static void print_membership(tOptions * pOpts, tOptDesc * pOD) { char const * svstr = pOD->optArg.argString; char const * pz; uintptr_t val = 1; printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME, (int)(uintptr_t)(pOD->optCookie)); pOD->optCookie = VOIDP(~0UL); (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD); pz = pOD->optArg.argString; while (*pz != NUL) { printf("readonly %s_", pOD->pz_NAME); pz = SPN_PLUS_N_SPACE_CHARS(pz); for (;;) { int ch = *(pz++); if (IS_LOWER_CASE_CHAR(ch)) fputc(toupper(ch), stdout); else if (IS_UPPER_CASE_CHAR(ch)) fputc(ch, stdout); else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done; else if (ch == NUL) { pz--; goto name_done; } else fputc('_', stdout); } name_done:; printf(SHOW_VAL_FMT, (unsigned long)val); val <<= 1; } AGFREE(pOD->optArg.argString); pOD->optArg.argString = svstr; }
static void print_membership(tOptions * pOpts, tOptDesc * pOD) { char const * pz; uintptr_t val = 1; printf(zOptNumFmt, pOpts->pzPROGNAME, pOD->pz_NAME, (int)(uintptr_t)(pOD->optCookie)); pOD->optCookie = (void*)(uintptr_t)~0UL; (*(pOD->pOptProc))(OPTPROC_RETURN_VALNAME, pOD); /* * We are building the typeset list. The list returned starts with * 'none + ' for use by option saving stuff. We must ignore that. */ pz = pOD->optArg.argString + 7; while (*pz != NUL) { printf("typeset -x -i %s_", pOD->pz_NAME); while (IS_PLUS_N_SPACE_CHAR(*pz)) pz++; for (;;) { int ch = *(pz++); if (IS_LOWER_CASE_CHAR(ch)) fputc(toupper(ch), stdout); else if (IS_UPPER_CASE_CHAR(ch)) fputc(ch, stdout); else if (IS_PLUS_N_SPACE_CHAR(ch)) goto name_done; else if (ch == NUL) { pz--; goto name_done; } else fputc('_', stdout); } name_done:; printf("=%1$lu # 0x%1$lX\n", (unsigned long)val); val <<= 1; } AGFREE(pOD->optArg.argString); pOD->optArg.argString = NULL; pOD->fOptState &= ~OPTST_ALLOC_ARG; }
/** * Add a system name to the environment. The input name is up-cased and * made to conform to environment variable names. If not already in the * environment, it is added with the string value "1". * * @param env_name in/out: system name to export */ static void add_sys_env(char * env_name) { int i = 2; for (;;) { if (IS_UPPER_CASE_CHAR(env_name[i])) env_name[i] = (char)tolower(env_name[i]); else if (! IS_ALPHANUMERIC_CHAR(env_name[i])) env_name[i] = '_'; if (env_name[ ++i ] == NUL) break; } /* * If the user already has something in the environment, do not * override it. */ if (getenv(env_name) == NULL) { char * pz; if (OPT_VALUE_TRACE > TRACE_DEBUG_MESSAGE) fprintf(trace_fp, TRACE_ADD_TO_ENV_FMT, env_name); pz = aprf(ADD_SYS_ENV_VAL_FMT, env_name); putenv(pz); } }
/* * canonicalizeName: remove white space and roughly verify the syntax. * This procedure will consume everything from the source string that * forms a valid AutoGen compound definition name. * We leave legally when: * 1. the state is "CN_NAME_ENDED", AND * 2. We stumble into a character that is not either '[' or name_sep_ch * (always skipping white space). * We start in CN_START. */ LOCAL int canonicalizeName(char* pzD, char const* pzS, int srcLen) { typedef enum { CN_START_NAME = 0, /* must find a name */ CN_NAME_ENDED, /* must find '[' or name_sep_ch or we end */ CN_INDEX, /* must find name, number, '$' or ']' */ CN_INDEX_CLOSE, /* must find ']' */ CN_INDEX_ENDED /* must find name_sep_ch or we end */ } teConState; teConState state = CN_START_NAME; char const* pzOri = pzS; char* pzDst = pzD; size_t stLen = srcLen; /* * Before anything, skip a leading name_sep_ch as a special hack * to force a current context lookup. */ pzS = SPN_WHITESPACE_CHARS(pzS); if (pzOri != pzS) { srcLen -= pzS - pzOri; if (srcLen <= 0) pzS = zNil; } if (*pzS == name_sep_ch) { *(pzD++) = name_sep_ch; pzS++; if (--srcLen <= 0) pzS = zNil; } nextSegment: /* * The next segment may always start with an alpha character, * but an index may also start with a number. The full number * validation will happen in find_by_index(). */ { char * p = SPN_WHITESPACE_CHARS(pzS); if (p != pzS) { srcLen -= p - pzS; if (srcLen <= 0) pzS = zNil; pzS = p; } } switch (state) { case CN_START_NAME: if (! IS_VAR_FIRST_CHAR(*pzS)) return bad_def_name(pzDst, pzOri, stLen); state = CN_NAME_ENDED; /* we found the start of our first name */ break; /* fall through to name/number consumption code */ case CN_NAME_ENDED: switch (*pzS++) { case '[': *(pzD++) = '['; state = CN_INDEX; break; case '.': case '/': if (pzS[-1] == name_sep_ch) { *(pzD++) = name_sep_ch; state = CN_START_NAME; break; } default: /* legal exit -- we have a name already */ *pzD = NUL; return srcLen; } if (--srcLen <= 0) return bad_def_name(pzDst, pzOri, stLen); goto nextSegment; case CN_INDEX: /* * An index. Valid syntaxes are: * * '[' <#define-d name> ']' * '[' <number> ']' * '[' '$' ']' * '[' ']' * * We will check for and handle the last case right here. * The next cycle must find the index closer (']'). */ state = CN_INDEX_CLOSE; /* * Numbers and #define-d names are handled at the end of the switch. * '$' and ']' are handled immediately below. */ if (IS_ALPHANUMERIC_CHAR(*pzS)) break; /* * A solitary '$' is the highest index, whatever that happens to be * We process that right here because down below we only accept * name-type characters and this is not VMS. */ if (*pzS == '$') { if (--srcLen < 0) return bad_def_name(pzDst, pzOri, stLen); *(pzD++) = *(pzS++); goto nextSegment; } /* FALLTHROUGH */ case CN_INDEX_CLOSE: /* * Nothing else is okay. */ if ((*(pzD++) = *(pzS++)) != ']') return bad_def_name(pzDst, pzOri, stLen); if (--srcLen <= 0) { *pzD = NUL; return srcLen; } state = CN_INDEX_ENDED; goto nextSegment; case CN_INDEX_ENDED: if ((*pzS != name_sep_ch) || (--srcLen < 0)) { *pzD = NUL; return srcLen; } *(pzD++) = *(pzS++); state = CN_START_NAME; goto nextSegment; } /* * The next state must be either looking for what comes after the * end of a name, or for the close bracket after an index. * Whatever, the next token must be a name or a number. */ assert((state == CN_NAME_ENDED) || (state == CN_INDEX_CLOSE)); assert(IS_ALPHANUMERIC_CHAR(*pzS)); /* * Copy the name/number. We already know the first character is valid. * However, we must *NOT* downcase #define names... */ while (IS_VALUE_NAME_CHAR(*pzS)) { char ch = *(pzS++); if ((state != CN_INDEX_CLOSE) && IS_UPPER_CASE_CHAR(ch)) *(pzD++) = tolower(ch); else switch (ch) { /* force the separator chars to be '_' */ case '-': case '^': *(pzD++) = '_'; break; default: *(pzD++) = ch; } if (--srcLen <= 0) { pzS = zNil; break; } } goto nextSegment; }