void postfix(void) { char symbol; precedence token; int n=0; int top=0; stack[0]=eos; for(token=get_token(&symbol,&n);token!=eos;token=get_token(&symbol,&n)) { if(token==operand) printf("%c",symbol); else if(token==rparen) { while(stack[top]!=lparen) printtoken(pop(&top)); } else { if (isp(&stack[top])>=isp(&token)) printtoken(pop(&top)); push(&top,token); } } while((token=pop(&top))!=eos) printtoken(token); }
void skipto(int tok, char set[]) { int n; char *s; assert(set); for (n = 0; t != EOI && t != tok; t = gettok()) { for (s = set; *s && kind[t] != *s; s++) ; if (kind[t] == *s) break; if (n++ == 0) error("skipping"); if (n <= 8) printtoken(); else if (n == 9) fprint(stderr, " ..."); } if (n > 8) { fprint(stderr, " up to"); printtoken(); } if (n > 0) fprint(stderr, "\n"); }
void expect(int tok) { if (t == tok) t = gettok(); else { error("syntax error; found"); printtoken(); fprint(stderr, " expecting `%k'\n", tok); } }
void printexprnode(const char *s, exprnode list) { printf("%s", s); while (list) { if (list->is_float && list->tok.type != TOK_FLOAT && list->tok.type != TOK_TOFLOAT) printf("."); printtoken(&list->tok); if (list->tok.type == TOK_VAR) { if (list->history_index < 0) printf("{%d}", list->history_index); if (list->vector_index > -1) printf("[%d]", list->vector_index); } list = list->next; if (list) printf(" "); } }
static struct zastoken * zasprocinst(struct zastoken *token, zasmemadr_t adr, zasmemadr_t *retadr) { #if (WPM) struct wpmopcode *op = NULL; #elif (ZEN) struct zpuop *op = NULL; #endif #if (WPMVEC) struct vecopcode *vop = NULL; #endif zasmemadr_t opadr = rounduppow2(adr, 4); struct zastoken *token1 = NULL; struct zastoken *token2 = NULL; struct zastoken *retval = NULL; struct zassymrec *sym; uint8_t narg = token->data.inst.narg; // uint8_t len = token->data.inst.op == OPNOP ? 1 : 4; uint8_t len = 4; while (adr < opadr) { #if (WPM) physmem[adr] = OPNOP; #endif adr++; } // adr = opadr; #if (ZASDB) zasaddline(adr, token->data.inst.data, token->file, token->line); #endif #if (WPMVEC) if (token->unit == UNIT_VEC) { vop = (struct vecopcode *)&zvm.physmem[adr]; vop->inst = token->data.inst.op; vop->unit = UNIT_VEC; vop->flg = token->opflg; token1 = token->next; zasfreetoken(token); if (token1) { switch(token1->type) { case ZASTOKENVAREG: vop->arg1t = ARGVAREG; vop->reg1 = token1->data.reg & 0xff; break; case ZASTOKENVLREG: vop->arg1t = ARGVLREG; vop->reg1 = token1->data.reg & 0xff; break; case ZASTOKENIMMED: vop->arg1t = ARGIMMED; vop->args[0] = token1->val; len += sizeof(zasword_t); break; case ZASTOKENADR: vop->arg1t = ARGIMMED; sym = malloc(sizeof(struct zassymrec)); sym->name = (uint8_t *)strdup((char *)token1->data.sym.name); sym->adr = (uintptr_t)&op->args[0]; zasqueuesym(sym); len += sizeof(uintptr_t); break; default: fprintf(stderr, "invalid argument 1 of type %lx\n", token1->type); printtoken(token1); exit(1); break; } token2 = token1->next; zasfreetoken(token1); retval = token2; } vop->narg = len >> 3; if (narg == 1) { vop->arg2t = ARGNONE; } else if (narg == 2 && (token2)) { switch(token2->type) { case ZASTOKENVAREG: vop->arg2t = ARGVAREG; vop->reg2 = token2->data.reg & 0xff; break; case ZASTOKENVLREG: vop->arg2t = ARGVLREG; vop->reg2 = token2->data.reg & 0xff; break; default: fprintf(stderr, "invalid argument 2 of type %lx\n", token2->type); printtoken(token2); exit(1); break; } retval = token2->next; zasfreetoken(token2); } } else
static void displaysettings(struct termios *m, int all) { const struct key *kbd = keys; const struct mode *mod = modes; struct winsize winsize; speed_t in, out; tcflag_t *bitsp, mask; const char *linestr; in = cfgetispeed(m); out = cfgetospeed(m); if (!in || in == out) { if (all || out != B38400) printtoken("speed %s baud;", baudtostr(out)); } else { printtoken("ispeed %s baud;", baudtostr(in)); printtoken("ospeed %s baud;", baudtostr(out)); } if (all) { if (ioctl(STDIN_FILENO, TIOCGWINSZ, &winsize)) eprintf("TIOCGWINSZ <stdin>:"); printtoken("rows %u;", winsize.ws_row); printtoken("columns %u;", winsize.ws_col); } printtoken("\n"); if (all || m->c_line != 0) { linestr = linetostr(m->c_line); if (linestr) printtoken("line = %s;", linestr); else printtoken("line = %u;", (unsigned)(m->c_line)); } if (all || (m->c_cc[VMIN] != 1 && !(m->c_lflag & ICANON))) printtoken("min = %u;", (unsigned)(m->c_cc[VMIN])); if (all || (m->c_cc[VTIME] != 0 && !(m->c_lflag & ICANON))) printtoken("time = %u;", (unsigned)(m->c_cc[VTIME])); printtoken("\n"); for (; kbd->op; kbd++) if (all || m->c_cc[kbd->index] != kbd->sanevalue) printtoken("%s = %s;", kbd->op, keytostr(m->c_cc[kbd->index])); printtoken("\n"); for (; mod->op; mod++) { switch (mod->type) { case CTRL: bitsp = &m->c_cflag; break; case IN: bitsp = &m->c_iflag; break; case OUT: bitsp = &m->c_oflag; break; case LOCAL: bitsp = &m->c_lflag; break; default: bitsp = 0; break; } if (!bitsp || (mod->flags & DUP)) continue; mask = mod->clear ? mod->clear : mod->set; if ((*bitsp & mask) == mod->set) { if (all || !isdefault(mod->flags)) printtoken("%s", mod->op); } else if (mod->flags & BOOL) { if (all || isdefault(mod->flags)) printtoken("-%s", mod->op); } } printtoken("\n"); }