--- rc_cliopt.c 2002/04/23 12:30:29 1.6
+++ rc_cliopt.c 2002/04/24 16:47:07 1.7
@@ -27,25 +27,66 @@
** rc_cliopt.c: Run-command processor ISO C source file
*/
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "rc.h"
#include "rc_const.h"
#include "rc_config.h"
-#include "popt.h" /* OSSP popt options library*/
+#include "popt.h" /* OSSP popt options library */
-static char *m_pszOptuples[RC_NUMOPTS]; /* Option name value tuples */
-static char *m_szRcfile = NULL; /* rc file */
-static char *m_szSec = NULL; /* Section names */
+static char *m_pszOptuples[RC_NUMOPTS]; /* Option name value tuples */
+static char *m_szRcfile = NULL; /* rc file */
+static char **m_pszSec = NULL; /* Section names */
+static popt_context m_Optcon; /* Context for parsing options */
+
+static struct popt_option m_pOptable[] = {
+ /* Long options with short keys but no arguments */
+ {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 */
+ {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, 0, 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 */
+ {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"},
+
+ /* Special stuff */
+ POPT_AUTOHELP
+ {NULL, 0, 0, NULL, 0}
+};
/***************************************
-* clioptConstruct(void) *
+* clioptNew(void) *
* Construct a command line option *
***************************************/
-rc_return_t clioptConstruct(void)
+rc_return_t clioptNew(void)
{
/* assert(s_pBintab == NULL); */ /* Error if constructed already */
/* s_pBintab = malloc(sizeof(*s_pBintab));*/ /* Allocate a cliopt instance */
@@ -53,19 +94,30 @@
return(RC_THROW(RC_ERR_MEM));
s_pBintab->pOptlist = malloc(sizeof(*s_pBintab->pOptlist));*/
-/*FIXME optConstruct((rc_opt_t **)&s_pBintab->pOptlist->pvData);FIXME*/
+/*FIXME optNew((rc_opt_t **)&s_pBintab->pOptlist->pvData);FIXME*/
/* s_pBintab->pOptlist->pvData = NULL;
s_pBintab->pOptlist->pvNext = NULL;*/
memset(m_pszOptuples, NULL, sizeof(m_pszOptuples));
-TRACE("cliopt constructed.\n");
return(RC_THROW(RC_OK));
}
/***************************************
-* clioptGetval(rc_opt_t) *
-* Command line option accessor *
+* clioptPrintusage() *
+* Print usage to command line stderr *
+***************************************/
+rc_return_t clioptPrintusage(void)
+{
+ popt_printusage(m_Optcon, stderr, 0);
+
+ return(RC_THROW(RC_OK));
+}
+
+/***************************************
+* clioptGetXXX() *
+* clioptSetXXX() *
+* Command line option accessors *
***************************************/
const char *clioptGetval(rc_opt_t Optname)
{
@@ -75,22 +127,77 @@
return((const char *)m_pszOptuples[Optname]);
}
-/***************************************
-* clioptGetrcfile(void) *
-* Command line rc file accessor *
-***************************************/
const char *clioptGetrcfile(void)
{
+ if (!m_szRcfile)
+ RC_THROW(RC_ERR_USE);
+
return((const char *)m_szRcfile);
}
-/***************************************
-* clioptGetsec(void) *
-* Command line section accessor *
-***************************************/
-const char *clioptGetsec(void)
+const char **clioptGetsec(void)
{
- return((const char *)m_szSec);
+ if (!m_pszSec)
+ RC_THROW(RC_ERR_USE);
+
+ return((const char **)m_pszSec);
+}
+
+int clioptGetseclen(void)
+{
+ int i = 0;
+
+ if (!m_pszSec)
+ RC_THROW(RC_ERR_USE);
+
+ for (i = 0; m_pszSec[i]; i++);
+ return(i);
+}
+
+rc_return_t clioptSetval(rc_opt_t Optname, const char *kszOptval)
+{
+ if (!(Optname < RC_NUMOPTS)) /* Validate option range */
+ return(RC_THROW(RC_ERR_USE));
+ if (!(kszOptval)) /* Validate string value */
+ return(RC_THROW(RC_ERR_USE));
+
+ if (!(m_pszOptuples[Optname] = strdup(kszOptval)))
+ return(RC_THROW(RC_ERR_MEM));
+ return(RC_THROW(RC_OK));
+}
+
+rc_return_t clioptSetrcfile(const char *kszRc)
+{
+ if (m_szRcfile) /* Forbid overwriting */
+ return(RC_THROW(RC_ERR_USE)); /* an existing rcfile */
+ else if (kszRc)
+ m_szRcfile = strdup(kszRc);
+ else
+ return(RC_THROW(RC_ERR_USE)); /* Incoming string is NULL? */
+
+ return(RC_THROW(RC_OK));
+}
+
+rc_return_t clioptSetsec(const char *pkszSec[])
+{
+ int i = 0;
+
+ if (m_pszSec) /* Forbid overwriting */
+ return(RC_THROW(RC_ERR_USE)); /* an existing rcfile */
+ else if (pkszSec) {
+ for (i = 0; pkszSec[i]; i++); /* Count the sections */
+ m_pszSec = malloc(sizeof (char **) * i + 1); /* Allocate using i */
+
+ for (i = 0; pkszSec[i]; i++) {
+ m_pszSec[i] = malloc(strlen(pkszSec[i]));
+ memcpy(m_pszSec[i], pkszSec[i], strlen(pkszSec[i]));
+ }
+ m_pszSec[i] = NULL; /* Used later for finding the end of array */
+ }
+ else
+ return(RC_THROW(RC_ERR_USE)); /* Incoming sections are NULL? */
+
+ return(RC_THROW(RC_OK));
}
/***************************************
@@ -99,73 +206,72 @@
* processing the corresponding option *
* and update option table accordingly *
***************************************/
-rc_return_t clioptProcess(int cliOption, const char *szArg)
+rc_return_t clioptProcess(int cliOption, const char *kszArg)
{
switch (cliOption) {
/* Begin concrete (digital) options */
case RC_USE_VAL:
- m_pszOptuples[cliOption] = strdup("1"); /* Usage */
- return(RC_THROW(RC_ERR_USE));
+ clioptSetval(cliOption, "1"); break; /* Usage */
case RC_DBG_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Debug */
+ clioptSetval(cliOption, "1"); break; /* Debug */
case RC_VER_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Version */
+ clioptSetval(cliOption, "1"); break; /* Version */
case RC_EVL_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Eval */
+ clioptSetval(cliOption, "1"); break; /* Eval */
case RC_HLP_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Help */
+ clioptSetval(cliOption, "1"); break; /* Help */
case RC_INF_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Info */
+ clioptSetval(cliOption, "1"); break; /* Info */
case RC_LBL_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Label */
+ clioptSetval(cliOption, "1"); break; /* Label */
case RC_PRN_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Print */
+ clioptSetval(cliOption, "1"); break; /* Print */
case RC_SIL_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Silent */
+ clioptSetval(cliOption, "1"); break; /* Silent */
case RC_RAW_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Raw */
+ clioptSetval(cliOption, "1"); break; /* Raw */
case RC_VRB_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Verbose */
+ clioptSetval(cliOption, "1"); break; /* Verbose */
case RC_EXC_VAL:
- m_pszOptuples[cliOption] = strdup("1"); break; /* Exec */
+ clioptSetval(cliOption, "1"); break; /* Exec */
/* Begin abstract (nondigital) options */
case RC_LOC_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Locations */
+ clioptSetval(cliOption, kszArg); break; /* Locations */
case RC_CNF_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Conf file */
+ clioptSetval(cliOption, kszArg); break; /* Conf file */
case RC_FNC_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Func file */
+ clioptSetval(cliOption, kszArg); break; /* Func file */
case RC_QRY_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Format */
+ clioptSetval(cliOption, kszArg); break; /* Format */
case RC_TMP_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Temp dir */
+ clioptSetval(cliOption, kszArg); break; /* Temp dir */
case RC_OWN_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* User name */
+ clioptSetval(cliOption, kszArg); break; /* User name */
case RC_GRP_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Group name */
+ clioptSetval(cliOption, kszArg); break; /* Group name */
case RC_MSK_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Umask */
+ clioptSetval(cliOption, kszArg); break; /* Umask */
case RC_ASS_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Assignregex */
+ clioptSetval(cliOption, kszArg); break; /* Assignregex */
case RC_DEF_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Labelregex */
+ clioptSetval(cliOption, kszArg); break; /* Labelregex */
case RC_REF_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Refregex */
+ clioptSetval(cliOption, kszArg); break; /* Refregex */
case RC_PRM_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Paramregex */
+ clioptSetval(cliOption, kszArg); break; /* Paramregex */
case RC_TRM_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Termregex */
+ clioptSetval(cliOption, kszArg); break; /* Termregex */
case RC_NCF_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Configname */
+ clioptSetval(cliOption, kszArg); break; /* Configname */
case RC_CMN_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Commonname */
+ clioptSetval(cliOption, kszArg); break; /* Commonname */
case RC_DFL_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Defaultname */
+ clioptSetval(cliOption, kszArg); break; /* Defaultname */
case RC_ERR_VAL:
- m_pszOptuples[cliOption] = strdup(szArg); break; /* Errorname */
+ clioptSetval(cliOption, kszArg); break; /* Errorname */
default : break;
}
@@ -173,112 +279,91 @@
}
/***************************************
-* clioptParse(int, char **) *
+* clioptParseopt(int, char **) *
* Parse command line options *
***************************************/
-rc_return_t clioptParse(int argc, char *argv[])
+rc_return_t clioptParseopt(int argc, char *argv[])
{
- static struct popt_option optionsTable[] = {
- /* Long options with short keys but no arguments */
- {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 */
- {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, 0, 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 */
- {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"},
-
- /* Special stuff */
- POPT_AUTOHELP
- {NULL, 0, 0, NULL, 0}
- };
-
ex_t Except;
- char cliOpt = 0; /* For argument parsing */
- char *szCLIBuf = NULL;
- popt_context optCon; /* Context for parsing options */
-
- optCon = popt_getcontext(NULL, argc, (const char **)argv, optionsTable, 0);
- popt_setotheroptionhelp(optCon, "[options] <rcfile> <sections [args]>");
-
- if (argc < 3) {
- fprintf(stderr, "Please enter at least one rcfile and section.\n");
- popt_printusage(optCon, stderr, 0);
+ char cliOpt = 0; /* For argument parsing */
+
+ m_Optcon = popt_getcontext(NULL, argc, (const char **)argv, m_pOptable, 0);
+ popt_setotheroptionhelp(m_Optcon, "<rcfile> <sections [args]>");
+
+ if (argc < 2) { /* Allow the user to enter just one option, -h z.B. */
+ fprintf(stderr, RC_LST_TEXT);
+ popt_printusage(m_Optcon, stderr, 0);
return(RC_THROW(RC_ERR_USE));
}
/* Now do options processing */
- while ((cliOpt = popt_getnextopt(optCon)) >= 0) { /* Loop, each time */
- ex_try { /* eating a new option */
- clioptProcess(cliOpt, popt_getoptarg(optCon));
+ while ((cliOpt = popt_getnextopt(m_Optcon)) >= 0) {/* Loop, each time */
+ ex_try { /* eating a new option */
+ clioptProcess(cliOpt, popt_getoptarg(m_Optcon));
}
- ex_catch(Except) {
- if ((rc_return_t)Except.ex_value == RC_ERR_USE) {
- popt_printusage(optCon, stderr, 0);
- rethrow;
- }
- else { /* Some error condition probably deserves attention */
- 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);
- rethrow;
- }
+ ex_catch(Except) { /* Error condition probably deserves attention */
+/* FIXME Examine the following line *(int *) for a potential segfault prob */
+ 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);
+ rethrow;
}
}
- /* At this point we should be finished parsing options, so now we use */
- /* popt as a transport to read the user specified rcfile and sections. */
- szCLIBuf = (char *)popt_getarg(optCon);
- if ((szCLIBuf == NULL)) {
- fprintf(stderr, "Please enter at least one rcfile and section.\n");
- popt_printusage(optCon, stderr, 0);
- return(RC_THROW(RC_ERR_USE));
- }
-
if (cliOpt < -1) {
/* An error occurred during option processing */
fprintf(stderr, "%s: %s\n",
- popt_badoption(optCon, POPT_BADOPTION_NOALIAS),
+ popt_badoption(m_Optcon, POPT_BADOPTION_NOALIAS),
popt_strerror(cliOpt));
return(RC_THROW(RC_ERR_INT));
}
- fprintf(stderr, "Run these commands: %s\n", szCLIBuf);
- popt_freecontext(optCon);
return(RC_THROW(RC_OK));
}
/***************************************
-* clioptDestruct(void) *
+* clioptParserc(void) *
+* Parse command line rc file *
+***************************************/
+rc_return_t clioptParserc(void)
+{
+ ex_t Except;
+
+ /* Use popt as a transport to read the user specified rcfile */
+ ex_try { /* Retrieve exactly one rc file name from the command line */
+ clioptSetrcfile(popt_getarg(m_Optcon)); /* No file check here */
+ }
+ ex_catch(Except) {
+ rethrow; /* Our generic response */
+ }
+
+ return(RC_THROW(RC_OK));
+}
+
+/***************************************
+* clioptParsesec(void) *
+* Parse command line sections *
+***************************************/
+rc_return_t clioptParsesec(void)
+{
+ ex_t Except;
+
+ /* Use popt as a transport to read the user specified sections */
+ ex_try { /* Retrieve one or more sections from the command line */
+ clioptSetsec(popt_getargs(m_Optcon));
+ }
+ ex_catch(Except) {
+ rethrow; /* Our generic response */
+ }
+
+ return(RC_THROW(RC_OK));
+}
+
+/***************************************
+* clioptDelete(void) *
* Destruct a command line option *
***************************************/
-rc_return_t clioptDestruct(void)
+rc_return_t clioptDelete(void)
{
int i = 0;
/* ex_t Except;
@@ -286,7 +371,7 @@
assert(s_pBintab);*/ /* Error if not constructed */
/* ex_try {
clioptRemall();*/ /* Removes ALL list nodes */
-/*FIXME optDestruct((rc_opt_t **)&s_pBintab->pOptlist->pvData);FIXME*/
+/*FIXME optDelete((rc_opt_t **)&s_pBintab->pOptlist->pvData);FIXME*/
/* free(s_pBintab->pOptlist);*/ /* Deallocate option list */
/* free(s_pBintab);*/ /* Deallocate cliopt and */
/* s_pBintab = NULL;*/ /* clear its reference */
@@ -295,6 +380,7 @@
rethrow;
}*/
+ popt_freecontext(m_Optcon); /* Free the popt context */
for (i = 0; i < RC_NUMOPTS; i++) { /* Free the tuples themselves */
if (m_pszOptuples[i]) {
free(m_pszOptuples[i]);
@@ -304,14 +390,18 @@
if (m_szRcfile) /* Free the rc file arg */
free(m_szRcfile);
- if (m_szSec) /* Free the section name arg */
- free(m_szSec);
+ if (m_pszSec) { /* Free the section name arg */
+ for (i = 0; m_pszSec[i]; i++) {
+ free(m_pszSec[i]);
+ m_pszSec[i] = NULL;
+ }
+ free(m_pszSec);
+ }
/* FIXME BEGIN DEBUG */
for (i = 0; i < RC_NUMOPTS; i++)
if (m_pszOptuples[i])
TRACE("Problem! Destructor failed!\n");
-TRACE("cliopt destructed.\n");
/* FIXME END DEBUG */
return(RC_THROW(RC_OK));
|