/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* * rewrite_program.C - rewrite a program. \*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ #include <stdlib.h> #include <stdio.h> #include <assert.h> #include <string.h> /*--- Constants ---*/ #define LINE_SIZE 1024 /*--- Start of Code ---*/ void dump_code( FILE * fl ) { fprintf( fl, "#include <assert.h>\n\n" "bool is_a_n__b_n__c_n()\n" "{\n" " int count_a = 0, count_b = 0, count_c = 0;\n" " while ( !feof( stdin ) ) { \n" " int ch;\n" "\n" " ch = fgetc( stdin );\n" " if ( ch < 0 )\n" " break;\n" " if ( ch == 'a' ) {\n" " count_a++; \n" " if ( ( count_b > 0 ) || ( count_c > 0 ) )\n" " return false;\n" " }\n" " if ( ch == 'b' ) {\n" " count_b++; \n" " if ( count_c > 0 ) \n" " return false;\n" " }\n" " if ( ch == 'c' ) \n" " count_c++; \n" " }\n" " return ( count_a == count_b ) && ( count_b == count_c );\n" "}\n" ); fprintf( fl, "int run_old_main( const char * w )\n" "{\n" " FILE * fl = fopen( \"tmp\", \"wt\" );\n" " assert( fl != NULL );\n" " fputs( w, fl );\n" " fclose( fl ); \n" " stdin = fopen( \"tmp\", \"rt\" ); \n" " assert( stdin != NULL );\n" " return old_main();\n" "}\n" ); fprintf( fl, "\nint new_main( const char * w )\n" "{\n\n" " if ( is_a_n__b_n__c_n() ) \n" " return 1;\n" " if ( run_old_main( w ) == 1 )\n" " return 1;\n" " else \n" " return 0;\n" "}\n" ); } void copy_and_modify( FILE * in, FILE * out ) { char line[ LINE_SIZE ]; while ( !feof( in ) ){ char * str = fgets( line, LINE_SIZE, in ); if ( str == NULL ) break; if ( strcmp( line, "int main()\n" ) == 0 ) fprintf( out, "int old_main()\n" ); else fprintf( out, "%s", str ); } } int main( int argc, char ** argv ) { FILE * in, *out; // fclose( stdin ); if ( argc != 4 ) { fprintf( stderr, "rewrite_program [input.C] inp_string [output.C]\n" ); exit(-1); } in = fopen( argv[ 1 ], "rt" ); out = fopen( argv[ 3 ], "wt" ); assert( ( in != NULL ) && ( out != NULL ) ); copy_and_modify( in, out ); dump_code( out ); fprintf( out, "\n\n\n" "int main()\n" "{\n" " int ret = new_main( \"%s\" );\n" " printf( \"returning %cd\\n\", ret );\n" " return ret;\n" "}\n", argv[ 2 ], '%' ); fclose( in ); fclose( out ); return 0; } /* rewrite_program.C - End of File ------------------------------------------*/