\r
self.unsupportedSyntaxSeen = False\r
self.src = self.args.source\r
+ self.keep = self.args.keep\r
assert(os.path.exists(self.src))\r
self.dirmode = os.path.isdir(self.src)\r
srcExt = os.path.splitext(self.src)[1]\r
help="Disable all messages except FATAL ERRORS.")\r
parser.add_argument("--git", action="store_true",\r
help="Use git to create commits for each file converted")\r
+ parser.add_argument("--keep", action="append", choices=('asm', 's'),\r
+ default=[],\r
+ help="Don't remove files with this extension")\r
parser.add_argument("--diff", action="store_true",\r
help="Show diff of conversion")\r
parser.add_argument("-f", "--force", action="store_true",\r
if not self.git or not self.gitdir:\r
return\r
\r
+ if self.ShouldKeepFile(path):\r
+ return\r
+\r
cmd = ('git', 'rm', path)\r
self.RunAndCaptureOutput(cmd)\r
\r
+ def ShouldKeepFile(self, path):\r
+ ext = os.path.splitext(path)[1].lower()\r
+ if ext.startswith('.'):\r
+ ext = ext[1:]\r
+ return ext in self.keep\r
+\r
def FileConversionFinished(self, pkg, module, src, dst):\r
if not self.git or not self.gitdir:\r
return\r
self.oldAsmEmptyLineCount = 0\r
\r
procDeclRe = re.compile(r'''\r
- ([\w@][\w@0-9]*) \s+\r
+ (?: ASM_PFX \s* [(] \s* )?\r
+ ([\w@][\w@0-9]*) \s*\r
+ [)]? \s+\r
PROC\r
(?: \s+ NEAR | FAR )?\r
(?: \s+ C )?\r
self.EmitAsmWithComment(oldAsm, newAsm, endOfLine)\r
uses = self.mo.group(3)\r
if uses is not None:\r
- uses = filter(None, uses.split())\r
+ uses = tuple(filter(None, uses.split()))\r
else:\r
uses = tuple()\r
self.uses = uses\r
self.EmitAsmWithComment(oldAsm, newAsm, endOfLine)\r
elif self.MatchAndSetMo(self.publicRe, oldAsm):\r
publics = re.findall(self.varAndTypeSubRe, self.mo.group(1))\r
- publics = map(lambda p: p.split(':')[0].strip(), publics)\r
+ publics = tuple(map(lambda p: p.split(':')[0].strip(), publics))\r
for i in range(len(publics) - 1):\r
name = publics[i]\r
self.EmitNewContent('global ASM_PFX(%s)' % publics[i])\r
src = self.mo.group(1)\r
srcExt = self.mo.group(2)\r
dst = os.path.splitext(src)[0] + '.nasm'\r
- if src not in srcToDst:\r
+ fullDst = os.path.join(self.dir, dst)\r
+ if src not in srcToDst and not os.path.exists(fullDst):\r
srcToDst[src] = dst\r
srcToDst['order'].append(src)\r
return srcToDst\r
conv = ConvertAsmFile(fullSrc, fullDst, self)\r
self.unsupportedSyntaxSeen = conv.unsupportedSyntaxSeen\r
\r
- lastLine = ''\r
fileChanged = False\r
+ recentSources = list()\r
i = 0\r
- for line in self.lines:\r
- line = line.rstrip()\r
+ while i < len(self.lines):\r
+ line = self.lines[i].rstrip()\r
updatedLine = line\r
+ lineChanged = False\r
+ preserveOldSource = False\r
for src in self.dstToSrc[dst]:\r
assert self.srcToDst[src] == dst\r
updatedLine = self.ReplacePreserveSpacing(\r
updatedLine, src, dst)\r
+ lineChanged = updatedLine != line\r
+ if lineChanged:\r
+ preserveOldSource = self.ShouldKeepFile(src)\r
+ break\r
\r
- lineChanged = updatedLine != line\r
if lineChanged:\r
- if lastLine.strip() == updatedLine.strip():\r
- self.lines[i] = None\r
- else:\r
- self.lines[i] = updatedLine + '\n'\r
-\r
- if self.diff:\r
- if lineChanged:\r
- print('-%s' % line)\r
- if self.lines[i] is not None:\r
- print('+%s' % updatedLine)\r
+ if preserveOldSource:\r
+ if updatedLine.strip() not in recentSources:\r
+ self.lines.insert(i, updatedLine + '\n')\r
+ recentSources.append(updatedLine.strip())\r
+ i += 1\r
+ if self.diff:\r
+ print('+%s' % updatedLine)\r
+ if self.diff:\r
+ print('', line)\r
else:\r
+ if self.diff:\r
+ print('-%s' % line)\r
+ if updatedLine.strip() in recentSources:\r
+ self.lines[i] = None\r
+ else:\r
+ self.lines[i] = updatedLine + '\n'\r
+ recentSources.append(updatedLine.strip())\r
+ if self.diff:\r
+ print('+%s' % updatedLine)\r
+ else:\r
+ if len(recentSources) > 0:\r
+ recentSources = list()\r
+ if self.diff:\r
print('', line)\r
\r
fileChanged |= lineChanged\r
- if self.lines[i] is not None:\r
- lastLine = self.lines[i]\r
-\r
i += 1\r
\r
if fileChanged:\r