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);
100 char const ** pp = VOIDP(&(opts->pzProgName));
107 pz = pathfind(getenv("PATH"), pname, "rx");
111 pp = (char const **)VOIDP(&(opts->pzProgPath));
115 * when comparing long names, these are equivalent
117 strequate(zSepChars);
123 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
127 * The next several routines do the immediate action pass on the command
128 * line options, then the environment variables, then the config files in
129 * reverse order. Once done with that, the order is reversed and all
130 * the config files and environment variables are processed again, this
131 * time only processing the non-immediate action options. do_presets()
132 * will then return for optionProcess() to do the final pass on the command
137 * scan the command line for immediate action options.
138 * This is only called the first time through.
139 * While this procedure is active, the OPTPROC_IMMEDIATE is true.
141 * @param pOpts program options descriptor
142 * @returns SUCCESS or FAILURE
145 immediate_opts(tOptions * opts)
149 opts->fOptSet |= OPTPROC_IMMEDIATE;
150 opts->curOptIdx = 1; /* start by skipping program name */
151 opts->pzCurOpt = NULL;
154 * Examine all the options from the start. We process any options that
155 * are marked for immediate processing.
158 tOptState opt_st = OPTSTATE_INITIALIZER(PRESET);
160 res = next_opt(opts, &opt_st);
162 case FAILURE: goto failed_option;
163 case PROBLEM: res = SUCCESS; goto leave;
168 * IF this is an immediate-attribute option, then do it.
170 if (! DO_IMMEDIATELY(opt_st.flags))
173 if (! SUCCESSFUL(handle_opt(opts, &opt_st)))
177 if ((opts->fOptSet & OPTPROC_ERRSTOP) != 0)
178 (*opts->pUsageProc)(opts, EXIT_FAILURE);
182 opts->fOptSet &= ~OPTPROC_IMMEDIATE;
187 * check for preset values from a config files or envrionment variables
189 * @param[in,out] opts the structure with the option names to check
192 do_presets(tOptions * opts)
194 tOptDesc * od = NULL;
196 if (! SUCCESSFUL(immediate_opts(opts)))
200 * IF this option set has a --save-opts option, then it also
201 * has a --load-opts option. See if a command line option has disabled
204 if ( (opts->specOptIdx.save_opts != NO_EQUIVALENT)
205 && (opts->specOptIdx.save_opts != 0)) {
206 od = opts->pOptDesc + opts->specOptIdx.save_opts + 1;
207 if (DISABLED_OPT(od))
212 * Until we return from this procedure, disable non-presettable opts
214 opts->fOptSet |= OPTPROC_PRESETTING;
216 * IF there are no config files,
217 * THEN do any environment presets and leave.
219 if (opts->papzHomeList == NULL) {
220 env_presets(opts, ENV_ALL);
223 env_presets(opts, ENV_IMM);
226 * Check to see if environment variables have disabled presetting.
228 if ((od != NULL) && ! DISABLED_OPT(od))
229 intern_file_load(opts);
232 * ${PROGRAM_LOAD_OPTS} value of "no" cannot disable other environment
233 * variable options. Only the loading of .rc files.
235 env_presets(opts, ENV_NON_IMM);
237 opts->fOptSet &= ~OPTPROC_PRESETTING;
243 * AutoOpts initialization
245 * @param[in,out] opts the structure to initialize
246 * @param[in] a_ct program argument count
247 * @param[in] a_v program argument vector
250 ao_initialize(tOptions * opts, int a_ct, char ** a_v)
252 if ((opts->fOptSet & OPTPROC_INITDONE) != 0)
255 opts->origArgCt = (unsigned int)a_ct;
256 opts->origArgVect = a_v;
257 opts->fOptSet |= OPTPROC_INITDONE;
259 if (HAS_pzPkgDataDir(opts))
260 program_pkgdatadir = opts->pzPkgDataDir;
262 if (! SUCCESSFUL(do_presets(opts)))
266 * IF option name conversion was suppressed but it is not suppressed
267 * for the command line, then it's time to translate option names.
268 * Usage text will not get retranslated.
270 if ( ((opts->fOptSet & OPTPROC_TRANSLATE) != 0)
271 && (opts->pTransProc != NULL)
272 && ((opts->fOptSet & OPTPROC_NO_XLAT_MASK) == OPTPROC_NXLAT_OPT_CFG)
274 opts->fOptSet &= ~OPTPROC_NXLAT_OPT_CFG;
275 (*opts->pTransProc)();
278 if ((opts->fOptSet & OPTPROC_REORDER) != 0)
282 opts->pzCurOpt = NULL;
290 * c-file-style: "stroustrup"
291 * indent-tabs-mode: nil
293 * end of autoopts/initialize.c */