Getting rid of support for MacOS9 and earlier. This is the first step,

and the biggest in size, but probably the easiest. Hunting through the
source code comes next.
This commit is contained in:
Jack Jansen 2003-11-19 14:34:18 +00:00
parent 6045b9c935
commit 28ecf70db5
181 changed files with 0 additions and 22664 deletions

View file

@ -1,140 +0,0 @@
"""Create a standalone application from a Python script.
This puts up a dialog asking for a Python source file ('TEXT').
The output is a file with the same name but its ".py" suffix dropped.
It is created by copying an applet template, all used shared libs and
then adding 'PYC ' resources containing compiled versions of all used
modules written in Python and the main script itself, as __main__.
"""
import sys
import string
import os
import MacOS
from Carbon import Res
from Carbon import Dlg
import EasyDialogs
import buildtools
import macresource
# Hmmm...
MACFREEZEPATH = os.path.join(sys.prefix, ":Mac:Tools:macfreeze")
if MACFREEZEPATH not in sys.path:
sys.path.append(MACFREEZEPATH)
import macgen_bin
# dialog, items
DLG_ID = 400
OK_BUTTON = 1
CANCEL_BUTTON = 2
GENFAT_BUTTON = 4
GENPPC_BUTTON = 5
GEN68K_BUTTON = 6
# Define this if we cannot generate 68/fat binaries (Python 1.6)
PPC_ONLY=1
macresource.need('DITL', DLG_ID, "BuildApplication.rsrc")
def main():
try:
buildapplication()
except buildtools.BuildError, detail:
EasyDialogs.Message(detail)
def buildapplication(debug = 0):
buildtools.DEBUG = debug
# Ask for source text if not specified in sys.argv[1:]
if not sys.argv[1:]:
filename = EasyDialogs.AskFileForOpen(message='Select Python source:',
fileTypes=('TEXT',))
if not filename:
return
else:
if sys.argv[2:]:
raise buildtools.BuildError, "please select one file at a time"
filename = sys.argv[1]
tp, tf = os.path.split(filename)
# interact with user
architecture, ok = interact(tf)
if not ok:
return
if tf[-3:] == '.py':
tf = tf[:-3]
else:
tf = tf + '.app'
dstfilename = EasyDialogs.AskFileForSate(message='Save application as:',
savedFileName=tf)
if not ok:
return
macgen_bin.generate(filename, dstfilename, None, architecture, 1)
class radio:
def __init__(self, dlg, *items):
self.items = {}
for item in items:
ctl = dlg.GetDialogItemAsControl(item)
self.items[item] = ctl
def set(self, setitem):
for item, ctl in self.items.items():
if item == setitem:
ctl.SetControlValue(1)
else:
ctl.SetControlValue(0)
def get(self):
for item, ctl in self.items.items():
if ctl.GetControlValue():
return item
def hasitem(self, item):
return self.items.has_key(item)
def interact(scriptname):
if PPC_ONLY:
return 'pwpc', 1
d = Dlg.GetNewDialog(DLG_ID, -1)
if not d:
raise "Can't get DLOG resource with id =", DLG_ID
d.SetDialogDefaultItem(OK_BUTTON)
d.SetDialogCancelItem(CANCEL_BUTTON)
Dlg.ParamText(scriptname, "", "", "")
radiogroup = radio(d, GENFAT_BUTTON, GENPPC_BUTTON, GEN68K_BUTTON)
radiogroup.set(GENFAT_BUTTON)
gentype = 'fat'
while 1:
n = Dlg.ModalDialog(None)
if n == OK_BUTTON or n == CANCEL_BUTTON:
break
elif radiogroup.hasitem(n):
radiogroup.set(n)
genitem = radiogroup.get()
del radiogroup
del d
if genitem == GENFAT_BUTTON:
gentype = 'fat'
elif genitem == GENPPC_BUTTON:
gentype = 'pwpc'
elif genitem == GEN68K_BUTTON:
gentype = 'm68k'
return gentype, n == OK_BUTTON
if __name__ == '__main__':
main()

Binary file not shown.

View file

@ -1,179 +0,0 @@
# This python script creates Finder aliases for all the
# dynamically-loaded modules that "live in" in a single
# shared library.
#
# This is sort-of a merger between Jack's MkPluginAliases
# and Guido's mkaliases.
#
# Jack Jansen, CWI, August 1996
import sys
import os
import warnings
warnings.filterwarnings("ignore", "macfs.*", DeprecationWarning, __name__)
import macfs
import MacOS
import gestalt
import string
from Carbon import Res
SPLASH_COPYCORE=512
SPLASH_COPYCARBON=513
SPLASH_COPYCLASSIC=514
SPLASH_BUILDAPPLETS=515
ALERT_NOCORE=516
ALERT_NONBOOT=517
ALERT_NONBOOT_COPY=1
ALERT_NONBOOT_ALIAS=2
ALERT_NOTPYTHONFOLDER=518
ALERT_NOTPYTHONFOLDER_REMOVE_QUIT=1
ALERT_NOTPYTHONFOLDER_QUIT=2
ALERT_NOTPYTHONFOLDER_CONTINUE=3
APPLET_LIST=[
(":Mac:scripts:EditPythonPrefs.py", "EditPythonPrefs", None),
(":Mac:scripts:BuildApplet.py", "BuildApplet", None),
(":Mac:scripts:BuildApplication.py", "BuildApplication", None),
## (":Mac:scripts:ConfigurePython.py", "ConfigurePython", None),
## (":Mac:scripts:ConfigurePython.py", "ConfigurePythonCarbon", "PythonInterpreterCarbon"),
## (":Mac:scripts:ConfigurePython.py", "ConfigurePythonClassic", "PythonInterpreterClassic"),
(":Mac:Tools:IDE:PythonIDE.py", "Python IDE", None),
(":Mac:Tools:CGI:PythonCGISlave.py", ":Mac:Tools:CGI:PythonCGISlave", None),
(":Mac:Tools:CGI:BuildCGIApplet.py", ":Mac:Tools:CGI:BuildCGIApplet", None),
]
def getextensiondirfile(fname):
import macfs
import MACFS
try:
vrefnum, dirid = macfs.FindFolder(MACFS.kLocalDomain, MACFS.kSharedLibrariesFolderType, 1)
except macfs.error:
try:
vrefnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk, MACFS.kSharedLibrariesFolderType, 1)
except macfs.error:
return None
fss = macfs.FSSpec((vrefnum, dirid, fname))
return fss.as_pathname()
def mkcorealias(src, altsrc):
import string
import macostools
version = string.split(sys.version)[0]
dst = getextensiondirfile(src+ ' ' + version)
if not dst:
return 0
if not os.path.exists(os.path.join(sys.exec_prefix, src)):
if not os.path.exists(os.path.join(sys.exec_prefix, altsrc)):
return 0
src = altsrc
try:
os.unlink(dst)
except os.error:
pass
do_copy = ask_copy()
try:
if do_copy:
macostools.copy(os.path.join(sys.exec_prefix, src), dst)
else:
macostools.mkalias(os.path.join(sys.exec_prefix, src), dst)
except IOError:
return 0
return 1
do_copy = None
def ask_copy():
global do_copy
if do_copy != None:
return do_copy
# On OSX always copy
if gestalt.gestalt('sysv') > 0x9ff:
do_copy = 1
return do_copy
do_copy = 0
if macfs.FSSpec(sys.exec_prefix).as_tuple()[0] != -1: # XXXX
try:
from Carbon import Dlg
rv = Dlg.CautionAlert(ALERT_NONBOOT, None)
if rv == ALERT_NONBOOT_COPY:
do_copy = 1
except ImportError:
pass
return do_copy
# Copied from fullbuild, should probably go to buildtools
def buildapplet(top, dummy, list):
"""Create python applets"""
import buildtools
for src, dst, tmpl in list:
template = buildtools.findtemplate(tmpl)
if src[-3:] != '.py':
raise 'Should end in .py', src
base = os.path.basename(src)
src = os.path.join(top, src)
dst = os.path.join(top, dst)
try:
os.unlink(dst)
except os.error:
pass
try:
buildtools.process(template, src, dst, 1)
except buildtools.BuildError, arg:
print '**', dst, arg
def buildcopy(top, dummy, list):
import macostools
for src, dst in list:
src = os.path.join(top, src)
dst = os.path.join(top, dst)
macostools.copy(src, dst, forcetype="APPL")
def main():
verbose = 0
try:
h = Res.GetResource('DLOG', SPLASH_COPYCORE)
del h
except Res.Error:
verbose = 1
print "Not running as applet: verbose on"
oldcwd = os.getcwd()
os.chdir(sys.prefix)
newcwd = os.getcwd()
if verbose:
print "Not running as applet: Skipping check for preference file correctness."
elif oldcwd != newcwd:
# Hack to make sure we get the new MACFS
sys.path.insert(0, os.path.join(oldcwd, ':Mac:Lib'))
from Carbon import Dlg
rv = Dlg.CautionAlert(ALERT_NOTPYTHONFOLDER, None)
if rv == ALERT_NOTPYTHONFOLDER_REMOVE_QUIT:
import pythonprefs, preferences
prefpathname = pythonprefs.pref_fss.as_pathname()
os.remove(prefpathname)
sys.exit(0)
elif rv == ALERT_NOTPYTHONFOLDER_QUIT:
sys.exit(0)
sys.path.append('::Mac:Lib')
import macostools
# Create the PythonCore alias(es)
MacOS.splash(SPLASH_COPYCORE)
if verbose:
print "Copying PythonCoreCarbon..."
n = 0
n = n + mkcorealias('PythonCoreCarbon', 'PythonCoreCarbon')
if n == 0:
from Carbon import Dlg
Dlg.CautionAlert(ALERT_NOCORE, None)
if verbose:
print "Warning: PythonCore not copied to Extensions folder"
print " (Applets will not work unless run from the Python folder)"
MacOS.splash(SPLASH_BUILDAPPLETS)
buildapplet(sys.prefix, None, APPLET_LIST)
if __name__ == '__main__':
main()
MacOS.splash()

