Annotation of elwix/tools/oldlzma/SRC/Common/CommandLineParser.cpp, revision 1.1.1.1

1.1       misho       1: // CommandLineParser.cpp
                      2: 
                      3: #include "StdAfx.h"
                      4: 
                      5: #include "CommandLineParser.h"
                      6: 
                      7: namespace NCommandLineParser {
                      8: 
                      9: void SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
                     10: {
                     11:   dest1.Empty();
                     12:   dest2.Empty();
                     13:   bool quoteMode = false;
                     14:   int i;
                     15:   for (i = 0; i < src.Length(); i++)
                     16:   {
                     17:     wchar_t c = src[i];
                     18:     if (c == L'\"')
                     19:       quoteMode = !quoteMode;
                     20:     else if (c == L' ' && !quoteMode)
                     21:     {
                     22:       i++;
                     23:       break;
                     24:     }
                     25:     else 
                     26:       dest1 += c;
                     27:   }
                     28:   dest2 = src.Mid(i);
                     29: }
                     30: 
                     31: void SplitCommandLine(const UString &s, UStringVector &parts)
                     32: {
                     33:   UString sTemp = s;
                     34:   sTemp.Trim();
                     35:   parts.Clear();
                     36:   while (true)
                     37:   {
                     38:     UString s1, s2;
                     39:     SplitCommandLine(sTemp, s1, s2);
                     40:     // s1.Trim();
                     41:     // s2.Trim();
                     42:     if (!s1.IsEmpty())
                     43:       parts.Add(s1);
                     44:     if (s2.IsEmpty())
                     45:       return;
                     46:     sTemp = s2;
                     47:   }
                     48: }
                     49: 
                     50: 
                     51: static const wchar_t kSwitchID1 = '-';
                     52: // static const wchar_t kSwitchID2 = '/';
                     53: 
                     54: static const wchar_t kSwitchMinus = '-';
                     55: static const wchar_t *kStopSwitchParsing = L"--";
                     56: 
                     57: static bool IsItSwitchChar(wchar_t c)
                     58: { 
                     59:   return (c == kSwitchID1 /*|| c == kSwitchID2 */); 
                     60: }
                     61: 
                     62: CParser::CParser(int numSwitches):
                     63:   _numSwitches(numSwitches)
                     64: {
                     65:   _switches = new CSwitchResult[_numSwitches];
                     66: }
                     67: 
                     68: CParser::~CParser()
                     69: {
                     70:   delete []_switches;
                     71: }
                     72: 
                     73: void CParser::ParseStrings(const CSwitchForm *switchForms, 
                     74:   const UStringVector &commandStrings)
                     75: {
                     76:   int numCommandStrings = commandStrings.Size();
                     77:   bool stopSwitch = false;
                     78:   for (int i = 0; i < numCommandStrings; i++)
                     79:   {
                     80:     const UString &s = commandStrings[i];
                     81:     if (stopSwitch)
                     82:       NonSwitchStrings.Add(s);
                     83:     else
                     84:       if (s == kStopSwitchParsing)
                     85:         stopSwitch = true;
                     86:       else
                     87:         if (!ParseString(s, switchForms))
                     88:           NonSwitchStrings.Add(s);
                     89:   }
                     90: }
                     91: 
                     92: // if string contains switch then function updates switch structures
                     93: // out: (string is a switch)
                     94: bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)
                     95: {
                     96:   int len = s.Length();
                     97:   if (len == 0) 
                     98:     return false;
                     99:   int pos = 0;
                    100:   if (!IsItSwitchChar(s[pos]))
                    101:     return false;
                    102:   while(pos < len)
                    103:   {
                    104:     if (IsItSwitchChar(s[pos]))
                    105:       pos++;
                    106:     const int kNoLen = -1;
                    107:     int matchedSwitchIndex = 0; // GCC Warning
                    108:     int maxLen = kNoLen;
                    109:     for(int switchIndex = 0; switchIndex < _numSwitches; switchIndex++)
                    110:     {
                    111:       int switchLen = MyStringLen(switchForms[switchIndex].IDString);
                    112:       if (switchLen <= maxLen || pos + switchLen > len) 
                    113:         continue;
                    114: 
                    115:       UString temp = s + pos;
                    116:       temp = temp.Left(switchLen);
                    117:       if(temp.CompareNoCase(switchForms[switchIndex].IDString) == 0)
                    118:       // if(_strnicmp(switchForms[switchIndex].IDString, LPCSTR(s) + pos, switchLen) == 0)
                    119:       {
                    120:         matchedSwitchIndex = switchIndex;
                    121:         maxLen = switchLen;
                    122:       }
                    123:     }
                    124:     if (maxLen == kNoLen)
                    125:       throw "maxLen == kNoLen";
                    126:     CSwitchResult &matchedSwitch = _switches[matchedSwitchIndex];
                    127:     const CSwitchForm &switchForm = switchForms[matchedSwitchIndex];
                    128:     if ((!switchForm.Multi) && matchedSwitch.ThereIs)
                    129:       throw "switch must be single";
                    130:     matchedSwitch.ThereIs = true;
                    131:     pos += maxLen;
                    132:     int tailSize = len - pos;
                    133:     NSwitchType::EEnum type = switchForm.Type;
                    134:     switch(type)
                    135:     {
                    136:       case NSwitchType::kPostMinus:
                    137:         {
                    138:           if (tailSize == 0)
                    139:             matchedSwitch.WithMinus = false;
                    140:           else
                    141:           {
                    142:             matchedSwitch.WithMinus = (s[pos] == kSwitchMinus);
                    143:             if (matchedSwitch.WithMinus)
                    144:               pos++;
                    145:           }
                    146:           break;
                    147:         }
                    148:       case NSwitchType::kPostChar:
                    149:         {
                    150:           if (tailSize < switchForm.MinLen)
                    151:             throw "switch is not full";
                    152:           UString set = switchForm.PostCharSet;
                    153:           const int kEmptyCharValue = -1;
                    154:           if (tailSize == 0)
                    155:             matchedSwitch.PostCharIndex = kEmptyCharValue;
                    156:           else
                    157:           {
                    158:             int index = set.Find(s[pos]);
                    159:             if (index < 0)
                    160:               matchedSwitch.PostCharIndex =  kEmptyCharValue;
                    161:             else
                    162:             {
                    163:               matchedSwitch.PostCharIndex = index;
                    164:               pos++;
                    165:             }
                    166:           }
                    167:           break;
                    168:         }
                    169:       case NSwitchType::kLimitedPostString: 
                    170:       case NSwitchType::kUnLimitedPostString: 
                    171:         {
                    172:           int minLen = switchForm.MinLen;
                    173:           if (tailSize < minLen)
                    174:             throw "switch is not full";
                    175:           if (type == NSwitchType::kUnLimitedPostString)
                    176:           {
                    177:             matchedSwitch.PostStrings.Add(s.Mid(pos));
                    178:             return true;
                    179:           }
                    180:           int maxLen = switchForm.MaxLen;
                    181:           UString stringSwitch = s.Mid(pos, minLen);
                    182:           pos += minLen;
                    183:           for(int i = minLen; i < maxLen && pos < len; i++, pos++)
                    184:           {
                    185:             wchar_t c = s[pos];
                    186:             if (IsItSwitchChar(c))
                    187:               break;
                    188:             stringSwitch += c;
                    189:           }
                    190:           matchedSwitch.PostStrings.Add(stringSwitch);
                    191:           break;
                    192:         }
                    193:       case NSwitchType::kSimple:
                    194:           break;
                    195:     }
                    196:   }
                    197:   return true;
                    198: }
                    199: 
                    200: const CSwitchResult& CParser::operator[](size_t index) const
                    201: {
                    202:   return _switches[index];
                    203: }
                    204: 
                    205: /////////////////////////////////
                    206: // Command parsing procedures
                    207: 
                    208: int ParseCommand(int numCommandForms, const CCommandForm *commandForms, 
                    209:     const UString &commandString, UString &postString)
                    210: {
                    211:   for(int i = 0; i < numCommandForms; i++)
                    212:   {
                    213:     const UString id = commandForms[i].IDString;
                    214:     if (commandForms[i].PostStringMode)
                    215:     {
                    216:       if(commandString.Find(id) == 0)
                    217:       {
                    218:         postString = commandString.Mid(id.Length());
                    219:         return i;
                    220:       }
                    221:     }
                    222:     else
                    223:       if (commandString == id)
                    224:       {
                    225:         postString.Empty();
                    226:         return i;
                    227:       }
                    228:   }
                    229:   return -1;
                    230: }
                    231:    
                    232: bool ParseSubCharsCommand(int numForms, const CCommandSubCharsSet *forms, 
                    233:     const UString &commandString, CIntVector &indices)
                    234: {
                    235:   indices.Clear();
                    236:   int numUsedChars = 0;
                    237:   for(int i = 0; i < numForms; i++)
                    238:   {
                    239:     const CCommandSubCharsSet &set = forms[i];
                    240:     int currentIndex = -1;
                    241:     int len = MyStringLen(set.Chars);
                    242:     for(int j = 0; j < len; j++)
                    243:     {
                    244:       wchar_t c = set.Chars[j];
                    245:       int newIndex = commandString.Find(c);
                    246:       if (newIndex >= 0)
                    247:       {
                    248:         if (currentIndex >= 0)
                    249:           return false;
                    250:         if (commandString.Find(c, newIndex + 1) >= 0)
                    251:           return false;
                    252:         currentIndex = j;
                    253:         numUsedChars++;
                    254:       }
                    255:     }
                    256:     if(currentIndex == -1 && !set.EmptyAllowed)
                    257:       return false;
                    258:     indices.Add(currentIndex);
                    259:   }
                    260:   return (numUsedChars == commandString.Length());
                    261: }
                    262: 
                    263: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>