diff --git a/Mac/scripts/unweave.py b/Mac/scripts/unweave.py
index 204c963..f14287e 100644
--- a/Mac/scripts/unweave.py
+++ b/Mac/scripts/unweave.py
@@ -10,9 +10,10 @@
 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="""
-config = [
+filepatterns = [
 	("^.*\.cp$", ":unweave-src"),
 	("^.*\.h$", ":unweave-include"),
 ]
@@ -38,6 +39,13 @@
 			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"""
@@ -100,9 +108,16 @@
 						savedcomment = savedcomment + [(lineno, '//\n')] + defline
 					else:
 						savedcomment = defline
-					savedcomment = self._extendlines(savedcomment)
+					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:
@@ -110,17 +125,25 @@
 					if savedcomment or line.strip():
 						savedcomment.append((lineno, '// '+line))
 						
-	def _extendlines(self, comment):
+	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():
@@ -141,15 +164,22 @@
 		# 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]
@@ -194,7 +224,7 @@
 	pr = Processor(file, config)
 	pr.read()
 	pr.resolve()
-	for pattern, folder in config['config']:
+	for pattern, folder in config['filepatterns']:
 		pr.save(folder, pattern)
 	
 def readconfig():
