4 * initialize the libopts data structures.
10 * This file is part of AutoOpts, a companion to AutoGen.
11 * AutoOpts is free software.
12 * AutoOpts is Copyright (C) 1992-2015 by Bruce Korb - all rights reserved
14 * AutoOpts is available under any one of two licenses. The license
15 * in use must be one of these two and the choice is under the control
16 * of the user of the license.
18 * The GNU Lesser General Public License, version 3 or later
19 * See the files "COPYING.lgplv3" and "COPYING.gplv3"
21 * The Modified Berkeley Software Distribution License
22 * See the file "COPYING.mbsd"
24 * These files have the following sha256 sums:
26 * 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3
27 * 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3
28 * 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd
31 /* = = = START-STATIC-FORWARD = = = */
33 do_presets(tOptions * opts);
34 /* = = = END-STATIC-FORWARD = = = */
37 * Make sure the option descriptor is there and that we understand it.
38 * This should be called from any user entry point where one needs to
39 * worry about validity. (Some entry points are free to assume that
40 * the call is not the first to the library and, thus, that this has
41 * already been called.)
43 * Upon successful completion, pzProgName and pzProgPath are set.
45 * @param[in,out] opts program options descriptor
46 * @param[in] pname name of program, from argv[]
47 * @returns SUCCESS or FAILURE
50 validate_struct(tOptions * opts, char const * pname)
53 fputs(zno_opt_arg, stderr);
56 print_exit = ((opts->fOptSet & OPTPROC_SHELL_OUTPUT) != 0);
59 * IF the client has enabled translation and the translation procedure
60 * is available, then go do it.
62 if ( ((opts->fOptSet & OPTPROC_TRANSLATE) != 0)
63 && (opts->pTransProc != NULL)
64 && (option_xlateable_txt.field_ct != 0) ) {
66 * If option names are not to be translated at all, then do not do
67 * it for configuration parsing either. (That is the bit that really
68 * gets tested anyway.)
70 if ((opts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT)
71 opts->fOptSet |= OPTPROC_NXLAT_OPT_CFG;
76 * IF the struct version is not the current, and also
77 * either too large (?!) or too small,
78 * THEN emit error message and fail-exit
80 if ( ( opts->structVersion != OPTIONS_STRUCT_VERSION )
81 && ( (opts->structVersion > OPTIONS_STRUCT_VERSION )
82 || (opts->structVersion < OPTIONS_MINIMUM_VERSION )
84 fprintf(stderr, zwrong_ver, pname, NUM_TO_VER(opts->structVersion));
85 if (opts->structVersion > OPTIONS_STRUCT_VERSION )
86 fputs(ztoo_new, stderr);
88 fputs(ztoo_old, stderr);
90 fwrite(ao_ver_string, sizeof(ao_ver_string) - 1, 1, stderr);
95 * If the program name hasn't been set, then set the name and the path
96 * and the set of equivalent characters.
98 if (opts->pzProgName == NULL) {
99 char const * pz = strrchr(pname, DIRCH);
101 (char const **)(void **)&(opts->pzProgName);
108 pz = pathfind(getenv("PATH"), (char *)pname, "rx");
112 pp = (char const **)VOIDP(&(opts->pzProgPath));
116 * when comparing long names, these are equivalent
118 strequate(zSepChars);
124 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
128 * The next several routines do the immediate action pass on the command
129 * line options, then the environment variables, then the config files in
130 * reverse order. Once done with that, the order is reversed and all
131 * the config files and environment variables are processed again, this
132 * time only processing the non-immediate action options. do_presets()
133 * will then return for optionProcess() to do the final pass on the command
138 * scan the command line for immediate action options.
139 * This is only called the first time through.
140 * While this procedure is active, the OPTPROC_IMMEDIATE is true.
142 * @param pOpts program options descriptor
143 * @returns SUCCESS or FAILURE
146 immediate_opts(tOptions * opts)
150 opts->fOptSet |= OPTPROC_IMMEDIATE;
151 opts->curOptIdx = 1; /* start by skipping program name */
152 opts->pzCurOpt = NULL;
155 * Examine all the options from the start. We process any options that
156 * are marked for immediate processing.
159 tOptState opt_st = OPTSTATE_INITIALIZER(PRESET);
161 res = next_opt(opts, &opt_st);
163 case FAILURE: goto failed_option;
164 case PROBLEM: res = SUCCESS; goto leave;
169 * IF this is an immediate-attribute option, then do it.
171 if (! DO_IMMEDIATELY(opt_st.flags))
174 if (! SUCCESSFUL(handle_opt(opts, &opt_st)))
178 if ((opts->fOptSet & OPTPROC_ERRSTOP) != 0)
179 (*opts->pUsageProc)(opts, EXIT_FAILURE);
183 opts->fOptSet &= ~OPTPROC_IMMEDIATE;
188 * check for preset values from a config files or envrionment variables
190 * @param[in,out] opts the structure with the option names to check
193 do_presets(tOptions * opts)
195 tOptDesc * od = NULL;
197 if (! SUCCESSFUL(immediate_opts(opts)))
201 * IF this option set has a --save-opts option, then it also
202 * has a --load-opts option. See if a command line option has disabled
205 if ( (opts->specOptIdx.save_opts != NO_EQUIVALENT)
206 && (opts->specOptIdx.save_opts != 0)) {
207 od = opts->pOptDesc + opts->specOptIdx.save_opts + 1;
208 if (DISABLED_OPT(od))
213 * Until we return from this procedure, disable non-presettable opts
215 opts->fOptSet |= OPTPROC_PRESETTING;
217 * IF there are no config files,
218 * THEN do any environment presets and leave.
220 if (opts->papzHomeList == NULL) {
221 env_presets(opts, ENV_ALL);
224 env_presets(opts, ENV_IMM);
227 * Check to see if environment variables have disabled presetting.
229 if ((od != NULL) && ! DISABLED_OPT(od))
230 intern_file_load(opts);
233 * ${PROGRAM_LOAD_OPTS} value of "no" cannot disable other environment
234 * variable options. Only the loading of .rc files.
236 env_presets(opts, ENV_NON_IMM);
238 opts->fOptSet &= ~OPTPROC_PRESETTING;
244 * AutoOpts initialization
246 * @param[in,out] opts the structure to initialize
247 * @param[in] a_ct program argument count
248 * @param[in] a_v program argument vector
251 ao_initialize(tOptions * opts, int a_ct, char ** a_v)
253 if ((opts->fOptSet & OPTPROC_INITDONE) != 0)
256 opts->origArgCt = (unsigned int)a_ct;
257 opts->origArgVect = a_v;
258 opts->fOptSet |= OPTPROC_INITDONE;
260 if (HAS_pzPkgDataDir(opts))
261 program_pkgdatadir = opts->pzPkgDataDir;
263 if (! SUCCESSFUL(do_presets(opts)))
267 * IF option name conversion was suppressed but it is not suppressed
268 * for the command line, then it's time to translate option names.
269 * Usage text will not get retranslated.
271 if ( ((opts->fOptSet & OPTPROC_TRANSLATE) != 0)
272 && (opts->pTransProc != NULL)
273 && ((opts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT_CFG)
275 opts->fOptSet &= ~OPTPROC_NXLAT_OPT_CFG;
276 (*opts->pTransProc)();
279 if ((opts->fOptSet & OPTPROC_REORDER) != 0)
283 opts->pzCurOpt = NULL;
291 * c-file-style: "stroustrup"
292 * indent-tabs-mode: nil
294 * end of autoopts/initialize.c */