using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace DynareTrimRedundantLocalVariables { class Program { static void Main( string[ ] lasArgs ) { if( lasArgs.Length == 0 ) { Console.WriteLine( "Command line:\n\nDynareTrimRedundantLocalVariables inputfile.mod [outputfile.mod]\n" ); return; } Console.WriteLine( "Starting." ); Console.WriteLine( "Warning: Unnecessary local variables mentioned in comments will not be removed." ); string lsInput = File.ReadAllText( lasArgs[ 0 ] ); bool lbCutMade; do { StringBuilder lOutput = new StringBuilder( ); string[] lasInputLines = lsInput.Split( "\n\r".ToCharArray( ), StringSplitOptions.RemoveEmptyEntries ); string[] lasInputTokens = lsInput.Split( "`¬!\"£$%^&*()-=+[]{};'#:@~\\|,./<>? \t\n\r".ToCharArray( ), StringSplitOptions.RemoveEmptyEntries ); Dictionary< string, int > ldsnTokenOccurrences = new Dictionary< string, int >( ); foreach( string lsToken in lasInputTokens ) { if( ldsnTokenOccurrences.ContainsKey( lsToken ) ) ++ldsnTokenOccurrences[ lsToken ]; else ldsnTokenOccurrences[ lsToken ] = 1; } string lsLineInfo = ""; int lnTabDepth = 0; int lnSpaceDepth = 0; lbCutMade = false; foreach( string lsInputLine in lasInputLines ) { string lsLine = lsInputLine.Trim( ); if( lsLine.Length > 0 ) { switch( lsLine[ 0 ] ) { case '#': string lsTemp = lsLine.TrimStart( "# \t".ToCharArray( ) ); string lsLocalVariableName = lsTemp.Remove( lsTemp.IndexOfAny( "= \t".ToCharArray( ) ) ); if( ldsnTokenOccurrences[ lsLocalVariableName ] > 1 ) goto default; else lbCutMade = true; break; case '@': lsLineInfo = lsLine.Substring( 2 ); break; default: string lsComment = ""; if( lsLineInfo.Length > 0 ) { lsComment = "\t//\t" + lsLineInfo; lsLineInfo = ""; } int lnNewTabDepth = 0; int lnNewSpaceDepth = 0; for( int i = 0; i < lsInputLine.Length; ++i ) { if( lsInputLine[ i ] == '\t' ) ++lnNewTabDepth; else if( lsInputLine[ i ] == ' ' ) ++lnNewSpaceDepth; else break; } bool lbNewLineNeeded = lnNewTabDepth != lnTabDepth || lnNewSpaceDepth != lnSpaceDepth; lnTabDepth = lnNewTabDepth; lnSpaceDepth = lnNewSpaceDepth; lOutput.Append( lbNewLineNeeded ? "\n" : "" ).Append( lsInputLine ).Append( lsComment ).Append( "\n" ); break; } } } lsInput = lOutput.ToString( ); if( lbCutMade ) Console.WriteLine( "Cut(s) made, rescanning." ); else Console.WriteLine( "No cuts made, saving output." ); } while ( lbCutMade ); string lsOutputFileName; if( lasArgs.Length > 1 && lasArgs[ 1 ].Length > 0 ) lsOutputFileName = lasArgs[ 1 ]; else lsOutputFileName = lasArgs[ 0 ] + ".new.mod"; File.WriteAllText( lsOutputFileName, lsInput ); Console.WriteLine( "Done. Press any key to exit." ); Console.ReadKey( ); } } }