--- rc_option.c 2002/02/07 12:38:32 1.1
+++ rc_option.c 2002/02/08 18:36:40 1.2
@@ -30,84 +30,90 @@
#include <stdio.h>
#include "rc.h"
-#include "rc_option.h" /* Values and other for popt */
-#include "rc_const.h" /* Strings and other constants */
-
-#ifdef HAVE_CONFIG_H
-#include "rc_config.h"
-#endif
+#include "rc_private.h"
+#include "rc_option.h" /* Option operations rely on popt */
+#include "rc_const.h" /* Strings and other constants */
/* Third party headers for libraries linked in */
-#include "ex.h" /* OSSP ex exception library */
#include "popt.h" /* OSSP popt options library */
-/* Define the ability to throw OSSP ex exceptions */
-#define RC_THROW(rv) \
- ( (rv) != RC_OK && (ex_catching && !ex_shielding) \
- ? (ex_throw(ossprc_id, NULL, (rv)), (rv)) : (rv))
-
/* Unique identifier to use with OSSP ex library */
const char ossprc_id[] = "OSSP rc";
-rc_return_t parseopts(int argc, char *argv[])
+/* Loops through available options and fills a configuration if encountered */
+rc_return_t procOpts(char cOpt, char *pcCLI)
+{
+ int nPos = 0; /* For tracking options */
+
+ switch (cOpt) {
+ case 'h':
+ pcCLI[nPos++] = 'h';
+ break;
+ case 'V':
+ pcCLI[nPos++] = 'V';
+ break;
+ case 'i':
+ pcCLI[nPos++] = 'i';
+ break;
+ case 'q':
+ pcCLI[nPos++] = 'q';
+ break;
+ }
+
+ return(RC_THROW(RC_OK));
+}
+
+rc_return_t parseOpts(int argc, char *argv[])
{
+ ex_t Except;
+ int bCaught = 0;
+ char pcBuf[BUFSIZ+1];
+ int nBufpos = 0; /* For tracking options */
char cOpt = 0; /* For argument parsing */
- int iBufpos = 0; /* For tracking options */
char *szCLIBuf = NULL;
char *szFuncfile = NULL; /* Rc.func file name and location */
int nIter = 0;
- char pcBuf[BUFSIZ+1];
popt_context optCon; /* Context for parsing options */
struct popt_option optionsTable[] = {
/* Long options with short keys but no arguments */
- { "usage", '?', POPT_ARG_NONE, 0, RC_USE_VAL, RC_USE_DESC, NULL },
- { "debug", 'd', POPT_ARG_NONE, 0, RC_DBG_VAL, RC_DBG_DESC, NULL },
- { "version", 'V', POPT_ARG_NONE, 0, RC_VER_VAL, RC_VER_DESC, NULL },
- { "eval", 'e', POPT_ARG_NONE, 0, RC_EVL_VAL, RC_EVL_DESC, NULL },
- { "help", 'h', POPT_ARG_NONE, 0, RC_HLP_VAL, RC_HLP_DESC, NULL },
- { "info", 'i', POPT_ARG_NONE, 0, RC_INF_VAL, RC_INF_DESC, NULL },
- { "labels", 'l', POPT_ARG_NONE, 0, RC_LBL_VAL, RC_LBL_DESC, NULL },
- { "print", 'p', POPT_ARG_NONE, 0, RC_PRN_VAL, RC_PRN_DESC, NULL },
- { "silent", 's', POPT_ARG_NONE, 0, RC_SIL_VAL, RC_SIL_DESC, NULL },
- { "raw", 'r', POPT_ARG_NONE, 0, RC_RAW_VAL, RC_RAW_DESC, NULL },
- { "verbose", 'v', POPT_ARG_NONE, 0, RC_VRB_VAL, RC_VRB_DESC, NULL },
- { "exec", 'x', POPT_ARG_NONE, 0, RC_EXC_VAL, RC_EXC_DESC, NULL },
+ { RC_USE_NAME, '?', POPT_ARG_NONE, 0, RC_USE_VAL, RC_USE_DESC, NULL },
+ { RC_DBG_NAME, 'd', POPT_ARG_NONE, 0, RC_DBG_VAL, RC_DBG_DESC, NULL },
+ { RC_VER_NAME, 'V', POPT_ARG_NONE, 0, RC_VER_VAL, RC_VER_DESC, NULL },
+ { RC_EVL_NAME, 'e', POPT_ARG_NONE, 0, RC_EVL_VAL, RC_EVL_DESC, NULL },
+ { RC_HLP_NAME, 'h', POPT_ARG_NONE, 0, RC_HLP_VAL, RC_HLP_DESC, NULL },
+ { RC_INF_NAME, 'i', POPT_ARG_NONE, 0, RC_INF_VAL, RC_INF_DESC, NULL },
+ { RC_LBL_NAME, 'l', POPT_ARG_NONE, 0, RC_LBL_VAL, RC_LBL_DESC, NULL },
+ { RC_PRN_NAME, 'p', POPT_ARG_NONE, 0, RC_PRN_VAL, RC_PRN_DESC, NULL },
+ { RC_SIL_NAME, 's', POPT_ARG_NONE, 0, RC_SIL_VAL, RC_SIL_DESC, NULL },
+ { RC_RAW_NAME, 'r', POPT_ARG_NONE, 0, RC_RAW_VAL, RC_RAW_DESC, NULL },
+ { RC_VRB_NAME, 'v', POPT_ARG_NONE, 0, RC_VRB_VAL, RC_VRB_DESC, NULL },
+ { RC_EXC_NAME, 'x', POPT_ARG_NONE, 0, RC_EXC_VAL, RC_EXC_DESC, NULL },
/* Single argument long options with short keys */
- { "locate", 'L', POPT_ARG_STRING, 0, RC_LOC_VAL, RC_LOC_DESC, "regx" },
- { "conf", 'c', POPT_ARG_STRING, 0, RC_CNF_VAL, RC_CNF_DESC, "path" },
- { "func", 'f', POPT_ARG_STRING, &szFuncfile,\
- RC_FNC_VAL, RC_FNC_DESC, "path" },
- { "query", 'q', POPT_ARG_STRING, 0, RC_QRY_VAL, RC_QRY_DESC, "varx" },
- { "tmp", 't', POPT_ARG_STRING, 0, RC_TMP_VAL, RC_TMP_DESC, "path" },
+ {RC_LOC_NAME, 'L', POPT_ARG_STRING, 0, RC_LOC_VAL, RC_LOC_DESC, "regx"},
+ {RC_CNF_NAME, 'c', POPT_ARG_STRING, 0, RC_CNF_VAL, RC_CNF_DESC, "path"},
+
+ {RC_FNC_NAME, 'f', POPT_ARG_STRING, &szFuncfile,\
+ RC_FNC_VAL, RC_FNC_DESC, "path"},
+
+ {RC_QRY_NAME, 'q', POPT_ARG_STRING, 0, RC_QRY_VAL, RC_QRY_DESC, "varx"},
+ {RC_TMP_NAME, 't', POPT_ARG_STRING, 0, RC_TMP_VAL, RC_TMP_DESC, "path"},
/* Single argument long options without short keys */
- { "RequireOwner", 0, POPT_ARG_STRING, 0,\
- RC_OWN_VAL, RC_OWN_DESC, "user" },
- { "RequireGroup", 0, POPT_ARG_STRING, 0,\
- RC_GRP_VAL, RC_GRP_DESC, "group" },
- { "RequireUmask", 0, POPT_ARG_INT, 0,\
- RC_MSK_VAL, RC_MSK_DESC, "umask" },
- { "ParseEnvAss", 0, POPT_ARG_STRING, 0,\
- RC_ASS_VAL, RC_ASS_DESC, "regx" },
- { "ParseSectionDef", 0, POPT_ARG_STRING, 0,\
- RC_DEF_VAL, RC_DEF_DESC, "regx" },
- { "ParseSectionRef", 0, POPT_ARG_STRING, 0,\
- RC_REF_VAL, RC_REF_DESC, "regx" },
- { "ParseSectionParam", 0, POPT_ARG_STRING, 0,\
- RC_PRM_VAL, RC_PRM_DESC, "regx" },
- { "ParseTerminal", 0, POPT_ARG_STRING, 0,\
- RC_TRM_VAL, RC_TRM_DESC, "regx" },
- { "NameConfig", 0, POPT_ARG_STRING, 0,\
- RC_NCF_VAL, RC_NCF_DESC, "name" },
- { "NameCommon", 0, POPT_ARG_STRING, 0,\
- RC_CMN_VAL, RC_CMN_DESC, "name" },
- { "NameDefault", 0, POPT_ARG_STRING, 0,\
- RC_DFL_VAL, RC_DFL_DESC, "name" },
- { "NameError", 0, POPT_ARG_STRING, 0,\
- RC_ERR_VAL, RC_ERR_DESC, "name" },
+ { RC_OWN_NAME, 0, POPT_ARG_STRING, 0, RC_OWN_VAL, RC_OWN_DESC, "user" },
+ { RC_GRP_NAME, 0, POPT_ARG_STRING, 0, RC_GRP_VAL, RC_GRP_DESC, "group"},
+ { RC_MSK_NAME, 0, POPT_ARG_INT, 0, RC_MSK_VAL, RC_MSK_DESC, "umask"},
+ { RC_ASS_NAME, 0, POPT_ARG_STRING, 0, RC_ASS_VAL, RC_ASS_DESC, "regx" },
+ { RC_DEF_NAME, 0, POPT_ARG_STRING, 0, RC_DEF_VAL, RC_DEF_DESC, "regx" },
+ { RC_REF_NAME, 0, POPT_ARG_STRING, 0, RC_REF_VAL, RC_REF_DESC, "regx" },
+ { RC_PRM_NAME, 0, POPT_ARG_STRING, 0, RC_PRM_VAL, RC_PRM_DESC, "regx" },
+ { RC_TRM_NAME, 0, POPT_ARG_STRING, 0, RC_TRM_VAL, RC_TRM_DESC, "regx" },
+ { RC_NCF_NAME, 0, POPT_ARG_STRING, 0, RC_NCF_VAL, RC_NCF_DESC, "name" },
+ { RC_CMN_NAME, 0, POPT_ARG_STRING, 0, RC_CMN_VAL, RC_CMN_DESC, "name" },
+ { RC_DFL_NAME, 0, POPT_ARG_STRING, 0, RC_DFL_VAL, RC_DFL_DESC, "name" },
+ { RC_ERR_NAME, 0, POPT_ARG_STRING, 0, RC_ERR_VAL, RC_ERR_DESC, "name" },
POPT_AUTOHELP
{ NULL, 0, 0, NULL, 0 }
@@ -122,22 +128,21 @@
}
/* Now do options processing */
- while ((cOpt = popt_getnextopt(optCon)) >= 0) {
- switch (cOpt) {
- case 'h':
- pcBuf[iBufpos++] = 'h';
- break;
- case 'V':
- pcBuf[iBufpos++] = 'V';
- break;
- case 'i':
- pcBuf[iBufpos++] = 'i';
- break;
- case 'q':
- pcBuf[iBufpos++] = 'q';
- break;
- }
+ while ((cOpt = popt_getnextopt(optCon)) >= 0)
+ ex_try {
+ procOpts(cOpt, pcBuf);
+ }
+ ex_catch(Except) {
+ if ((rc_return_t)Except.ex_value != RC_ERR_USE)
+ fprintf(stderr, "Nonusage exception: %d\n",\
+ (rc_return_t)Except.ex_value);
+ bCaught = 1;
+ fprintf(stderr, "Class '%s' threw exception %d in %s:%s():%d.\n",\
+ (char *)Except.ex_class, *(int *)Except.ex_value,\
+ Except.ex_file, Except.ex_func, Except.ex_line);
}
+ if (!bCaught)
+ fprintf(stderr, "parseOpts: No exceptions caught.\n");
szCLIBuf = (char *)popt_getarg(optCon);
if ((szCLIBuf == NULL)) {
@@ -156,7 +161,7 @@
/* Print out options, szCLIBuf chosen */
fprintf(stderr, "Options chosen: ");
- for (nIter = 0; nIter < iBufpos ; nIter++)
+ for (nIter = 0; nIter < nBufpos ; nIter++)
fprintf(stderr, "-%c ", pcBuf[nIter]);
if (szFuncfile)
fprintf(stderr, "-f %s ", szFuncfile);
|