Binary file not shown.

View file

@ -1,213 +0,0 @@
"""Edit the Python Preferences file."""
#
# This program is getting more and more clunky. It should really
# be rewritten in a modeless way some time soon.
from Carbon.Dlg import *
from Carbon.Events import *
from Carbon.Res import *
from Carbon import Controls
import string
import struct
import macfs
import MacOS
import os
import sys
from Carbon import Res # For Res.Error
import pythonprefs
import macresource
import EasyDialogs
try:
from Carbon import Help
except ImportError:
Help = None
# resource IDs in our own resources (dialogs, etc)
MESSAGE_ID = 256
DIALOG_ID = 511
TEXT_ITEM = 1
OK_ITEM = 2
CANCEL_ITEM = 3
DIR_ITEM = 4
TITLE_ITEM = 5
OPTIONS_ITEM = 7
HELP_ITEM = 9
# The options dialog. There is a correspondence between
# the dialog item numbers and the option.
OPT_DIALOG_ID = 510
# Map dialog item numbers to option names (and the reverse)
opt_dialog_map = [
None,
None,
None,
"inspect",
"verbose",
"optimize",
"unbuffered",
"debugging",
"tabwarn",
"nosite",
"nonavservice",
"nointopt",
"noargs",
"delayconsole",
"divisionwarn",
"unixnewlines",
]
opt_dialog_dict = {}
for i in range(len(opt_dialog_map)):
if opt_dialog_map[i]:
opt_dialog_dict[opt_dialog_map[i]] = i
# 1 thru 10 are the options
# The GUSI creator/type and delay-console
OD_CREATOR_ITEM = 20
OD_TYPE_ITEM = 21
OD_OK_ITEM = 1
OD_CANCEL_ITEM = 2
OD_HELP_ITEM = 22
OD_KEEPALWAYS_ITEM = 16
OD_KEEPOUTPUT_ITEM = 17
OD_KEEPERROR_ITEM = 18
OD_KEEPNEVER_ITEM = 19
def optinteract(options):
"""Let the user interact with the options dialog"""
d = GetNewDialog(OPT_DIALOG_ID, -1)
htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM)
SetDialogItemText(htext, options['creator'])
htext = d.GetDialogItemAsControl(OD_TYPE_ITEM)
SetDialogItemText(htext, options['type'])
d.SetDialogDefaultItem(OD_OK_ITEM)
d.SetDialogCancelItem(OD_CANCEL_ITEM)
if not Help:
d.HideDialogItem(OD_HELP_ITEM)
while 1:
for name in opt_dialog_dict.keys():
num = opt_dialog_dict[name]
ctl = d.GetDialogItemAsControl(num)
ctl.SetControlValue(options[name])
ctl = d.GetDialogItemAsControl(OD_KEEPALWAYS_ITEM)
ctl.SetControlValue(options['keep_console'] == 3)
ctl = d.GetDialogItemAsControl(OD_KEEPOUTPUT_ITEM)
ctl.SetControlValue(options['keep_console'] == 1)
ctl = d.GetDialogItemAsControl(OD_KEEPERROR_ITEM)
ctl.SetControlValue(options['keep_console'] == 2)
ctl = d.GetDialogItemAsControl(OD_KEEPNEVER_ITEM)
ctl.SetControlValue(options['keep_console'] == 0)
n = ModalDialog(None)
if n == OD_OK_ITEM:
htext = d.GetDialogItemAsControl(OD_CREATOR_ITEM)
ncreator = GetDialogItemText(htext)
htext = d.GetDialogItemAsControl(OD_TYPE_ITEM)
ntype = GetDialogItemText(htext)
if len(ncreator) == 4 and len(ntype) == 4:
options['creator'] = ncreator
options['type'] = ntype
return options
else:
MacOS.SysBeep()
elif n == OD_CANCEL_ITEM:
return
elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM):
pass
elif n == OD_KEEPALWAYS_ITEM:
options['keep_console'] = 3;
elif n == OD_KEEPOUTPUT_ITEM:
options['keep_console'] = 1;
elif n == OD_KEEPERROR_ITEM:
options['keep_console'] = 2;
elif n == OD_KEEPNEVER_ITEM:
options['keep_console'] = 0;
elif n == OD_HELP_ITEM and Help:
onoff = Help.HMGetBalloons()
Help.HMSetBalloons(not onoff)
elif 1 <= n <= len(opt_dialog_map):
options[opt_dialog_map[n]] = (not options[opt_dialog_map[n]])
def interact(options, title):
"""Let the user interact with the dialog"""
try:
# Try to go to the "correct" dir for GetDirectory
os.chdir(options['dir'].as_pathname())
except os.error:
pass
d = GetNewDialog(DIALOG_ID, -1)
htext = d.GetDialogItemAsControl(TITLE_ITEM)
SetDialogItemText(htext, title)
path_ctl = d.GetDialogItemAsControl(TEXT_ITEM)
data = string.joinfields(options['path'], '\r')
path_ctl.SetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag, data)
d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
d.SelectDialogItemText(TEXT_ITEM, 0, 0)
## d.SetDialogDefaultItem(OK_ITEM)
d.SetDialogCancelItem(CANCEL_ITEM)
if not Help:
d.HideDialogItem(HELP_ITEM)
d.GetDialogWindow().ShowWindow()
d.DrawDialog()
while 1:
n = ModalDialog(None)
if n == OK_ITEM:
break
if n == CANCEL_ITEM:
return None
## if n == REVERT_ITEM:
## return [], pythondir
if n == DIR_ITEM:
fss = EasyDialogs.AskFolder(message='Select python home folder:',
wanted=macfs.FSSpec)
if fss:
options['dir'] = fss
elif n == HELP_ITEM and Help:
onoff = Help.HMGetBalloons()
Help.HMSetBalloons(not onoff)
if n == OPTIONS_ITEM:
noptions = options
for k in options.keys():
noptions[k] = options[k]
noptions = optinteract(noptions)
if noptions:
options = noptions
data = path_ctl.GetControlData(Controls.kControlEditTextPart, Controls.kControlEditTextTextTag)
tmp = string.splitfields(data, '\r')
newpath = []
for i in tmp:
if i:
newpath.append(i)
options['path'] = newpath
return options
def edit_preferences():
handler = pythonprefs.PythonOptions()
options = handler.load()
if options['noargs']:
EasyDialogs.Message('Warning: system-wide sys.argv processing is off.\nIf you dropped an applet I have not seen it.')
result = interact(options, 'System-wide preferences')
if result:
handler.save(result)
def edit_applet(name):
handler = pythonprefs.AppletOptions(name)
result = interact(handler.load(), os.path.split(name)[1])
if result:
handler.save(result)
def main():
macresource.need('DLOG', DIALOG_ID, 'EditPythonPrefs.rsrc')
MacOS.SchedParams(1, 0)
if len(sys.argv) <= 1:
edit_preferences()
else:
for appl in sys.argv[1:]:
edit_applet(appl)
if __name__ == '__main__':
main()

Binary file not shown.

View file

@ -1,47 +0,0 @@
STR# 26733
DIALOG 511
1.1 Enter folders to include in sys.path. Use the arrow keys to navigate.
2.1 Press when done.
3.1 Press to leave settings as they are.
4.1 Select the folder that will replace $(PYTHON) in sys.path items.
7.1 Press to show a dialog that allows you to set options.
9.1 Press here to turn help balloons off again.
END-DIALOG
DIALOG 510
1.1 Press here when satisfied with your new settings in this dialog.
2.1 Press here when you're not satisfied with your new settings.
3.1 Turn this item on to get the standard >>> prompt after a script terminates.
3.3 Turn this item off to have the interpreter terminate when a script terminates.
4.1 Turn this option on to get feedback on where modules are found and what their type is.
4.3 Turn this option off to stop import feedback.
5.1 Turn this option on to strip LINO instructions from Python bytecode. Gives a slight speedup.
5.3 Turn this option off to include LINO instructions in the bytecode. This enables line numbers in traceback printouts.
6.1 Turn this on to show output byte-by-byte as it is produced. Slows things down.
6.3 Turn this off to show output on a line-by-line basis, or when input is requested.
7.1 Print gibberish only Guido understands.
7.3 Stop printing gibberish.
8.1 Select to warn about mixing tabs and spaces in your source.
8.3 Deselect to treat tabs as 4 spaces without warning.
9.1 Selecting this disables the site-python feature.
9.3 Deselecting this enables the site-python feature.
10.1 Select this to keep the old behaviour for macfs Standard File calls
10.3 Deselect this to auto-import macfsn which replaces macfs Standard File calls with Navigation Services wrappers
11.1 Turn this on to stop the user from asking for the startup option dialog with the option key. Use this on applets only.
11.3 Turn this off to enable the user to set options by depressing <option> while Python is starting up.
12.1 If you enable this Python will not try to build a unix-style sys.argv, leaving all AppleEvents for your script. Use this for applets only.
12.3 If you disable this Python will create a sys.argv consisting of the files dropped on the interpreter or applet.
13.1 Turn this on to refrain from showing the console window and menu bar until something is printed. Use this for applets only.
13.3 Turn this off to show the console window and menu bar immedeately upon startup.
14.1 Select this to always keep the console window open after script termination.
14.3 The console window is always kept open after script termination.
15.1 Select this to keep the console window open if there is output that you may not have had a chance to look at.
15.3 The console window stays open if there is output that you may not have had a chance to look at.
16.1 Select this to keep the console window open when a script aborts.
16.3 The console window stays open when a script aborts.
17.1 Select this to always close the console window on script termination.
17.3 The console window is always closed on script termination.
18.1 The creator code Python will create files with. Select your favourite text editor.
19.1 The type code Python will create files with. TEXT is probably best.
20.1 Press here to turn help balloons off again.
END-DIALOG
END

