// return 0 on pass, non-0 on fail int runTest(char *expr, char *expect) { list *argList = parse_expr(expr, 0); char *result = list_to_str(argList); int cmp = strcmp(result, expect); if (cmp) printf("FAIL: [%s] != [%s]\n", result, expect); else printf("OK : [%s] == [%s]\n", expr, expect); list_free(argList, 1); free(result); return cmp; }
int main(int argc, char const *argv[]) { int i; Link* head = NULL; Link* end = head; char s[MAX_PRINT_LENGTH]; for (i = 1; i < argc; ++i) { end = add_link_num(end, strtod(argv[i], NULL)); if (!head) head = end; } printf("xs = {%s}\n", list_to_str(head, s, MAX_PRINT_LENGTH)); printf("sum = %4.3f\n", list_sum(head)); printf("product = %4.3f\n", list_product(head)); return 0; }
/* Read a configuration file in ``standard'' format (see the SExtractor documentation) */ void readprefs(char *filename, char **argkey, char **argval, int narg) { FILE *infile; char str[MAXCHARL], errstr[MAXCHAR], *cp, *keyword, *value, **dp; int i, ival, nkey, warn, argi, flagc, flagd, flage, flagz; double dval; #ifdef HAVE_GETENV static char value2[MAXCHARL],envname[MAXCHAR]; char *dolpos, *listbuf; #endif if ((infile = fopen(filename,"r")) == NULL) { flage = 1; warning(filename, " not found, using internal defaults"); } else flage = 0; /*Build the keyword-list from pkeystruct-array */ for (i=0; key[i].name[0]; i++) strcpy(keylist[i], key[i].name); keylist[i][0] = '\0'; /*Scan the configuration file*/ argi=0; flagc = 0; flagd = 1; dp = default_prefs; for (warn=0;;) { if (flagd) { if (**dp) { if (**dp=='*') strcpy(str, *(dp++)+1); else strcpy(str, *(dp++)); } else flagd = 0; } if (!flagc && !flagd) if (flage || !fgets(str, MAXCHARL, infile)) flagc=1; if (flagc) { if (argi<narg) { sprintf(str, "%s %s", argkey[argi], argval[argi]); argi++; } else break; } keyword = strtok(str, notokstr); if (keyword && keyword[0]!=0 && keyword[0]!=(char)'#') { if (warn>=10) error(EXIT_FAILURE, "*Error*: No valid keyword found in ", filename); nkey = findkeys(keyword, keylist, FIND_STRICT); if (nkey!=RETURN_ERROR) { value = strtok((char *)NULL, notokstr); #ifdef HAVE_GETENV /*------ Expansion of environment variables (preceded by '$') */ if (value && (dolpos=strchr(value, '$'))) { int nc; char *valuet,*value2t, *envval; value2t = value2; valuet = value; while (dolpos) { while (valuet<dolpos) *(value2t++) = *(valuet++); /* verbatim copy before '$' */ if (*(++valuet) == (char)'{') valuet++; strncpy(envname, valuet, nc=strcspn(valuet,"}/:\"\'\\")); *(envname+nc) = (char)'\0'; if (*(valuet+=nc) == (char)'}') valuet++; if (!(envval=getenv(envname))) error(EXIT_FAILURE, "Environment variable not found: ", envname); while(*envval) /* Copy the ENV content */ *(value2t++) = *(envval++); while(*valuet && *valuet!=(char)'$')/* Continue verbatim copy */ *(value2t++) = *(valuet++); if (*valuet) dolpos = valuet; else { dolpos = NULL; *value2t = (char)'\0'; } } value = strtok(value2, notokstr); } #endif switch(key[nkey].type) { case P_FLOAT: if (!value || value[0]==(char)'#') error(EXIT_FAILURE, keyword," keyword has no value!"); if (*value=='@') value = listbuf = list_to_str(value+1); dval = atof(value); if (dval>=key[nkey].dmin && dval<=key[nkey].dmax) *(double *)(key[nkey].ptr) = dval; else error(EXIT_FAILURE, keyword," keyword out of range"); break; case P_INT: if (!value || value[0]==(char)'#') error(EXIT_FAILURE, keyword," keyword has no value!"); if (*value=='@') value = listbuf = list_to_str(value+1); ival = (int)strtol(value, (char **)NULL, 0); if (ival>=key[nkey].imin && ival<=key[nkey].imax) *(int *)(key[nkey].ptr) = ival; else error(EXIT_FAILURE, keyword, " keyword out of range"); break; case P_STRING: if (!value || value[0]==(char)'#') value = ""; if (*value=='@') value = listbuf = list_to_str(value+1); strcpy((char *)key[nkey].ptr, value); break; case P_BOOL: if (!value || value[0]==(char)'#') error(EXIT_FAILURE, keyword," keyword has no value!"); if (*value=='@') value = listbuf = list_to_str(value+1); if ((cp = strchr("yYnN", (int)value[0]))) *(int *)(key[nkey].ptr) = (tolower((int)*cp)=='y')?1:0; else error(EXIT_FAILURE, keyword, " value must be Y or N"); break; case P_KEY: if (!value || value[0]==(char)'#') error(EXIT_FAILURE, keyword," keyword has no value!"); if (*value=='@') value = listbuf = list_to_str(value+1); if ((ival = findkeys(value, key[nkey].keylist,FIND_STRICT)) != RETURN_ERROR) *(int *)(key[nkey].ptr) = ival; else { sprintf(errstr, "*Error*: %s set to an unknown keyword: ", keyword); error(EXIT_FAILURE, errstr, value); } break; case P_BOOLLIST: if (value && *value=='@') value = strtok(listbuf = list_to_str(value+1), notokstr); for (i=0; i<MAXLIST&&value&&value[0]!=(char)'#'; i++) { if (i>=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); if ((cp = strchr("yYnN", (int)value[0]))) ((int *)(key[nkey].ptr))[i] = (tolower((int)*cp)=='y')?1:0; else error(EXIT_FAILURE, keyword, " value must be Y or N"); value = strtok((char *)NULL, notokstr); } if (i<key[nkey].nlistmin) error(EXIT_FAILURE, keyword, " list has not enough members"); *(key[nkey].nlistptr) = i; break; case P_INTLIST: if (value && *value=='@') value = strtok(listbuf = list_to_str(value+1), notokstr); for (i=0; i<MAXLIST&&value&&value[0]!=(char)'#'; i++) { if (i>=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); ival = strtol(value, (char **)NULL, 0); if (ival>=key[nkey].imin && ival<=key[nkey].imax) ((int *)key[nkey].ptr)[i] = ival; else error(EXIT_FAILURE, keyword, " keyword out of range"); value = strtok((char *)NULL, notokstr); } if (i<key[nkey].nlistmin) error(EXIT_FAILURE, keyword, " list has not enough members"); *(key[nkey].nlistptr) = i; break; case P_FLOATLIST: if (value && *value=='@') value = strtok(listbuf = list_to_str(value+1), notokstr); for (i=0; i<MAXLIST&&value&&value[0]!=(char)'#'; i++) { if (i>=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); dval = atof(value); if (dval>=key[nkey].dmin && dval<=key[nkey].dmax) ((double *)key[nkey].ptr)[i] = dval; else error(EXIT_FAILURE, keyword, " keyword out of range"); value = strtok((char *)NULL, notokstr); } if (i<key[nkey].nlistmin) error(EXIT_FAILURE, keyword, " list has not enough members"); *(key[nkey].nlistptr) = i; break; case P_KEYLIST: if (value && *value=='@') value = strtok(listbuf = list_to_str(value+1), notokstr); for (i=0; i<MAXLIST && value && value[0]!=(char)'#'; i++) { if (i>=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); if ((ival = findkeys(value, key[nkey].keylist, FIND_STRICT)) != RETURN_ERROR) ((int *)(key[nkey].ptr))[i] = ival; else { sprintf(errstr, "*Error*: %s set to an unknown keyword: ", keyword); error(EXIT_FAILURE, errstr, value); } value = strtok((char *)NULL, notokstr); } if (i<key[nkey].nlistmin) error(EXIT_FAILURE, keyword, " list has not enough members"); *(key[nkey].nlistptr) = i; break; case P_STRINGLIST: if (value && *value=='@') value = strtok(listbuf = list_to_str(value+1), notokstr); if (!value || value[0]==(char)'#') { value = ""; flagz = 1; } else flagz = 0; for (i=0; i<MAXLIST && value && value[0]!=(char)'#'; i++) { if (i>=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); free(((char **)key[nkey].ptr)[i]); QMALLOC(((char **)key[nkey].ptr)[i], char, MAXCHAR); strcpy(((char **)key[nkey].ptr)[i], value); value = strtok((char *)NULL, notokstr); } if (i<key[nkey].nlistmin) error(EXIT_FAILURE, keyword, " list has not enough members"); *(key[nkey].nlistptr) = flagz?0:i; break; default: error(EXIT_FAILURE, "*Internal ERROR*: Type Unknown", " in readprefs()"); break; } key[nkey].flag = 1; } else { warning(keyword, " keyword unknown"); warn++; } }