bool cbInstrAssemble(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 3)) return false; duint addr = 0; if(!valfromstring(argv[1], &addr)) { dprintf(QT_TRANSLATE_NOOP("DBG", "Invalid expression: \"%s\"!\n"), argv[1]); return false; } if(!DbgMemIsValidReadPtr(addr)) { dprintf(QT_TRANSLATE_NOOP("DBG", "Invalid address: %p!\n"), addr); return false; } bool fillnop = false; if(argc > 3) fillnop = true; char error[MAX_ERROR_SIZE] = ""; int size = 0; if(!assembleat(addr, argv[2], &size, error, fillnop)) { varset("$result", size, false); dprintf(QT_TRANSLATE_NOOP("DBG", "Failed to assemble \"%s\" (%s)\n"), argv[2], error); return false; } varset("$result", size, false); GuiUpdateAllViews(); return true; }
static void execute( /* process a file */ char *file ) { int conditional = vardefined("cond"); long nrecs = 0; long nout = 0; FILE *fp; if (file == NULL) fp = stdin; else if ((fp = fopen(file, "r")) == NULL) { eputs(file); eputs(": cannot open\n"); quit(1); } if (inpfmt != NULL) initinp(fp); while (getinputrec(fp)) { varset("recno", '=', (double)++nrecs); varset("outno", '=', (double)(nout+1)); colflg = 0; eclock++; if (!conditional || varvalue("cond") > 0.0) { putout(); ++nout; } } fclose(fp); }
static void combine(void) /* combine pictures */ { EPNODE *coldef[3], *brtdef; COLOR *scanout; double d; register int i, j; /* check defined variables */ for (j = 0; j < 3; j++) { if (vardefined(vcolout[j])) coldef[j] = eparse(vcolout[j]); else coldef[j] = NULL; } if (vardefined(vbrtout)) brtdef = eparse(vbrtout); else brtdef = NULL; /* allocate scanline */ scanout = (COLOR *)emalloc(xres*sizeof(COLOR)); /* set input position */ yscan = ymax+MIDSCN; /* combine files */ for (ypos = yres-1; ypos >= 0; ypos--) { advance(); varset(vypos, '=', (double)ypos); for (xpos = 0; xpos < xres; xpos++) { xscan = (xpos+.5)*xmax/xres; varset(vxpos, '=', (double)xpos); eclock++; if (brtdef != NULL) { d = evalue(brtdef); if (d < 0.0) d = 0.0; setcolor(scanout[xpos], d, d, d); } else { for (j = 0; j < 3; j++) { if (coldef[j] != NULL) { d = evalue(coldef[j]); } else { d = 0.0; for (i = 0; i < nfiles; i++) d += colval(input[i].scan[MIDSCN][xscan],j); } if (d < 0.0) d = 0.0; colval(scanout[xpos],j) = d; } } } if (fwritescan(scanout, xres, stdout) < 0) { perror("write error"); quit(1); } } efree((char *)scanout); }
static void test_fifos() { #ifdef DEBUG memfifo::CHUNK_SIZE = 2 * sizeof(variant); #endif memfifo f(NULL, false); varvec t; t.push_back(0); f.var_enq(t); f.var_enq("abc"); f.var_enq("def"); variant w = varset(); f.var_enq(w); // f.dump(std::cout); std::cout << std::endl; variant x; f.var_deq(x); check(x.is(variant::VEC)); f.var_deq(w); check(w.is(variant::STR)); f.var_eat(); variant vr; f.var_preview(vr); check(vr.is(variant::SET)); memfifo fc(NULL, true); test_bidir_char_fifo(fc); strfifo fs(NULL); test_bidir_char_fifo(fs); }
bool cbAddWatch(int argc, char* argv[]) { if(argc < 2) { dputs(QT_TRANSLATE_NOOP("DBG", "No enough arguments for addwatch\n")); return false; } WATCHVARTYPE newtype = WATCHVARTYPE::TYPE_UINT; if(argc > 2) { if(_stricmp(argv[2], "uint") == 0) newtype = WATCHVARTYPE::TYPE_UINT; else if(_stricmp(argv[2], "int") == 0) newtype = WATCHVARTYPE::TYPE_INT; else if(_stricmp(argv[2], "float") == 0) newtype = WATCHVARTYPE::TYPE_FLOAT; else if(_stricmp(argv[2], "ascii") == 0) newtype = WATCHVARTYPE::TYPE_ASCII; else if(_stricmp(argv[2], "unicode") == 0) newtype = WATCHVARTYPE::TYPE_UNICODE; } unsigned int newid = WatchAddExpr(argv[1], newtype); varset("$result", newid, false); return true; }
bool cbScriptMsgyn(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 2)) return false; varset("$RESULT", GuiScriptMsgyn(stringformatinline(argv[1]).c_str()), false); return true; }
/* Interpolate and output a BSDF function using Klems basis */ static void eval_function(char *funame) { ANGLE_BASIS *abp = get_basis(kbasis); int assignD = (fundefined(funame) < 6); FILE *ofp = open_component_file(CIE_Y); double iovec[6]; double sum; int i, j, n; initurand(npsamps); for (j = 0; j < abp->nangles; j++) { /* run through directions */ for (i = 0; i < abp->nangles; i++) { sum = 0; for (n = npsamps; n--; ) { /* average over patches */ if (output_orient > 0) fo_getvec(iovec+3, j+(n+frandom())/npsamps, abp); else bo_getvec(iovec+3, j+(n+frandom())/npsamps, abp); if (input_orient > 0) fi_getvec(iovec, i+urand(n), abp); else bi_getvec(iovec, i+urand(n), abp); if (assignD) { varset("Dx", '=', -iovec[3]); varset("Dy", '=', -iovec[4]); varset("Dz", '=', -iovec[5]); ++eclock; } sum += funvalue(funame, 6, iovec); } fprintf(ofp, "\t%.3e\n", sum/npsamps); } fputc('\n', ofp); prog_show((j+1.)/abp->nangles); } prog_done(); if (fclose(ofp)) { fprintf(stderr, "%s: error writing Y output\n", progname); exit(1); } }
/** \brief Sets a variable by name. \param Name The name of the variable. Cannot be null. \param Value The new value. \param ReadOnly true to set read-only variables (like $hProcess etc.). \return true if the variable was set successfully, false otherwise. */ bool varset(const char* Name, duint Value, bool ReadOnly) { // Insert variable as an unsigned integer VAR_VALUE varValue; varValue.size = sizeof(duint); varValue.type = VAR_UINT; varValue.u.value = Value; return varset(Name, &varValue, ReadOnly); }
CMDRESULT cbScriptMsgyn(int argc, char* argv[]) { if(argc < 2) { dputs("not enough arguments!"); return STATUS_ERROR; } varset("$RESULT", GuiScriptMsgyn(argv[1]), false); return STATUS_CONTINUE; }
static void init(void) /* perform final setup */ { register int i; /* define constants */ varset("PI", ':', PI); varset(vnfiles, ':', (double)nfiles); varset(vxmax, ':', (double)xmax); varset(vymax, ':', (double)ymax); /* set functions */ for (i = 0; i < 3; i++) { funset(vcolexp[i], 1, ':', l_expos); funset(vcolin[i], 1, '=', l_colin); } funset(vbrtexp, 1, ':', l_expos); funset(vbrtin, 1, '=', l_colin); funset(vpixaspect, 1, ':', l_pixaspect); for (i = 0; i < 7; i++) funset(vray[i], 1, '=', l_ray); funset(vpsize, 1, '=', l_psize); /* set brightness function */ if (!strcmp(ourfmt, CIEFMT)) { varset(vwhteff, ':', 1.0); ourbright = xyz_bright; } else varset(vwhteff, ':', WHTEFFICACY); }
/* Interpolate and output a BSDF function using Klems basis */ static void eval_function(char *funame) { ANGLE_BASIS *abp = get_basis(kbasis); int assignD = (fundefined(funame) < 6); double iovec[6]; double sum; int i, j, n; initurand(npsamps); data_prologue(); /* begin output */ for (j = 0; j < abp->nangles; j++) { /* run through directions */ for (i = 0; i < abp->nangles; i++) { sum = 0; for (n = npsamps; n--; ) { /* average over patches */ if (output_orient > 0) fo_getvec(iovec+3, j+(n+frandom())/npsamps, abp); else bo_getvec(iovec+3, j+(n+frandom())/npsamps, abp); if (input_orient > 0) fi_getvec(iovec, i+urand(n), abp); else bi_getvec(iovec, i+urand(n), abp); if (assignD) { varset("Dx", '=', -iovec[3]); varset("Dy", '=', -iovec[4]); varset("Dz", '=', -iovec[5]); ++eclock; } sum += funvalue(funame, 6, iovec); } printf("\t%.3e\n", sum/npsamps); } putchar('\n'); } data_epilogue(); /* finish output */ }
bool cbInstrGpa(int argc, char* argv[]) { if(IsArgumentsLessThan(argc, 2)) return false; char newcmd[deflen] = ""; if(argc >= 3) sprintf_s(newcmd, "\"%s\":%s", argv[2], argv[1]); else sprintf_s(newcmd, "%s", argv[1]); duint result = 0; if(!valfromstring(newcmd, &result, false)) return false; varset("$RESULT", result, false); return true; }
bool cbCheckWatchdog(int argc, char* argv[]) { EXCLUSIVE_ACQUIRE(LockWatch); bool watchdogTriggered = false; for(auto j = watchexpr.begin(); j != watchexpr.end(); ++j) { std::pair<unsigned int, WatchExpr*> i = *j; i.second->watchdogTriggered = false; duint intVal = i.second->getIntValue(); watchdogTriggered |= i.second->watchdogTriggered; } EXCLUSIVE_RELEASE(); if(watchdogTriggered) GuiUpdateWatchViewAsync(); varset("$result", watchdogTriggered ? 1 : 0, false); return true; }
static int setbrdfunc( /* set up brdf function and variables */ BRDFDAT *np ) { FVECT vec; if (setfunc(np->mp, np->pr) == 0) return(0); /* it's OK, setfunc says we're done */ /* else (re)assign special variables */ multv3(vec, np->pnorm, funcxf.xfm); varset("NxP", '=', vec[0]/funcxf.sca); varset("NyP", '=', vec[1]/funcxf.sca); varset("NzP", '=', vec[2]/funcxf.sca); varset("RdotP", '=', np->pdot <= -1.0 ? -1.0 : np->pdot >= 1.0 ? 1.0 : np->pdot); varset("CrP", '=', colval(np->mcolor,RED)); varset("CgP", '=', colval(np->mcolor,GRN)); varset("CbP", '=', colval(np->mcolor,BLU)); return(1); }
/** \brief Sets a variable by name. \param Name The name of the variable. Cannot be null. \param Value The new value. Cannot be null. \param ReadOnly true to set read-only variables (like $hProcess etc.). \return true if the variable was set successfully, false otherwise. */ bool varset(const char* Name, const char* Value, bool ReadOnly) { VAR_VALUE varValue; int stringLen = (int)strlen(Value); varValue.size = stringLen; varValue.type = VAR_STRING; varValue.u.data = new std::vector<unsigned char>; // Allocate space for the string varValue.u.data->resize(stringLen); // Copy directly to vector array memcpy(varValue.u.data->data(), Value, stringLen); // Try to register variable if(!varset(Name, &varValue, ReadOnly)) { delete varValue.u.data; return false; } return true; }
static void cbDebugLoadLibBPX() { HANDLE LoadLibThread = ThreadGetHandle((DWORD)LoadLibThreadID); #ifdef _WIN64 duint LibAddr = GetContextDataEx(LoadLibThread, UE_RAX); #else duint LibAddr = GetContextDataEx(LoadLibThread, UE_EAX); #endif //_WIN64 varset("$result", LibAddr, false); backupctx.eflags &= ~0x100; SetFullContextDataEx(LoadLibThread, &backupctx); MemFreeRemote(DLLNameMem); MemFreeRemote(ASMAddr); ThreadResumeAll(); //update GUI DebugUpdateGuiSetStateAsync(GetContextDataEx(hActiveThread, UE_CIP), true); //lock lock(WAITID_RUN); dbgsetforeground(); PLUG_CB_PAUSEDEBUG pauseInfo = { nullptr }; plugincbcall(CB_PAUSEDEBUG, &pauseInfo); wait(WAITID_RUN); }
/** \brief Sets a variable by name. \param Name The name of the variable. Cannot be null. \param Value The new value. Cannot be null. \param ReadOnly true to set read-only variables (like $hProcess etc.). \return true if the variable was set correctly, false otherwise. */ bool varset(const char* Name, VAR_VALUE* Value, bool ReadOnly) { EXCLUSIVE_ACQUIRE(LockVariables); String name_; if(*Name != '$') name_ = "$"; name_ += Name; auto found = variables.find(name_); if(found == variables.end()) //not found return false; if(found->second.alias.length()) { // Release the lock (potential deadlock here) EXCLUSIVE_RELEASE(); return varset(found->second.alias.c_str(), Value, ReadOnly); } if(!ReadOnly && (found->second.type == VAR_READONLY || found->second.type == VAR_HIDDEN)) return false; varsetvalue(&found->second, Value); return true; }
int main( int argc, char *argv[] ) { int original; double f; int a; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; /* scan options */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': case 'y': a++; continue; case 'w': nowarn = !nowarn; continue; case 'h': echoheader = !echoheader; continue; case 'f': case 'e': a++; continue; } break; } newheader("RADIANCE", stdout); /* start header */ fputnow(stdout); /* process files */ for (nfiles = 0; nfiles < MAXINP; nfiles++) { setcolor(input[nfiles].coef, 1.0, 1.0, 1.0); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); input[nfiles].vw = stdview; input[nfiles].pa = 1.0; } nfiles = 0; original = 0; for ( ; a < argc; a++) { if (nfiles >= MAXINP) { eputs(argv[0]); eputs(": too many picture files\n"); quit(1); } if (argv[a][0] == '-') switch (argv[a][1]) { case '\0': input[nfiles].name = StandardInput; input[nfiles].fp = stdin; break; case 'o': original++; continue; case 's': f = atof(argv[++a]); scalecolor(input[nfiles].coef, f); continue; case 'c': colval(input[nfiles].coef,RED)*=atof(argv[++a]); colval(input[nfiles].coef,GRN)*=atof(argv[++a]); colval(input[nfiles].coef,BLU)*=atof(argv[++a]); continue; default: goto usage; } else { if (argv[a][0] == '!') { input[nfiles].name = Command; input[nfiles].fp = popen(argv[a]+1, "r"); } else { input[nfiles].name = argv[a]; input[nfiles].fp = fopen(argv[a], "r"); } if (input[nfiles].fp == NULL) { perror(argv[a]); quit(1); } } checkfile(); if (original) { colval(input[nfiles].coef,RED) /= colval(input[nfiles].expos,RED); colval(input[nfiles].coef,GRN) /= colval(input[nfiles].expos,GRN); colval(input[nfiles].coef,BLU) /= colval(input[nfiles].expos,BLU); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); } nfiles++; original = 0; } init(); /* set constants */ /* go back and get expressions */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': varset(vxres, ':', eval(argv[++a])); continue; case 'y': varset(vyres, ':', eval(argv[++a])); continue; case 'w': continue; case 'h': continue; case 'f': fcompile(argv[++a]); continue; case 'e': scompile(argv[++a], NULL, 0); continue; } break; } /* set/get output resolution */ if (!vardefined(vxres)) varset(vxres, ':', (double)xmax); if (!vardefined(vyres)) varset(vyres, ':', (double)ymax); xres = varvalue(vxres) + .5; yres = varvalue(vyres) + .5; if (xres <= 0 || yres <= 0) { eputs(argv[0]); eputs(": illegal output resolution\n"); quit(1); } /* complete header */ printargs(argc, argv, stdout); if (strcmp(ourfmt, PICFMT)) fputformat(ourfmt, stdout); /* print format if known */ putchar('\n'); fprtresolu(xres, yres, stdout); /* combine pictures */ combine(); quit(0); usage: eputs("Usage: "); eputs(argv[0]); eputs( " [-w][-h][-x xr][-y yr][-e expr][-f file] [ [-o][-s f][-c r g b] hdr ..]\n"); quit(1); return 1; /* pro forma return */ }
static int redirect( /* compute n'th ray redirection */ OBJREC *m, RAY *r, int n ) { MFUNC *mf; EPNODE **va; FVECT nsdir; RAY nr; double coef; int j; /* set up function */ mf = getdfunc(m); setfunc(m, r); /* assign direction variable */ if (r->rsrc >= 0) { SRCREC *sp = source + source[r->rsrc].sa.sv.sn; if (sp->sflags & SDISTANT) VCOPY(nsdir, sp->sloc); else { for (j = 0; j < 3; j++) nsdir[j] = sp->sloc[j] - r->rop[j]; normalize(nsdir); } multv3(nsdir, nsdir, funcxf.xfm); varset("DxA", '=', nsdir[0]/funcxf.sca); varset("DyA", '=', nsdir[1]/funcxf.sca); varset("DzA", '=', nsdir[2]/funcxf.sca); } else { varset("DxA", '=', 0.0); varset("DyA", '=', 0.0); varset("DzA", '=', 0.0); } /* compute coefficient */ errno = 0; va = mf->ep + 4*n; coef = evalue(va[0]); if ((errno == EDOM) | (errno == ERANGE)) goto computerr; setcolor(nr.rcoef, coef, coef, coef); if (rayorigin(&nr, TRANS, r, nr.rcoef) < 0) return(0); va++; /* compute direction */ for (j = 0; j < 3; j++) { nr.rdir[j] = evalue(va[j]); if (errno == EDOM || errno == ERANGE) goto computerr; } if (mf->fxp != &unitxf) multv3(nr.rdir, nr.rdir, mf->fxp->xfm); if (r->rox != NULL) multv3(nr.rdir, nr.rdir, r->rox->f.xfm); if (normalize(nr.rdir) == 0.0) goto computerr; /* compute value */ if (r->rsrc >= 0) nr.rsrc = source[r->rsrc].sa.sv.sn; rayvalue(&nr); multcolor(nr.rcol, nr.rcoef); addcolor(r->rcol, nr.rcol); if (r->ro != NULL && isflat(r->ro->otype)) r->rt = r->rot + nr.rt; return(1); computerr: objerror(m, WARNING, "compute error"); return(-1); }
static int dir_proj( /* compute a director's projection */ MAT4 pm, OBJREC *o, SRCREC *s, int n ) { RAY tr; OBJREC *m; MFUNC *mf; EPNODE **va; FVECT cent, newdir, nv, h; double coef, olddot, newdot, od; int i, j; /* initialize test ray */ getmaxdisk(cent, o); if (s->sflags & SDISTANT) for (i = 0; i < 3; i++) { tr.rdir[i] = -s->sloc[i]; tr.rorg[i] = cent[i] - tr.rdir[i]; } else { for (i = 0; i < 3; i++) { tr.rdir[i] = cent[i] - s->sloc[i]; tr.rorg[i] = s->sloc[i]; } if (normalize(tr.rdir) == 0.0) return(0); /* at source! */ } od = getplaneq(nv, o); olddot = DOT(tr.rdir, nv); if (olddot <= FTINY && olddot >= -FTINY) return(0); /* old dir parallels plane */ tr.rmax = 0.0; rayorigin(&tr, PRIMARY, NULL, NULL); if (!(*ofun[o->otype].funp)(o, &tr)) return(0); /* no intersection! */ /* compute redirection */ m = vsmaterial(o); mf = getdfunc(m); setfunc(m, &tr); varset("DxA", '=', 0.0); varset("DyA", '=', 0.0); varset("DzA", '=', 0.0); errno = 0; va = mf->ep + 4*n; coef = evalue(va[0]); if (errno == EDOM || errno == ERANGE) goto computerr; if (coef <= FTINY) return(0); /* insignificant */ va++; for (i = 0; i < 3; i++) { newdir[i] = evalue(va[i]); if (errno == EDOM || errno == ERANGE) goto computerr; } if (mf->fxp != &unitxf) multv3(newdir, newdir, mf->fxp->xfm); /* normalization unnecessary */ newdot = DOT(newdir, nv); if (newdot <= FTINY && newdot >= -FTINY) return(0); /* new dir parallels plane */ /* everything OK -- compute shear */ for (i = 0; i < 3; i++) h[i] = newdir[i]/newdot - tr.rdir[i]/olddot; setident4(pm); for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) pm[i][j] += nv[i]*h[j]; pm[3][j] = -od*h[j]; } if ((newdot > 0.0) ^ (olddot > 0.0)) /* add mirroring */ for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) pm[i][j] -= 2.*nv[i]*nv[j]; pm[3][j] += 2.*od*nv[j]; } return(1); computerr: objerror(m, WARNING, "projection compute error"); return(0); }
int main( int argc, char *argv[] ) { int i; esupport |= E_VARIABLE|E_FUNCTION|E_INCHAN|E_OUTCHAN|E_RCONST; esupport &= ~(E_REDEFW); #ifdef BIGGERLIB biggerlib(); #endif varset("PI", ':', 3.14159265358979323846); funset("in", 1, '=', &l_in); for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'b': blnkeq = !blnkeq; break; case 'l': igneol = !igneol; break; case 'p': passive = !passive; break; case 't': sepchar = argv[i][2]; break; case 's': svpreset(argv[++i]); break; case 'f': fcompile(argv[++i]); break; case 'e': scompile(argv[++i], NULL, 0); break; case 'n': noinput = 1; break; case 'i': switch (argv[i][2]) { case '\0': itype = 'a'; nbicols = 0; readfmt(argv[++i], 0); break; case 'a': itype = 'a'; nbicols = 0; break; case 'd': case 'D': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(double) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; case 'f': case 'F': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(float) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; default: goto userr; } break; case 'o': switch (argv[i][2]) { case '\0': otype = 'a'; readfmt(argv[++i], 1); break; case 'a': otype = 'a'; break; case 'd': case 'D': case 'f': case 'F': otype = argv[i][2]; break; default: goto userr; } break; case 'w': nowarn = !nowarn; break; case 'u': unbuff = !unbuff; break; default:; userr: eputs("Usage: "); eputs(argv[0]); eputs(" [-b][-l][-n][-p][-w][-u][-tS][-s svar=sval][-e expr][-f source][-i infmt][-o outfmt] [file]\n"); quit(1); } if (otype != 'a') SET_FILE_BINARY(stdout); if (noinput) { /* produce a single output record */ if (i < argc) { eputs(argv[0]); eputs(": file argument(s) incompatible with -n\n"); quit(1); } eclock++; putout(); quit(0); } if (itype != 'a') SET_FILE_BINARY(stdin); if (blnkeq) /* for efficiency */ nbsynch(); if (i == argc) /* from stdin */ execute(NULL); else /* from one or more files */ for ( ; i < argc; i++) execute(argv[i]); quit(0); return 0; /* pro forma return */ }
static int getfield( /* get next field */ register struct field *f ) { static char buf[RMAXWORD+1]; /* no recursion! */ int delim, inword; double d; char *np; register char *cp; switch (f->type & F_TYP) { case T_LIT: cp = f->f.sl; do { if (blnkeq && isblnk(*cp)) { if (!isblnk(ipb.chr)) return(-1); do cp++; while (isblnk(*cp)); do scaninp(); while (isblnk(ipb.chr)); } else if (*cp == ipb.chr) { cp++; scaninp(); } else return(-1); } while (*cp); return(0); case T_STR: if (f->next == NULL || (f->next->type & F_TYP) != T_LIT) delim = EOF; else delim = f->next->f.sl[0]; cp = buf; do { if (ipb.chr == EOF || ipb.chr == '\n') inword = 0; else if (blnkeq && delim != EOF) inword = isblnk(delim) ? !isblnk(ipb.chr) : ipb.chr != delim; else inword = cp-buf < (f->type & F_WID); if (inword) { *cp++ = ipb.chr; scaninp(); } } while (inword && cp < &buf[RMAXWORD]); *cp = '\0'; if (f->f.sv->val == NULL) f->f.sv->val = savqstr(buf); /* first setting */ else if (strcmp(f->f.sv->val, buf)) return(-1); /* doesn't match! */ return(0); case T_NUM: if (f->next == NULL || (f->next->type & F_TYP) != T_LIT) delim = EOF; else delim = f->next->f.sl[0]; np = NULL; cp = buf; do { if (!((np==NULL&&isblnk(ipb.chr)) || isnum(ipb.chr))) inword = 0; else if (blnkeq && delim != EOF) inword = isblnk(delim) ? !isblnk(ipb.chr) : ipb.chr != delim; else inword = cp-buf < (f->type & F_WID); if (inword) { if (np==NULL && !isblnk(ipb.chr)) np = cp; *cp++ = ipb.chr; scaninp(); } } while (inword && cp < &buf[RMAXWORD]); *cp = '\0'; d = np==NULL ? 0. : atof(np); if (!vardefined(f->f.nv)) varset(f->f.nv, '=', d); /* first setting */ else if ((d = (varvalue(f->f.nv)-d)/(d==0.?1.:d)) > .001 || d < -.001) return(-1); /* doesn't match! */ return(0); } return -1; /* pro forma return */ }