/* prefs.c *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * * Part of: WeightWatcher * * Author: E.BERTIN (IAP, Leiden observatory & ESO) * * Contents: Functions to handle the configuration file. * * Last modify: 25/09/2000 * *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ #include #include #include #include #include #include "define.h" #include "globals.h" #include "key.h" #include "prefs.h" /********************************* readprefs ********************************/ /* Read a configuration file in ``standard'' format (see the SExtractor documentation) */ void readprefs(char *filename, char **argkey, char **argval, int narg) { FILE *infile; char *cp, str[MAXCHAR], *keyword, *value, **dp; int i, ival, nkey, warn, argi, flagc, flagd, flagz; double dval; #ifndef NO_ENVVAR static char value2[MAXCHAR],envname[MAXCHAR]; char *dolpos; #endif if ((infile = fopen(filename,"r")) == NULL) error(EXIT_FAILURE,"*ERROR*: can't read ", filename); /*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) strcpy(str, *(dp++)); else flagd = 0; } if (!flagc && !flagd) if (!fgets(str, MAXCHAR, infile)) flagc=1; if (flagc) { if (argi=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); #ifndef NO_ENVVAR /*------ 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=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!"); ival = atoi(value); 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)'#') error(EXIT_FAILURE, keyword," string is empty!"); strcpy((char *)key[nkey].ptr, value); break; case P_BOOL: if (!value || value[0]==(char)'#') error(EXIT_FAILURE, keyword," keyword has no value!"); 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 ((ival = findkeys(value, key[nkey].keylist,FIND_STRICT)) != RETURN_ERROR) *(int *)(key[nkey].ptr) = ival; else error(EXIT_FAILURE, keyword, " set to an unknown keyword"); break; case P_INTLIST: for (i=0; i=key[nkey].nlistmax) error(EXIT_FAILURE, keyword, " has too many members"); ival = strtol(value, 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].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].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 error(EXIT_FAILURE, keyword, " set to an unknown keyword"); value = strtok((char *)NULL, notokstr); } 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 prefs.nweight_threshd) error(EXIT_FAILURE, "*Error*: not enough WEIGHT_MIN parameters",""); if (prefs.nweight_name > prefs.nweight_threshu) error(EXIT_FAILURE, "*Error*: not enough WEIGHT_MAX parameters",""); if (prefs.nweight_name > prefs.nweight_mask) error(EXIT_FAILURE, "*Error*: not enough WEIGHT_OUTFLAGS parameters",""); /* Control the number of FLAG-related pref. parameters */ if (prefs.nflag_name > prefs.nflag_wmask) error(EXIT_FAILURE, "*Error*: not enough FLAG_WMASKS parameters",""); if (prefs.nflag_name > prefs.nflag_fmask) error(EXIT_FAILURE, "*Error*: not enough FLAG_MASKS parameters",""); /* Control the number of VECTOR-related pref. parameters */ if (prefs.nvec_name > prefs.nvec_mask) error(EXIT_FAILURE, "*Error*: not enough POLY_OUTFLAGS parameters",""); return; }