/** * validateOptions * * - Sanity check the options * - massage the SUBBLOCK options into something * more easily used during the source text processing. * - compile the regular expressions * - make sure we can find all the input files and their mod times * - Set up our entry ordering database (if specified) * - Make sure we have valid strings for SRCFILE and LINENUM * (if we are to use these things). * - Initialize the user name characters array. */ LOCAL void validateOptions(void) { set_define_re(); /* * Prepare each sub-block entry so we can parse easily later. */ if (HAVE_OPT(SUBBLOCK)) { int ct = STACKCT_OPT( SUBBLOCK); tCC** ppz = STACKLST_OPT(SUBBLOCK); /* * FOR each SUBBLOCK argument, * DO condense each name list to be a list of names * separated by a single space and NUL terminated. */ do { *ppz = fixupSubblockString(*ppz); ppz++; } while (--ct > 0); } if (! HAVE_OPT(INPUT)) SET_OPT_INPUT("-"); set_modtime(); /* * IF the output is to have order AND it is to be based on a file, * THEN load the contents of that file. * IF we cannot load the file, * THEN it must be new or empty. Allocate several K to start. */ if ( HAVE_OPT(ORDERING) && (OPT_ARG(ORDERING) != NULL)) { tSCC zIndexPreamble[] = "# -*- buffer-read-only: t -*- vi: set ro:\n" "#\n# DO NOT EDIT THIS FILE - it is auto-edited by getdefs\n"; pzIndexText = loadFile(OPT_ARG(ORDERING)); if (pzIndexText == NULL) { pzIndexText = pzEndIndex = pzIndexEOF = malloc((size_t)0x4000); indexAlloc = 0x4000; pzEndIndex += sprintf(pzEndIndex, "%s", zIndexPreamble); } else { pzEndIndex = pzIndexEOF = pzIndexText + strlen(pzIndexText); indexAlloc = (pzEndIndex - pzIndexText) + 1; } /* * We map the name entries to a connonical form. * By default, everything is mapped to lower case already. * This call will map these three characters to '_'. */ strequate("_-^"); } { char const * pz = OPT_ARG(SRCFILE); if ((pz == NULL) || (*pz == NUL)) OPT_ARG(SRCFILE) = "srcfile"; pz = OPT_ARG(LINENUM); if ((pz == NULL) || (*pz == NUL)) OPT_ARG(LINENUM) = "linenum"; } { tSCC zAgNameChars[] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789" "_-^"; tSCC zUserNameChs[] = ":.$%*!~<>&@"; tCC* p = zAgNameChars; while (*p) zUserNameCh[(unsigned)(*p++)] = 3; p = zUserNameChs; while (*p) zUserNameCh[(unsigned)(*p++)] = 1; } }
/** * Make sure the option descriptor is there and that we understand it. * This should be called from any user entry point where one needs to * worry about validity. (Some entry points are free to assume that * the call is not the first to the library and, thus, that this has * already been called.) */ LOCAL tSuccess validateOptionsStruct(tOptions* pOpts, char const* pzProgram) { if (pOpts == NULL) { fputs(zAO_Bad, stderr); exit(EX_CONFIG); } /* * IF the client has enabled translation and the translation procedure * is available, then go do it. */ if ( ((pOpts->fOptSet & OPTPROC_TRANSLATE) != 0) && (pOpts->pTransProc != NULL) ) { /* * If option names are not to be translated at all, then do not do * it for configuration parsing either. (That is the bit that really * gets tested anyway.) */ if ((pOpts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT) pOpts->fOptSet |= OPTPROC_NXLAT_OPT_CFG; (*pOpts->pTransProc)(); pOpts->fOptSet &= ~OPTPROC_TRANSLATE; } /* * IF the struct version is not the current, and also * either too large (?!) or too small, * THEN emit error message and fail-exit */ if ( ( pOpts->structVersion != OPTIONS_STRUCT_VERSION ) && ( (pOpts->structVersion > OPTIONS_STRUCT_VERSION ) || (pOpts->structVersion < OPTIONS_MINIMUM_VERSION ) ) ) { fprintf(stderr, zAO_Err, pzProgram, NUM_TO_VER(pOpts->structVersion)); if (pOpts->structVersion > OPTIONS_STRUCT_VERSION ) fputs(zAO_Big, stderr); else fputs(zAO_Sml, stderr); fputs(ShellAsString(AO_CURRENT) ":" ShellAsString(AO_REVISION) ":" ShellAsString(AO_AGE) "\n", stderr); return FAILURE; } /* * If the program name hasn't been set, then set the name and the path * and the set of equivalent characters. */ if (pOpts->pzProgName == NULL) { char const * pz = strrchr(pzProgram, DIRCH); char const ** pp = (char const **)(void **)&(pOpts->pzProgName); if (pz == NULL) *pp = pzProgram; else *pp = pz+1; pp = (char const **)(void **)&(pOpts->pzProgPath); *pp = pzProgram; /* * when comparing long names, these are equivalent */ strequate(zSepChars); } return SUCCESS; }