| OLD | NEW |
| (Empty) |
| 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 for (;;) | |
| 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 break; | |
| 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, switc
hLen) == 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 } | |
| OLD | NEW |