/********************************************************************* return: next character from current input stream **********************************************************************/ static int getnext(void) { int ch; if(inputputbackcount > 0) { ch = inputputback[--inputputbackcount]; (current->columnnr)++; return ch; } if(inputstate == CLOSED) systemerror(9); if(current->columnnr > 0 && inputbuffer[current->columnnr-1] == '\0') { if(inputstate == EXPRESSIONINPUT) return EOF; else if(current->fp == NULL || !fgets(inputbuffer, stringsize, current->fp)) { closeinput(); return inputstate==FILEINPUT ? getnext() : EOF; } (current->linenr)++; current->columnnr = 0; if(preprocess()) return getnext(); } ch = inputbuffer[(current->columnnr)++]; if(ch == '\0') ch = '\n'; return ch; }
bool parseinput(char s[]) { bool result = False; setchecktypevariables(NOCHECK); openinput(s); checkmemlarge(); storefunctionname(""); tokenoffside = 0; gettoken(); if(tokentype == empty) { push(template_nil); return result; } parseexpression(MAXPRIO); if(tokentype == WHERE) { gettoken(); parsewhereclause(); } if(tokentype == COLONS) result = True; else if(tokentype != empty) parseerror(19); closeinput(); initrename(""); settop(renamerec(EXP, top())); return result; }
void openinput(char s[]) { while(inputstate != CLOSED) closeinput(); inputstate = EXPRESSIONINPUT; strcpy(current->name, ""); strncat(strcpy(inputbuffer, ""), s, sizeof(inputbuffer)-1); current->columnnr = 0; inputputbackcount = 0; }
void parsetypeexpr(char s[]) { setchecktypevariables(NOCHECK); openinput(s); checkmemlarge(); tokenoffside = 0; gettoken(); parsetype(TYPEEXPR); closeinput(); }
void parsefile(char filename[]) { setchecktypevariables(NOCHECK); openfileinput(filename); tokenoffside = 0; gettoken(); while(tokentype != empty) { checkmemlarge(); parsedefinition(True); tokenoffside = 0; if(tokentype == offside) gettoken(); } closeinput(); }
void lexerror(void) { if(inputstate == EXPRESSIONINPUT || strcmp(current->name, "") == 0) { int k, l = current->columnnr + strlen(GetOption("ConPrompt")); for(k=1; k<l; k++) Write(" "); Write("^"); } else { Write("file : %s\n", current->name); Write("line : %d\n", current->linenr); Write("column: %d\n", current->columnnr); while(inputstate != CLOSED) closeinput(); } }