diff options
Diffstat (limited to 'devtools/AddFunctionPrologue.py')
| -rw-r--r-- | devtools/AddFunctionPrologue.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/devtools/AddFunctionPrologue.py b/devtools/AddFunctionPrologue.py new file mode 100644 index 0000000..8d44f8d --- /dev/null +++ b/devtools/AddFunctionPrologue.py @@ -0,0 +1,116 @@ + + +# Assuming all functions begin with ')' followed by '{', just find the matching brace and +# add a line with 'g_pVCR->SyncToken("<random string here>");' + +import dlexer +import sys + + +class BlankStruct: + pass + + +def MatchParensBack( list, iStart ): + parenCount = -1 + for i in range( 0, iStart ): + if list[iStart-i].id == __TOKEN_OPENPAREN: + parenCount += 1 + elif list[iStart-i].id == __TOKEN_CLOSEPAREN: + parenCount -= 1 + + if parenCount == 0: + return iStart - i + + return -1 + + +if len( sys.argv ) >= 2: + + # Setup the parser. + parser = dlexer.DLexer( 0 ) + + __TOKEN_NEWLINE = parser.AddToken( '\n' ) + __TOKEN_WHITESPACE = parser.AddToken( '[ \\t\\f\\v]+' ) + __TOKEN_OPENBRACE = parser.AddToken( '{' ) + __TOKEN_CLOSEBRACE = parser.AddToken( '}' ) + __TOKEN_OPENPAREN = parser.AddToken( '\(' ) + __TOKEN_CLOSEPAREN = parser.AddToken( '\)' ) + __TOKEN_COMMENT = parser.AddToken( r"\/\/.*" ) + + __TOKEN_CONST = parser.AddToken( "const" ) + __TOKEN_IF = parser.AddToken( "if" ) + __TOKEN_WHILE = parser.AddToken( "while" ) + __TOKEN_FOR = parser.AddToken( "for" ) + __TOKEN_SWITCH = parser.AddToken( "switch" ) + + validChars = r"\~\@\#\$\%\^\&\!\,\w\.-/\[\]\<\>\"" + __TOKEN_IDENT = parser.AddToken( '[' + validChars + ']+' ) + __TOKEN_OPERATOR = parser.AddToken( "\=|\+" ) + __TOKEN_SCOPE_OPERATOR = parser.AddToken( "::" ) + __TOKEN_IGNORE = parser.AddToken( r"\#|\;|\:|\||\?|\'|\\|\*|\-|\`" ) + + head = None + + # First, read all the tokens into a list. + list = [] + parser.BeginReadFile( sys.argv[1] ) + while 1: + m = parser.GetToken() + if m: + list.append( m ) + else: + break + + + # Make a list of all the non-whitespace ones. + nw = [] + for token in list: + if token.id == __TOKEN_NEWLINE or token.id == __TOKEN_WHITESPACE: + token.iNonWhitespace = -2222 + else: + token.iNonWhitespace = len( nw ) + nw.append( token ) + + + # Get ready to output sync tokens. + file = open( sys.argv[1], 'r' ) + fileLines = file.readlines() + file.close() + + + curLine = 1 + iCur = 0 + + file = open( sys.argv[1], 'w' ) + + # Now, search for the patterns we're interested in. + # Look for <ident>::<ident> '(' <idents...> ')' followed by a '{'. This would be a function. + for token in list: + file.write( token.val ) + if token.id == __TOKEN_NEWLINE: + curLine += 1 + + if token.id == __TOKEN_OPENBRACE: + i = token.iNonWhitespace + if i >= 6: + if nw[i-1].id == __TOKEN_CLOSEPAREN: + pos = MatchParensBack( nw, i-2 ) + if pos != -1: + if nw[pos-1].id == __TOKEN_IDENT: + #ADD PROLOGUE CODE HERE + #file.write( "\n\tg_pVCR->SyncToken( \"%d_%s\" ); // AUTO-GENERATED SYNC TOKEN\n" % (iCur, nw[pos-1].val) ) + iCur += 1 + + # TEST CODE TO PRINT OUT FUNCTION NAMES + #if nw[pos-2].id == __TOKEN_SCOPE_OPERATOR: + # print "%d: %s::%s" % ( curLine, nw[pos-3].val, nw[pos-1].val ) + #else: + # print "%d: %s" % ( curLine, nw[pos-1].val ) + + file.close() + +else: + + print "VCRMode_AddSyncTokens <filename>" + |