local void setarguments(param *pvec, string *argv) { bool scanpos; param *pp; string *ap, name; scanpos = TRUE; // start scan by position pp = pvec; // start with 0th param for (ap = argv + 1; *ap != NULL; ap++) { // loop over the arguments name = parname(*ap); // get param name, if any scanpos = scanpos && (name == NULL); // see how to match args if (scanpos) { // match by position? pp++; // move to next param if (pp->name == NULL) // past last parameter? error("%s.initparam: too many arguments\n", progname); pp->value = strdup(*ap); // set new param value } else { // matching by name? if (name == NULL) // but no name given? error("%s.initparam: arg %s must be named\n", progname, *ap); pp = findparam(name, pvec); // look for named param if (pp == NULL) // an unknown param? error("%s.initparam: parameter %s unknown\n", progname, name); if (pp->flags & ARGPARAM) // already on arg list? error("%s.initparam: parameter %s duplicated\n", progname, name); pp->value = strdup(parvalue(*ap)); // set new param value } pp->flags = (pp->flags & ~DEFPARAM) | ARGPARAM; // switch source flag } }
qstr *bas_getstrpar() { int l; qstr *p; char *bp; if (argused()) return bas_getstr(); l=parname(); if (l == -1) return (qstr*)0; bp = (char*) (l*8+ReadLong(aReg[6]+0x18)); printf("bp %p\n",bp); bp = ReadWord(aReg[6]+bp+2)+ReadLong(aReg[6]+0x20); printf("%p ,%d\n%s\n",bp,l,(char*)bp+1+aReg[6]); return p; }
local void copydefaults(param *pvec, string *defv) { param *pp; string *dp, name, value, com; pp = pvec; // start with 0th param for (dp = defv; *dp != NULL; dp++) // loop over the defaults if (**dp != ';') { // if not a comment... pp++; // go on to new param name = parname(*dp); // extract param name value = parvalue(*dp); // and param value if (name == NULL || value == NULL) // any problems found? error("%s.initparam: bad parameter %s\n", progname, *dp); pp->name = strdup(name); // assign param name pp->value = strdup(value); // and parameter value pp->comment = NULL; // clear comment field pp->flags = DEFPARAM; // source is default if (streq(pp->value, "???")) // a required param? pp->flags |= REQPARAM; // set required flag if (**dp == '<') // an input parameter? pp->flags |= INPARAM; // set input flag else if (**dp == '>') // an output parameter? pp->flags |= OUTPARAM; // set output flag } else if (pp->comment == NULL) { // a new comment... pp->comment = strdup(*dp + 1); // assign comment field } else { // more text for comment... com = (string) allocate(strlen(pp->comment) + strlen(*dp+1) + 2); // get space for comment strcpy(com, pp->comment); // copy existing text strcat(com, "\n"); // indicate end of line strcat(com, *dp + 1); // store text of comment free(pp->comment); // free up old space pp->comment = com; // and store new comment } pp++; // past last real param pp->name = NULL; // end list of parameters }