Binary file not shown.

Binary file not shown.

View file

@ -1,318 +0,0 @@
#
# Interactively decide what to distribute
#
#
# The exclude file signals files to always exclude,
# The pattern file lines are of the form
# *.c
# This excludes all files ending in .c.
#
# The include file signals files and directories to include.
# Records are of the form
# ('Tools:bgen:AE:AppleEvents.py', 'Lib:MacToolbox:AppleEvents.py')
# This includes the specified file, putting it in the given place, or
# ('Tools:bgen:AE:AppleEvents.py', None)
# This excludes the specified file.
#
from MkDistr_ui import *
import fnmatch
import re
import os
import sys
import macfs
import macostools
DEBUG=0
SyntaxError='Include/exclude file syntax error'
class Matcher:
"""Include/exclude database, common code"""
def __init__(self, filename):
self.filename = filename
self.rawdata = []
self.parse(filename)
self.rawdata.sort()
self.rebuild()
self.modified = 0
def parse(self, dbfile):
try:
fp = open(dbfile)
except IOError:
return
data = fp.readlines()
fp.close()
for d in data:
d = d[:-1]
if not d or d[0] == '#': continue
pat = self.parseline(d)
self.rawdata.append(pat)
def save(self):
fp = open(self.filename, 'w')
self.savedata(fp, self.rawdata)
self.modified = 0
def add(self, value):
if len(value) == 1:
value = value + ('',)
self.rawdata.append(value)
self.rebuild1(value)
self.modified = 1
def delete(self, value):
key = value
for i in range(len(self.rawdata)):
if self.rawdata[i][0] == key:
del self.rawdata[i]
self.unrebuild1(i, key)
self.modified = 1
return
print 'Not found!', key
def getall(self):
return map(lambda x: x[0], self.rawdata)
def get(self, value):
for src, dst in self.rawdata:
if src == value:
return src, dst
print 'Not found!', value
def is_modified(self):
return self.modified
class IncMatcher(Matcher):
"""Include filename database and matching engine"""
def rebuild(self):
self.idict = {}
self.edict = {}
for v in self.rawdata:
self.rebuild1(v)
def parseline(self, line):
try:
data = eval(line)
except:
raise SyntaxError, line
if type(data) <> type(()) or len(data) not in (1,2):
raise SyntaxError, line
if len(data) == 1:
data = data + ('',)
return data
def savedata(self, fp, data):
for d in self.rawdata:
fp.write(`d`+'\n')
def rebuild1(self, (src, dst)):
if dst == '':
dst = src
if dst == None:
self.edict[src] = None
else:
self.idict[src] = dst
def unrebuild1(self, num, src):
if self.idict.has_key(src):
del self.idict[src]
else:
del self.edict[src]
def match(self, patharg):
removed = []
# First check the include directory
path = patharg
while 1:
if self.idict.has_key(path):
# We know of this path (or initial piece of path)
dstpath = self.idict[path]
# We do want it distributed. Tack on the tail.
while removed:
dstpath = os.path.join(dstpath, removed[0])
removed = removed[1:]
# Finally, if the resultant string ends in a separator
# tack on our input filename
if dstpath[-1] == os.sep:
dir, file = os.path.split(path)
dstpath = os.path.join(dstpath, file)
if DEBUG:
print 'include', patharg, dstpath
return dstpath
## path, lastcomp = os.path.split(path)
## if not path:
## break
## removed[0:0] = [lastcomp]
## # Next check the exclude directory
## path = patharg
## while 1:
if self.edict.has_key(path):
if DEBUG:
print 'exclude', patharg, path
return ''
path, lastcomp = os.path.split(path)
if not path:
break
removed[0:0] = [lastcomp]
if DEBUG:
print 'nomatch', patharg
return None
def checksourcetree(self):
rv = []
for name in self.idict.keys():
if not os.path.exists(name):
rv.append(name)
return rv
class ExcMatcher(Matcher):
"""Exclude pattern database and matching engine"""
def rebuild(self):
self.relist = []
for v in self.rawdata:
self.rebuild1(v)
def parseline(self, data):
return (data, None)
def savedata(self, fp, data):
for d in self.rawdata:
fp.write(d[0]+'\n')
def rebuild1(self, (src, dst)):
pat = fnmatch.translate(src)
if DEBUG:
print 'PATTERN', `src`, 'REGEX', `pat`
self.relist.append(re.compile(pat))
def unrebuild1(self, num, src):
del self.relist[num]
def match(self, path):
comps = os.path.split(path)
file = comps[-1]
for pat in self.relist:
if pat and pat.match(file):
if DEBUG:
print 'excmatch', file, pat
return 1
return 0
class Main:
"""The main program glueing it all together"""
def __init__(self):
InitUI()
os.chdir(sys.prefix)
if not os.path.isdir(':Mac:Distributions'):
os.mkdir(':Mac:Distributions')
self.typedist = GetType()
self.inc = IncMatcher(':Mac:Distributions:%s.include'%self.typedist)
self.exc = ExcMatcher(':Mac:Distributions:%s.exclude'%self.typedist)
self.ui = MkDistrUI(self)
self.ui.mainloop()
def check(self):
return self.checkdir(':', 1)
def checkdir(self, path, istop):
if DEBUG:
print 'checkdir', path
files = os.listdir(path)
rv = []
todo = []
for f in files:
if DEBUG:
print 'checkfile', f
if self.exc.match(f):
if DEBUG:
print 'exclude match', f
continue
fullname = os.path.join(path, f)
if DEBUG:
print 'checkpath', fullname
matchvalue = self.inc.match(fullname)
if matchvalue == None:
if os.path.isdir(fullname):
if DEBUG:
print 'do dir', fullname
todo.append(fullname)
else:
if DEBUG:
print 'include', fullname
rv.append(fullname)
elif DEBUG:
print 'badmatch', matchvalue
for d in todo:
if len(rv) > 500:
if istop:
rv.append('... and more ...')
return rv
rv = rv + self.checkdir(d, 0)
return rv
def run(self):
missing = self.inc.checksourcetree()
if missing:
print '==== Missing source files ===='
for i in missing:
print i
print '==== Fix and retry ===='
return
destprefix = os.path.join(sys.prefix, ':Mac:Distributions:(vise)')
destprefix = os.path.join(destprefix, '%s Distribution'%self.typedist)
if not self.rundir(':', destprefix, 0):
return
self.rundir(':', destprefix, 1)
def rundir(self, path, destprefix, doit):
files = os.listdir(path)
todo = []
rv = 1
for f in files:
if self.exc.match(f):
continue
fullname = os.path.join(path, f)
if os.path.isdir(fullname):
todo.append(fullname)
else:
dest = self.inc.match(fullname)
if dest == None:
print 'Not yet resolved:', fullname
rv = 0
if dest:
if doit:
print 'COPY ', fullname
print ' -> ', os.path.join(destprefix, dest)
try:
macostools.copy(fullname, os.path.join(destprefix, dest), 1)
except: #DBG
print '*** Copy failed mysteriously, try again'
print '*** cwd', os.getcwd() #DBG
print '*** fsspec', macfs.FSSpec(fullname) #DBG
# Get rid of open files
try:
i = 1 / 0
except:
pass
macostools.copy(fullname, os.path.join(destprefix, dest), 1)
for d in todo:
if not self.rundir(d, destprefix, doit):
rv = 0
return rv
def save(self):
self.inc.save()
self.exc.save()
def is_modified(self):
return self.inc.is_modified() or self.exc.is_modified()
if __name__ == '__main__':
Main()

Binary file not shown.

View file

