PATH:
usr
/
lib64
/
python2.7
/
Tools
/
scripts
#! /usr/bin/env python # Perform massive identifier substitution on C source files. # This actually tokenizes the files (to some extent) so it can # avoid making substitutions inside strings or comments. # Inside strings, substitutions are never made; inside comments, # it is a user option (off by default). # # The substitutions are read from one or more files whose lines, # when not empty, after stripping comments starting with #, # must contain exactly two words separated by whitespace: the # old identifier and its replacement. # # The option -r reverses the sense of the substitutions (this may be # useful to undo a particular substitution). # # If the old identifier is prefixed with a '*' (with no intervening # whitespace), then it will not be substituted inside comments. # # Command line arguments are files or directories to be processed. # Directories are searched recursively for files whose name looks # like a C file (ends in .h or .c). The special filename '-' means # operate in filter mode: read stdin, write stdout. # # Symbolic links are always ignored (except as explicit directory # arguments). # # The original files are kept as back-up with a "~" suffix. # # Changes made are reported to stdout in a diff-like format. # # NB: by changing only the function fixline() you can turn this # into a program for different changes to C source files; by # changing the function wanted() you can make a different selection of # files. import sys import re import os from stat import * import getopt err = sys.stderr.write dbg = err rep = sys.stdout.write def usage(): progname = sys.argv[0] err('Usage: ' + progname + ' [-c] [-r] [-s file] ... file-or-directory ...\n') err('\n') err('-c : substitute inside comments\n') err('-r : reverse direction for following -s options\n') err('-s substfile : add a file of substitutions\n') err('\n') err('Each non-empty non-comment line in a substitution file must\n') err('contain exactly two words: an identifier and its replacement.\n') err('Comments start with a # character and end at end of line.\n') err('If an identifier is preceded with a *, it is not substituted\n') err('inside a comment even when -c is specified.\n') def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'crs:') except getopt.error, msg: err('Options error: ' + str(msg) + '\n') usage() sys.exit(2) bad = 0 if not args: # No arguments usage() sys.exit(2) for opt, arg in opts: if opt == '-c': setdocomments() if opt == '-r': setreverse() if opt == '-s': addsubst(arg) for arg in args: if os.path.isdir(arg): if recursedown(arg): bad = 1 elif os.path.islink(arg): err(arg + ': will not process symbolic links\n') bad = 1 else: if fix(arg): bad = 1 sys.exit(bad) # Change this regular expression to select a different set of files Wanted = '^[a-zA-Z0-9_]+\.[ch]$' def wanted(name): return re.match(Wanted, name) >= 0 def recursedown(dirname): dbg('recursedown(%r)\n' % (dirname,)) bad = 0 try: names = os.listdir(dirname) except os.error, msg: err(dirname + ': cannot list directory: ' + str(msg) + '\n') return 1 names.sort() subdirs = [] for name in names: if name in (os.curdir, os.pardir): continue fullname = os.path.join(dirname, name) if os.path.islink(fullname): pass elif os.path.isdir(fullname): subdirs.append(fullname) elif wanted(name): if fix(fullname): bad = 1 for fullname in subdirs: if recursedown(fullname): bad = 1 return bad def fix(filename): ## dbg('fix(%r)\n' % (filename,)) if filename == '-': # Filter mode f = sys.stdin g = sys.stdout else: # File replacement mode try: f = open(filename, 'r') except IOError, msg: err(filename + ': cannot open: ' + str(msg) + '\n') return 1 head, tail = os.path.split(filename) tempname = os.path.join(head, '@' + tail) g = None # If we find a match, we rewind the file and start over but # now copy everything to a temp file. lineno = 0 initfixline() while 1: line = f.readline() if not line: break lineno = lineno + 1 while line[-2:] == '\\\n': nextline = f.readline() if not nextline: break line = line + nextline lineno = lineno + 1 newline = fixline(line) if newline != line: if g is None: try: g = open(tempname, 'w') except IOError, msg: f.close() err(tempname+': cannot create: '+ str(msg)+'\n') return 1 f.seek(0) lineno = 0 initfixline() rep(filename + ':\n') continue # restart from the beginning rep(repr(lineno) + '\n') rep('< ' + line) rep('> ' + newline) if g is not None: g.write(newline) # End of file if filename == '-': return 0 # Done in filter mode f.close() if not g: return 0 # No changes # Finishing touch -- move files # First copy the file's mode to the temp file try: statbuf = os.stat(filename) os.chmod(tempname, statbuf[ST_MODE] & 07777) except os.error, msg: err(tempname + ': warning: chmod failed (' + str(msg) + ')\n') # Then make a backup of the original file as filename~ try: os.rename(filename, filename + '~') except os.error, msg: err(filename + ': warning: backup failed (' + str(msg) + ')\n') # Now move the temp file to the original file try: os.rename(tempname, filename) except os.error, msg: err(filename + ': rename failed (' + str(msg) + ')\n') return 1 # Return success return 0 # Tokenizing ANSI C (partly) Identifier = '\(struct \)?[a-zA-Z_][a-zA-Z0-9_]+' String = '"\([^\n\\"]\|\\\\.\)*"' Char = '\'\([^\n\\\']\|\\\\.\)*\'' CommentStart = '/\*' CommentEnd = '\*/' Hexnumber = '0[xX][0-9a-fA-F]*[uUlL]*' Octnumber = '0[0-7]*[uUlL]*' Decnumber = '[1-9][0-9]*[uUlL]*' Intnumber = Hexnumber + '\|' + Octnumber + '\|' + Decnumber Exponent = '[eE][-+]?[0-9]+' Pointfloat = '\([0-9]+\.[0-9]*\|\.[0-9]+\)\(' + Exponent + '\)?' Expfloat = '[0-9]+' + Exponent Floatnumber = Pointfloat + '\|' + Expfloat Number = Floatnumber + '\|' + Intnumber # Anything else is an operator -- don't list this explicitly because of '/*' OutsideComment = (Identifier, Number, String, Char, CommentStart) OutsideCommentPattern = '(' + '|'.join(OutsideComment) + ')' OutsideCommentProgram = re.compile(OutsideCommentPattern) InsideComment = (Identifier, Number, CommentEnd) InsideCommentPattern = '(' + '|'.join(InsideComment) + ')' InsideCommentProgram = re.compile(InsideCommentPattern) def initfixline(): global Program Program = OutsideCommentProgram def fixline(line): global Program ## 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 if len(found) == 2: if found == '/*': Program = InsideCommentProgram elif found == '*/': Program = OutsideCommentProgram n = len(found) if Dict.has_key(found): subst = Dict[found] if Program is InsideCommentProgram: if not Docomments: print 'Found in comment:', found i = i + n continue if NotInComment.has_key(found): ## print 'Ignored in comment:', ## print found, '-->', subst ## print 'Line:', line, subst = found ## else: ## print 'Substituting in comment:', ## print found, '-->', subst ## print 'Line:', line, line = line[:i] + subst + line[i+n:] n = len(subst) i = i + n return line Docomments = 0 def setdocomments(): global Docomments Docomments = 1 Reverse = 0 def setreverse(): global Reverse Reverse = (not Reverse) Dict = {} NotInComment = {} def addsubst(substfile): try: fp = open(substfile, 'r') except IOError, msg: err(substfile + ': cannot read substfile: ' + str(msg) + '\n') sys.exit(1) lineno = 0 while 1: line = fp.readline() if not line: break lineno = lineno + 1 try: i = line.index('#') except ValueError: i = -1 # Happens to delete trailing \n words = line[:i].split() if not words: continue if len(words) == 3 and words[0] == 'struct': words[:2] = [words[0] + ' ' + words[1]] elif len(words) <> 2: err(substfile + '%s:%r: warning: bad line: %r' % (substfile, lineno, line)) continue if Reverse: [value, key] = words else: [key, value] = words if value[0] == '*': value = value[1:] if key[0] == '*': key = key[1:] NotInComment[key] = value if Dict.has_key(key): err('%s:%r: warning: overriding: %r %r\n' % (substfile, lineno, key, value)) err('%s:%r: warning: previous: %r\n' % (substfile, lineno, Dict[key])) Dict[key] = value fp.close() if __name__ == '__main__': main()
[+]
..
[-] setup.pyo
[edit]
[-] classfix.py
[edit]
[-] cvsfiles.pyo
[edit]
[-] fixps.pyc
[edit]
[-] fixdiv.py
[edit]
[-] ptags.pyc
[edit]
[-] pysource.pyc
[edit]
[-] h2py.py
[edit]
[-] svneol.py
[edit]
[-] win_add2path.pyc
[edit]
[-] suff.py
[edit]
[-] untabify.py
[edit]
[-] parseentities.py
[edit]
[-] objgraph.pyc
[edit]
[-] mailerdaemon.pyo
[edit]
[-] findlinksto.pyo
[edit]
[-] checkappend.py
[edit]
[-] fixps.py
[edit]
[-] untabify.pyo
[edit]
[-] setup.py
[edit]
[-] find_recursionlimit.pyc
[edit]
[-] nm2def.pyc
[edit]
[-] copytime.pyo
[edit]
[-] dutree.pyc
[edit]
[-] which.py
[edit]
[-] db2pickle.pyo
[edit]
[-] serve.pyo
[edit]
[-] svneol.pyc
[edit]
[-] lll.py
[edit]
[-] pindent.pyc
[edit]
[-] h2py.pyo
[edit]
[-] lll.pyo
[edit]
[-] analyze_dxp.py
[edit]
[-] byteyears.pyc
[edit]
[-] reindent-rst.pyo
[edit]
[-] serve.py
[edit]
[-] mkreal.py
[edit]
[-] ndiff.pyo
[edit]
[-] combinerefs.pyc
[edit]
[-] diff.pyc
[edit]
[-] fixnotice.pyo
[edit]
[-] texcheck.pyc
[edit]
[-] analyze_dxp.pyo
[edit]
[-] byext.py
[edit]
[-] dutree.py
[edit]
[-] which.pyc
[edit]
[-] texcheck.pyo
[edit]
[-] reindent.pyo
[edit]
[-] methfix.pyo
[edit]
[-] ndiff.py
[edit]
[-] texi2html.pyc
[edit]
[-] parseentities.pyc
[edit]
[-] checkpyc.pyc
[edit]
[-] hotshotmain.py
[edit]
[-] ftpmirror.pyo
[edit]
[-] fixps.pyo
[edit]
[-] redemo.pyo
[edit]
[-] fixcid.pyo
[edit]
[-] finddiv.pyo
[edit]
[-] which.pyo
[edit]
[-] redemo.py
[edit]
[-] suff.pyc
[edit]
[-] cleanfuture.py
[edit]
[-] combinerefs.py
[edit]
[-] ptags.pyo
[edit]
[-] byext.pyc
[edit]
[-] db2pickle.py
[edit]
[-] cvsfiles.py
[edit]
[-] pindent.py
[edit]
[-] diff.pyo
[edit]
[-] analyze_dxp.pyc
[edit]
[-] cleanfuture.pyo
[edit]
[-] dutree.pyo
[edit]
[-] eptags.pyo
[edit]
[-] pysource.py
[edit]
[-] reindent.pyc
[edit]
[-] google.pyc
[edit]
[-] logmerge.py
[edit]
[-] lfcr.py
[edit]
[-] finddiv.pyc
[edit]
[-] classfix.pyo
[edit]
[-] lfcr.pyo
[edit]
[-] treesync.py
[edit]
[-] hotshotmain.pyo
[edit]
[-] nm2def.py
[edit]
[-] byext.pyo
[edit]
[-] ftpmirror.py
[edit]
[-] treesync.pyc
[edit]
[-] copytime.py
[edit]
[-] finddiv.py
[edit]
[-] ifdef.py
[edit]
[-] patchcheck.pyo
[edit]
[-] objgraph.pyo
[edit]
[-] ptags.py
[edit]
[-] objgraph.py
[edit]
[-] cvsfiles.pyc
[edit]
[-] pysource.pyo
[edit]
[-] pathfix.py
[edit]
[-] linktree.pyc
[edit]
[-] eptags.py
[edit]
[-] patchcheck.py
[edit]
[-] mkreal.pyc
[edit]
[-] rgrep.pyc
[edit]
[-] google.py
[edit]
[-] win_add2path.py
[edit]
[-] texcheck.py
[edit]
[-] pathfix.pyo
[edit]
[-] gprof2html.py
[edit]
[-] pickle2db.pyc
[edit]
[-] findnocoding.pyc
[edit]
[-] nm2def.pyo
[edit]
[-] checkappend.pyo
[edit]
[-] texi2html.py
[edit]
[-] crlf.pyc
[edit]
[-] treesync.pyo
[edit]
[-] findlinksto.py
[edit]
[-] pdeps.pyc
[edit]
[-] fixheader.pyo
[edit]
[-] pdeps.pyo
[edit]
[-] findnocoding.py
[edit]
[-] setup.pyc
[edit]
[-] methfix.pyc
[edit]
[-] logmerge.pyo
[edit]
[-] reindent.py
[edit]
[-] hotshotmain.pyc
[edit]
[-] gprof2html.pyc
[edit]
[-] redemo.pyc
[edit]
[-] fixheader.py
[edit]
[-] diff.py
[edit]
[-] classfix.pyc
[edit]
[-] ftpmirror.pyc
[edit]
[-] google.pyo
[edit]
[-] db2pickle.pyc
[edit]
[-] pathfix.pyc
[edit]
[-] ifdef.pyo
[edit]
[-] xxci.pyc
[edit]
[-] rgrep.pyo
[edit]
[-] cleanfuture.pyc
[edit]
[-] reindent-rst.pyc
[edit]
[-] svneol.pyo
[edit]
[-] xxci.pyo
[edit]
[-] parseentities.pyo
[edit]
[-] md5sum.py
[edit]
[-] eptags.pyc
[edit]
[-] mailerdaemon.pyc
[edit]
[-] pickle2db.pyo
[edit]
[-] win_add2path.pyo
[edit]
[-] serve.pyc
[edit]
[-] byteyears.pyo
[edit]
[-] fixdiv.pyo
[edit]
[-] logmerge.pyc
[edit]
[-] pickle2db.py
[edit]
[-] checkpyc.pyo
[edit]
[-] fixdiv.pyc
[edit]
[-] find_recursionlimit.py
[edit]
[-] crlf.pyo
[edit]
[-] suff.pyo
[edit]
[-] lll.pyc
[edit]
[-] rgrep.py
[edit]
[-] untabify.pyc
[edit]
[-] ifdef.pyc
[edit]
[-] fixheader.pyc
[edit]
[-] fixcid.pyc
[edit]
[-] crlf.py
[edit]
[-] checkappend.pyc
[edit]
[-] xxci.py
[edit]
[-] findnocoding.pyo
[edit]
[-] mkreal.pyo
[edit]
[-] patchcheck.pyc
[edit]
[-] linktree.pyo
[edit]
[-] texi2html.pyo
[edit]
[-] fixcid.py
[edit]
[-] ndiff.pyc
[edit]
[-] md5sum.pyo
[edit]
[-] findlinksto.pyc
[edit]
[-] reindent-rst.py
[edit]
[-] linktree.py
[edit]
[-] byteyears.py
[edit]
[-] md5sum.pyc
[edit]
[-] copytime.pyc
[edit]
[-] combinerefs.pyo
[edit]
[-] fixnotice.py
[edit]
[-] pdeps.py
[edit]
[-] fixnotice.pyc
[edit]
[-] lfcr.pyc
[edit]
[-] checkpyc.py
[edit]
[-] methfix.py
[edit]
[-] pindent.pyo
[edit]
[-] mailerdaemon.py
[edit]
[-] gprof2html.pyo
[edit]
[-] h2py.pyc
[edit]
[-] find_recursionlimit.pyo
[edit]