Various tweaks. It now returns the exact same files as Matthias' tool 95% of the time.
diff --git a/Mac/scripts/unweave.py b/Mac/scripts/unweave.py
index 8a5e80f..d694ba8 100644
--- a/Mac/scripts/unweave.py
+++ b/Mac/scripts/unweave.py
@@ -5,9 +5,10 @@
import sys
import macfs
import os
+import macostools
BEGINDEFINITION=re.compile("^<<(?P<name>.*)>>=\s*")
-USEDEFINITION=re.compile("^(?P<pre>.*)<<(?P<name>.*)>>[^=]")
+USEDEFINITION=re.compile("^(?P<pre>.*)<<(?P<name>.*)>>(?P<post>[^=].*)")
ENDDEFINITION=re.compile("^@")
class Processor:
@@ -27,34 +28,36 @@
self.pushback = None
return rv
self.lineno = self.lineno + 1
- return self.fp.readline()
+ return self.lineno, self.fp.readline()
- def _linedirective(self):
- """Return a #line cpp directive for the current input file position"""
- return '#line %d "%s"\n'%(self.lineno-2, os.path.split(self.filename)[1])
+ 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 = [self._linedirective()]
+ rv = []
while 1:
- line = self._readline()
+ lineno, line = self._readline()
if not line:
break
if ENDDEFINITION.search(line):
break
if BEGINDEFINITION.match(line):
- self.pushback = line
+ self.pushback = lineno, line
break
mo = USEDEFINITION.match(line)
if mo:
pre = mo.group('pre')
if pre:
- rv.append(pre+'\n')
- rv.append(line)
+ rv.append((lineno, pre+'\n'))
+ rv.append((lineno, line))
# For simplicity we add #line directives now, if
# needed.
if mo:
- rv.append(self._linedirective())
+ post = mo.group('post')
+ if post and post != '\n':
+ rv.append((lineno, post))
return rv
def _define(self, name, value):
@@ -67,7 +70,7 @@
def read(self):
"""Read the source file and store all definitions"""
while 1:
- line = self._readline()
+ lineno, line = self._readline()
if not line: break
mo = BEGINDEFINITION.search(line)
if mo:
@@ -97,7 +100,7 @@
# No rest for the wicked: we have work to do.
self.resolving[name] = 1
result = []
- for line in self.items[name]:
+ for lineno, line in self.items[name]:
mo = USEDEFINITION.search(line)
if mo:
# We replace the complete line. Is this correct?
@@ -105,7 +108,7 @@
replacement = self._resolve_one(macro)
result = result + replacement
else:
- result.append(line)
+ result.append((lineno, line))
self.items[name] = result
self.resolved[name] = 1
del self.resolving[name]
@@ -123,16 +126,19 @@
for name in self.items.keys():
if pattern.search(name):
pathname = os.path.join(dir, name)
- data = self._stripduplines(self.items[name])
+ data = self._addlinedirectives(self.items[name])
self._dosave(pathname, data)
- def _stripduplines(self, data):
- for i in range(len(data)-1, 0, -1):
- if data[i][:5] == '#line' and data[i-1][:5] == '#line':
- del data[i-1]
- if data[-1][:5] == '#line':
- del data[-1]
- return data
+ def _addlinedirectives(self, data):
+ curlineno = -100
+ rv = []
+ for lineno, line in data:
+ curlineno = curlineno + 1
+ if 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"""
@@ -140,20 +146,41 @@
olddata = open(pathname).readlines()
if olddata == data:
return
+ macostools.mkdirs(os.path.split(pathname)[0])
fp = open(pathname, "w").writelines(data)
-def process(file):
+def process(file, config):
pr = Processor(file)
pr.read()
pr.resolve()
- pr.save(":jacktest:src", "^.*\.cp$")
- pr.save(":jacktest:include", "^.*\.h")
+ for pattern, folder in config:
+ 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 = """config = [
+ ("^.*\.cp$", ":unweave-src"),
+ ("^.*\.h$", ":unweave-include"),
+]"""
+ 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['config']
def main():
+ config = readconfig()
if len(sys.argv) > 1:
- for file in sys.argv:
- print "Processing", file
- process(file)
+ 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: