📄 getpars.c
字号:
__FILE__,nread,pflen,filename); } efclose(fp); /* Zap whites in parfile to help in parsing */ argstr[0] = '\0' ; pfargc = white2null(argstr, pflen); targc = pfargc ; /* Allocate space for total arg pointers */ targv = (char **) ealloc1(targc, sizeof(char*)); /* Parse the parfile. Skip over multiple NULLs */ for( j=1, i=0; j < pflen; j++) { if( argstr[j] && !argstr[j-1] ) { targv[i++] = argstr + j; } } /* Allocate space for the pointer table */ argtbl = (ArgStruct*) ealloc1(targc, sizeof(ArgStruct)); /* Tabulate targv */ tabulate(targc, targv); return 1 ;}/* * Return the index of the n'th occurence of a parameter name, * except if n==0, return the index of the last occurence. * Return -1 if the specified occurence does not exist. */static int getparindex (int n, char *name){ int i; if (n==0) { for (i=nargs-1; i>=0; --i) if (!strcmp(name,argtbl[i].name)) break; return i; } else { for (i=0; i<nargs; ++i) if (!strcmp(name,argtbl[i].name)) if (--n==0) break; if (i<nargs) return i; else return -1; }}/* Initialize getpar */static int getparinit (void){ static int targc; /* total number of args */ static char **targv; /* pointer to arg strings */ static char *pfname; /* name of parameter file */ FILE *pffd; /* file id of parameter file */ int pflen; /* length of parameter file in bytes */ static int pfargc; /* arg count from parameter file */ bool parfile; /* parfile existence flag */ int argstrlen; char *argstr, *pargstr; /* storage for command line and parameter file args */ int nread; /* bytes fread */ int i, j; /* counters */ char *getpfname(); /* return name of parameter file */ int white2null(); /* deliminate arg strings from parameter file with (possibly multiple) NULLs and return a count of the strings */ int tabulate(); /* install symbol table */ tabled = true; /* remember table is built */ /* Check if xargc was initiated */ if(!xargc) err("%s: xargc=%d -- not initiated in main", __FILE__, xargc); /* Space needed for command lines */ for (i = 1, argstrlen = 0; i < xargc; i++) { argstrlen += strlen(xargv[i]) + 1; } /* Get parfile name if there is one */ /* parfile = (pfname = getpfname()) ? true : false; */ if (pfname = getpfname()) { parfile = true; } else { parfile = false; } if (parfile) { pffd = efopen(pfname, "r"); /* Get the length */ efseek(pffd, 0, SEEK_END); pflen = eftell(pffd); rewind(pffd); argstrlen += pflen; } else { pflen = 0; } /* Allocate space for command line and parameter file plus nulls at the ends to help with parsing. */ /* argstr = (char *) calloc((size_t) (1+argstrlen+1), 1); */ argstr = (char *) ealloc1(1+argstrlen+1, 1); if (parfile) { /* Read the parfile */ nread = efread(argstr + 1, 1, pflen, pffd); if (nread != pflen) { err("%s: fread only %d bytes out of %d from %s", __FILE__, nread, pflen, pfname); } efclose(pffd); /* Zap whites in parfile to help in parsing */ argstr[0] = '\0' ; pfargc = white2null(argstr, pflen); } else { pfargc = 0; } /* Total arg count */ targc = pfargc + xargc - 1; /* Allocate space for total arg pointers */ targv = (char **) ealloc1(targc, sizeof(char*)); if (parfile) { /* Parse the parfile. Skip over multiple NULLs */ for (j = 1, i = 0; j < pflen; j++) { if (argstr[j] && !argstr[j-1]) { targv[i++] = argstr + j; } } } else { i = 0; } /* Copy command line arguments */ for (j = 1, pargstr = argstr + pflen + 2; j < xargc; j++) { strcpy(pargstr,xargv[j]); targv[i++] = pargstr; pargstr += strlen(xargv[j]) + 1; } /* Allocate space for the pointer table */ argtbl = (ArgStruct*) ealloc1(targc, sizeof(ArgStruct)); /* Tabulate targv */ tabulate(targc, targv);}#define PFNAME "par="static char *getpfname (void){ int i; int pfnamelen; pfnamelen = strlen(PFNAME); for (i = xargc-1 ; i > 0 ; i--) { if(!strncmp(PFNAME, xargv[i], pfnamelen) && strlen(xargv[i]) != pfnamelen) { return xargv[i] + pfnamelen; } } return NULL;}#define iswhite(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')/* * Replace the whites by nulls. If we see a non-white and the previous * char is a null, this signals the start of a string and we bump the count. */static int white2null (char *str, int len){ int i; int count; bool inquote = false; for (i = 1, count = 0; i < len; i++) { if (str[i]=='"') inquote=(inquote==true)?false:true; if (!inquote) { if (iswhite(str[i])) { /* Is this a new word ? */ str[i] = '\0'; } else if (!str[i-1]) { /* multiple whites */ count++; } } } for (i = 1, inquote=false; i < len; i++) { if (str[i]=='"') inquote=(inquote==true)?false:true; if (inquote) { if (str[i+1]!='"') { str[i] = str[i+1]; } else { str[i] = '\0'; str[i+1] = '\0'; inquote = false; } } } str[len] = '\0'; return count;}/* Tabulate parameters */static int tabulate (int argc, char **argv){ int i; char *eqptr; for (i = 0, nargs = 0 ; i < argc; i++) { eqptr = strchr(argv[i], '='); if (eqptr) { argtbl[nargs].name = argv[i]; argtbl[nargs].asciival = eqptr + 1; *eqptr = (char)0; /* Debugging dump *//* fprintf(stderr, *//* "argtbl[%d]: name=%s asciival=%s\n", *//* nargs,argtbl[nargs].name,argtbl[nargs].asciival); */ nargs++; } }}/* Count characters in a string */static int ccount (char c, char *s){ int i, count; for (i = 0, count = 0; s[i] != 0; i++) if(s[i] == c) count++; return count;}#ifdef TEST#define N 100main(int argc, char **argv){ char *s; short h, vh[N]; unsigned short u, vu[N]; long l, vl[N]; unsigned long v, vv[N]; int i, vi[N], ipar, npar, nval; unsigned int p, vp[N]; float f, vf[N]; double d, vd[N]; initargs(argc, argv); /* int parameters */ npar = countparname("i"); printf("\nnumber of i pars = %d\n",npar); for (ipar=1; ipar<=npar; ++ipar) { getnparint(ipar,"i",&i); printf("occurence %d of i=%d\n",ipar,i); } if (getparint("i", &i)) printf("last occurence of i=%d\n",i); npar = countparname("vi"); printf("number of vi pars = %d\n",npar); for (ipar=1; ipar<=npar; ++ipar) { nval = countnparval(ipar,"vi"); printf("occurence %d has %d values\n",ipar,nval); nval = getnparint(ipar,"vi",vi); printf("vi="); for (i=0; i<nval; i++) printf("%d%c",vi[i],i==nval-1?'\n':','); } if (npar>0) { nval = countparval("vi"); printf("last occurence has %d values\n",nval); getparint("vi",vi); printf("vi="); for (i=0; i<nval; i++) printf("%d%c",vi[i],i==nval-1?'\n':','); } /* float parameters */ npar = countparname("f"); printf("\nnumber of f pars = %d\n",npar); for (ipar=1; ipar<=npar; ++ipar) { getnparfloat(ipar,"f",&f); printf("occurence %d of f=%g\n",ipar,f); } if (getparfloat("f", &f)) printf("last occurence of f=%g\n",f); npar = countparname("vf"); printf("number of vf pars = %d\n",npar); for (ipar=1; ipar<=npar; ++ipar) { nval = countnparval(ipar,"vf"); printf("occurence %d has %d values\n",ipar,nval); nval = getnparfloat(ipar,"vf",vf); printf("vf="); for (i=0; i<nval; i++) printf("%g%c",vf[i],i==nval-1?'\n':','); } if (npar>0) { nval = countparval("vf"); printf("last occurence has %d values\n",nval); getparfloat("vf",vf); printf("vf="); for (i=0; i<nval; i++) printf("%g%c",vf[i],i==nval-1?'\n':','); } /* string parameters */ npar = countparname("s"); printf("\nnumber of s pars = %d\n",npar); for (ipar=1; ipar<=npar; ++ipar) { getnparstring(ipar,"s",&s); printf("occurence %d of s=%s\n",ipar,s); } if (getparstring("s", &s)) printf("last occurence of s=%s\n",s); if( auxgetpar("aux","i","i",&i) ) printf("in aux last occurence of i=%d\n",i); if( auxgetpar("aux","f","f",&f) ) printf("in aux last occurence of f=%f\n",f); if( auxgetpar("aux","s","s",&s) ) printf("in aux last occurence of s=%s\n",s); if (getparint("i", &i)) printf("last occurence of i=%d\n",i); if( auxgetpar("aux","junk","s",&s) ) printf("in aux last occurence of junk=%s\n",s); return EXIT_SUCCESS;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -