Annotation of elwix/tools/oldlzma/SRC/Common/CommandLineParser.cpp, revision 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>