⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getpars.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
	      __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 + -