📄 lex.c
字号:
if (inputkind == INP_INCFILE) { pop_input(); getline(); } else strcpy(inbuf, "\001"); } break; case INP_STRLIST: if (instrlist) { strcpy(inbuf, instrlist->s); if (instrlist->value) inf_lnum = instrlist->value; else inf_lnum++; instrlist = instrlist->next; } else strcpy(inbuf, "\001"); break; } inbufptr = inbuf; inbufindent = 0;}Static void push_input(){ struct inprec *inp; inp = ALLOC(1, struct inprec, inprecs); inp->kind = inputkind; inp->fname = infname; inp->lnum = inf_lnum; inp->filep = inf; inp->strlistp = instrlist; inp->inbufptr = stralloc(inbufptr); inp->curtok = curtok; inp->curtoksym = curtoksym; inp->curtokmeaning = curtokmeaning; inp->curtokbuf = stralloc(curtokbuf); inp->curtokcase = stralloc(curtokcase); inp->saveblockkind = TOK_NIL; inp->next = topinput; topinput = inp; inbufptr = inbuf + strlen(inbuf);}void push_input_file(fp, fname, isinclude)FILE *fp;char *fname;int isinclude;{ push_input(); inputkind = (isinclude == 1) ? INP_INCFILE : INP_FILE; inf = fp; inf_lnum = 0; infname = fname; *inbuf = 0; inbufptr = inbuf; topinput->tempopts = tempoptionlist; tempoptionlist = NULL; if (isinclude != 2) gettok();}void include_as_import(){ if (inputkind == INP_INCFILE) { if (topinput->saveblockkind == TOK_NIL) topinput->saveblockkind = blockkind; blockkind = TOK_IMPORT; } else warning(format_s("%s ignored except in include files [228]", interfacecomment));}void push_input_strlist(sp, fname)Strlist *sp;char *fname;{ push_input(); inputkind = INP_STRLIST; instrlist = sp; if (fname) { infname = fname; inf_lnum = 0; } else inf_lnum--; /* adjust for extra getline() */ *inbuf = 0; inbufptr = inbuf; gettok();}void pop_input(){ struct inprec *inp; if (inputkind == INP_FILE || inputkind == INP_INCFILE) { while (tempoptionlist) { undooption(tempoptionlist->value, tempoptionlist->s); strlist_eat(&tempoptionlist); } tempoptionlist = topinput->tempopts; if (inf) fclose(inf); } inp = topinput; topinput = inp->next; if (inp->saveblockkind != TOK_NIL) blockkind = inp->saveblockkind; inputkind = inp->kind; infname = inp->fname; inf_lnum = inp->lnum; inf = inp->filep; curtok = inp->curtok; curtoksym = inp->curtoksym; curtokmeaning = inp->curtokmeaning; strcpy(curtokbuf, inp->curtokbuf); FREE(inp->curtokbuf); strcpy(curtokcase, inp->curtokcase); FREE(inp->curtokcase); strcpy(inbuf, inp->inbufptr); FREE(inp->inbufptr); inbufptr = inbuf; instrlist = inp->strlistp; FREE(inp);}int undooption(i, name)int i;char *name;{ char kind = rctable[i].kind; switch (kind) { case 'S': case 'B': if (rcprevvalues[i]) { *((short *)rctable[i].ptr) = rcprevvalues[i]->value; strlist_eat(&rcprevvalues[i]); return 1; } break; case 'I': case 'D': if (rcprevvalues[i]) { *((int *)rctable[i].ptr) = rcprevvalues[i]->value; strlist_eat(&rcprevvalues[i]); return 1; } break; case 'L': if (rcprevvalues[i]) { *((long *)rctable[i].ptr) = rcprevvalues[i]->value; strlist_eat(&rcprevvalues[i]); return 1; } break; case 'R': if (rcprevvalues[i]) { *((double *)rctable[i].ptr) = atof(rcprevvalues[i]->s); strlist_eat(&rcprevvalues[i]); return 1; } break; case 'C': case 'U': if (rcprevvalues[i]) { strcpy((char *)rctable[i].ptr, rcprevvalues[i]->s); strlist_eat(&rcprevvalues[i]); return 1; } break; case 'A': strlist_remove((Strlist **)rctable[i].ptr, name); return 1; case 'X': if (rctable[i].def == 1 || rctable[i].def == 4) { strlist_remove((Strlist **)rctable[i].ptr, name); return 1; } break; } return 0;}void badinclude(){ warning("Can't handle an \"include\" directive here [229]"); inputkind = INP_INCFILE; /* expand it in-line */ gettok();}int handle_include(fn)char *fn;{ FILE *fp = NULL; Strlist *sl; for (sl = includedirs; sl; sl = sl->next) { fp = fopen(format_s(sl->s, fn), "r"); if (fp) { fn = stralloc(format_s(sl->s, fn)); break; } } if (!fp) { perror(fn); warning(format_s("Could not open include file %s [230]", fn)); return 0; } else { if (!quietmode && !showprogress) if (outf == stdout) fprintf(stderr, "Reading include file \"%s\"\n", fn); else printf("Reading include file \"%s\"\n", fn); if (verbose) fprintf(logf, "Reading include file \"%s\"\n", fn); if (expandincludes == 0) { push_input_file(fp, fn, 2); curtok = TOK_INCLUDE; strcpy(curtokbuf, fn); } else { push_input_file(fp, fn, 1); } return 1; }}int turbo_directive(closing, after)char *closing, *after;{ char *cp, *cp2; int i, result; if (!strcincmp(inbufptr, "$double", 7)) { cp = inbufptr + 7; while (isspace(*cp)) cp++; if (cp == closing) { inbufptr = after; doublereals = 1; return 1; } } else if (!strcincmp(inbufptr, "$nodouble", 9)) { cp = inbufptr + 9; while (isspace(*cp)) cp++; if (cp == closing) { inbufptr = after; doublereals = 0; return 1; } } else if (!strcincmp(inbufptr, "$no object", 10)) { cp = inbufptr + 10; while (isspace(*cp)) cp++; if (cp == closing) { inbufptr = after; nullbody = 1; return 1; } } else if (!strcincmp(inbufptr, "$nullbody", 9)) { cp = inbufptr + 9; while (isspace(*cp)) cp++; if (cp == closing) { inbufptr = after; nullbody = 1; return 1; } } switch (inbufptr[2]) { case '+': case '-': result = 1; cp = inbufptr + 1; for (;;) { if (!isalpha(*cp++)) return 0; if (*cp != '+' && *cp != '-') return 0; if (++cp == closing) break; if (*cp++ != ',') return 0; } cp = inbufptr + 1; do { switch (*cp++) { case 'b': case 'B': if (shortcircuit < 0 && which_lang != LANG_MPW) partial_eval_flag = (*cp == '-'); break; case 'i': case 'I': iocheck_flag = (*cp == '+'); break; case 'r': case 'R': if (*cp == '+') { if (!range_flag) note("Range checking is ON [216]"); range_flag = 1; } else { if (range_flag) note("Range checking is OFF [216]"); range_flag = 0; } break; case 's': case 'S': if (*cp == '+') { if (!stackcheck_flag) note("Stack checking is ON [217]"); stackcheck_flag = 1; } else { if (stackcheck_flag) note("Stack checking is OFF [217]"); stackcheck_flag = 0; } break; default: result = 0; break; } cp++; } while (*cp++ == ','); if (result) inbufptr = after; return result; case 'c': case 'C': if (toupper(inbufptr[1]) == 'S' && (inbufptr[3] == '+' || inbufptr[3] == '-') && inbufptr + 4 == closing) { if (shortcircuit < 0) partial_eval_flag = (inbufptr[3] == '+'); inbufptr = after; return 1; } return 0; case '=': switch (inbufptr[1]) { case 'f': case 'F': goto do_include; } return 0; case ' ': switch (inbufptr[1]) { case 'i': case 'I': do_include: if (skipping_module) break; cp = inbufptr + 3; while (isspace(*cp)) cp++; cp2 = cp; i = 0; while (*cp2 && cp2 != closing) i++, cp2++; if (cp2 != closing) return 0; while (isspace(cp[i-1])) if (--i <= 0) return 0; inbufptr = after; cp2 = ALLOC(i + 1, char, strings); strncpy(cp2, cp, i); cp2[i] = 0; if (handle_include(cp2)) return 2; break; case 's': case 'S': cp = inbufptr + 3; outsection(minorspace); if (cp == closing) { output("#undef __SEG__\n"); } else { output("#define __SEG__ "); while (*cp && cp != closing) cp++; if (*cp) { i = *cp; *cp = 0; output(inbufptr + 3); *cp = i; } output("\n"); } outsection(minorspace); inbufptr = after; return 1; } return 0; case '}': case '*': if (inbufptr + 2 == closing) { switch (inbufptr[1]) { case 's': case 'S': outsection(minorspace); output("#undef __SEG__\n"); outsection(minorspace); inbufptr = after; return 1; } } return 0; case 'f': /* $ifdef etc. */ case 'F': if (toupper(inbufptr[1]) == 'I' && ((toupper(inbufptr[3]) == 'O' && toupper(inbufptr[4]) == 'P' && toupper(inbufptr[5]) == 'T') || (toupper(inbufptr[3]) == 'D' && toupper(inbufptr[4]) == 'E' && toupper(inbufptr[5]) == 'F') || (toupper(inbufptr[3]) == 'N' && toupper(inbufptr[4]) == 'D' && toupper(inbufptr[5]) == 'E' && toupper(inbufptr[6]) == 'F'))) { note("Turbo Pascal conditional compilation directive was ignored [218]"); } return 0; } return 0;}extern Strlist *addmacros;void defmacro(name, kind, fname, lnum)char *name, *fname;long kind;int lnum;{ Strlist *defsl, *sl, *sl2; Symbol *sym, *sym2; Meaning *mp; Expr *ex; defsl = NULL; sl = strlist_append(&defsl, name); C_lex++; if (fname && !strcmp(fname, "<macro>") && curtok == TOK_IDENT) fname = curtoksym->name; push_input_strlist(defsl, fname); if (fname) inf_lnum = lnum; switch (kind) { case MAC_VAR: if (!wexpecttok(TOK_IDENT)) break; for (mp = curtoksym->mbase; mp; mp = mp->snext) { if (mp->kind == MK_VAR) warning(format_s("VarMacro must be defined before declaration of variable %s [231]", curtokcase)); } sl = strlist_append(&varmacros, curtoksym->name); gettok(); if (!wneedtok(TOK_EQ)) break; sl->value = (long)pc_expr(); break; case MAC_CONST: if (!wexpecttok(TOK_IDENT)) break; for (mp = curtoksym->mbase; mp; mp = mp->snext) { if (mp->kind == MK_CONST) warning(format_s("ConstMacro must be defined before declaration of variable %s [232]", curtokcase)); } sl = strlist_append(&constmacros, curtoksym->name); gettok(); if (!wneedtok(TOK_EQ)) break; sl->value = (long)pc_expr(); break; case MAC_FIELD: if (!wexpecttok(TOK_IDENT)) break; sym = curtoksym; gettok(); if (!wneedtok(TOK_DOT)) break; if (!wexpecttok(TOK_IDENT)) break; sym2 = curtoksym; gettok(); if (!wneedtok(TOK_EQ)) break; funcmacroargs = NULL; sym->flags |= FMACREC; ex = pc_expr(); sym->flags &= ~FMACREC; for (mp = sym2->fbase; mp; mp = mp->snext) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -