Annotation of capa/capa51/pProj/capaLexerDef.flex, revision 1.1
1.1 ! albertel 1: /*------------------------------------------------------------------------*/
! 2: /* capaLexerDef.flex created by Isaac Tsai Jul 15 1996 */
! 3: /* added /END(variable) */
! 4: /* added /HIN .... /DIS(variable) ... */
! 5: /* Jan 15 1998 /{KeyWord}{KeyWord}{KeyWord} */
! 6: /* replaced by /DIS */
! 7: /* catch "No /END() statement found" */
! 8: /* catch "/DIS(")" and "/DIS(""")" errors " */
! 9: /* catch "/LET var = " */
! 10: /* add a new token EoL to indicate '\n' '\r''\n' and '\r' */
! 11: /* This file is based on flex 2.5.3, flex 2.3 apparantly cannot take it :-( */
! 12: /* DONE /RMAP() function July 14, 1998 */
! 13: /* DONE /AND /OR answer formats July 20, 1998 */
! 14: /* DONE /IF () /ENDIF July 26, 1998 */
! 15: /* DONE /WHILE () /ENDWHILE August 10 1998 */
! 16: /* DONE /VERB /ENDVERB Feb 20 1998 */
! 17: /*------------------------------------------------------------------------*/
! 18: /**************************************************************************/
! 19:
! 20: %{
! 21:
! 22: #include <stdio.h>
! 23: #include <stdlib.h> /* strtod(), strtol() */
! 24: #include <string.h>
! 25: #ifdef NeXT
! 26: #include <sys/file.h>
! 27: #else
! 28: #include <unistd.h> /* access() */
! 29: #endif
! 30:
! 31: #include "capaToken.h" /* from YACC -d capaGrammarDef.y */
! 32: #include "capaCommon.h" /* capa_access() */
! 33: #include "capaParser.h" /* _symbol structure def */
! 34: #include "lex_debug.h" /* defined RETURN(xxx) macro */
! 35:
! 36:
! 37:
! 38: /* ============================================== begin of code */
! 39:
! 40: #define LEX_BUFLEN (8*1024) /* lexical buffer size (for each opened file) */
! 41:
! 42: #ifdef YYLMAX
! 43: #undef YYLMAX
! 44: #define YYLMAX 8192
! 45: #endif
! 46:
! 47: void yyfatalerror(char*msg);
! 48: #define YY_FATAL_ERROR yyfatalerror
! 49:
! 50: #ifdef LEX_DBUG
! 51: #define LLDBUG_PRL1(xx) { printf("Line %d ",Current_line[Input_idx]); printf(xx); fflush(stdout); }
! 52: #define LLDBUG_PRL2(xx,yy) { printf("Line %d ",Current_line[Input_idx]); printf(xx,yy); fflush(stdout); }
! 53: #define LLDBUG_PR1(xx) { printf(xx); fflush(stdout); }
! 54: #define LLDBUG_PR2(xx,yy) { printf(xx,yy); fflush(stdout); }
! 55: #define LLDBUG_PR3(xx,yy,zz) { printf(xx,yy,zz); fflush(stdout); }
! 56: #else
! 57: #define LLDBUG_PRL1(xx) { }
! 58: #define LLDBUG_PRL2(xx,yy) { }
! 59: #define LLDBUG_PR1(xx) { }
! 60: #define LLDBUG_PR2(xx,yy) { }
! 61: #define LLDBUG_PR3(xx,yy,zz) { }
! 62: #endif
! 63:
! 64: #ifdef LEX_INPUT_DBUG
! 65: #define LIDBUG_PR1(xx) { printf(xx); fflush(stdout); }
! 66: #define LIDBUG_PR2(xx,yy) { printf(xx,yy); fflush(stdout); }
! 67: #define LIDBUG_PR3(xx,yy,zz) { printf(xx,yy,zz); fflush(stdout); }
! 68: #else
! 69: #define LIDBUG_PR1(xx) { }
! 70: #define LIDBUG_PR2(xx,yy) { }
! 71: #define LIDBUG_PR3(xx,yy,zz) { }
! 72: #endif
! 73:
! 74: #ifdef USE_DYNAMIC_SYMBOLS
! 75: #define USE_DYNAMIC_LEXBUFS
! 76: #endif
! 77:
! 78: Symbol *yylval; /* global pointer to symbol */
! 79:
! 80: FILE *(Input_stream[MAX_OPENED_FILE]); /* <-- perhaps we can use linked list */
! 81: char Opened_filename[MAX_OPENED_FILE][QUARTER_K]; /* <-- perhaps we can use linked list */
! 82: int Input_idx;
! 83: int Lexi_pos[MAX_OPENED_FILE]; /* Current position in the line */
! 84:
! 85: #ifdef USE_DYNAMIC_LEXBUFS
! 86: char *(Lexi_buf[MAX_OPENED_FILE]); /* Line Buffer for current file */
! 87:
! 88: #else
! 89: char Lexi_buf[MAX_OPENED_FILE][LEX_BUFLEN+4]; /* Line Buffer for current file */
! 90:
! 91: #endif /* USE_DYNAMIC_LEXBUFS */
! 92:
! 93: char String_buf[LEX_BUFLEN]; /* Constant String buffer <-- perhaps we can use char pointer */
! 94: char *Dynamic_buf;
! 95: int Dynamic_buf_max;
! 96: int Dynamic_buf_cur;
! 97:
! 98:
! 99: static int End_of_input;
! 100: static int Pcount, Bcount; /* static means only available in this file */
! 101: /* --------------------------------------------------------------------------- */
! 102: /* GLOBAL VARIABLES */
! 103: /* --------------------------------------------------------------------------- */
! 104: int Lexi_line; /* Current source file line number, counting from beginning */
! 105: extern int Current_line[MAX_OPENED_FILE];
! 106:
! 107: int Func_idx;
! 108: Symbol FuncStack[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */
! 109:
! 110: int Array_idx;
! 111: Symbol *ArraySymbList_p;
! 112: Symbol *ArraySymbLast_p;
! 113: Symbol *FmlSymbList_p;
! 114: Symbol *FmlSymbLast_p;
! 115: int FmlSymb_cnt;
! 116: int Symb_count;
! 117:
! 118: int IFstatus[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */
! 119: int IFcurrent[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */
! 120: int IFcount;
! 121: WhileLoop_t WhileStack[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */
! 122: int While_idx, Wcount;
! 123:
! 124: #ifdef USE_DYNAMIC_SYMBOLS
! 125: Symbol *SymbList_p;
! 126: Symbol *SymbLast_p;
! 127: #else
! 128: Symbol SymbArray[MAX_SYMB_COUNT];
! 129: #endif /* USE_DYNAMIC_SYMBOLS */
! 130:
! 131:
! 132: char *Current_char_p; /* Collect string constant */
! 133: extern char *EndText_p;
! 134: extern char *StartText_p;
! 135: extern Problem_t *LexiProblem_p;
! 136: extern Problem_t *LastProblem_p;
! 137: int first_run=1;
! 138: int Stop_Parser;
! 139: #define FLEX
! 140:
! 141: #define YY_STACK_USED 1 /* for yy_push_state(), yy_pop_state() */
! 142:
! 143: #ifdef FLEX
! 144:
! 145: int capaL_unput();
! 146: int capaL_input();
! 147:
! 148:
! 149: /* YY_INPUT()
! 150: Controls scanner input. By default, YY_INPUT reads from the
! 151: file-pointer yyin. Its action is to place up to max_size
! 152: characters in the character array buf and return in the
! 153: integer variable result either the number of characters read
! 154: or the constant YY_NULL to indicate EOF.
! 155: max_size is defined to be num_to_read = 8192 in liby
! 156: Following is a sample
! 157: redefinition of YY_INPUT, in the definitions section of
! 158: the input file:
! 159:
! 160: %{
! 161: #undef YY_INPUT
! 162: #define YY_INPUT(buf,result,max_size)\
! 163: {\
! 164: int c = getchar();\
! 165: result = (c == EOF) ? YY_NULL : (buf[0] = c, 1);\
! 166: }
! 167: %}
! 168:
! 169: */
! 170:
! 171: /* fgets() reads the input stream until
! 172: n-1 bytes have been read OR
! 173: a newline character is read and transferred to string OR
! 174: an EOF (End-of-File) condition is encountered
! 175:
! 176: The string is then terminated with a NULL character.
! 177:
! 178: ii = fseek(FILE *stream,0L,SEEK_END) ;
! 179: if(ii!=0) { error }
! 180: leng = ftell(FILE *stream) + 1 ;
! 181: fseek(FILE *stream,0L,SEEK_SET) ;
! 182: Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*leng,1);
! 183:
! 184: */
! 185:
! 186:
! 187: #ifdef AVOIDYYINPUT
! 188: #define MAX_INCLUDE_DEPTH 10
! 189: YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
! 190: int include_stack_ptr = 0;
! 191: #else
! 192: #ifdef USE_DYNAMIC_LEXBUFS
! 193: #define NEWYYINPUT
! 194: #endif
! 195:
! 196: #ifdef NEWYYINPUT
! 197: void newyy_input (char *buf,int *result,int max_size);
! 198: #define YY_INPUT(buf,result,max_size) newyy_input(buf,&result,max_size)
! 199:
! 200: #else
! 201: #ifdef USE_DYNAMIC_LEXBUFS
! 202:
! 203: #define YY_INPUT(buf,result,max_size) \
! 204: { int ii, leng, out_of_char; \
! 205: if (!Lexi_line) { /* was startup */ \
! 206: for(ii=0;ii < MAX_OPENED_FILE;ii++) { \
! 207: Lexi_buf[ii] = NULL; \
! 208: Lexi_pos[ii] = 0; \
! 209: Current_line[ii] = 0; \
! 210: } \
! 211: Input_idx = 0; \
! 212: first_run=0; \
! 213: yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n"); \
! 214: } \
! 215: out_of_char = 0; \
! 216: if ( Lexi_buf[Input_idx] == NULL ) { \
! 217: Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; \
! 218: } else { \
! 219: if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { /* test if the line buffer is empty or at the end */ \
! 220: out_of_char=1; \
! 221: } \
! 222: } \
! 223: if( out_of_char ) { \
! 224: if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \
! 225: LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx); \
! 226: if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) { \
! 227: LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \
! 228: fclose(Input_stream[Input_idx]); \
! 229: capa_mfree((char *)Lexi_buf[Input_idx]); \
! 230: Lexi_buf[Input_idx] = NULL; \
! 231: Input_idx--; \
! 232: yyin = Input_stream[Input_idx]; \
! 233: /* (Lexi_pos[Input_idx])++; */ \
! 234: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 235: result = 1; \
! 236: } else { \
! 237: result = YY_NULL; /* End of File */ \
! 238: } \
! 239: } else { /* successfully read in one line */ \
! 240: if (Lexi_buf[Input_idx]==NULL) puts("Whatup?");\
! 241: leng = strlen(Lexi_buf[Input_idx]); \
! 242: LIDBUG_PR3("<<yy_input() read into buffer a line(leng=%d), input index=%d>>\n",leng,Input_idx); \
! 243: Lexi_pos[Input_idx] = 0; \
! 244: Lexi_line++; \
! 245: Current_line[Input_idx]++; \
! 246: (Lexi_pos[Input_idx])++; \
! 247: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 248: /* need to take care of return continuation conditions */ \
! 249: /* so, we return to one-char-at-a-time approach */ \
! 250: /* for(ii=0;ii<leng;ii++) { */ \
! 251: /* buf[ii] = Lexi_buf[Input_idx][ii]; */ \
! 252: /* } */ \
! 253: /* buf[ii] = '\0'; */ \
! 254: /* printf("YY_INPUT()(Lexi_line=%d,max size=%d)(%c)",Lexi_line,max_size,buf[0]); */ \
! 255: result = 1; \
! 256: } \
! 257: } else { \
! 258: /* LIDBUG_PR2("<<yy_input() increase Lexi_pos, input index=%d>>\n",Input_idx); */ \
! 259: (Lexi_pos[Input_idx])++; \
! 260: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 261: result = 1; \
! 262: } \
! 263: if (Stop_Parser==1) { \
! 264: result = YY_NULL; \
! 265: } \
! 266: }
! 267:
! 268: #else
! 269:
! 270: #define YY_INPUT(buf,result,max_size) \
! 271: { int ii, leng; \
! 272: if (!Lexi_line) { /* was startup */ \
! 273: for(ii=0;ii < MAX_OPENED_FILE;ii++) { \
! 274: Lexi_buf[ii][0]=0; \
! 275: Lexi_pos[ii] = 0; \
! 276: Current_line[ii] = 0; \
! 277: } \
! 278: Input_idx = 0; \
! 279: first_run=0; \
! 280: yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n"); \
! 281: } \
! 282: if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { /* test if the line buffer is empty or at the end */ \
! 283: if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \
! 284: LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx); \
! 285: if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) { \
! 286: LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \
! 287: fclose(Input_stream[Input_idx]); \
! 288: Input_idx--; \
! 289: yyin = Input_stream[Input_idx]; \
! 290: /* (Lexi_pos[Input_idx])++; */ \
! 291: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 292: result = 1; \
! 293: } else { \
! 294: result = YY_NULL; /* End of File */ \
! 295: } \
! 296: } else { /* successfully read in one line */ \
! 297: leng = strlen(Lexi_buf[Input_idx]); \
! 298: LIDBUG_PR3("<<yy_input() read into buffer a line(leng=%d), input index=%d>>\n",leng,Input_idx); \
! 299: Lexi_pos[Input_idx] = 0; \
! 300: Lexi_line++; \
! 301: Current_line[Input_idx]++; \
! 302: (Lexi_pos[Input_idx])++; \
! 303: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 304: /* need to take care of return continuation conditions */ \
! 305: /* so, we return to one-char-at-a-time approach */ \
! 306: /* for(ii=0;ii<leng;ii++) { */ \
! 307: /* buf[ii] = Lexi_buf[Input_idx][ii]; */ \
! 308: /* } */ \
! 309: /* buf[ii] = '\0'; */ \
! 310: /* printf("YY_INPUT()(Lexi_line=%d,max size=%d)(%c)",Lexi_line,max_size,buf[0]); */ \
! 311: result = 1; \
! 312: } \
! 313: } else { \
! 314: /* LIDBUG_PR2("<<yy_input() increase Lexi_pos, input index=%d>>\n",Input_idx); */ \
! 315: (Lexi_pos[Input_idx])++; \
! 316: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1]; \
! 317: result = 1; \
! 318: } \
! 319: if (Stop_Parser==1) { \
! 320: result = YY_NULL; \
! 321: } \
! 322: }
! 323: #endif /* USE_DYNAMIC_LEXBUFS */
! 324: #endif /*NEWYYINPUT*/
! 325: #endif /*AVOIDYYINPUT*/
! 326:
! 327: #else
! 328:
! 329: #undef input
! 330: #undef unput
! 331:
! 332: #endif
! 333:
! 334: int capa_eof();
! 335: %}
! 336:
! 337: Alpha [a-zA-Z_]
! 338: KeyChar [A-Z]
! 339: AlphaNum [a-zA-Z_0-9]
! 340: Number [0-9]
! 341: HexNumber [0-9a-fA-F]
! 342: Space [ \t]
! 343: Spaces ({Space}*)
! 344: FileName (\"[^"\n]*\")
! 345: Qchar ([0-9a-zA-Z \t!?\._,:;'"`~@#$%\^&\+\-\*=|\[\]{}()])
! 346: Operator ([=\+\-\*/%<>!&|,])
! 347: Identifier ([a-zA-Z_][a-zA-Z_0-9]*)
! 348: EndLine ([\r][\n]|[\n])
! 349:
! 350: %a 10500
! 351: %o 15000
! 352: %k 10000
! 353: %p 10000
! 354: %n 1000
! 355: %x S_COMMENT S_HINT S_HINTEXLAINX S_IMPORT S_EXPLAIN S_ENDX S_UNIT S_IGNORE
! 356: %x S_SKIP S_VARIABLE S_LET S_DEFINE S_TEXT S_MAP S_FIGURE S_ANSWER
! 357: %x S_STRING S_ANSCONTINUE S_TRUE_FALSE_STMT S_IF_SKIP S_WHILE_SKIP
! 358: %x S_NEXT_LINE S_RANDOMORDER S_VERB
! 359: %array
! 360:
! 361:
! 362:
! 363: %%
! 364:
! 365: <S_IGNORE>{
! 366: {EndLine} BEGIN S_IGNORE;
! 367: [^\n]*$ BEGIN S_IGNORE;
! 368: <<EOF>> {
! 369: capa_eof();
! 370: #ifndef AVOIDYYINPUT
! 371: yyterminate();
! 372: #endif
! 373: }
! 374: }
! 375:
! 376: <S_COMMENT>[^\n]*{EndLine} BEGIN S_TEXT;
! 377:
! 378: <S_TEXT>{
! 379: ^{Spaces}"/LET" |
! 380: ^{Spaces}"/BEG" { LLDBUG_PRL1("[LET]"); Pcount = 0; init_funcstack(); BEGIN S_LET; RETURN(CAPA_LET); }
! 381: ^{Spaces}"/VERB" {
! 382: LLDBUG_PRL1("[VERBATIM]");
! 383: Dynamic_buf = (char *)capa_malloc(sizeof(char),1);
! 384: Dynamic_buf_max = 1;
! 385: Dynamic_buf_cur = 0;
! 386: Dynamic_buf[0] = '\0';
! 387: BEGIN S_VERB;
! 388: }
! 389: ^{Spaces}"/HIN"{Alpha}*{Spaces} { LLDBUG_PRL1("[HIN]"); Current_char_p = String_buf; BEGIN S_HINT; }
! 390: ^{Spaces}"/EXP"{Alpha}*{Spaces} { LLDBUG_PRL1("[EXP]"); Current_char_p = String_buf; BEGIN S_EXPLAIN; }
! 391: ^{Spaces}"/IMP"{Alpha}*{Space}+ { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; }
! 392: ^{Spaces}"/END" { LLDBUG_PRL1("[END]");
! 393: if ( (LexiProblem_p !=NULL) &&
! 394: (LexiProblem_p->question != NULL) &&
! 395: (LexiProblem_p->ans_type == 0)) {
! 396: EndText_p=strsave(LexiProblem_p->question);
! 397: free_problems(LexiProblem_p);
! 398: LexiProblem_p=NULL;
! 399: } else {
! 400: EndText_p=NULL;
! 401: }
! 402: End_of_input = 1; BEGIN S_IGNORE;RETURN(CAPA_END);
! 403: }
! 404: ^{Spaces}"/START"[^\n]* { LLDBUG_PRL1("[START]");
! 405: if (LexiProblem_p !=NULL &&
! 406: LexiProblem_p->question != NULL) {
! 407: StartText_p=strsave(LexiProblem_p->question);
! 408: } else {
! 409: StartText_p=NULL;
! 410: }
! 411: BEGIN S_TEXT;
! 412: RETURN(CAPA_START);
! 413: }
! 414:
! 415: ^{Spaces}"/END"{Spaces}[\(]{Spaces} { LLDBUG_PRL1("[END()]"); BEGIN S_ENDX; }
! 416: ^"/DEF" { Bcount = 0; BEGIN S_DEFINE; RETURN(CAPA_DEF); }
! 417: ^{Spaces}"/ANS" { LLDBUG_PRL2("[ANS(%s)]",yytext); Pcount = 0; BEGIN S_ANSWER; RETURN(CAPA_ANS); }
! 418: ^{Spaces}"/SUBJECTIVE" { LLDBUG_PRL1("[SUBJECTIVE ANSWER]"); Pcount = 0; BEGIN S_ANSWER; RETURN(CAPA_SUBJ); }
! 419: ^{Spaces}"/MAP" { LLDBUG_PRL1("[MAP]"); Pcount = 0; BEGIN S_MAP; RETURN(CAPA_MAP); }
! 420: ^{Spaces}"/RMAP" { LLDBUG_PRL1("[RMAP]"); Pcount = 0; BEGIN S_MAP; RETURN(CAPA_RMAP); }
! 421: ^{Spaces}"/RQO"{Spaces}* { LLDBUG_PRL1("[RQO]"); BEGIN S_RANDOMORDER;
! 422: RETURN(CAPA_RQO);}
! 423: ^{Spaces}"/ENDWHILE"([^\n])* { long int file_pos;
! 424: int top_item, input_idx;
! 425: LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",While_idx);
! 426:
! 427: top_item = While_idx - 1;
! 428: if( top_item < 0 ) { /* strange things must have happened here! */
! 429:
! 430: } else {
! 431: input_idx = WhileStack[top_item].input_idx;
! 432: file_pos = WhileStack[top_item].pos_idx;
! 433: Current_line[input_idx] = WhileStack[top_item].line_idx;
! 434: Lexi_pos[input_idx] = 0;
! 435: fseek(Input_stream[input_idx],file_pos,SEEK_SET);
! 436: fgets(Lexi_buf[input_idx],LEX_BUFLEN-1,Input_stream[input_idx]);
! 437: While_idx--;
! 438: }
! 439: BEGIN S_TEXT;
! 440: }
! 441: "/WHILE" |
! 442: ^{Spaces}"/WHILE" { long int file_pos;
! 443: int leng;
! 444: LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",While_idx);
! 445: leng = strlen(Lexi_buf[Input_idx]); /* length of current line */
! 446: /* <-- because we use fgets() to read input,
! 447: thus ftell() will give the starting position of next line */
! 448: WhileStack[While_idx].input_idx = Input_idx;
! 449: file_pos = ftell(Input_stream[Input_idx]);
! 450: file_pos -= leng; /* calibrate the current line length */
! 451: WhileStack[While_idx].pos_idx = file_pos; /* begin of current line */
! 452: WhileStack[While_idx].line_idx = Current_line[Input_idx];
! 453: While_idx++; /* advance the stack pointer */
! 454:
! 455: BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_WHILE);
! 456:
! 457: }
! 458: ^{Spaces}"/IF" { IFcount++; IFcurrent[IFcount] = RUN_IF_PORTION;
! 459: LLDBUG_PRL2("[IF <IFcount=%d>]",IFcount); BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_IF); }
! 460: ^{Spaces}"/ELSE"([^\n])* { LLDBUG_PRL2("[ELSE <IFcount=%d>]\n",IFcount);
! 461: IFcurrent[IFcount] = RUN_ELSE_PORTION;
! 462: if( IFstatus[IFcount] == IF_TRUE ) {
! 463: LLDBUG_PRL1("[ELSE begin Skip]\n");
! 464: BEGIN S_IF_SKIP;
! 465: }
! 466: }
! 467: ^{Spaces}"/ENDIF"([^\n])* { IFcount--; LLDBUG_PRL2("[ENDIF <IFcount=%d>]\n",IFcount);
! 468: }
! 469: "/AND" { LLDBUG_PRL1("[AND]"); BEGIN S_ANSCONTINUE; RETURN(ANS_AND); }
! 470: "/DIS" { /* since S_VARIABLE treat {Space} as null, so here we do not match ( */
! 471: /* so that between /DIS and ( can have as many {Space} as we want */
! 472: LLDBUG_PR1("[DIS<]");
! 473: init_funcstack();
! 474: Pcount = 0; BEGIN S_VARIABLE;
! 475: RETURN(CAPA_VAR);
! 476: }
! 477: "/OR" { LLDBUG_PRL1("[OR]"); BEGIN S_ANSCONTINUE; RETURN(ANS_OR); }
! 478: {EndLine} { LLDBUG_PR1("[EoL within S_TEXT]\n"); /* end of the whole text line */
! 479: RETURN(EoL); }
! 480: [\\]{Space}*{EndLine} { LLDBUG_PR2("[\\EoL continue](%s)",yytext); /* continuation on next line */ }
! 481: ^{Spaces}"//"[^\n]*$ { LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); BEGIN S_COMMENT; }
! 482: [^/\n\\]+$ |
! 483: [/] |
! 484: [\\] { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 485: yylval->s_str = strsave(yytext);
! 486: LLDBUG_PR2("[TEXT_LINE<%s>]",yytext);
! 487: RETURN(TEXT_LINE);
! 488: }
! 489: ([^/\n])+[/] |
! 490: ([^/\n])+[\\] { /* matches anything until a '/' or a '\' */
! 491: LLDBUG_PR2("[TEXT_LINE( )<%s>]",yytext);
! 492:
! 493: yyless(yyleng-1); /* push back the last char */
! 494: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 495: yylval->s_str = strsave(yytext);
! 496:
! 497: BEGIN S_TEXT;
! 498: RETURN(TEXT_LINE);
! 499: }
! 500: <<EOF>> {
! 501: #ifdef AVOIDYYINPUT
! 502: char warn_msg[ONE_K];
! 503:
! 504: if ( (--include_stack_ptr < 0) || Stop_Parser) {
! 505: if (Stop_Parser) {
! 506: if ( LexiProblem_p!=NULL &&
! 507: LexiProblem_p->question != NULL)
! 508: EndText_p=strsave(LexiProblem_p->question);
! 509: while (include_stack_ptr >= 0) {
! 510: yy_delete_buffer( YY_CURRENT_BUFFER );
! 511: yy_switch_to_buffer(
! 512: include_stack[include_stack_ptr]);
! 513: --include_stack_ptr;
! 514: }
! 515: } else {
! 516: sprintf(warn_msg,
! 517: "at End-of-File, a /END is needed.\n");
! 518: capa_msg(MESSAGE_ERROR,warn_msg);
! 519: }
! 520: free_problems(LexiProblem_p);
! 521: LexiProblem_p=NULL;
! 522: yyterminate();
! 523: } else {
! 524: yy_delete_buffer( YY_CURRENT_BUFFER );
! 525: yy_switch_to_buffer(include_stack[include_stack_ptr]);
! 526: }
! 527: #else
! 528: char warn_msg[ONE_K];
! 529: if (!Stop_Parser) {
! 530: sprintf(warn_msg,"at End-of-File, a /END is needed.\n");
! 531: capa_msg(MESSAGE_ERROR,warn_msg);
! 532: } else {
! 533: if (LexiProblem_p != NULL &&
! 534: LexiProblem_p->question != NULL)
! 535: EndText_p=strsave(LexiProblem_p->question);
! 536: }
! 537: capa_eof();
! 538: yyterminate();
! 539: #endif
! 540: }
! 541: }
! 542:
! 543:
! 544: <S_ENDX>{
! 545: {Alpha}{AlphaNum}* { /* DONE: add codes to handle /END() */
! 546: char *question_end=NULL;
! 547: End_of_input = 1;
! 548: if (EndText_p!=NULL) capa_mfree((char*)EndText_p);
! 549: if ((LexiProblem_p!=NULL) &&
! 550: (LexiProblem_p->question != NULL) &&
! 551: (LexiProblem_p->ans_type == 0)) {
! 552: question_end=strsave(LexiProblem_p->question);
! 553: }
! 554: if( yyleng > 0 ) {
! 555:
! 556: LLDBUG_PRL2("[END()<%s>]\n",yytext);
! 557: yylval = find_identifier(yytext);
! 558:
! 559: switch(yylval->s_type) {
! 560: case IDENTIFIER:
! 561: case I_VAR: case I_CONSTANT:
! 562: case R_VAR: case R_CONSTANT:
! 563: break;
! 564: case S_VAR: case S_CONSTANT:
! 565: EndText_p = strsave(yylval->s_str);
! 566: if (question_end) {
! 567: int leng; char *new_end;
! 568: leng = strlen(EndText_p) +
! 569: strlen(question_end) + 1;
! 570: new_end = capa_malloc(sizeof(char), leng);
! 571: strcat(new_end, question_end);
! 572: strcat(new_end, EndText_p);
! 573: capa_mfree(EndText_p);
! 574: capa_mfree(question_end);
! 575: EndText_p=new_end;
! 576: }
! 577: break;
! 578: default: break;
! 579: }
! 580: }
! 581: BEGIN S_IGNORE; RETURN(CAPA_END);
! 582: }
! 583: {Space}* { /* ignore spaces */ }
! 584: [\)] { /* a right paren */
! 585: if ( (LexiProblem_p != NULL) &&
! 586: (LexiProblem_p->question != NULL) &&
! 587: (LexiProblem_p->ans_type == 0)) {
! 588: EndText_p=strsave(LexiProblem_p->question);
! 589: } else {
! 590: EndText_p=NULL;
! 591: }
! 592: BEGIN S_IGNORE;
! 593: RETURN(CAPA_END);
! 594: }
! 595: }
! 596:
! 597: <S_HINT,S_EXPLAIN>{
! 598: [/][Dd][Ii][Ss]{Space}*[\(]{Space}* { yy_push_state(S_HINTEXLAINX); }
! 599: [^/\n]+[/\\] { char *aptr = yytext;
! 600: int ii;
! 601:
! 602: yyless(yyleng-1);
! 603: for(ii=0;ii<yyleng;ii++) {
! 604: *Current_char_p++ = *aptr++;
! 605: }
! 606:
! 607: }
! 608: [/] { *Current_char_p++ = '/'; }
! 609: [\\] { *Current_char_p++ = '\\'; }
! 610: [\\]{Space}*[\n] { LLDBUG_PR1("[\\CR hint explain continue]"); /* Hint and explain continuation */ }
! 611: [^/\n\\]+$ { char *aptr = yytext;
! 612: int ii;
! 613: for(ii=0;ii<yyleng;ii++) {
! 614: *Current_char_p++ = *aptr++;
! 615: }
! 616: }
! 617: }
! 618: <S_HINT>{
! 619: {EndLine} { LLDBUG_PR1("[CR hint]");
! 620: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 621: *Current_char_p++ = '\n'; *Current_char_p = '\0';
! 622: yylval->s_str = strsave(String_buf);
! 623: BEGIN S_TEXT; RETURN(HINT_LINE);
! 624: }
! 625: }
! 626: <S_EXPLAIN>{
! 627: {EndLine} { LLDBUG_PR1("[CR explain]");
! 628: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 629: *Current_char_p++ = '\n'; *Current_char_p = '\0';
! 630: yylval->s_str = strsave(String_buf);
! 631: BEGIN S_TEXT; RETURN(EXPLAIN_LINE);
! 632: }
! 633: }
! 634:
! 635: <S_HINTEXLAINX>{
! 636: {Alpha}{AlphaNum}* { char *aptr;
! 637: char tmp_str[QUARTER_K],warn_msg[ONE_K];
! 638: int ii, len;
! 639: Symbol *tmp_p;
! 640:
! 641: tmp_p = find_identifier(yytext);
! 642: switch(tmp_p->s_type) {
! 643: case IDENTIFIER:
! 644: sprintf(warn_msg,"var %s not defined.\n", yytext);
! 645: capa_msg(MESSAGE_ERROR,warn_msg);
! 646: break;
! 647: case I_VAR:
! 648: case I_CONSTANT:
! 649: sprintf(tmp_str,"%ld",tmp_p->s_int);
! 650: len = strlen(tmp_str);
! 651: for(ii=0;ii< len;ii++) {
! 652: *Current_char_p++ = tmp_str[ii];
! 653: }
! 654: break;
! 655: case R_VAR:
! 656: case R_CONSTANT:
! 657: sprintf(tmp_str,"%g",tmp_p->s_real);
! 658: len = strlen(tmp_str);
! 659: for(ii=0;ii< len;ii++) {
! 660: *Current_char_p++ = tmp_str[ii];
! 661: }
! 662: break;
! 663: case S_VAR:
! 664: case S_CONSTANT:
! 665: len = strlen(tmp_p->s_str);
! 666: aptr = tmp_p->s_str;
! 667: for(ii=0;ii< len;ii++) {
! 668: *Current_char_p++ = *aptr++;
! 669: }
! 670: break;
! 671: }
! 672: }
! 673: {Space}+ { }
! 674: [)] { yy_pop_state(); }
! 675: }
! 676:
! 677: <S_IMPORT>{
! 678: {FileName}{Space}* { parse_filename(yytext); BEGIN S_SKIP; }
! 679: {Identifier}{Space}* { parse_import_id(yytext); BEGIN S_SKIP; }
! 680: }
! 681:
! 682: <S_ANSWER>{
! 683: [Pp][Ll][Uu][Ss] { LLDBUG_PR1("[PLUS]"); RETURN(ANS_PLUS); }
! 684: [Mm][Ii][Nn][Uu][Ss] { LLDBUG_PR1("[MINUS]"); RETURN(ANS_MINUS); }
! 685: [Cc][Ss] { LLDBUG_PR1("[CS]"); RETURN(ANS_CS); }
! 686: [Cc][Ii] { LLDBUG_PR1("[CI]"); RETURN(ANS_CI); }
! 687: [Mm][Cc] { LLDBUG_PR1("[MC]"); RETURN(ANS_MC); }
! 688: [Oo][Nn] |
! 689: [Yy][Ee][Ss] { LLDBUG_PR1("[ON]"); RETURN(ANS_ON); }
! 690: [Oo][Ff][Ff] |
! 691: [Nn][Oo] { LLDBUG_PR1("[OFF]"); RETURN(ANS_OFF); }
! 692: [Ff][Mm][Ll] { LLDBUG_PR1("[FORMULA]"); RETURN(ANS_FORMULA); }
! 693: [Ff][Mm][Tt] { LLDBUG_PR1("[FMT]"); RETURN(ANS_FMT); }
! 694: [Uu][Nn][Ff][Mm][Tt] { LLDBUG_PR1("[UNFMT]"); RETURN(ANS_UNFMT); }
! 695: [,:%=@#-] { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
! 696: "<" { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
! 697: ">" { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
! 698: [Ss][Ii][Gg] { LLDBUG_PR2("[SIG(%s)]",yytext); RETURN(ANS_SIG); }
! 699: [Tt][Oo][Ll] { LLDBUG_PR2("[tol(%s)]",yytext); RETURN(ANS_TOLERANCE); }
! 700: [Ss][Tt][Rr] { LLDBUG_PR1("[STR]"); RETURN(ANS_COMPARE); }
! 701: [Ww][Gg][Tt] { LLDBUG_PR1("[WGT]"); RETURN(ANS_WEIGHT); }
! 702: [Pp][Cc][Rr] |
! 703: [Hh][Gg][Rr] { RETURN(ANS_PCREDIT); }
! 704: [Pp][Aa][Tt][Hh] { RETURN(ANS_PATH); }
! 705: [Cc][Aa][Ll][Cc] { RETURN(ANS_CALC); }
! 706: [Tt][Rr][Yy] |
! 707: [Tt][Rr][Ii][Ee][Ss] { LLDBUG_PR1("[TRY]"); RETURN(ANS_TRY); }
! 708: [Uu][Nn][Ii][Tt] |
! 709: [Uu][Nn][Ii][Tt][Ss] { LLDBUG_PR1("[UNIT]"); RETURN(ANS_UNIT); }
! 710: [Bb][Rr] { LLDBUG_PR1("[SHOW_BR]"); RETURN(ANS_SHOW_BR); }
! 711: [Aa][Nn][Ss][Bb][Oo][Xx] { LLDBUG_PR1("[SHOW_ANS_BOX]"); RETURN(ANS_BOX_SHOW); }
! 712: [Hh][Ii][Nn][Tt] { LLDBUG_PR1("[HINT]"); RETURN(ANS_HINT); }
! 713: [Ee][Xx][Pp][Ll][Aa][Ii][Nn] { LLDBUG_PR1("[EXPLAIN]"); RETURN(ANS_EXPLAIN); }
! 714: [Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll] { LLDBUG_PR1("[EXTERNAL]"); RETURN(ANS_EXTERNAL); }
! 715: [Ee][Vv][Aa][Ll] |
! 716: [Ee][Vv][Aa][Ll][Uu][Aa][Tt][Ee] { LLDBUG_PR1("[EVAL]"); RETURN(ANS_EVAL); }
! 717: [\)] { LLDBUG_PR1("[)]"); Pcount--;
! 718: if(Pcount==0) {
! 719: BEGIN S_ANSCONTINUE;
! 720: }
! 721: return(yytext[0]);
! 722: }
! 723: }
! 724:
! 725: <S_VARIABLE,S_TRUE_FALSE_STMT,S_LET,S_ANSWER,S_MAP>{
! 726: {Alpha}{AlphaNum}* { LLDBUG_PR2("[ID<%s>]",yytext);LLDBUG_PR2("[SYMB CNT=<%d>]", Symb_count);
! 727: yylval = find_identifier(yytext); RETURN(IDENTIFIER);
! 728: }
! 729:
! 730: {Alpha}{AlphaNum}*{Space}*[(] { char aline[MAX_FUNC_NAME];
! 731: int i;
! 732: for(i=0;i < (yyleng-1); i++) {
! 733: if( yytext[i] == ' ' || yytext[i] == '\t' ||
! 734: yytext[i] == 0 || yytext[i] == '(' ) break;
! 735: aline[i] = yytext[i];
! 736: }
! 737: aline[i] = 0;
! 738: LLDBUG_PR3("[FUNCT<%s:%d>]",aline,Func_idx);
! 739: (FuncStack[Func_idx]).s_type = FUNCTION_ID;
! 740: (FuncStack[Func_idx]).s_name = strsave(aline); /* free it in parser() */
! 741: Func_idx++;
! 742: yyless(yyleng-1); /* <-- push back '(' char */
! 743: RETURN(FUNCTION_ID);
! 744: }
! 745: {Alpha}{AlphaNum}*{Space}*[\[] { char aline[MAX_FUNC_NAME];
! 746: int i;
! 747: for(i=0;i < (yyleng-1); i++) {
! 748: if( yytext[i] == ' ' || yytext[i] == '\t' ||
! 749: yytext[i] == 0 || yytext[i] == '[' ) break;
! 750: aline[i] = yytext[i];
! 751: }
! 752: aline[i] = 0;
! 753: LLDBUG_PR2("[ARRAY<%s>]",aline);
! 754:
! 755: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */
! 756: yylval->s_name = strsave(aline); /* free it in parser() */
! 757: yylval->s_type = ARRAY_ID;
! 758:
! 759: yyless(yyleng-1); /* <-- push back char '[' */
! 760: RETURN(ARRAY_ID);
! 761: }
! 762: {Number}*"\."{Number}*[Ee]"+"{Number}+ |
! 763: {Number}*"\."{Number}*[Ee]{Number}+ |
! 764: {Number}*"\."{Number}*[Ee]"-"{Number}+ |
! 765: {Number}+[Ee]"+"{Number}+ |
! 766: {Number}+[Ee]{Number}+ |
! 767: {Number}+[Ee]"-"{Number}+ |
! 768: {Number}+"\."{Number}* |
! 769: "\."{Number}+ { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */
! 770: yylval->s_real = strtod(yytext, (char **) 0);
! 771: yylval->s_type = R_CONSTANT;
! 772: LLDBUG_PR2("[REAL<%s>]",yytext);
! 773: RETURN(R_CONSTANT);
! 774: }
! 775:
! 776: {Number}+ { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */
! 777: yylval->s_int = strtol(yytext, (char **) 0, 0);
! 778: yylval->s_type= I_CONSTANT;
! 779: LLDBUG_PR2("[INT<%s>]",yytext);
! 780: RETURN(I_CONSTANT);
! 781: }
! 782: [\(] { LLDBUG_PR1("[dis let ans map (]"); Pcount++; return(yytext[0]); }
! 783: [\[] { LLDBUG_PR1("[dis let ans map '[']"); return(yytext[0]); }
! 784: [\]] { LLDBUG_PR1("[dis let ans map ']']"); return(yytext[0]); }
! 785: {Space}+ { /* LLDBUG_PR1("[SP ignored]"); Ignore Spaces */ }
! 786: [\"] { LLDBUG_PR1("[TF,V,LET,ANS,MAP str\" ]");
! 787: Current_char_p = String_buf;
! 788: yy_push_state(S_STRING);
! 789: }
! 790: }
! 791:
! 792: <S_VARIABLE,S_ANSWER>[:]{Number}+[EeFf] { char num[ONE_TWO_EIGHT], fmt[SIXTEEN];
! 793: int i;
! 794: LLDBUG_PR2("[FORMAT<%s>]",yytext);
! 795: for(i=0;i<yyleng-2;i++) {
! 796: num[i] = yytext[i+1];
! 797: }
! 798: num[yyleng-2] = 0; /* terminate the numerical string */
! 799: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 800: i = strtol(num, (char **) 0, 0);
! 801: yylval->s_type=FORMAT;
! 802: switch( yytext[yyleng-1] ) {
! 803: case 'e': sprintf(fmt,"%%.%de", i);
! 804: yylval->s_distype = E_FORMAT; break;
! 805: case 'E': sprintf(fmt,"%%.%dE", i);
! 806: yylval->s_distype = E_FORMAT; break;
! 807: case 'f':
! 808: case 'F': sprintf(fmt,"%%.%df", i);
! 809: yylval->s_distype = F_FORMAT; break;
! 810: }
! 811: yylval->s_str = strsave(fmt);
! 812: RETURN(FORMAT);
! 813: }
! 814:
! 815: <S_VARIABLE,S_TRUE_FALSE_STMT,S_LET,S_MAP>{
! 816: "==" { LLDBUG_PR1("[==]"); RETURN(EQ_op); }
! 817: "!=" { LLDBUG_PR1("[!=]"); RETURN(NE_op); }
! 818: ">" { LLDBUG_PR1("[>]"); RETURN(GT_op); }
! 819: ">=" { LLDBUG_PR1("[>=]"); RETURN(GE_op); }
! 820: "<" { LLDBUG_PR1("[<]"); RETURN(LT_op); }
! 821: "<=" { LLDBUG_PR1("[<=]"); RETURN(LE_op); }
! 822: "&&" { LLDBUG_PR1("[&&]"); RETURN(AND_op); }
! 823: "||" { LLDBUG_PR1("[||]"); RETURN(OR_op); }
! 824: "//" { if(Pcount==0) BEGIN S_SKIP; }
! 825: {Operator} { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); return(yytext[0]); }
! 826: }
! 827:
! 828:
! 829: <S_RANDOMORDER>{
! 830: {Number}+ {
! 831: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 832: yylval->s_int = strtol(yytext, (char **) 0, 0);
! 833: yylval->s_type= I_CONSTANT;
! 834: LLDBUG_PR2("[INT<%s>]",yytext);
! 835: RETURN(I_CONSTANT);
! 836: }
! 837: [+~,\-!] { LLDBUG_PR2("[randqo(%s)]",yytext); return(yytext[0]); }
! 838: {EndLine} { LLDBUG_PR1("[EoLRQO]"); BEGIN S_TEXT; RETURN(EoL);}
! 839: }
! 840:
! 841: <S_VARIABLE>{
! 842: [\)] { LLDBUG_PR1("[)]"); Pcount--; if(Pcount == 0) BEGIN S_TEXT; return(yytext[0]); }
! 843: [\\]{Space}*{EndLine} { LLDBUG_PR2("[\\EoL continue in S_VARIABLE (DIS?)](%s)",yytext); /* continuation on next line */ }
! 844: {EndLine} { LLDBUG_PR1("[EoL within /dis()]\n"); RETURN(EoL); }
! 845: . { char warn_msg[WARN_MSG_LENGTH];
! 846: sprintf(warn_msg,"When use a VARIABLE, an unexpected char [%c] is encountered.\n",yytext[0]);
! 847: capa_msg(MESSAGE_ERROR,warn_msg);
! 848: }
! 849: }
! 850:
! 851: <S_TRUE_FALSE_STMT>{
! 852: [\)] { LLDBUG_PR1("[) in TRUE_FALSE]"); Pcount--; if(Pcount == 0) BEGIN S_NEXT_LINE; return(yytext[0]); }
! 853: [\\]{Space}*{EndLine} { LLDBUG_PR2("[\\EoL continue in S_TRUE_FALSE_STMT](%s)",yytext); /* continuation on next line */ }
! 854: {EndLine} { LLDBUG_PR1("[EoL within /IF()]\n"); RETURN(EoL); }
! 855: . { char warn_msg[WARN_MSG_LENGTH];
! 856: sprintf(warn_msg,"In /IF(), an unexpected char [%c] is encountered.\n",yytext[0]);
! 857: capa_msg(MESSAGE_ERROR,warn_msg);
! 858: }
! 859: }
! 860:
! 861: <S_STRING>{
! 862: [\\][\\] { char *aptr = yytext;
! 863: while( *aptr ) *Current_char_p++ = *aptr++;
! 864: }
! 865: [\\][\"] { *Current_char_p++ = '"'; }
! 866: [\\]{Space}*[\n] { LLDBUG_PR2("[\\CR continue in S_STRING](%s)",yytext); /* continuation on next line */ }
! 867: [\"] { /* end of a string constant -- */
! 868: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 869: *Current_char_p = '\0';
! 870: yylval->s_str = strsave(String_buf); /* **** */
! 871: yylval->s_type = S_CONSTANT;
! 872: /* printf("STRING:%s\n", String_buf); */
! 873: LLDBUG_PR2("[%s\"END str]",String_buf);
! 874: yy_pop_state();
! 875: RETURN(S_CONSTANT); }
! 876: {EndLine} { /* check for termination of string constant */
! 877: char warn_msg[WARN_MSG_LENGTH];
! 878:
! 879: *Current_char_p = '\0';
! 880: sprintf(warn_msg,"STRING not terminated properly, an EoL encountered in the middle.\n%s\n",String_buf);
! 881: capa_msg(MESSAGE_ERROR,warn_msg);
! 882: yy_pop_state();
! 883: }
! 884: . { char *aptr = yytext;
! 885: while( *aptr ) *Current_char_p++ = *aptr++;
! 886: }
! 887: }
! 888:
! 889: <S_LET>[\)] { LLDBUG_PR1("[) in LET]"); Pcount--; return(yytext[0]); }
! 890:
! 891: <S_SKIP>{
! 892: [^\n]+$ { }
! 893: {EndLine} { BEGIN S_TEXT; RETURN(EoL); }
! 894: }
! 895:
! 896: <S_LET,S_ANSWER,S_MAP>{
! 897: [\\]{Space}*{EndLine} { LLDBUG_PR1("[\\EoL let ans map]"); /* continuation */ }
! 898: {EndLine} { LLDBUG_PR1("[EoL END let ans map]\n"); if(Pcount == 0) BEGIN S_TEXT; RETURN(EoL); }
! 899: }
! 900:
! 901: <S_MAP>{
! 902: [;,] { LLDBUG_PR2("[%c]",yytext[0]); return(yytext[0]); }
! 903: [\)] { LLDBUG_PR1("[) in MAP]"); Pcount--;
! 904: if(Pcount==0) {
! 905: BEGIN S_SKIP;
! 906: }
! 907: return(yytext[0]);
! 908: }
! 909: }
! 910:
! 911: <S_ANSCONTINUE>{
! 912: {Space}+ { /* ignore white spaces */ }
! 913: [\\]{Space}*{EndLine} { /* continuation */ }
! 914: {EndLine} { /* end of answer and/or other answers */ LLDBUG_PR1("[complete an answer<EoL>]");
! 915: BEGIN S_TEXT; }
! 916: "/AND" { LLDBUG_PR1("[AND]"); RETURN(ANS_AND); }
! 917: "/OR" { LLDBUG_PR1("[OR]"); RETURN(ANS_OR); }
! 918: }
! 919:
! 920: <S_IF_SKIP>{
! 921: ^{Spaces}"/IF"[^\n]*{EndLine} { IFcount++; LLDBUG_PRL2("[Skip IF <IFcount=%d>]\n",IFcount);
! 922: IFstatus[IFcount] = IF_DONT_CARE;
! 923: }
! 924: ^{Spaces}"/ELSE"[^\n]*{EndLine} { LLDBUG_PRL2("[Skip ELSE <IFcount=%d>]",IFcount);
! 925: IFcurrent[IFcount]=RUN_ELSE_PORTION;
! 926: if( IFstatus[IFcount] == IF_FALSE ) {
! 927: LLDBUG_PRL1("[ELSE begin TEXT CR]\n");
! 928: BEGIN S_TEXT;
! 929: }
! 930: if( IFstatus[IFcount] == IF_TRUE ) {
! 931: LLDBUG_PRL1("[ELSE THIS SHOULD NEVER HAPPEN.]\n");
! 932: }
! 933: }
! 934: ^{Spaces}"/ENDIF"[^\n]*{EndLine} { IFcount--; LLDBUG_PRL2("[Skip ENDIF <IFcount=%d>]\n",IFcount);
! 935: if( IFcount == 0 ) {
! 936: LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
! 937: BEGIN S_TEXT;
! 938: }
! 939: if( (IFcurrent[IFcount] == RUN_IF_PORTION )&&(IFstatus[IFcount] == IF_TRUE)) {
! 940: LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
! 941: BEGIN S_TEXT;
! 942: }
! 943: if( (IFcurrent[IFcount] == RUN_ELSE_PORTION )&&(IFstatus[IFcount] == IF_FALSE)) {
! 944: LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
! 945: BEGIN S_TEXT;
! 946: }
! 947: }
! 948: {EndLine} { LLDBUG_PRL1("[SkipIF a CR]\n"); }
! 949: [^\n]*$ { LLDBUG_PRL2("[SkipIF anything <IFcount=%d>]",IFcount); }
! 950: }
! 951: <S_NEXT_LINE>{
! 952: ([.]*){EndLine} { /* this ignores everything until it hits an EoL */ BEGIN S_TEXT; }
! 953: }
! 954:
! 955: <S_WHILE_SKIP>{
! 956: ^{Spaces}"/WHILE"[^\n]*{EndLine} { Wcount++;
! 957: LLDBUG_PRL2("[SkipWHILE /WHILE <Wcount=%d>]\n",Wcount);
! 958: }
! 959: ^{Spaces}"/ENDWHILE"[^\n]*{EndLine} {
! 960: if(Wcount==0) {
! 961: LLDBUG_PRL2("[SkipWHILE->/ENDWHILE <Wcount=%d>]\n",Wcount);
! 962: BEGIN S_TEXT;
! 963: } else {
! 964: Wcount--;
! 965: LLDBUG_PRL2("[SkipWHILE /ENDWHILE <Wcount=%d>]\n",Wcount);
! 966: }
! 967: }
! 968: {EndLine} { LLDBUG_PRL1("[SkipWHILE a CR]\n"); }
! 969: [^\n]*$ { LLDBUG_PRL2("[SkipWHILE anything <Wcount=%d>]",Wcount); }
! 970: }
! 971:
! 972: <S_VERB>{
! 973: ^{Spaces}"/ENDVERB" { LLDBUG_PRL1("[END VERB]\n");
! 974: yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
! 975: yylval->s_str = strsave(Dynamic_buf); /* **** */
! 976: yylval->s_type = S_CONSTANT;
! 977: capa_mfree(Dynamic_buf);
! 978: Dynamic_buf_cur=-1;
! 979: Dynamic_buf_max=0;
! 980: BEGIN S_TEXT; RETURN(VERBATIM);
! 981: }
! 982: .*|{EndLine} { append_dynamic_buf(yytext); }
! 983: }
! 984:
! 985: %%
! 986:
! 987: /* ========================================================================================== */
! 988: extern void
! 989: begin_if_skip() { BEGIN S_IF_SKIP; }
! 990:
! 991: extern void
! 992: begin_while_skip() { Wcount=0; While_idx--; /* while is FALSE, pop it out from stack */ BEGIN S_WHILE_SKIP; }
! 993:
! 994: extern void
! 995: begin_next_line() { BEGIN S_NEXT_LINE; }
! 996:
! 997: extern void
! 998: begin_var() { BEGIN S_VARIABLE; }
! 999:
! 1000: extern void
! 1001: begin_let() { BEGIN S_LET; }
! 1002:
! 1003: extern void
! 1004: begin_def() { BEGIN S_DEFINE; }
! 1005:
! 1006: extern void
! 1007: begin_ans() { BEGIN S_ANSWER; }
! 1008:
! 1009: extern void
! 1010: begin_map() { BEGIN S_MAP; }
! 1011:
! 1012: extern void
! 1013: begin_ignore() { BEGIN S_IGNORE; }
! 1014:
! 1015: extern void
! 1016: begin_text() { BEGIN S_TEXT; }
! 1017:
! 1018: extern void
! 1019: begin_question() { LLDBUG_PR1("[<S_TEXT>]");
! 1020: IFcount = 0; While_idx=0; /* initialize some stacks */
! 1021: End_of_input = 0; YY_FLUSH_BUFFER; BEGIN S_TEXT; }
! 1022:
! 1023: extern void
! 1024: end_problemset() { End_of_input = 0; YY_FLUSH_BUFFER; BEGIN S_TEXT; }
! 1025:
! 1026:
! 1027: /* ========================================================================================== */
! 1028:
! 1029: #define NUM_KEY 2
! 1030: int
! 1031: match_keyword(key) char *key;
! 1032: {
! 1033: char *keyword[NUM_KEY] = {"/DIS", "/DIR" };
! 1034: int i;
! 1035:
! 1036: for(i=0;i < NUM_KEY; i++) {
! 1037: if( !strncmp(keyword[i], key, 4) ) {
! 1038: return (1);
! 1039: }
! 1040: }
! 1041: return (0);
! 1042: }
! 1043:
! 1044: int
! 1045: match_functionid(key) char *key;
! 1046: {
! 1047: char *keyword[NUM_KEY] = {"/DIS", "/DIR" };
! 1048: int i;
! 1049:
! 1050: for(i=0;i < NUM_KEY; i++) {
! 1051: if( !strncmp(keyword[i], key, 4) ) {
! 1052: return (1);
! 1053: }
! 1054: }
! 1055: return (0);
! 1056: }
! 1057: /* -------------------------------------------------------------------------- */
! 1058: /* -------------------------------------------------------------------------- */
! 1059:
! 1060: void init_funcstack()
! 1061: {
! 1062: int ii;
! 1063: for(ii=0;ii<Func_idx;ii++) {
! 1064: capa_mfree(FuncStack[ii].s_name);
! 1065: }
! 1066: Func_idx = 0;
! 1067: }
! 1068:
! 1069:
! 1070: /* -------------------------------------------------------------------------- */
! 1071: /* GET THE NEXT CHARACTER OF THE SOURCE FILE */
! 1072: /* -------------------------------------------------------------------------- */
! 1073:
! 1074: #ifdef FLEX
! 1075: int capaL_input()
! 1076: #else
! 1077: int /* RETURNS: next character */
! 1078: input() /* ARGUMENTS: (none) */
! 1079: #endif
! 1080:
! 1081: { /* LOCAL VARIABLES: */
! 1082: static int startup=1; /* First call flag */
! 1083:
! 1084: LLDBUG_PRL1("<<capaL_input() is called>>\n");
! 1085: if (!Lexi_line) { /* was startup */
! 1086: for(Input_idx=0;Input_idx < MAX_OPENED_FILE;Input_idx++) {
! 1087: /* for(ii=0;ii<LEX_BUFLEN;ii++) {
! 1088: Lexi_buf[Input_idx][ii]=0;
! 1089: }
! 1090: */
! 1091: Lexi_buf[Input_idx][0]=0;
! 1092: Lexi_pos[Input_idx] = 0;
! 1093: }
! 1094: Input_idx = 0;
! 1095: startup=0;
! 1096: yyin = Input_stream[Input_idx];
! 1097: }
! 1098: if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) {
! 1099: if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) {
! 1100: /* EOF? */
! 1101: /* no use in flex
! 1102: printf("capaL_input()EOF %s\n",Opened_filename[Input_idx+1]); fflush(stdout); */
! 1103: return (0);
! 1104: }
! 1105: Lexi_pos[Input_idx] = 0;
! 1106: Lexi_line++;
! 1107: printf("input()(%d)\n",Lexi_line);
! 1108: }
! 1109: (Lexi_pos[Input_idx])++;
! 1110: return ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1] );
! 1111: }
! 1112:
! 1113: /******************************************************************************/
! 1114: /* PUSH BACK ONE CHARACTER OF THE INPUT */
! 1115: /******************************************************************************/
! 1116:
! 1117: int /* RETURNS: nothing */
! 1118: capaL_unput(ch) /* ARGUMENTS: */
! 1119: register int ch; /* Character to push */
! 1120: {
! 1121: if (ch) (Lexi_pos[Input_idx])--;
! 1122:
! 1123: /* unput() stream cannot be re-defined */
! 1124: /* unput(ch); inconsistency between YY_INPUT() and internal matched yytext */
! 1125: return (0);
! 1126:
! 1127: }
! 1128:
! 1129:
! 1130: /******************************************************/
! 1131:
! 1132: #ifndef DMALLOC
! 1133:
! 1134: char *
! 1135: strsave(char *s)
! 1136: {
! 1137: char *p;
! 1138: p=capa_malloc(strlen(s)+1,1);
! 1139: strcpy(p,s);
! 1140: return (p);
! 1141: }
! 1142:
! 1143: #endif
! 1144:
! 1145: /* =========================================================================== */
! 1146:
! 1147: #ifndef DMALLOC
! 1148: char *
! 1149: capa_malloc(unsigned num,unsigned sz)
! 1150: {
! 1151: char *p;
! 1152: p = calloc(num, sz);
! 1153: bzero(p, num*sz); /* added Jan 21 1998 */
! 1154: return (p);
! 1155: }
! 1156:
! 1157: #endif
! 1158:
! 1159: #ifndef DMALLOC
! 1160: void
! 1161: capa_mfree(p) char *p;
! 1162: {
! 1163: free(p);
! 1164: }
! 1165: #endif
! 1166:
! 1167: void
! 1168: capa_msg(int type, char *p)
! 1169: { int idx, i, j;
! 1170: int len;
! 1171: char warn_msg[WARN_MSG_LENGTH];
! 1172: char tmp_line[ONE_TWO_EIGHT];
! 1173: char *tmp_str;
! 1174:
! 1175: strcpy(warn_msg,"File: ");
! 1176: idx=6;
! 1177: for(i=0;i<=Input_idx;i++) {
! 1178: len=strlen(Opened_filename[i]);
! 1179: for(j=0;j<len;j++) {
! 1180: warn_msg[idx++] = Opened_filename[i][j];
! 1181: }
! 1182: if(i < Input_idx) {
! 1183: warn_msg[idx++]='-';
! 1184: warn_msg[idx++]='>';
! 1185: }
! 1186: warn_msg[idx]=0;
! 1187: }
! 1188: switch (type) {
! 1189: case MESSAGE_ERROR:
! 1190: sprintf(tmp_line,", Line %d: ERROR:", Current_line[Input_idx]);
! 1191: len=strlen(tmp_line);
! 1192: for(j=0;j<len;j++) {
! 1193: warn_msg[idx++] = tmp_line[j];
! 1194: }
! 1195: warn_msg[idx]=0;
! 1196: append_error(warn_msg); append_error(p);
! 1197: break;
! 1198: case MESSAGE_WARN:
! 1199: default:
! 1200: sprintf(tmp_line,", Line %d: WARNING:", Current_line[Input_idx]);
! 1201: len=strlen(tmp_line);
! 1202: for(j=0;j<len;j++) {
! 1203: warn_msg[idx++] = tmp_line[j];
! 1204: }
! 1205: warn_msg[idx]=0;
! 1206: j = strlen(warn_msg);
! 1207: len = strlen(p);
! 1208: tmp_str = (char *)capa_malloc(len+j+1,1);
! 1209: for(i=0;i<j;i++) {
! 1210: tmp_str[i]=warn_msg[i];
! 1211: }
! 1212: for(i=j;i<j+len;i++) {
! 1213: tmp_str[i] = p[i-j];
! 1214: }
! 1215: append_warn(type,tmp_str);
! 1216: capa_mfree(tmp_str);
! 1217: break;
! 1218: }
! 1219: }
! 1220:
! 1221: /* ======================================================================== */
! 1222: void
! 1223: capa_warn_header(int type)
! 1224: {
! 1225: int idx, i, j;
! 1226: int len;
! 1227: char warn_msg[WARN_MSG_LENGTH];
! 1228: char tmp_line[ONE_TWO_EIGHT];
! 1229:
! 1230: strcpy(warn_msg,"File: ");
! 1231: idx=6;
! 1232: for(i=0;i<=Input_idx;i++) {
! 1233: len=strlen(Opened_filename[i]);
! 1234: for(j=0;j<len;j++) {
! 1235: warn_msg[idx++] = Opened_filename[i][j];
! 1236: }
! 1237: if(i < Input_idx) {
! 1238: warn_msg[idx++]='-';
! 1239: warn_msg[idx++]='>';
! 1240: }
! 1241: warn_msg[idx]=0;
! 1242: }
! 1243: switch (type) {
! 1244: case MESSAGE_ERROR:
! 1245: sprintf(tmp_line,", Line %d: ERROR:", Current_line[Input_idx]);
! 1246:
! 1247: break;
! 1248: case MESSAGE_WARN:
! 1249: sprintf(tmp_line,", Line %d: WARNING:", Current_line[Input_idx]);break;
! 1250: default:
! 1251: sprintf(tmp_line,", Line %d: ERROR:", Current_line[Input_idx]);break;
! 1252: }
! 1253: len=strlen(tmp_line);
! 1254: for(j=0;j<len;j++) {
! 1255: warn_msg[idx++] = tmp_line[j];
! 1256: }
! 1257: warn_msg[idx]=0;
! 1258: append_error(warn_msg);
! 1259: }
! 1260:
! 1261: /* --------------------------------------------------------------------------- */
! 1262: #ifdef AVOIDYYINPUT
! 1263:
! 1264: void change_file(char *fname)
! 1265: {
! 1266: char warn_msg[WARN_MSG_LENGTH];
! 1267: if( capa_access(fname, (F_OK | R_OK)) == -1 ) {
! 1268: sprintf(warn_msg,"/IMP \"%s\", import file does not exist or is not readable.\n",
! 1269: fname);
! 1270: capa_msg(MESSAGE_ERROR,warn_msg);
! 1271: return;
! 1272: }
! 1273:
! 1274: if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) {
! 1275: sprintf(warn_msg,"Includes nested too deeply" );
! 1276: capa_msg(MESSAGE_ERROR,warn_msg);
! 1277: return;
! 1278: }
! 1279:
! 1280: include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
! 1281: yyin = fopen( fname, "r" );
! 1282: yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) );
! 1283: }
! 1284:
! 1285: void
! 1286: parse_filename(char *line)
! 1287: {
! 1288: char *start, fname[MAX_BUFFER_SIZE], warn_msg[WARN_MSG_LENGTH];
! 1289: int ii,len;
! 1290:
! 1291: start = index(line, '\"'); /*** hpux complained */
! 1292: if( start == NULL ) {
! 1293: sprintf(warn_msg,"/IMP was not given a filename.\n");
! 1294: capa_msg(MESSAGE_ERROR,warn_msg);
! 1295: return;
! 1296: }
! 1297: start++; len = strlen(start) - 1;
! 1298: ii = 0;
! 1299: while( start[ii] != '\"' ) fname[ii++] = start[ii];
! 1300: fname[ii] = 0;
! 1301: LLDBUG_PR2("[parse_filename<%s>]\n",fname);
! 1302:
! 1303: change_file(fname);
! 1304: }
! 1305:
! 1306: void
! 1307: parse_import_id(char *line)
! 1308: {
! 1309: char fname[QUARTER_K], warn_msg[WARN_MSG_LENGTH];
! 1310: int ii, dup_open;
! 1311: Symbol *symb_p;
! 1312: int no_error = 0;
! 1313:
! 1314: ii = 0;
! 1315: while( line[ii] != '\0' && line[ii] != ' ' && line[ii] != '\n' && line[ii] != '\t' )
! 1316: fname[ii++] = line[ii];
! 1317: fname[ii] = 0;
! 1318:
! 1319: LLDBUG_PR2("[parse_import_id<%s>]\n",fname);
! 1320: symb_p = find_identifier(fname);
! 1321:
! 1322: switch (symb_p->s_type) {
! 1323: case IDENTIFIER:
! 1324: sprintf(warn_msg,"/IMP %s, var is not defined.\n", fname);
! 1325: capa_msg(MESSAGE_ERROR,warn_msg);
! 1326: break;
! 1327: case I_VAR: case I_CONSTANT: case R_VAR: case R_CONSTANT:
! 1328: sprintf(warn_msg,"var cannot be a number.\n");
! 1329: capa_msg(MESSAGE_ERROR,warn_msg);
! 1330: break;
! 1331: case S_VAR: case S_CONSTANT: sprintf(fname,"%s",symb_p->s_str);
! 1332: no_error = 1;
! 1333: break;
! 1334: }
! 1335: if( no_error ) change_file(fname);
! 1336: }
! 1337:
! 1338: #else
! 1339: void
! 1340: parse_filename(char *line)
! 1341: {
! 1342: char *start, fname[QUARTER_K], warn_msg[WARN_MSG_LENGTH];
! 1343: int ii, len, dup_open;
! 1344:
! 1345: /* printf("IMPORT %s\n", line); */
! 1346:
! 1347: start = index(line, '\"'); /*** hpux complained */
! 1348: if( start != NULL ) {
! 1349: start++; len = strlen(start) - 1;
! 1350: ii = 0;
! 1351: while( start[ii] != '\"' ) {
! 1352: fname[ii] = start[ii]; ii++;
! 1353: }
! 1354: fname[ii] = 0;
! 1355: LLDBUG_PR2("[parse_filename<%s>]\n",fname);
! 1356: if(Input_idx < (MAX_OPENED_FILE -1)) {
! 1357: dup_open = 0;
! 1358: /* -- no need to check duplicated opening a file
! 1359: for(ii=0;ii<Input_idx;ii++) {
! 1360: if(strcmp(Opened_filename[ii],fname)==0) {
! 1361: dup_open =1;
! 1362: }
! 1363: }
! 1364: */
! 1365: if( !dup_open ) {
! 1366: if( capa_access(fname, (F_OK | R_OK)) == -1 ) {
! 1367: sprintf(warn_msg,"/IMP \"%s\", import file does not exist or is not readable.\n",fname);
! 1368: capa_msg(MESSAGE_ERROR,warn_msg);
! 1369: } else {
! 1370: Input_idx++;
! 1371: Input_stream[Input_idx]=fopen(fname,"r");
! 1372: sprintf(Opened_filename[Input_idx], "%s",fname);
! 1373: Current_line[Input_idx] = 0;
! 1374: }
! 1375: } else {
! 1376: /*
! 1377: sprintf(warn_msg,"/IMP \"%s\", import file has already been imported.\n",fname);
! 1378: capa_msg(MESSAGE_WARN,warn_msg);
! 1379: */
! 1380: if( capa_access(fname, (F_OK | R_OK)) == -1 ) {
! 1381: sprintf(warn_msg,"/IMP \"%s\", import file does not exist or is not readable.\n",fname);
! 1382: capa_msg(MESSAGE_ERROR,warn_msg);
! 1383: } else {
! 1384: Input_idx++;
! 1385: Input_stream[Input_idx]=fopen(fname,"r");
! 1386: sprintf(Opened_filename[Input_idx], "%s",fname);
! 1387: Current_line[Input_idx] = 0;
! 1388: }
! 1389: }
! 1390: } else {
! 1391: sprintf(warn_msg,"/IMP more the %d levels deep ignoring further imports.\n",MAX_OPENED_FILE-1);
! 1392: capa_msg(MESSAGE_WARN,warn_msg);
! 1393: }
! 1394: } else {
! 1395: sprintf(warn_msg,"%s, is not a valid file name.\n",line);
! 1396: capa_msg(MESSAGE_ERROR,warn_msg);
! 1397: }
! 1398:
! 1399: }
! 1400:
! 1401: void
! 1402: parse_import_id(char *line)
! 1403: {
! 1404: char fname[QUARTER_K], warn_msg[WARN_MSG_LENGTH];
! 1405: int ii, dup_open;
! 1406: Symbol *symb_p;
! 1407: int no_error = 0;
! 1408:
! 1409: ii = 0;
! 1410: while (line[ii] != '\0' && line[ii] != ' ' && line[ii] != '\n' && line[ii] != '\t') {
! 1411: fname[ii] = line[ii]; ii++;
! 1412: }
! 1413: fname[ii] = 0;
! 1414: LLDBUG_PR2("[parse_import_id<%s>]\n",fname);
! 1415: symb_p = find_identifier(fname);
! 1416:
! 1417: switch (symb_p->s_type) {
! 1418: case IDENTIFIER:
! 1419: sprintf(warn_msg,"/IMP %s, var is not defined.\n", fname);
! 1420: capa_msg(MESSAGE_ERROR,warn_msg);
! 1421: break;
! 1422: case I_VAR: case I_CONSTANT: case R_VAR: case R_CONSTANT:
! 1423: sprintf(warn_msg,"var cannot be a number.\n");
! 1424: capa_msg(MESSAGE_ERROR,warn_msg);
! 1425: break;
! 1426: case S_VAR:
! 1427: case S_CONSTANT:
! 1428: sprintf(fname,"%s",symb_p->s_str);
! 1429: no_error = 1;
! 1430: break;
! 1431: }
! 1432: if( no_error ) {
! 1433: if(Input_idx < (MAX_OPENED_FILE -1) ) {
! 1434: dup_open = 0;
! 1435: /* no need to check duplicated opening a file
! 1436: for(ii=0;ii<Input_idx;ii++) {
! 1437: if(strcmp(Opened_filename[ii],fname)==0) dup_open =1;
! 1438: }
! 1439: */
! 1440: if( !dup_open ) {
! 1441: if( capa_access(fname, (F_OK | R_OK)) == -1 ) {
! 1442: sprintf(warn_msg,"/IMP \"%s\", import file does not exist or is not readable.\n", fname);
! 1443: capa_msg(MESSAGE_ERROR,warn_msg);
! 1444: } else {
! 1445: Input_idx++;
! 1446: Input_stream[Input_idx]=fopen(fname,"r");
! 1447: sprintf(Opened_filename[Input_idx], "%s",fname);
! 1448: Current_line[Input_idx] = 0;
! 1449: }
! 1450: } else {
! 1451: /* NO warning on duplicated open a file
! 1452: sprintf(warn_msg,"/IMP \"%s\", file has already been imported.\n", fname);
! 1453: capa_msg(MESSAGE_WARN,warn_msg);
! 1454: */
! 1455: if( capa_access(fname, (F_OK | R_OK)) == -1 ) {
! 1456: sprintf(warn_msg,"/IMP \"%s\", import file does not exist or is not readable.\n", fname);
! 1457: capa_msg(MESSAGE_ERROR,warn_msg);
! 1458: } else {
! 1459: Input_idx++;
! 1460: Input_stream[Input_idx]=fopen(fname,"r");
! 1461: sprintf(Opened_filename[Input_idx], "%s",fname);
! 1462: Current_line[Input_idx] = 0;
! 1463: }
! 1464:
! 1465: }
! 1466: } else {
! 1467: sprintf(warn_msg,"/IMP , too many files has been imported. The maximum is %d files.\n",
! 1468: MAX_OPENED_FILE-1);
! 1469: capa_msg(MESSAGE_WARN,warn_msg);
! 1470: }
! 1471: }
! 1472: }
! 1473: #endif /*AVOIDYYINPUT*/
! 1474:
! 1475: void append_dynamic_buf(new_str) char *new_str;
! 1476: {
! 1477: int ii,len;
! 1478:
! 1479: if(new_str==NULL) return;
! 1480: len=strlen(new_str);
! 1481: #define LEX_DBUG 1
! 1482: #ifdef LEX_DBUG
! 1483: printf("before: len %d; Dynamic_buf_cur %d; Dynamic_buf_max %d\n",
! 1484: len,Dynamic_buf_cur,Dynamic_buf_max);
! 1485: #endif /* LEX_DBUG */
! 1486: if (Dynamic_buf_cur+len+1>Dynamic_buf_max) {
! 1487: char *temp_text;
! 1488: Dynamic_buf_max=(Dynamic_buf_cur+len)*2;
! 1489: temp_text=(char*)capa_malloc(sizeof(char),Dynamic_buf_max);
! 1490: strncpy(temp_text,Dynamic_buf,Dynamic_buf_max);
! 1491: free(Dynamic_buf);
! 1492: Dynamic_buf=temp_text;
! 1493: }
! 1494: for(ii=0;ii<len;ii++) {
! 1495: Dynamic_buf[Dynamic_buf_cur+ii]=new_str[ii];
! 1496: }
! 1497: Dynamic_buf_cur += len;
! 1498: Dynamic_buf[Dynamic_buf_cur+1]='\0';
! 1499: #ifdef LEX_DBUG
! 1500: printf("after: len %d; Dynamic_buf_cur %d; Dynamic_buf_max %d\n",
! 1501: len,Dynamic_buf_cur,Dynamic_buf_max);
! 1502: #endif /* LEX_DBUG */
! 1503: }
! 1504:
! 1505: char* parser_status()
! 1506: {
! 1507: char *buf,small[SMALL_LINE_BUFFER];
! 1508: int i,j,totlen=0,len,idx=0;
! 1509:
! 1510: for(i=0;i<=Input_idx;i++) totlen+=strlen(Opened_filename[i])+6;
! 1511: buf=capa_malloc(sizeof(char),totlen);
! 1512: for(i=0;i<=Input_idx;i++) {
! 1513: len=strlen(Opened_filename[i]);
! 1514: for(j=0;j<len;j++) buf[idx++] = Opened_filename[i][j];
! 1515: buf[idx++] = ':';
! 1516: sprintf(small,"%d",Current_line[i]);
! 1517: len=strlen(small);
! 1518: for(j=0;j<len;j++) buf[idx++] = small[j];
! 1519: buf[idx++]=' ';
! 1520: buf[idx]='\0';
! 1521: }
! 1522: return buf;
! 1523: }
! 1524:
! 1525: void yyfatalerror(char*msg)
! 1526: {
! 1527: char warn_msg[WARN_MSG_LENGTH];
! 1528: sprintf(warn_msg,"Invalid character[%s]\n",yytext);
! 1529: capa_msg(MESSAGE_ERROR,warn_msg);
! 1530: }
! 1531: void yyerror(char* msg)
! 1532: {
! 1533: char warn_msg[WARN_MSG_LENGTH];
! 1534: sprintf(warn_msg,"%s\n",msg);
! 1535: capa_msg(MESSAGE_ERROR,warn_msg);
! 1536: }
! 1537:
! 1538: void newyy_input (char *buf,int *result,int max_size)
! 1539: { int ii, leng, out_of_char;
! 1540: if (!Lexi_line) { /* was startup */
! 1541: for(ii=0;ii < MAX_OPENED_FILE;ii++) {
! 1542: Lexi_buf[ii] = NULL;
! 1543: Lexi_pos[ii] = 0;
! 1544: Current_line[ii] = 0;
! 1545: }
! 1546: Input_idx = 0;
! 1547: first_run=0;
! 1548: yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n");
! 1549: }
! 1550: out_of_char = 0;
! 1551: if ( Lexi_buf[Input_idx] == NULL ) {
! 1552: Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1;
! 1553: } else {
! 1554: if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) {
! 1555: /* test if the line buffer is empty or at the end */
! 1556: out_of_char=1;
! 1557: }
! 1558: }
! 1559: if( out_of_char ) {
! 1560: if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) {
! 1561: /* read in one line */
! 1562: LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx);
! 1563: if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) {
! 1564: LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx);
! 1565: fclose(Input_stream[Input_idx]);
! 1566: capa_mfree((char *)Lexi_buf[Input_idx]);
! 1567: Lexi_buf[Input_idx] = NULL;
! 1568: Input_idx--;
! 1569: yyin = Input_stream[Input_idx];
! 1570: /* (Lexi_pos[Input_idx])++; */
! 1571: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1];
! 1572: *result = 1;
! 1573: } else {
! 1574: *result = YY_NULL; /* End of File */
! 1575: }
! 1576: } else { /* successfully read in one line */
! 1577: leng = strlen(Lexi_buf[Input_idx]);
! 1578: LIDBUG_PR3("<<yy_input() read into buffer a line(leng=%d), input index=%d>>\n",
! 1579: leng,Input_idx);
! 1580: Lexi_pos[Input_idx] = 0;
! 1581: Lexi_line++;
! 1582: Current_line[Input_idx]++;
! 1583: (Lexi_pos[Input_idx])++;
! 1584: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1];
! 1585: /* need to take care of return continuation conditions */
! 1586: /* so, we return to one-char-at-a-time approach */
! 1587: /* for(ii=0;ii<leng;ii++) { */
! 1588: /* buf[ii] = Lexi_buf[Input_idx][ii]; */
! 1589: /* } */
! 1590: /* buf[ii] = '\0'; */
! 1591: /* printf("YY_INPUT()(Lexi_line=%d,max size=%d)(%c)",Lexi_line,max_size,buf[0]); */
! 1592: *result = 1;
! 1593: }
! 1594: } else {
! 1595: /* LIDBUG_PR2("<<yy_input() increase Lexi_pos, input index=%d>>\n",Input_idx); */
! 1596: (Lexi_pos[Input_idx])++;
! 1597: buf[0] = Lexi_buf[Input_idx][Lexi_pos[Input_idx]-1];
! 1598: *result = 1;
! 1599: }
! 1600: if (Stop_Parser==1) *result = YY_NULL;
! 1601: }
! 1602:
! 1603: int capa_eof()
! 1604: {
! 1605: #ifdef AVOIDYYINPUT
! 1606: if ( --include_stack_ptr < 0 ) yyterminate();
! 1607: else {
! 1608: yy_delete_buffer( YY_CURRENT_BUFFER );
! 1609: yy_switch_to_buffer(include_stack[include_stack_ptr]);
! 1610: }
! 1611: #else
! 1612: if(Input_idx == 0) {
! 1613: fclose(Input_stream[Input_idx]);
! 1614: capa_mfree((char *)Lexi_buf[Input_idx]);
! 1615: free_problems(LexiProblem_p);
! 1616: LexiProblem_p=NULL;
! 1617: /* printf("\nCAPA EOF\n"); fflush(stdout); */
! 1618: }
! 1619: return (0);
! 1620: #endif /*AVOIDYYINPUT*/
! 1621: }
! 1622: /* ------------ */
! 1623:
! 1624:
! 1625: /* =========================================================== */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>