#include "hp2graph.h" #include #define LEXBUFFER 8192 static char lexbuffer[2*LEXBUFFER+1]; static SharedToken lexpos; static SharedToken lexlast; static int lexeof=1; int lexline=1; SharedToken lextoken; static FILE *lexFile; void initlex(FILE *fp) { lexpos = 0; lexeof = 0; lexline = 1; lexFile = fp; } static int skipblank(void) { char *start; char c; whileblank: if(lexpos) { for(start = lexpos; (c=*lexpos) && isspace(c); lexpos++) if(c=='\n') lexline++; } else c = 0; if(!c) { int last; if(lexeof || !(last = fread(lexpos=&lexbuffer[LEXBUFFER],1,LEXBUFFER,lexFile))) { lextoken = 0; return (lexeof = 1); } lexlast = &lexbuffer[LEXBUFFER+last]; *lexlast = 0; goto whileblank; } return 0; } SharedToken getToken(void) { SharedToken start; int startline = lexline; SharedToken stop; char c; if(skipblank()) return lextoken; for(start = lexpos; (c=*lexpos) && !isspace(c); lexpos++) ; if(!c) { int last; int len = lexpos - start; /* Don't copy trailing '\0' */ start = memcpy(&lexbuffer[LEXBUFFER]-len,start,len); if(lexeof || !(last = fread(lexpos=&lexbuffer[LEXBUFFER],1,LEXBUFFER,lexFile))) { lexeof = 1; lexpos = 0; lexbuffer[LEXBUFFER] = 0; return lextoken=start; } lexbuffer[LEXBUFFER+last] = 0; for( ; (c=*lexpos) && !isspace(c); lexpos++) ; if(!c) { fprintf(stderr,"Token starting att line %d is more than %d characters\n",startline,LEXBUFFER); abort(); } } if(c) { if(c=='\n') lexline++; *lexpos++ = 0; } return lextoken=start; } SharedToken getString(void) { SharedToken start; int startline = lexline; SharedToken stop; char c; if(skipblank() || *lexpos != '"') { fprintf(stderr,"Expecting string at %d.\n",lexline); abort(); } lexpos++; /* skip " */ for(start = lexpos; (c=*lexpos) && c!='"' && lexpos[-1]!='\\' ; lexpos++) ; if(!c) { int last; int len = lexpos - start; /* Don't copy trailing '\0' */ start = memcpy(start-len,start,len); if(lexeof || !(last = fread(lexpos=&lexbuffer[LEXBUFFER],1,LEXBUFFER,lexFile))) { lexeof = 1; lexpos = 0; lexbuffer[LEXBUFFER] = 0; return lextoken=start; } for( ; (c=*lexpos) && c!='"' && lexpos[-1]!='\\'; lexpos++) ; if(!c) { fprintf(stderr,"String starting att line %d is more than %d characters\n",startline,LEXBUFFER); abort(); } } if(c=='"') { *lexpos++ = 0; /* overwrite terminating " */ } else { fprintf(stderr,"No terminating '\"' for string that started at %d.\n",startline); abort(); } return lextoken=start; }