@ -1,356 +0,0 @@
#
# MkDistr - User Interface.
#
# Jack Jansen, CWI, August 1995
#
# XXXX To be done (requires mods of FrameWork and toolbox interfaces too):
# - Give dialogs titles (need dlg->win conversion)
# - Place dialogs better (???)
# - <return> as <ok>
# - big box around ok button
# - window-close crashes on reopen (why?)
# - Box around lists (???)
# - Change cursor while busy (need cursor support in Qd)
#
from Carbon import Res
from Carbon import Dlg
from Carbon import Ctl
from Carbon import List
from Carbon import Win
from Carbon import Qd
from FrameWork import *
import EasyDialogs
import os
import sys
import macresource
# Resource IDs
ID_MAIN = 514
MAIN_LIST=1
MAIN_MKDISTR=2
MAIN_CHECK=3
MAIN_INCLUDE=4
MAIN_EXCLUDE=5
ID_INCWINDOW=515
ID_EXCWINDOW=517
INCEXC_DELETE=2
INCEXC_CHANGE=3
INCEXC_ADD=4
ID_INCLUDE=512
ID_EXCLUDE=513
DLG_OK=1 # Include for include, exclude for exclude
DLG_CANCEL=2
DLG_SRCPATH=3
DLG_DSTPATH=4 # include dialog only
DLG_EXCLUDE=5 # Exclude, include dialog only
ID_DTYPE=516
DTYPE_EXIST=1
DTYPE_NEW=2
DTYPE_CANCEL=3
class EditDialogWindow(DialogWindow):
"""Include/exclude editor (modeless dialog window)"""
def open(self, id, (src, dst), callback, cancelrv):
self.id = id
self.callback = callback
self.cancelrv = cancelrv
DialogWindow.open(self, id)
tp, h, rect = self.dlg.GetDialogItem(DLG_SRCPATH)
Dlg.SetDialogItemText(h, src)
self.dlg.SetDialogDefaultItem(DLG_OK)
self.dlg.SetDialogCancelItem(DLG_CANCEL)
if id == ID_INCLUDE:
tp, h, rect = self.dlg.GetDialogItem(DLG_DSTPATH)
if dst == None:
dst = ''
Dlg.SetDialogItemText(h, dst)
self.dlg.DrawDialog()
def do_itemhit(self, item, event):
if item in (DLG_OK, DLG_CANCEL, DLG_EXCLUDE):
self.done(item)
# else it is not interesting
def done(self, item):
tp, h, rect = self.dlg.GetDialogItem(DLG_SRCPATH)
src = Dlg.GetDialogItemText(h)
if item == DLG_OK:
if self.id == ID_INCLUDE:
tp, h, rect = self.dlg.GetDialogItem(DLG_DSTPATH)
dst = Dlg.GetDialogItemText(h)
rv = (src, dst)
else:
rv = (src, None)
elif item == DLG_EXCLUDE:
rv = (src, None)
else:
rv = self.cancelrv
self.close()
self.callback((item in (DLG_OK, DLG_EXCLUDE)), rv)
class ListWindow(DialogWindow):
"""A dialog window containing a list as its main item"""
def open(self, id, contents):
self.id = id
DialogWindow.open(self, id)
Qd.SetPort(self.wid)
tp, h, rect = self.dlg.GetDialogItem(MAIN_LIST)
self.listrect = rect
rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-16 # Scroll bar space
self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid,
0, 1, 1, 1)
self.setlist(contents)
def setlist(self, contents):
self.list.LDelRow(0, 0)
self.list.LSetDrawingMode(0)
if contents:
self.list.LAddRow(len(contents), 0)
for i in range(len(contents)):
self.list.LSetCell(contents[i], (0, i))
self.list.LSetDrawingMode(1)
##self.list.LUpdate(self.wid.GetWindowPort().visRgn)
self.wid.InvalWindowRect(self.listrect)
def additem(self, item):
where = self.list.LAddRow(1, 0)
self.list.LSetCell(item, (0, where))
def delgetitem(self, item):
data = self.list.LGetCell(1000, (0, item))
self.list.LDelRow(1, item)
return data
def do_listhit(self, event):
(what, message, when, where, modifiers) = event
Qd.SetPort(self.wid)
where = Qd.GlobalToLocal(where)
if self.list.LClick(where, modifiers):
self.do_dclick(self.delgetselection())
def delgetselection(self):
items = []
point = (0,0)
while 1:
ok, point = self.list.LGetSelect(1, point)
if not ok:
break
items.append(point[1])
point = point[0], point[1]+1
values = []
items.reverse()
for i in items:
values.append(self.delgetitem(i))
return values
def do_rawupdate(self, window, event):
Qd.SetPort(window)
Qd.FrameRect(self.listrect)
self.list.LUpdate(self.wid.GetWindowPort().visRgn)
def do_close(self):
self.close()
def close(self):
del self.list
DialogWindow.close(self)
def mycb_add(self, ok, item):
if item:
self.additem(item[0])
self.cb_add(item)
class MainListWindow(ListWindow):
"""The main window"""
def open(self, id, cb_check, cb_run, cb_add):
ListWindow.open(self, id, [])
self.dlg.SetDialogDefaultItem(MAIN_INCLUDE)
self.cb_run = cb_run
self.cb_check = cb_check
self.cb_add = cb_add
setwatchcursor()
list = self.cb_check()
self.setlist(list)
setarrowcursor()
def do_itemhit(self, item, event):
if item == MAIN_LIST:
self.do_listhit(event)
if item == MAIN_MKDISTR:
setwatchcursor()
self.cb_run()
setarrowcursor()
if item == MAIN_CHECK:
setwatchcursor()
list = self.cb_check()
self.setlist(list)
setarrowcursor()
if item == MAIN_INCLUDE:
self.do_dclick(self.delgetselection())
if item == MAIN_EXCLUDE:
for i in self.delgetselection():
self.cb_add((i, None))
def do_dclick(self, list):
if not list:
list = ['']
for l in list:
w = EditDialogWindow(self.parent)
w.open(ID_INCLUDE, (l, None), self.mycb_add, None)
def mycb_add(self, ok, item):
if item:
self.cb_add(item)
class IncListWindow(ListWindow):
"""An include/exclude window"""
def open(self, id, editid, contents, cb_add, cb_del, cb_get):
ListWindow.open(self, id, contents)
self.dlg.SetDialogDefaultItem(INCEXC_CHANGE)
self.editid = editid
self.cb_add = cb_add
self.cb_del = cb_del
self.cb_get = cb_get
def do_itemhit(self, item, event):
if item == MAIN_LIST:
self.do_listhit(event)
if item == INCEXC_DELETE:
old = self.delgetselection()
for i in old:
self.cb_del(i)
if item == INCEXC_CHANGE:
self.do_dclick(self.delgetselection())
if item == INCEXC_ADD:
w = EditDialogWindow(self.parent)
w.open(self.editid, ('', None), self.mycb_add, None)
def do_dclick(self, list):
if not list:
list = ['']
for l in list:
old = self.cb_get(l)
self.cb_del(l)
w = EditDialogWindow(self.parent)
w.open(self.editid, old, self.mycb_add, old)
class MkDistrUI(Application):
def __init__(self, main):
self.main = main
Application.__init__(self)
self.mwin = MainListWindow(self)
self.mwin.open(ID_MAIN, self.main.check, self.main.run, self.main.inc.add)
self.iwin = None
self.ewin = None
def makeusermenus(self):
self.filemenu = m = Menu(self.menubar, "File")
self.includeitem = MenuItem(m, "Show Include window", "", self.showinc)
self.excludeitem = MenuItem(m, "Show Exclude window", "", self.showexc)
self.saveitem = MenuItem(m, "Save databases", "S", self.save)
self.quititem = MenuItem(m, "Quit", "Q", self.quit)
def quit(self, *args):
if self.main.is_modified():
rv = EasyDialogs.AskYesNoCancel('Database modified. Save?', -1)
if rv == -1:
return
if rv == 1:
self.main.save()
self._quit()
def save(self, *args):
self.main.save()
def showinc(self, *args):
if self.iwin:
if self._windows.has_key(self.iwin):
self.iwin.close()
del self.iwin
self.iwin = IncListWindow(self)
self.iwin.open(ID_INCWINDOW, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add,
self.main.inc.delete, self.main.inc.get)
def showexc(self, *args):
if self.ewin:
if self._windows.has_key(self.ewin):
self.ewin.close()
del self.ewin
self.ewin = IncListWindow(self)
self.ewin.open(ID_EXCWINDOW, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add,
self.main.exc.delete, self.main.exc.get)
def do_about(self, id, item, window, event):
EasyDialogs.Message("Test the MkDistr user interface.")
def GetType():
"""Ask user for distribution type"""
while 1:
d = Dlg.GetNewDialog(ID_DTYPE, -1)
d.SetDialogDefaultItem(DTYPE_EXIST)
d.SetDialogCancelItem(DTYPE_CANCEL)
while 1:
rv = ModalDialog(None)
if rv in (DTYPE_EXIST, DTYPE_NEW, DTYPE_CANCEL):
break
del d
if rv == DTYPE_CANCEL:
sys.exit(0)
if rv == DTYPE_EXIST:
path = EasyDialogs.AskFileForOpen()
if not path:
sys.exit(0)
basename = os.path.split(path)[-1]
if basename[-8:] <> '.include':
EasyDialogs.Message('That is not a distribution include file')
else:
return basename[:-8]
else:
name = EasyDialogs.AskString('Distribution name:')
if name:
return name
sys.exit(0)
def InitUI():
"""Initialize stuff needed by UI (a resource file)"""
macresource.need('DLOG', ID_MAIN, 'MkDistr.rsrc', modname=__name__)
class _testerhelp:
def __init__(self, which):
self.which = which
def get(self):
return [self.which+'-one', self.which+'-two']
def add(self, value):
if value:
print 'ADD', self.which, value
def delete(self, value):
print 'DEL', self.which, value
class _test:
def __init__(self):
import sys
InitUI()
self.inc = _testerhelp('include')
self.exc = _testerhelp('exclude')
self.ui = MkDistrUI(self)
self.ui.mainloop()
sys.exit(1)
def check(self):
print 'CHECK'
return ['rv1', 'rv2']
def run(self):
print 'RUN'
if __name__ == '__main__':
_test()

View file

@ -1,104 +0,0 @@
#! /usr/bin/env python
# XXX This will be replaced by a main program in Mac/Lib/bundlebuilder.py,
# but for now this is kept so Jack won't need to change his scripts...
"""\
buildappbundle creates an application bundle
Usage:
buildappbundle [options] executable
Options:
--output o Output file; default executable with .app appended, short -o
--link Symlink the executable instead of copying it, short -l
--plist file Plist file (default: generate one), short -p
--nib file Main nib file or lproj folder for Cocoa program, short -n
--resource r Extra resource file to be copied to Resources, short -r
--creator c 4-char creator code (default: '????'), short -c
--verbose increase verbosity level (default: quiet), short -v
--help This message, short -? or -h
"""
import sys
import os
import getopt
from bundlebuilder import AppBuilder
from plistlib import Plist
def usage():
print __doc__
sys.exit(1)
def main():
output = None
symlink = 0
creator = "????"
plist = None
nib = None
resources = []
verbosity = 0
SHORTOPTS = "o:ln:r:p:c:v?h"
LONGOPTS=("output=", "link", "nib=", "resource=", "plist=", "creator=", "help",
"verbose")
try:
options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
except getopt.error:
usage()
if len(args) != 1:
usage()
executable = args[0]
for opt, arg in options:
if opt in ('-o', '--output'):
output = arg
elif opt in ('-l', '--link'):
symlink = 1
elif opt in ('-n', '--nib'):
nib = arg
elif opt in ('-r', '--resource'):
resources.append(arg)
elif opt in ('-c', '--creator'):
creator = arg
elif opt in ('-p', '--plist'):
plist = arg
elif opt in ('-v', '--verbose'):
verbosity += 1
elif opt in ('-?', '-h', '--help'):
usage()
if output is not None:
builddir, bundlename = os.path.split(output)
else:
builddir = os.curdir
bundlename = None # will be derived from executable
if plist is not None:
plist = Plist.fromFile(plist)
builder = AppBuilder(name=bundlename, executable=executable,
builddir=builddir, creator=creator, plist=plist, resources=resources,
symlink_exec=symlink, verbosity=verbosity)
if nib is not None:
resources.append(nib)
nibname, ext = os.path.splitext(os.path.basename(nib))
if ext == '.lproj':
# Special case: if the main nib is a .lproj we assum a directory
# and use the first nib from there. XXX Look: an arbitrary pick ;-)
files = os.listdir(nib)
for f in files:
if f[-4:] == '.nib':
nibname = os.path.split(f)[1][:-4]
break
else:
nibname = ""
if nibname:
builder.plist.NSMainNibFile = nibname
if not hasattr(builder.plist, "NSPrincipalClass"):
builder.plist.NSPrincipalClass = "NSApplication"
builder.setup()
builder.build()
if __name__ == '__main__':
main()

