mux/src/muxcli.cpp

Go to the documentation of this file.
00001 // muxcli.cpp
00002 //
00003 // $Id: muxcli.cpp,v 1.4 2004/06/10 15:39:34 sdennis Exp $
00004 //
00005 // MUX 2.4
00006 // Copyright (C) 1998 through 2004 Solid Vertical Domains, Ltd. All
00007 // rights not explicitly given are reserved.
00008 //
00009 #include "copyright.h"
00010 #include <string.h>
00011 #include "muxcli.h"
00012 
00013 // 0 -- A non-option argument.
00014 // 1 -- A short-option argument.
00015 // 2 -- A long-option argument.
00016 // 3 -- An 'end of options' indicator.
00017 //
00018 static int iArgType(char *pArg)
00019 {
00020     // How many characters from "--" does the argument match?
00021     //
00022     static char aHHN[3] = "--";
00023     int iType = 0;
00024     for (; iType < 3 && aHHN[iType] == pArg[iType]; iType++)
00025     {
00026         // Nothing
00027     }
00028     if (iType > 3)
00029     {
00030         iType = 3;
00031     }
00032 
00033     // "-" is a special case. It is a non-option argument.
00034     //
00035     if (iType == 1 && pArg[1] == '\0')
00036     {
00037         iType = 0;
00038     }
00039     return iType;
00040 }
00041 
00042 // Examples:
00043 //
00044 // 1. prog -c123   --> (c,123)
00045 // 2. prog -c 123  --> (c,123)
00046 // 3. prog -c=123  --> (c,123)
00047 // 4. prog -cs 123 --> (c,123) (s)
00048 // 5. prog -sc=123 --> (s) (c,123)
00049 // 6. prog -cs123 --> (c,s123)
00050 //
00051 void CLI_Process
00052 (
00053     int argc,
00054     char *argv[],
00055     CLI_OptionEntry *aOptionTable,
00056     int nOptionTable,
00057     CLI_CALLBACKFUNC *pFunc
00058 )
00059 {
00060     int minNonOption = 0;
00061     int bEndOfOptions = 0;
00062     for (int i = 1; i < argc; i++)
00063     {
00064         char *pArgv = argv[i];
00065         int iType = 0;
00066         if (!bEndOfOptions)
00067         {
00068             iType = iArgType(pArgv);
00069         }
00070 
00071         if (iType == 0)
00072         {
00073             // Non-option argument.
00074             //
00075             if (minNonOption <= i)
00076             {
00077                 // We haven't associated it with an option, yet, so
00078                 // pass it in by itself.
00079                 //
00080                 pFunc(0, pArgv);
00081             }
00082             continue;
00083         }
00084 
00085         if (minNonOption < i+1)
00086         {
00087             minNonOption = i+1;
00088         }
00089 
00090         if (iType == 3)
00091         {
00092             // A "--" causes the remaining unpaired arguments to be
00093             // treated as non-option arguments.
00094             //
00095             bEndOfOptions = 1;
00096             continue;
00097         }
00098 
00099         char *p = pArgv+iType;
00100 
00101         if (iType == 2)
00102         {
00103             // We have a long option.
00104             //
00105             char *pEqual = strchr(p, '=');
00106             int nLen;
00107             if (pEqual)
00108             {
00109                 nLen = pEqual - p;
00110             }
00111             else
00112             {
00113                 nLen = strlen(p);
00114             }
00115             for (int j = 0; j < nOptionTable; j++)
00116             {
00117                 if (  !strncmp(aOptionTable[j].m_Flag, p, nLen)
00118                    && aOptionTable[j].m_Flag[nLen] == '\0')
00119                 {
00120                     switch (aOptionTable[j].m_ArgControl)
00121                     {
00122                     case CLI_NONE:
00123                         pFunc(aOptionTable + j, 0);
00124                         break;
00125 
00126                     case CLI_OPTIONAL:
00127                     case CLI_REQUIRED:
00128                         if (pEqual)
00129                         {
00130                             pFunc(aOptionTable + j, pEqual+1);
00131                             break;
00132                         }
00133                         int bFound = 0;
00134                         for (; minNonOption < argc; minNonOption++)
00135                         {
00136                             int iType2 = iArgType(argv[minNonOption]);
00137                             if (iType2 == 0)
00138                             {
00139                                 pFunc(aOptionTable + j, argv[minNonOption]);
00140                                 minNonOption++;
00141                                 bFound = 1;
00142                                 break;
00143                             }
00144                             else if (iType2 == 3)
00145                             {
00146                                 // End of options. Stop.
00147                                 //
00148                                 break;
00149                             }
00150                         }
00151                         if (  !bFound
00152                            && aOptionTable[j].m_ArgControl == CLI_OPTIONAL)
00153                         {
00154                             pFunc(aOptionTable + j, 0);
00155                         }
00156                         break;
00157                     }
00158                     break;
00159                 }
00160             }
00161             continue;
00162         }
00163 
00164         // At this point, the only possibilities left are a short
00165         // option.
00166         //
00167         while (*p)
00168         {
00169             int ch = *p++;
00170             for (int j = 0; j < nOptionTable; j++)
00171             {
00172                 if (  aOptionTable[j].m_Flag[0] == ch
00173                    && aOptionTable[j].m_Flag[1] == '\0')
00174                 {
00175                     switch (aOptionTable[j].m_ArgControl)
00176                     {
00177                     case CLI_NONE:
00178                         pFunc(aOptionTable + j, 0);
00179                         break;
00180 
00181                     case CLI_OPTIONAL:
00182                     case CLI_REQUIRED:
00183                         if (*p)
00184                         {
00185                             // Value follows option letter
00186                             //
00187                             if (*p == '=')
00188                             {
00189                                 p++;
00190                             }
00191 
00192                             pFunc(aOptionTable + j, p);
00193                             p = "";
00194                             break;
00195                         }
00196                         int bFound = 0;
00197                         for (; minNonOption < argc; minNonOption++)
00198                         {
00199                             int iType2 = iArgType(argv[minNonOption]);
00200                             if (iType2 == 0)
00201                             {
00202                                 pFunc(aOptionTable + j, argv[minNonOption]);
00203                                 minNonOption++;
00204                                 bFound = 1;
00205                                 break;
00206                             }
00207                             else if (iType2 == 3)
00208                             {
00209                                 // End of options. Stop.
00210                                 //
00211                                 break;
00212                             }
00213                         }
00214                         if (  !bFound
00215                            && aOptionTable[j].m_ArgControl == CLI_OPTIONAL)
00216                         {
00217                             pFunc(aOptionTable + j, 0);
00218                         }
00219                         break;
00220                     }
00221                     break;
00222                 }
00223             }
00224         }
00225     }
00226 }

Generated on Mon May 28 04:40:10 2007 for MUX by  doxygen 1.4.7