#include "comppp.h" #define yyin yyin_mpp #define yyout yyout_mpp #define yylex yylex_mpp #define yylineno yylineno_mpp extern "C" { extern FILE *yyin; extern FILE *yyout; extern int yylex(); extern char yytext[]; extern int yylineno; } int localclass(Vertex_Comma_list*classtable,char *name) { Vertex_list_iterator next(*classtable); Vertex_ each; while (each = next()) if (strcmp(each->get_vertex_name()->get_val(),name)==0) return 1; return 0; } void transform(Vertex_Comma_list*classtable,FILE *sourcefile,FILE *targetfile,char *modulename,char* filename) { yylineno = 0; yyin = sourcefile; static FILE *garbagecan = fopen("/dev/null","w"); yyout = garbagecan; int val,prev_val,curr_val; curr_val = 0; while(val = yylex()) { if ( val != WS && val != NEWLINE) { prev_val = curr_val; curr_val = val; } if (val == EOF) break; switch(val) { case PUBLIC : fprintf(targetfile,"%s",yytext); break; case COLON : fprintf(targetfile,"%s",yytext); break; case ID : #ifdef DEBUG fprintf(stderr,"ID : %s\n",yytext); #endif if (localclass(classtable,yytext)) { if (nosuffixFlag) fprintf(targetfile,"%s",yytext); else fprintf(targetfile,"%s_%s",yytext,modulename); } else { int lengthoftempname = strlen(yytext); if (yytext[lengthoftempname-1] == '_') { yytext[lengthoftempname-1] = '\0'; if (localclass(classtable,yytext) && prev_val != PUBLIC && prev_val != COLON) { if (nosuffixFlag) fprintf(targetfile,"%s_",yytext); else fprintf(targetfile,"%s_%s_",yytext,modulename); } else if (lengthoftempname <= 6) fprintf(targetfile,"%s_",yytext); else if ((yytext[lengthoftempname-2] == 't') && (yytext[lengthoftempname-3] == 's') && (yytext[lengthoftempname-4] == 'i') && (yytext[lengthoftempname-5] == 'l') && (yytext[lengthoftempname-6] == '_')) { yytext[lengthoftempname-6] = '\0'; if (localclass(classtable,yytext)) { if (nosuffixFlag) fprintf(targetfile,"%s_list_",yytext); else fprintf(targetfile,"%s_%s_list_",yytext,modulename); } else fprintf(targetfile,"%s_list_",yytext); } else fprintf(targetfile,"%s_",yytext); } else fprintf(targetfile,"%s",yytext); } break; case MODULECLASS : #ifdef DEBUG fprintf(stderr,"MODULECLASS : %s length : %d\n",yytext,strlen(yytext)); #endif { int k; char classnametmp1[200]; for (k = 0; k < strlen(yytext); k++) if (yytext[k] == '@') break; else classnametmp1[k] = yytext[k]; classnametmp1[k]='\0'; if (nosuffixFlag) fprintf(targetfile,"%s",classnametmp1); else fprintf(targetfile,"%s_%s",classnametmp1,yytext+k+1); } break; case EXTCLASS : { #ifdef DEBUG fprintf(stderr,"EXTCLASS : %s length : %d\n",yytext,strlen(yytext)); #endif int k; char classnametmp1[200]; for (k = 0; k < strlen(yytext); k++) if (yytext[k] == '@') break; else classnametmp1[k] = yytext[k]; classnametmp1[k]='\0'; fprintf(targetfile,"%s",classnametmp1); break; } case LETTER : #ifdef DEBUG fprintf(stderr,"LETTER : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; case DIGIT : #ifdef DEBUG fprintf(stderr,"DIGIT : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; case SPECIAL : #ifdef DEBUG fprintf(stderr,"SPECIAL : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; case CPPCOMMENT : #ifdef DEBUG fprintf(stderr,"CPPCOMMENT : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; case DOUBLESLASH : #ifdef DEBUG fprintf(stderr,"DOUBLESLASH : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; case DQUOTE : { #ifdef DEBUG fprintf(stderr,"DQUOTE : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); while ((val = getc(yyin))!= EOF ) { if (val == '\\') { fprintf(targetfile,"\\"); val = getc(yyin); if (val == EOF) break; fprintf(targetfile,"%c",val); } else if (val == '\"') break; else fprintf(targetfile,"%c",val); if (val == '\n') { yylineno++; fprintf(targetfile,"\n"); } } if (val==EOF) { fprintf(stderr,"%s : line: %d: error: missing \" \n", filename,yylineno); fprintf(stderr,"comp-pp: aborted.\n"); exit(1); } val = DQUOTE; fprintf(targetfile,"\""); break; } case SQUOTE : { #ifdef DEBUG fprintf(stderr,"SQUOTE : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); while ((val = getc(yyin))!= EOF ) { if (val == '\\') { fprintf(targetfile,"\\"); val = getc(yyin); if (val == EOF) break; fprintf(targetfile,"%c",val); } else if (val == '\'') break; else fprintf(targetfile,"%c",val); if (val == '\n') { yylineno++; fprintf(targetfile,"\n"); } } if (val==EOF) { fprintf(stderr,"%s : line: %d: error: missing \' \n", filename,yylineno); fprintf(stderr,"comp-pp: aborted.\n"); exit(1); } val = SQUOTE; fprintf(targetfile,"\'"); break; } case CCOMMENTBEGIN : { #ifdef DEBUG fprintf(stderr,"CCOMMENTBEGIN : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); while ((val = getc(yyin))!= EOF ) { if (val == '\\') { fprintf(targetfile,"\\"); val = getc(yyin); if (val == EOF) break; fprintf(targetfile,"%c",val); } else if (val == '*') { while (val == '*') { fprintf(targetfile,"*"); val = getc(yyin); } if (val == EOF) break; if (val == '/') { fprintf(targetfile,"/"); break; } fprintf(targetfile,"%c",val); } else fprintf(targetfile,"%c",val); if (val == '\n') yylineno++; } if (val ==EOF) { fprintf(stderr,"%s : line: %d: error : missing \"*/\"\n",filename,yylineno); fprintf(stderr,"comp-pp: aborted.\n"); exit(1); } break; } case WS : { #ifdef DEBUG fprintf(stderr,"WS : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; } case QUOTEINQUOTE : { #ifdef DEBUG fprintf(stderr,"QUOTEINQUOTE : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; } case NEWLINE : { #ifdef DEBUG fprintf(stderr,"NEWLINE : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); break; } case CCOMMENTEND : { #ifdef DEBUG fprintf(stderr,"CCOMMENTEND : %s\n",yytext); #endif fprintf(targetfile,"%s",yytext); fprintf(stderr,"%s : line: %d: warning: missing \"/*\"\n",filename, yylineno); break; } case EXTERN_ITERATOR : { #ifdef DEBUG fprintf(stderr,"EXTERN_ITERATOR : %s\n",yytext); #endif { int j; char classnametmp2[200]; for (j = 0; j < strlen(yytext); j++) if (yytext[j] == '@') break; else classnametmp2[j] = yytext[j]; classnametmp2[j]='\0'; char modulenametmp[200]; strncpy(modulenametmp,yytext+j+1,strlen(yytext+j+1)-14); if (nosuffixFlag) fprintf(targetfile,"%s_list_iterator",classnametmp2); else fprintf(targetfile,"%s_%s_list_iterator",classnametmp2,modulenametmp); } break; } case LOCAL_ITERATOR : { #ifdef DEBUG fprintf(stderr,"LOCAL_ITERATOR : %s\n",yytext); #endif int length2 = strlen(yytext)-14; char * new_name2 = (char*)malloc(length2+1); strncpy(new_name2,yytext,length2); new_name2[length2]='\0'; if (localclass(classtable,new_name2)) { if (nosuffixFlag) fprintf(targetfile,"%s",new_name2); else fprintf(targetfile,"%s_%s",new_name2,modulename); fprintf(targetfile,"_list_iterator"); } else { if (strcmp(new_name2,"DemString") && strcmp(new_name2,"DemText") && strcmp(new_name2,"DemNumber") && strcmp(new_name2,"DemReal") && strcmp(new_name2,"DemIdent")) fprintf(stderr,"Warning: unknown %s \n",yytext); fprintf(targetfile,"%s",yytext); } break; } default : #ifdef DEBUG fprintf(stderr,"????---> %d === %s",val,yytext); #endif break; } } }