View file

@ -1,29 +0,0 @@
#! /usr/local/bin/python
# Replace \r by \n -- useful after transferring files from the Mac...
# Run this on UNIX.
# Usage: crlf.py file ...
import sys
import os
import string
def main():
args = sys.argv[1:]
if not args:
print 'usage:', sys.argv[0], 'file ...'
sys.exit(2)
for file in args:
print file, '...'
data = open(file, 'r').read()
lines = string.splitfields(data, '\r')
newdata = string.joinfields(lines, '\n')
if newdata != data:
print 'rewriting...'
os.rename(file, file + '~')
open(file, 'w').write(newdata)
print 'done.'
else:
print 'no change.'
main()

View file

@ -1,57 +0,0 @@
"""findgremlins - Search through a folder and subfolders for
text files that have characters with bit 8 set, and print
the filename and a bit of context.
By Just, with a little glue by Jack"""
import EasyDialogs
import MacOS
import re
import os
import string
import sys
xpat = re.compile(r"[\200-\377]")
def walk(top, recurse=1):
if os.path.isdir(top):
if recurse:
for name in os.listdir(top):
path = os.path.join(top, name)
walk(path)
else:
cr, tp = MacOS.GetCreatorAndType(top)
if tp in ('TEXT', '\0\0\0\0') and top[-4:] <> ".hqx":
data = open(top).read()
badcount = 0
for ch in data[:256]:
if ord(ch) == 0 or ord(ch) >= 0200:
badcount = badcount + 1
if badcount > 16:
print `top`, 'appears to be a binary file'
return
pos = 0
gotone = 0
while 1:
m = xpat.search(data, pos)
if m is None:
break
if not gotone:
print `top`
gotone = 1
[(i, j)] = m.regs
print " ", string.replace(data[i-15:j+15], '\n', ' ')
pos = j
def main():
if sys.argv[1:]:
for pathname in sys.argv[1:]:
walk(pathname)
else:
pathname = EasyDialogs.AskFolder()
if pathname:
walk(pathname)
if __name__ == '__main__':
main()

View file

@ -1,56 +0,0 @@
#
# Fixfiletypes - Set mac filetypes to something sensible,
# recursively down a directory tree.
#
# It will only touch extensions it feels pretty sure about.
# This script is useful after copying files from unix.
#
# Jack Jansen, CWI, 1995.
#
import os
import EasyDialogs
import sys
import macostools
import MacOS
list = [
('.py', 'Pyth', 'TEXT'),
('.pyc', 'Pyth', 'PYC '),
('.c', 'CWIE', 'TEXT'),
('.h', 'CWIE', 'TEXT'),
('.as', 'ToyS', 'TEXT'),
('.hqx', 'BnHq', 'TEXT'),
('.cmif', 'CMIF', 'TEXT'),
('.cmc', 'CMIF', 'CMC '),
('.aiff', 'SCPL', 'AIFF'),
('.mpg', 'mMPG', 'MPEG'),
]
def walktree(name, change):
if os.path.isfile(name):
for ext, cr, tp in list:
if name[-len(ext):] == ext:
curcrtp = MacOS.GetCreatorAndType(name)
if curcrtp <> (cr, tp):
if change:
MacOS.SetCreatorAndType(name, cr, tp)
macostools.touched(fs)
print 'Fixed ', name
else:
print 'Wrong', curcrtp, name
elif os.path.isdir(name):
print '->', name
files = os.listdir(name)
for f in files:
walktree(os.path.join(name, f), change)
def run(change):
pathname = EasyDialogs.AskFolder(message='Folder to search:')
if not pathname:
sys.exit(0)
walktree(pathname, change)
if __name__ == '__main__':
run(0)

View file

