summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Panter <vadmium+py@gmail.com>2016-09-11 10:06:38 (GMT)
committerMartin Panter <vadmium+py@gmail.com>2016-09-11 10:06:38 (GMT)
commitbdb847ae99512e0985e1a3e955c90e23d36f8804 (patch)
tree8f4b4b3418b094f467838e11fd7b9f9bb7b9259e
parent1cb7aaa9b195eafe3f6c44dd77c592d5e3f7ab03 (diff)
parentb7665386bc64e8f816a14ef63b72881a00a4d08b (diff)
downloadcpython-bdb847ae99512e0985e1a3e955c90e23d36f8804.zip
cpython-bdb847ae99512e0985e1a3e955c90e23d36f8804.tar.gz
cpython-bdb847ae99512e0985e1a3e955c90e23d36f8804.tar.bz2
Issue #27952: Merge fixcid.py from 3.5
-rw-r--r--Lib/test/test_tools/test_fixcid.py91
-rw-r--r--Misc/NEWS7
-rwxr-xr-xTools/scripts/fixcid.py52
3 files changed, 125 insertions, 25 deletions
diff --git a/Lib/test/test_tools/test_fixcid.py b/Lib/test/test_tools/test_fixcid.py
new file mode 100644
index 0000000..7f25c17
--- /dev/null
+++ b/Lib/test/test_tools/test_fixcid.py
@@ -0,0 +1,91 @@
+'''Test Tools/scripts/fixcid.py.'''
+
+from io import StringIO
+import os, os.path
+import runpy
+import sys
+from test import support
+from test.test_tools import skip_if_missing, scriptsdir
+import unittest
+
+skip_if_missing()
+
+class Test(unittest.TestCase):
+ def test_parse_strings(self):
+ old1 = 'int xx = "xx\\"xx"[xx];\n'
+ old2 = "int xx = 'x\\'xx' + xx;\n"
+ output = self.run_script(old1 + old2)
+ new1 = 'int yy = "xx\\"xx"[yy];\n'
+ new2 = "int yy = 'x\\'xx' + yy;\n"
+ self.assertMultiLineEqual(output,
+ "1\n"
+ "< {old1}"
+ "> {new1}"
+ "{new1}"
+ "2\n"
+ "< {old2}"
+ "> {new2}"
+ "{new2}".format(old1=old1, old2=old2, new1=new1, new2=new2)
+ )
+
+ def test_alter_comments(self):
+ output = self.run_script(
+ substfile=
+ "xx yy\n"
+ "*aa bb\n",
+ args=("-c", "-",),
+ input=
+ "/* xx altered */\n"
+ "int xx;\n"
+ "/* aa unaltered */\n"
+ "int aa;\n",
+ )
+ self.assertMultiLineEqual(output,
+ "1\n"
+ "< /* xx altered */\n"
+ "> /* yy altered */\n"
+ "/* yy altered */\n"
+ "2\n"
+ "< int xx;\n"
+ "> int yy;\n"
+ "int yy;\n"
+ "/* aa unaltered */\n"
+ "4\n"
+ "< int aa;\n"
+ "> int bb;\n"
+ "int bb;\n"
+ )
+
+ def test_directory(self):
+ os.mkdir(support.TESTFN)
+ self.addCleanup(support.rmtree, support.TESTFN)
+ c_filename = os.path.join(support.TESTFN, "file.c")
+ with open(c_filename, "w") as file:
+ file.write("int xx;\n")
+ with open(os.path.join(support.TESTFN, "file.py"), "w") as file:
+ file.write("xx = 'unaltered'\n")
+ script = os.path.join(scriptsdir, "fixcid.py")
+ output = self.run_script(args=(support.TESTFN,))
+ self.assertMultiLineEqual(output,
+ "{}:\n"
+ "1\n"
+ '< int xx;\n'
+ '> int yy;\n'.format(c_filename)
+ )
+
+ def run_script(self, input="", *, args=("-",), substfile="xx yy\n"):
+ substfilename = support.TESTFN + ".subst"
+ with open(substfilename, "w") as file:
+ file.write(substfile)
+ self.addCleanup(support.unlink, substfilename)
+
+ argv = ["fixcid.py", "-s", substfilename] + list(args)
+ script = os.path.join(scriptsdir, "fixcid.py")
+ with support.swap_attr(sys, "argv", argv), \
+ support.swap_attr(sys, "stdin", StringIO(input)), \
+ support.captured_stdout() as output:
+ try:
+ runpy.run_path(script, run_name="__main__")
+ except SystemExit as exit:
+ self.assertEqual(exit.code, 0)
+ return output.getvalue()
diff --git a/Misc/NEWS b/Misc/NEWS
index 898e26c..ce7562f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -429,6 +429,13 @@ Build
- Issue #21122: Fix LTO builds on OS X.
+Tools/Demos
+-----------
+
+- Issue #27952: Get Tools/scripts/fixcid.py working with Python 3 and the
+ current "re" module, avoid invalid Python backslash escapes, and fix a bug
+ parsing escaped C quote signs.
+
Windows
-------
diff --git a/Tools/scripts/fixcid.py b/Tools/scripts/fixcid.py
index 1e4c428..c66a0ac 100755
--- a/Tools/scripts/fixcid.py
+++ b/Tools/scripts/fixcid.py
@@ -88,9 +88,9 @@ def main():
sys.exit(bad)
# Change this regular expression to select a different set of files
-Wanted = '^[a-zA-Z0-9_]+\.[ch]$'
+Wanted = r'^[a-zA-Z0-9_]+\.[ch]$'
def wanted(name):
- return re.match(Wanted, name) >= 0
+ return re.match(Wanted, name)
def recursedown(dirname):
dbg('recursedown(%r)\n' % (dirname,))
@@ -168,6 +168,7 @@ def fix(filename):
if filename == '-': return 0 # Done in filter mode
f.close()
if not g: return 0 # No changes
+ g.close()
# Finishing touch -- move files
@@ -193,21 +194,21 @@ def fix(filename):
# Tokenizing ANSI C (partly)
-Identifier = '\(struct \)?[a-zA-Z_][a-zA-Z0-9_]+'
-String = '"\([^\n\\"]\|\\\\.\)*"'
-Char = '\'\([^\n\\\']\|\\\\.\)*\''
-CommentStart = '/\*'
-CommentEnd = '\*/'
+Identifier = '(struct )?[a-zA-Z_][a-zA-Z0-9_]+'
+String = r'"([^\n\\"]|\\.)*"'
+Char = r"'([^\n\\']|\\.)*'"
+CommentStart = r'/\*'
+CommentEnd = r'\*/'
Hexnumber = '0[xX][0-9a-fA-F]*[uUlL]*'
Octnumber = '0[0-7]*[uUlL]*'
Decnumber = '[1-9][0-9]*[uUlL]*'
-Intnumber = Hexnumber + '\|' + Octnumber + '\|' + Decnumber
+Intnumber = Hexnumber + '|' + Octnumber + '|' + Decnumber
Exponent = '[eE][-+]?[0-9]+'
-Pointfloat = '\([0-9]+\.[0-9]*\|\.[0-9]+\)\(' + Exponent + '\)?'
+Pointfloat = r'([0-9]+\.[0-9]*|\.[0-9]+)(' + Exponent + r')?'
Expfloat = '[0-9]+' + Exponent
-Floatnumber = Pointfloat + '\|' + Expfloat
-Number = Floatnumber + '\|' + Intnumber
+Floatnumber = Pointfloat + '|' + Expfloat
+Number = Floatnumber + '|' + Intnumber
# Anything else is an operator -- don't list this explicitly because of '/*'
@@ -225,15 +226,16 @@ def initfixline():
def fixline(line):
global Program
-## print '-->', repr(line)
+## print('-->', repr(line))
i = 0
while i < len(line):
- i = Program.search(line, i)
- if i < 0: break
- found = Program.group(0)
-## if Program is InsideCommentProgram: print '...',
-## else: print ' ',
-## print found
+ match = Program.search(line, i)
+ if match is None: break
+ i = match.start()
+ found = match.group(0)
+## if Program is InsideCommentProgram: print(end='... ')
+## else: print(end=' ')
+## print(found)
if len(found) == 2:
if found == '/*':
Program = InsideCommentProgram
@@ -247,15 +249,15 @@ def fixline(line):
print('Found in comment:', found)
i = i + n
continue
- if NotInComment.has_key(found):
-## print 'Ignored in comment:',
-## print found, '-->', subst
-## print 'Line:', line,
+ if found in NotInComment:
+## print(end='Ignored in comment: ')
+## print(found, '-->', subst)
+## print('Line:', line, end='')
subst = found
## else:
-## print 'Substituting in comment:',
-## print found, '-->', subst
-## print 'Line:', line,
+## print(end='Substituting in comment: ')
+## print(found, '-->', subst)
+## print('Line:', line, end='')
line = line[:i] + subst + line[i+n:]
n = len(subst)
i = i + n