void forloop(char *var, double from, double to, int op, double by, char *str) /* set up a for loop */ { dprintf("# for %s from %g to %g by %c %g \n", var, from, to, op, by); if (++forp >= forstk+10) ERROR "for loop nested too deep" FATAL; forp->var = var; forp->to = to; forp->op = op; forp->by = by; forp->str = str; setfval(var, from); nextfor(); unput('\n'); }
void forloop(char *var, double from, double to, int op, double by, char *str) { if (++forp >= forstk+10) fatal("for loop nested too deep"); /* note: actually we here want to take a vector variable and construct its */ /* values directly, then access them one at a time below; the current */ /* version is a temporary concession to old pic's version of the 'for' */ forp->sym = findvar(var, VARNAME); if (forp->sym->s_dim && forp->sym->s_val.a) free(forp->sym->s_val.a); forp->sym->s_dim = 0; forp->sym->s_val.f = from; forp->to = to; if (by == 0.) fatal("step size of 0 not allowed"); /* For additive or subtractive step, make sure step is positive. Otherwise, make sure step is greater than 1 in absolute value. */ if ((op == ' ' || op == '+') && by < 0.) { op = '-'; by = -by; } else if (op == '-' && by < 0.) { op = '+'; by = -by; } else if (op == '*' && fabs(by) < 1.) { op = '/'; by = 1 / by; } else if (op == '/' && fabs(by) < 1.) { op = '*'; by = 1 / by; } forp->op = op; forp->by = by; forp->str = str; nextfor(); unput('\n'); }
void endfor(void) /* end one iteration of for loop */ { switch (forp->op) { case '+': case ' ': forp->sym->s_val.f += forp->by; break; case '-': forp->sym->s_val.f -= forp->by; break; case '*': forp->sym->s_val.f *= forp->by; break; case '/': forp->sym->s_val.f /= forp->by; break; } nextfor(); }
void endfor(void) /* end one iteration of for loop */ { struct symtab *p = lookup(forp->var); switch (forp->op) { case '+': case ' ': p->s_val.f += forp->by; break; case '-': p->s_val.f -= forp->by; break; case '*': p->s_val.f *= forp->by; break; case '/': p->s_val.f /= forp->by; break; } nextfor(); }