@ -1,434 +0,0 @@
#
# fullbuild creates everything that needs to be created before a
# distribution can be made, and puts it all in the right place.
#
# It expects the projects to be in the places where Jack likes them:
# in directories named like 'build.mac'. That is fixable,
# however.
#
# NOTE: You should proably make a copy of python with which to execute this
# script, rebuilding running programs does not work...
CARBON_ONLY = 1
MACBUILDNO=":Mac:Include:macbuildno.h"
import os
import sys
import Carbon.File
import MacOS
import EasyDialogs
import re
import string
import genpluginprojects
import macresource
import aetools
from Carbon import AppleEvents
import CodeWarrior
from Carbon import Res
from Carbon import Dlg
import buildtools
import cfmfile
# Dialog resource. Note that the item numbers should correspond
# to those in the DITL resource. Also note that the order is important:
# things are built in this order, so there should be no forward dependencies.
DIALOG_ID = 512
I_OK=1
I_CANCEL=2
# label 3
I_PPC_EXTLIBS=4
I_GEN_PROJECTS=5
I_GEN_PROJECTS_FORCE=6
I_GEN_IMGPROJECTS=7
I_GEN_IMGPROJECTS_FORCE=8
I_INC_BUILDNO=9
# label 10
I_PPC_CORE=11
I_PPC_PLUGINS=12
I_PPC_EXTENSIONS=13
# label 14
I_CARBON_CORE=15
I_CARBON_PLUGINS=16
I_CARBON_EXTENSIONS=17
I_INTERPRETER=18
# label 19
I_PPC_FULL=20
I_PPC_SMALL=21
# label 22
I_CARBON_FULL=23
I_CARBON_SMALL=24
# label 25
I_APPLETS=26
N_BUTTONS=27
if CARBON_ONLY:
BUTTONS_DISABLE = [
I_PPC_EXTLIBS,
I_PPC_CORE,
I_PPC_PLUGINS,
I_PPC_EXTENSIONS,
I_INTERPRETER,
I_PPC_FULL,
I_PPC_SMALL,
]
else:
BUTTONS_DISABLE = []
RUNNING=[]
def buildmwproject(top, creator, projects):
"""Build projects with an MW compiler"""
mgr = CodeWarrior.CodeWarrior(creator, start=1)
mgr.send_timeout = AppleEvents.kNoTimeOut
failed = []
for file in projects:
if type(file) == type(()):
file, target = file
else:
target = ''
file = os.path.join(top, file)
try:
fss = Carbon.File.FSSpec(file)
except MacOS.Error:
print '** file not found:', file
continue
print 'Building', file, target
try:
mgr.open(fss)
except aetools.Error, detail:
print '**', detail, file
continue
if target:
try:
mgr.Set_Current_Target(target)
except aetools.Error, arg:
print '**', file, target, 'Cannot select:', arg
try:
mgr.Make_Project()
except aetools.Error, arg:
print '**', file, target, 'Failed:', arg
failed.append(fss)
mgr.Close_Project()
if failed:
print 'Open failed projects and exit?',
rv = sys.stdin.readline()
if rv[0] in ('y', 'Y'):
for fss in failed:
mgr.open(fss)
sys.exit(0)
## mgr.quit()
def buildapplet(top, dummy, list):
"""Create python applets"""
for src, dst, tmpl in list:
template = buildtools.findtemplate(tmpl)
if src[-3:] != '.py':
raise 'Should end in .py', src
base = os.path.basename(src)
src = os.path.join(top, src)
dst = os.path.join(top, dst)
try:
os.unlink(dst)
except os.error:
pass
print 'Building applet', dst
try:
buildtools.process(template, src, dst, 1)
except buildtools.BuildError, arg:
print '**', dst, arg
def buildprojectfile(top, arg, list):
"""Create CodeWarrior project files with a script"""
for folder, module, routine in list:
print "Generating project files with", module
sys.path.insert(0, os.path.join(top, folder))
m = __import__(module)
r = getattr(m, routine)
r(arg)
del sys.path[0]
def buildfat(top, dummy, list):
"""Build fat binaries"""
for dst, src1, src2 in list:
dst = os.path.join(top, dst)
src1 = os.path.join(top, src1)
src2 = os.path.join(top, src2)
print 'Building fat binary', dst
cfmfile.mergecfmfiles((src1, src2), dst)
def buildcopy(top, dummy, list):
import macostools
for src, dst in list:
src = os.path.join(top, src)
dst = os.path.join(top, dst)
macostools.copy(src, dst, forcetype="APPL")
def buildsetup(top, dummy, list):
print 'Building extensions with setup.py ', ' '.join(list)
argv = ['setup.py'] + list[:]
save_argv = sys.argv
sys.argv = argv
sys.path.insert(0, top)
m = __import__('setup')
r = getattr(m, 'main')
r()
del sys.path[0]
sys.argv = save_argv
def buildcarbonplugins(top, dummy1, dummy2):
## XXXX Need to convert pathnames, I guess, and adapt distutils Mac-specific
## code to not call GetArgv if not needed.
## buildsetup(top, None, [
## '--dry_run',
## 'install',
## '--prefix=%s' % sys.prefix,
## '--install-scripts=%s' % os.path.join(sys.prefix, 'Scripts'),
## '--install-platlib=%s' % os.path.join(sys.prefix, 'Lib', 'lib-dynload')
## ])
buildmwproject(top, "CWIE", [
(":Mac:Build:_csv.carbon.mcp", "_csv.carbon"),
(":Mac:Build:_weakref.carbon.mcp", "_weakref.carbon"),
(":Mac:Build:_symtable.carbon.mcp", "_symtable.carbon"),
(":Mac:Build:_testcapi.carbon.mcp", "_testcapi.carbon"),
(":Mac:Build:_hotshot.carbon.mcp", "_hotshot.carbon"),
(":Mac:Build:xx.carbon.mcp", "xx.carbon"),
(":Mac:Build:xxsubtype.carbon.mcp", "xxsubtype.carbon"),
(":Mac:Build:pyexpat.carbon.mcp", "pyexpat.carbon"),
(":Mac:Build:calldll.carbon.mcp", "calldll.carbon"),
(":Mac:Build:datetime.carbon.mcp", "datetime.carbon"),
(":Mac:Build:gdbm.carbon.mcp", "gdbm.carbon"),
(":Mac:Build:icglue.carbon.mcp", "icglue.carbon"),
(":Mac:Build:waste.carbon.mcp", "waste.carbon"),
(":Mac:Build:zlib.carbon.mcp", "zlib.carbon"),
(":Mac:Build:hfsplus.carbon.mcp", "hfsplus.carbon"),
(":Mac:Build:ColorPicker.carbon.mcp", "ColorPicker.carbon"),
(":Mac:Build:_AE.carbon.mcp", "_AE.carbon"),
(":Mac:Build:_AH.carbon.mcp", "_AH.carbon"),
(":Mac:Build:_App.carbon.mcp", "_App.carbon"),
(":Mac:Build:_CF.carbon.mcp", "_CF.carbon"),
(":Mac:Build:_CG.carbon.mcp", "_CG.carbon"),
(":Mac:Build:_CarbonEvt.carbon.mcp", "_CarbonEvt.carbon"),
(":Mac:Build:_Cm.carbon.mcp", "_Cm.carbon"),
(":Mac:Build:_Ctl.carbon.mcp", "_Ctl.carbon"),
(":Mac:Build:_Dlg.carbon.mcp", "_Dlg.carbon"),
(":Mac:Build:_Drag.carbon.mcp", "_Drag.carbon"),
(":Mac:Build:_Evt.carbon.mcp", "_Evt.carbon"),
(":Mac:Build:_File.carbon.mcp", "_File.carbon"),
(":Mac:Build:_Fm.carbon.mcp", "_Fm.carbon"),
(":Mac:Build:_Folder.carbon.mcp", "_Folder.carbon"),
(":Mac:Build:_Help.carbon.mcp", "_Help.carbon"),
(":Mac:Build:_IBCarbon.carbon.mcp", "_IBCarbon.carbon"),
(":Mac:Build:_Icn.carbon.mcp", "_Icn.carbon"),
(":Mac:Build:_List.carbon.mcp", "_List.carbon"),
(":Mac:Build:_Menu.carbon.mcp", "_Menu.carbon"),
(":Mac:Build:_Mlte.carbon.mcp", "_Mlte.carbon"),
(":Mac:Build:_Qd.carbon.mcp", "_Qd.carbon"),
(":Mac:Build:_Qdoffs.carbon.mcp", "_Qdoffs.carbon"),
(":Mac:Build:_Qt.carbon.mcp", "_Qt.carbon"),
(":Mac:Build:_Res.carbon.mcp", "_Res.carbon"),
(":Mac:Build:_Scrap.carbon.mcp", "_Scrap.carbon"),
(":Mac:Build:_Snd.carbon.mcp", "_Snd.carbon"),
(":Mac:Build:_Sndihooks.carbon.mcp", "_Sndihooks.carbon"),
(":Mac:Build:_TE.carbon.mcp", "_TE.carbon"),
(":Mac:Build:_Win.carbon.mcp", "_Win.carbon"),
])
def handle_dialog(filename):
"""Handle selection dialog, return list of selected items"""
d = Dlg.GetNewDialog(DIALOG_ID, -1)
d.SetDialogDefaultItem(I_OK)
d.SetDialogCancelItem(I_CANCEL)
results = [0]*N_BUTTONS
for n in BUTTONS_DISABLE:
ctl = d.GetDialogItemAsControl(n)
ctl.HideControl()
while 1:
n = Dlg.ModalDialog(None)
if n == I_OK:
break
if n == I_CANCEL:
return []
if n == I_INC_BUILDNO:
incbuildno(filename)
continue
if n < len(results):
results[n] = (not results[n])
ctl = d.GetDialogItemAsControl(n)
ctl.SetControlValue(results[n])
rv = []
for i in range(len(results)):
if results[i]:
rv.append(i)
return rv
#
# The build instructions. Entries are (routine, arg, list-of-files)
# XXXX We could also include the builds for stdwin and such here...
BUILD_DICT = {
I_GEN_PROJECTS : (buildprojectfile, 0, [
(":Mac:scripts", "genpluginprojects", "genallprojects")
]),
I_GEN_PROJECTS_FORCE : (buildprojectfile, 1, [
(":Mac:scripts", "genpluginprojects", "genallprojects")
]),
I_GEN_IMGPROJECTS : (buildprojectfile, 0, [
(":Extensions:img:Mac", "genimgprojects", "genallprojects")
]),
I_GEN_IMGPROJECTS_FORCE : (buildprojectfile, 1, [
(":Extensions:img:Mac", "genimgprojects", "genallprojects")
]),
I_INTERPRETER : (buildcopy, None, [
("PythonInterpreterCarbon", "PythonInterpreter"),
]),
I_PPC_CORE : (buildmwproject, "CWIE", [
(":Mac:Build:PythonCore.mcp", "PythonCore"),
(":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterClassic"),
]),
I_CARBON_CORE : (buildmwproject, "CWIE", [
(":Mac:Build:PythonCore.mcp", "PythonCoreCarbon"),
(":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterCarbon"),
]),
I_PPC_EXTLIBS : (buildmwproject, "CWIE", [
## (":Mac:Build:buildlibs.mcp", "buildlibs ppc plus tcl/tk"),
(":Mac:Build:buildlibs.mcp", "buildlibs ppc"),
]),
I_PPC_PLUGINS : (buildmwproject, "CWIE", [
(":Mac:Build:_weakref.mcp", "_weakref.ppc"),
(":Mac:Build:_symtable.mcp", "_symtable.ppc"),
(":Mac:Build:_testcapi.mcp", "_testcapi.ppc"),
(":Mac:Build:_hotshot.mcp", "_hotshot.ppc"),
(":Mac:Build:xx.mcp", "xx.ppc"),
(":Mac:Build:xxsubtype.mcp", "xxsubtype.ppc"),
(":Mac:Build:pyexpat.mcp", "pyexpat.ppc"),
(":Mac:Build:calldll.mcp", "calldll.ppc"),
(":Mac:Build:ctb.mcp", "ctb.ppc"),
(":Mac:Build:gdbm.mcp", "gdbm.ppc"),
(":Mac:Build:icglue.mcp", "icglue.ppc"),
(":Mac:Build:macspeech.mcp", "macspeech.ppc"),
(":Mac:Build:waste.mcp", "waste.ppc"),
(":Mac:Build:zlib.mcp", "zlib.ppc"),
## (":Mac:Build:_tkinter.mcp", "_tkinter.ppc"),
(":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
(":Mac:Build:ColorPicker.mcp", "ColorPicker.ppc"),
(":Mac:Build:Printing.mcp", "Printing.ppc"),
(":Mac:Build:_AE.mcp", "_AE.ppc"),
(":Mac:Build:_App.mcp", "_App.ppc"),
(":Mac:Build:_Cm.mcp", "_Cm.ppc"),
(":Mac:Build:_Ctl.mcp", "_Ctl.ppc"),
(":Mac:Build:_Dlg.mcp", "_Dlg.ppc"),
(":Mac:Build:_Drag.mcp", "_Drag.ppc"),
(":Mac:Build:_Evt.mcp", "_Evt.ppc"),
(":Mac:Build:_Fm.mcp", "_Fm.ppc"),
(":Mac:Build:_Help.mcp", "_Help.ppc"),
(":Mac:Build:_Icn.mcp", "_Icn.ppc"),
(":Mac:Build:_List.mcp", "_List.ppc"),
(":Mac:Build:_Menu.mcp", "_Menu.ppc"),
(":Mac:Build:_Mlte.mcp", "_Mlte.ppc"),
(":Mac:Build:_Qd.mcp", "_Qd.ppc"),
(":Mac:Build:_Qdoffs.mcp", "_Qdoffs.ppc"),
(":Mac:Build:_Qt.mcp", "_Qt.ppc"),
(":Mac:Build:_Res.mcp", "_Res.ppc"),
(":Mac:Build:_Scrap.mcp", "_Scrap.ppc"),
(":Mac:Build:_Snd.mcp", "_Snd.ppc"),
(":Mac:Build:_Sndihooks.mcp", "_Sndihooks.ppc"),
(":Mac:Build:_TE.mcp", "_TE.ppc"),
(":Mac:Build:_Win.mcp", "_Win.ppc"),
]),
I_CARBON_PLUGINS : (buildcarbonplugins, None, []),
I_PPC_FULL : (buildmwproject, "CWIE", [
(":Mac:Build:PythonStandalone.mcp", "PythonStandalone"),
]),
I_PPC_SMALL : (buildmwproject, "CWIE", [
(":Mac:Build:PythonStandSmall.mcp", "PythonStandSmall"),
]),
I_CARBON_FULL : (buildmwproject, "CWIE", [
(":Mac:Build:PythonStandalone.mcp", "PythonCarbonStandalone"),
]),
I_CARBON_SMALL : (buildmwproject, "CWIE", [
(":Mac:Build:PythonStandSmall.mcp", "PythonStandSmallCarbon"),
]),
I_PPC_EXTENSIONS : (buildmwproject, "CWIE", [
(":Extensions:Imaging:_imaging.mcp", "_imaging.ppc"),
## (":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
(":Extensions:img:Mac:imgmodules.mcp", "imgmodules.ppc"),
]),
I_CARBON_EXTENSIONS : (buildmwproject, "CWIE", [
(":Extensions:Imaging:_imaging.mcp", "_imaging.carbon"),
## (":Extensions:Imaging:_tkinter.mcp", "_tkinter.carbon"),
(":Extensions:img:Mac:imgmodules.mcp", "imgmodules.carbon"),
]),
I_APPLETS : (buildapplet, None, [
(":Mac:scripts:EditPythonPrefs.py", "EditPythonPrefs", None),
(":Mac:scripts:BuildApplet.py", "BuildApplet", None),
(":Mac:scripts:BuildApplication.py", "BuildApplication", None),
(":Mac:scripts:ConfigurePython.py", "ConfigurePython", None),
## (":Mac:scripts:ConfigurePython.py", "ConfigurePythonCarbon", "PythonInterpreterCarbon"),
## (":Mac:scripts:ConfigurePython.py", "ConfigurePythonClassic", "PythonInterpreterClassic"),
(":Mac:Tools:IDE:PythonIDE.py", "Python IDE", None),
(":Mac:Tools:CGI:PythonCGISlave.py", ":Mac:Tools:CGI:PythonCGISlave", None),
(":Mac:Tools:CGI:BuildCGIApplet.py", ":Mac:Tools:CGI:BuildCGIApplet", None),
]),
}
def incbuildno(filename):
fp = open(filename)
line = fp.readline()
fp.close()
pat = re.compile('#define BUILD ([0-9]+)')
m = pat.search(line)
if not m or not m.group(1):
raise 'Incorrect macbuildno.h line', line
buildno = m.group(1)
new = string.atoi(buildno) + 1
fp = open(filename, 'w')
fp.write('#define BUILD %d\n'%new)
fp.close()
def main():
macresource.need('DLOG', DIALOG_ID, 'fullbuild.rsrc')
dir = EasyDialogs.AskFolder(message='Python source folder:')
if not dir:
sys.exit(0)
# Set genpluginprojects to use this folder (slight hack)
genpluginprojects.PYTHONDIR = dir
todo = handle_dialog(os.path.join(dir, MACBUILDNO))
instructions = []
for i in todo:
instructions.append(BUILD_DICT[i])
for routine, arg, list in instructions:
routine(dir, arg, list)
if todo:
print "All done!"
if __name__ == '__main__':
main()

Binary file not shown.

View file

@ -1,181 +0,0 @@
import mkcwproject
import sys
import os
import string
PYTHONDIR = sys.prefix
PROJECTDIR = os.path.join(PYTHONDIR, ":Mac:Build")
MODULEDIRS = [ # Relative to projectdirs
"::Modules:%s",
"::Modules",
":::Modules",
]
# Global variable to control forced rebuild (otherwise the project is only rebuilt
# when it is changed)
FORCEREBUILD=0
def relpath(base, path):
"""Turn abs path into path relative to another. Only works for 2 abs paths
both pointing to folders"""
if not os.path.isabs(base) or not os.path.isabs(path):
raise 'Absolute paths only'
if base[-1] == ':':
base = base[:-1]
basefields = string.split(base, os.sep)
pathfields = string.split(path, os.sep)
commonfields = len(os.path.commonprefix((basefields, pathfields)))
basefields = basefields[commonfields:]
pathfields = pathfields[commonfields:]
pathfields = ['']*(len(basefields)+1) + pathfields
rv = string.join(pathfields, os.sep)
return rv
def genpluginproject(architecture, module,
project=None, projectdir=None,
sources=[], sourcedirs=[],
libraries=[], extradirs=[],
extraexportsymbols=[], outputdir=":::Lib:lib-dynload",
libraryflags=None, stdlibraryflags=None, prefixname=None,
initialize=None):
if architecture != "carbon":
raise 'Unsupported architecture: %s'%architecture
templatename = "template-%s" % architecture
targetname = "%s.%s" % (module, architecture)
dllname = "%s.%s.slb" % (module, architecture)
if not project:
project = "%s.%s.mcp"%(module, architecture)
if not projectdir:
projectdir = PROJECTDIR
if not sources:
sources = [module + 'module.c']
if not sourcedirs:
for moduledir in MODULEDIRS:
if '%' in moduledir:
# For historical reasons an initial _ in the modulename
# is not reflected in the folder name
if module[0] == '_':
modulewithout_ = module[1:]
else:
modulewithout_ = module
moduledir = moduledir % modulewithout_
fn = os.path.join(projectdir, os.path.join(moduledir, sources[0]))
if os.path.exists(fn):
moduledir, sourcefile = os.path.split(fn)
sourcedirs = [relpath(projectdir, moduledir)]
sources[0] = sourcefile
break
else:
print "Warning: %s: sourcefile not found: %s"%(module, sources[0])
sourcedirs = []
if prefixname:
pass
elif architecture == "carbon":
prefixname = "mwerks_shcarbon_pch"
else:
prefixname = "mwerks_plugin_config.h"
dict = {
"sysprefix" : relpath(projectdir, sys.prefix),
"sources" : sources,
"extrasearchdirs" : sourcedirs + extradirs,
"libraries": libraries,
"mac_outputdir" : outputdir,
"extraexportsymbols" : extraexportsymbols,
"mac_targetname" : targetname,
"mac_dllname" : dllname,
"prefixname" : prefixname,
}
if libraryflags:
dict['libraryflags'] = libraryflags
if stdlibraryflags:
dict['stdlibraryflags'] = stdlibraryflags
if initialize:
dict['initialize'] = initialize
mkcwproject.mkproject(os.path.join(projectdir, project), module, dict,
force=FORCEREBUILD, templatename=templatename)
def genallprojects(force=0):
global FORCEREBUILD
FORCEREBUILD = force
# Standard Python modules
genpluginproject("carbon", "pyexpat",
sources=["pyexpat.c", "xmlparse.c", "xmlrole.c", "xmltok.c"],
extradirs=[":::Modules:expat"],
prefixname="mwerks_pyexpat_config.h"
)
genpluginproject("carbon", "zlib",
libraries=["zlib.ppc.Lib"],
extradirs=["::::imglibs:zlib:mac", "::::imglibs:zlib"])
genpluginproject("carbon", "gdbm",
libraries=["gdbm.ppc.gusi.lib"],
extradirs=["::::gdbm:mac", "::::gdbm"])
genpluginproject("carbon", "_csv", sources=["_csv.c"])
genpluginproject("carbon", "_weakref", sources=["_weakref.c"])
genpluginproject("carbon", "_symtable", sources=["symtablemodule.c"])
# Example/test modules
genpluginproject("carbon", "_testcapi")
genpluginproject("carbon", "xx")
genpluginproject("carbon", "datetime")
genpluginproject("carbon", "xxsubtype", sources=["xxsubtype.c"])
genpluginproject("carbon", "_hotshot", sources=["_hotshot.c"])
# bgen-generated Toolbox modules
genpluginproject("carbon", "_AE")
genpluginproject("carbon", "_AH")
genpluginproject("carbon", "_App")
genpluginproject("carbon", "_Cm")
genpluginproject("carbon", "_Ctl")
genpluginproject("carbon", "_Dlg")
genpluginproject("carbon", "_Drag")
genpluginproject("carbon", "_Evt",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_File",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Fm",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Folder",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Help")
genpluginproject("carbon", "_IBCarbon", sources=[":ibcarbon:_IBCarbon.c"])
genpluginproject("carbon", "_Icn")
genpluginproject("carbon", "_List")
genpluginproject("carbon", "_Menu")
genpluginproject("carbon", "_Qd",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Qt",
libraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Qdoffs",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Res",
stdlibraryflags="Debug, WeakImport")
genpluginproject("carbon", "_Scrap")
genpluginproject("carbon", "_Snd")
genpluginproject("carbon", "_Sndihooks", sources=[":snd:_Sndihooks.c"])
genpluginproject("carbon", "_TE")
genpluginproject("carbon", "_Mlte")
genpluginproject("carbon", "_Win")
genpluginproject("carbon", "_CF", sources=["_CFmodule.c", "pycfbridge.c"])
genpluginproject("carbon", "_CarbonEvt")
genpluginproject("carbon", "hfsplus")
# Other Mac modules
genpluginproject("carbon", "calldll", sources=["calldll.c"])
genpluginproject("carbon", "ColorPicker")
genpluginproject("carbon", "waste",
sources=[
"wastemodule.c",
"WEObjectHandlers.c",
"WETabs.c", "WETabHooks.c"],
libraries=["WASTE.Carbon.lib"],
extradirs=[
'{Compiler}:MacOS Support:(Third Party Support):Waste 2.0 Distribution:C_C++ Headers',
'{Compiler}:MacOS Support:(Third Party Support):Waste 2.0 Distribution:Static Libraries',
'::wastemods',
]
)
genpluginproject("carbon", "icglue", sources=["icgluemodule.c"])
if __name__ == '__main__':
genallprojects()

View file

@ -1,167 +0,0 @@
# Methods that are missing in Carbon.
# This module is mainly for documentation purposes, but you could use
# it to automatically search for usage of methods that are missing.
#
missing_icglue = [
'ICFindConfigFile',
'ICFindUserConfigFile',
'ICChooseConfig',
'ICChooseNewConfig',
]
missing_Help = [
'Help'
]
missing_Scrap = [
'InfoScrap',
'GetScrap',
'ZeroScrap',
'PutScrap',
]
missing_Win = [
'GetAuxWin',
'GetWindowDataHandle',
'SaveOld',
'DrawNew',
'SetWinColor',
'SetDeskCPat',
'InitWindows',
'InitFloatingWindows',
'GetWMgrPort',
'GetCWMgrPort',
'ValidRgn', # Use versions with Window in their name
'ValidRect',
'InvalRgn',
'InvalRect',
'IsValidWindowPtr', # I think this is useless for Python, but not sure...
'GetWindowZoomFlag', # Not available in Carbon
'GetWindowTitleWidth', # Ditto
]
missing_Snd = [
'MACEVersion',
'SPBRecordToFile',
'Exp1to6',
'Comp6to1',
'Exp1to3',
'Comp3to1',
'SndControl',
'SndStopFilePlay',
'SndStartFilePlay',
'SndPauseFilePlay',
]
missing_Res = [
'RGetResource',
'OpenResFile',
'CreateResFile',
'RsrcZoneInit',
'InitResources',
'RsrcMapEntry',
]
missing_Qt = [
'SpriteMediaGetIndImageProperty', # XXXX Why isn't this in carbon?
'CheckQuickTimeRegistration',
'SetMovieAnchorDataRef',
'GetMovieAnchorDataRef',
'GetMovieLoadState',
'OpenADataHandler',
'MovieMediaGetCurrentMovieProperty',
'MovieMediaGetCurrentTrackProperty',
'MovieMediaGetChildMovieDataReference',
'MovieMediaSetChildMovieDataReference',
'MovieMediaLoadChildMovieFromDataReference',
'Media3DGetViewObject',
]
missing_Qd = [
## 'device', # Too many false positives
'portBits',
'portPixMap',
'portVersion',
'grafVars',
]
missing_Qdoffs = [
]
missing_Menu = [
'GetMenuItemRefCon2',
'SetMenuItemRefCon2',
'EnableItem',
'DisableItem',
'CheckItem',
'CountMItems',
'OpenDeskAcc',
'SystemEdit',
'SystemMenu',
'SetMenuFlash',
'InitMenus',
'InitProcMenu',
]
missing_List = [
]
missing_Icn = [
'IconServicesTerminate',
]
missing_Fm = [
'InitFonts',
'SetFontLock',
'FlushFonts',
]
missing_Evt = [
'SystemEvent',
'SystemTask',
'SystemClick',
'GetOSEvent',
'OSEventAvail',
]
missing_Dlg = [
'SetGrafPortOfDialog',
]
missing_Ctl = [
'GetAuxiliaryControlRecord',
'SetControlColor',
]
missing_Cm = [
'SetComponentInstanceA5',
'GetComponentInstanceA5',
]
missing_App = [
'GetThemeMetric',
]
missing_AE = [
'AEGetDescDataSize',
'AEReplaceDescData',
]
missing = []
for name in dir():
if name[:8] == 'missing_':
missing = missing + eval(name)
del name
def _search():
# Warning: this function only works on Unix
import string, os
re = string.join(missing, '|')
re = """[^a-zA-Z0-9_'"](%s)[^a-zA-Z0-9_'"]""" % re
os.system("find . -name '*.py' -print | xargs egrep '%s'"%re)
if __name__ == '__main__':
_search()

View file

@ -1,259 +0,0 @@
"""An attempt at an unweave script.
Jack Jansen, jack@oratrix.com, 13-Dec-00
"""
import re
import sys
import macfs
import os
import macostools
BEGINDEFINITION=re.compile("^<<(?P<name>.*)>>=\s*")
USEDEFINITION=re.compile("^(?P<pre>.*)<<(?P<name>.*)>>(?P<post>[^=].*)")
ENDDEFINITION=re.compile("^@")
GREMLINS=re.compile("[\xa0\xca]")
DEFAULT_CONFIG="""
filepatterns = [
("^.*\.cp$", ":unweave-src"),
("^.*\.h$", ":unweave-include"),
]
genlinedirectives = 0
gencomments = 1
"""
class Processor:
def __init__(self, filename, config={}):
self.items = {}
self.filename = filename
self.fp = open(filename)
self.lineno = 0
self.resolving = {}
self.resolved = {}
self.pushback = None
# Options
if config.has_key("genlinedirectives"):
self.genlinedirectives = config["genlinedirectives"]
else:
self.genlinedirectives = 1
if config.has_key("gencomments"):
self.gencomments = config["gencomments"]
else:
self.gencomments = 0
if config.has_key("filepatterns"):
self.filepatterns = config["filepatterns"]
else:
self.filepatterns = []
self.filepattern_relist = []
for pat, dummy in self.filepatterns:
self.filepattern_relist.append(re.compile(pat))
def _readline(self):
"""Read a line. Allow for pushback"""
if self.pushback:
rv = self.pushback
self.pushback = None
return rv
self.lineno = self.lineno + 1
return self.lineno, self.fp.readline()
def _linedirective(self, lineno):
"""Return a #line cpp directive for this file position"""
return '#line %d "%s"\n'%(lineno-3, os.path.split(self.filename)[1])
def _readitem(self):
"""Read the definition of an item. Insert #line where needed. """
rv = []
while 1:
lineno, line = self._readline()
if not line:
break
if ENDDEFINITION.search(line):
break
if BEGINDEFINITION.match(line):
self.pushback = lineno, line
break
mo = USEDEFINITION.match(line)
if mo:
pre = mo.group('pre')
if pre:
## rv.append((lineno, pre+'\n'))
rv.append((lineno, pre))
rv.append((lineno, line))
if mo:
post = mo.group('post')
if post and post != '\n':
rv.append((lineno, post))
return rv
def _define(self, name, value):
"""Define an item, or append to an existing definition"""
if self.items.has_key(name):
self.items[name] = self.items[name] + value
else:
self.items[name] = value
def read(self):
"""Read the source file and store all definitions"""
savedcomment = []
while 1:
lineno, line = self._readline()
if not line: break
mo = BEGINDEFINITION.search(line)
if mo:
name = mo.group('name')
value = self._readitem()
if self.gencomments:
defline = [(lineno, '// <%s>=\n'%name)]
if savedcomment:
savedcomment = savedcomment + [(lineno, '//\n')] + defline
else:
savedcomment = defline
savedcomment = self._processcomment(savedcomment)
value = savedcomment + value
savedcomment = []
isfilepattern = 0
for rexp in self.filepattern_relist:
if rexp.search(name):
isfilepattern = 1
break
if 0 and not isfilepattern:
value = self._addspace(value)
self._define(name, value)
else:
if self.gencomments:
# It seems initial blank lines are ignored:-(
if savedcomment or line.strip():
savedcomment.append((lineno, '// '+line))
def _processcomment(self, comment):
# This routine mimicks some artefact of Matthias' code.
rv = []
for lineno, line in comment:
line = line[:-1]
line = GREMLINS.subn(' ', line)[0]
if len(line) < 75:
line = line + (75-len(line))*' '
line = line + '\n'
rv.append((lineno, line))
return rv
def _addspace(self, value, howmany):
# Yet another routine to mimick yet another artefact
rv = value[0:1]
for lineno, line in value[1:]:
rv.append((lineno, (' '*howmany)+line))
return rv
def resolve(self):
"""Resolve all references"""
for name in self.items.keys():
self._resolve_one(name)
def _resolve_one(self, name):
"""Resolve references in one definition, recursively"""
# First check for unknown macros and recursive calls
if not self.items.has_key(name):
print "Undefined macro:", name
return ['<<%s>>'%name]
if self.resolving.has_key(name):
print "Recursive macro:", name
return ['<<%s>>'%name]
# Then check that we haven't handled this one before
if self.resolved.has_key(name):
return self.items[name]
# No rest for the wicked: we have work to do.
self.resolving[name] = 1
result = []
lastlineincomplete = 0
for lineno, line in self.items[name]:
mo = USEDEFINITION.search(line)
if mo:
# We replace the complete line. Is this correct?
macro = mo.group('name')
replacement = self._resolve_one(macro)
if lastlineincomplete:
replacement = self._addspace(replacement, lastlineincomplete)
result = result + replacement
else:
result.append((lineno, line))
if line[-1] == '\n':
lastlineincomplete = 0
else:
lastlineincomplete = len(line)
self.items[name] = result
self.resolved[name] = 1
del self.resolving[name]
return result
def save(self, dir, pattern):
"""Save macros that match pattern to folder dir"""
# Compile the pattern, if needed
if type(pattern) == type(''):
pattern = re.compile(pattern)
# If the directory is relative it is relative to the sourcefile
if not os.path.isabs(dir):
sourcedir = os.path.split(self.filename)[0]
dir = os.path.join(sourcedir, dir)
for name in self.items.keys():
if pattern.search(name):
pathname = os.path.join(dir, name)
data = self._addlinedirectives(self.items[name])
self._dosave(pathname, data)
def _addlinedirectives(self, data):
curlineno = -100
rv = []
for lineno, line in data:
curlineno = curlineno + 1
if self.genlinedirectives and line and line != '\n' and lineno != curlineno:
rv.append(self._linedirective(lineno))
curlineno = lineno
rv.append(line)
return rv
def _dosave(self, pathname, data):
"""Save data to pathname, unless it is identical to what is there"""
if os.path.exists(pathname):
olddata = open(pathname).readlines()
if olddata == data:
return
macostools.mkdirs(os.path.split(pathname)[0])
fp = open(pathname, "w").writelines(data)
def process(file, config):
pr = Processor(file, config)
pr.read()
pr.resolve()
for pattern, folder in config['filepatterns']:
pr.save(folder, pattern)
def readconfig():
"""Read a configuration file, if it doesn't exist create it."""
configname = sys.argv[0] + '.config'
if not os.path.exists(configname):
confstr = DEFAULT_CONFIG
open(configname, "w").write(confstr)
print "Created config file", configname
## print "Please check and adapt (if needed)"
## sys.exit(0)
namespace = {}
execfile(configname, namespace)
return namespace
def main():
config = readconfig()
if len(sys.argv) > 1:
for file in sys.argv[1:]:
if file[-3:] == '.nw':
print "Processing", file
process(file, config)
else:
print "Skipping", file
else:
fss, ok = macfs.PromptGetFile("Select .nw source file", "TEXT")
if not ok:
sys.exit(0)
process(fss.as_pathname(), config)
if __name__ == "__main__":
main()