OSSP CVS Repository

ossp - Difference in ossp-pkg/rc/rc_cliopt.c versions 1.6 and 1.7
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

ossp-pkg/rc/rc_cliopt.c 1.6 -> 1.7

--- 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));

CVSTrac 2.0.1