static int doglobal(char *pre, int dowhat) { Ordered *walk; Symbol *sp; int j, cnt = 0; for (j = 0; j < 8; j++) for (walk = all_names; walk; walk = walk->next) { sp = walk->entry; if (!sp->context && !sp->owner && sp->type == Types[j]) { if (Types[j] != MTYPE || !ismtype(sp->name)) switch (dowhat) { case LOGV: if (sp->type == CHAN && verbose == 0) break; if (sp->hidden&1) break; do_var(tc, dowhat, "", sp, pre, "\", now.", ");\n"); break; case INIV: checktype(sp, (char *) 0); cnt++; /* fall through */ case PUTV: do_var(tc, dowhat, (sp->hidden&1)?"":"now.", sp, "", " = ", ";\n"); break; } } } return cnt; }
int dolocal(FILE *ofd, char *pre, int dowhat, int p, char *s) { int h, j, k=0; extern int nr_errs; Ordered *walk; Symbol *sp; char buf[64], buf2[128], buf3[128]; if (dowhat == INIV) { /* initialize in order of declaration */ for (walk = all_names; walk; walk = walk->next) { sp = walk->entry; if (sp->context && !sp->owner && strcmp(s, sp->context->name) == 0) { checktype(sp, s); /* fall through */ if (!(sp->hidden&16)) { sprintf(buf, "((P%d *)pptr(h))->", p); do_var(ofd, dowhat, buf, sp, "", " = ", ";\n"); } k++; } } } else { for (j = 0; j < 8; j++) for (h = 0; h <= 1; h++) for (walk = all_names; walk; walk = walk->next) { sp = walk->entry; if (sp->context && !sp->owner && sp->type == Types[j] && ((h == 0 && sp->nel == 1) || (h == 1 && sp->nel > 1)) && strcmp(s, sp->context->name) == 0) { switch (dowhat) { case LOGV: if (sp->type == CHAN && verbose == 0) break; sprintf(buf, "%s%s:", pre, s); { sprintf(buf2, "\", ((P%d *)pptr(h))->", p); sprintf(buf3, ");\n"); } do_var(ofd, dowhat, "", sp, buf, buf2, buf3); break; case PUTV: sprintf(buf, "((P%d *)pptr(h))->", p); do_var(ofd, dowhat, buf, sp, "", " = ", ";\n"); k++; break; } if (strcmp(s, ":never:") == 0) { printf("error: %s defines local %s\n", s, sp->name); nr_errs++; } } } } return k; }
int expression(void) { int value = 0; char op = 0, ch = 0; skip_space(); ch = str[idx]; if (ch == '\0') { return 0; } if (ch == '(') { idx += 1; /* read '(' */ value = expression(); skip_space(); idx += 1; /* read ')' */ skip_space(); if (is_operator()) { op = operator(); /*printf("%d|%c ", order++, op);*/ int v = expression(); return do_num(op, value, v); } else { return value; } } else if (ch == '_' || isdigit(ch)) { int num = number(); /*printf("%d|%d ", order++, num);*/ skip_space(); if (is_operator()) { op = operator(); /*printf("%d|%c ", order++, op);*/ value = expression(); return do_num(op, num, value); } else { return num; } } else { char var = variable(); /*printf("%d|%c ", order++, var);*/ skip_space(); if (is_operator()) { op = operator(); /*printf("%d|%c ", order++, op);*/ value = expression(); return do_var(op, var, value); } else { return vars[var - 'A']; } } }
void walk_struct(FILE *ofd, int dowhat, char *s, Symbol *z, char *a, char *b, char *c) { Lextok *fp, *tl; char eprefix[128]; int ix; ini_struct(z); if (z->nel == 1) sprintf(eprefix, "%s%s.", s, z->name); for (ix = 0; ix < z->nel; ix++) { if (z->nel > 1) sprintf(eprefix, "%s%s[%d].", s, z->name, ix); for (fp = z->Sval[ix]; fp; fp = fp->rgt) for (tl = fp->lft; tl; tl = tl->rgt) { if (tl->sym->type == STRUCT) walk_struct(ofd, dowhat, eprefix, tl->sym, a,b,c); else do_var(ofd, dowhat, eprefix, tl->sym, a,b,c); } } }