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>