00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "copyright.h"
00010 #include <string.h>
00011 #include "muxcli.h"
00012
00013
00014
00015
00016
00017
00018 static int iArgType(char *pArg)
00019 {
00020
00021
00022 static char aHHN[3] = "--";
00023 int iType = 0;
00024 for (; iType < 3 && aHHN[iType] == pArg[iType]; iType++)
00025 {
00026
00027 }
00028 if (iType > 3)
00029 {
00030 iType = 3;
00031 }
00032
00033
00034
00035 if (iType == 1 && pArg[1] == '\0')
00036 {
00037 iType = 0;
00038 }
00039 return iType;
00040 }
00041
00042
00043
00044
00045
00046
00047
00048
00049
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
00074
00075 if (minNonOption <= i)
00076 {
00077
00078
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
00093
00094
00095 bEndOfOptions = 1;
00096 continue;
00097 }
00098
00099 char *p = pArgv+iType;
00100
00101 if (iType == 2)
00102 {
00103
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
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
00165
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
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
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 }