1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// CommandLineParser.cs
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing System;
4baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing System.Collections;
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
6baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace SevenZip.CommandLineParser
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	public enum SwitchType
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		Simple,
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		PostMinus,
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		LimitedPostString,
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		UnLimitedPostString,
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		PostChar
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	public class SwitchForm
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public string IDString;
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchType Type;
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public bool Multi;
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public int MinLen;
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public int MaxLen;
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public string PostCharSet;
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchForm(string idString, SwitchType type, bool multi,
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			int minLen, int maxLen, string postCharSet)
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			IDString = idString;
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			Type = type;
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			Multi = multi;
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			MinLen = minLen;
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			MaxLen = maxLen;
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			PostCharSet = postCharSet;
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchForm(string idString, SwitchType type, bool multi, int minLen):
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			this(idString, type, multi, minLen, 0, "")
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchForm(string idString, SwitchType type, bool multi):
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			this(idString, type, multi, 0)
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	public class SwitchResult
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public bool ThereIs;
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public bool WithMinus;
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public ArrayList PostStrings = new ArrayList();
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public int PostCharIndex;
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchResult()
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			ThereIs = false;
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	public class Parser
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public ArrayList NonSwitchStrings = new ArrayList();
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		SwitchResult[] _switches;
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public Parser(int numSwitches)
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			_switches = new SwitchResult[numSwitches];
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			for (int i = 0; i < numSwitches; i++)
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				_switches[i] = new SwitchResult();
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		bool ParseString(string srcString, SwitchForm[] switchForms)
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			int len = srcString.Length;
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			if (len == 0)
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				return false;
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			int pos = 0;
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			if (!IsItSwitchChar(srcString[pos]))
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				return false;
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			while (pos < len)
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			{
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if (IsItSwitchChar(srcString[pos]))
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					pos++;
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				const int kNoLen = -1;
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				int matchedSwitchIndex = 0;
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				int maxLen = kNoLen;
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				for (int switchIndex = 0; switchIndex < _switches.Length; switchIndex++)
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				{
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					int switchLen = switchForms[switchIndex].IDString.Length;
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (switchLen <= maxLen || pos + switchLen > len)
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						continue;
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (String.Compare(switchForms[switchIndex].IDString, 0,
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							srcString, pos, switchLen, true) == 0)
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					{
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						matchedSwitchIndex = switchIndex;
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						maxLen = switchLen;
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					}
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				}
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if (maxLen == kNoLen)
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					throw new Exception("maxLen == kNoLen");
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				SwitchResult matchedSwitch = _switches[matchedSwitchIndex];
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				SwitchForm switchForm = switchForms[matchedSwitchIndex];
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if ((!switchForm.Multi) && matchedSwitch.ThereIs)
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					throw new Exception("switch must be single");
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				matchedSwitch.ThereIs = true;
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				pos += maxLen;
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				int tailSize = len - pos;
106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				SwitchType type = switchForm.Type;
107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				switch (type)
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				{
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					case SwitchType.PostMinus:
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						{
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							if (tailSize == 0)
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								matchedSwitch.WithMinus = false;
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							else
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							{
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								matchedSwitch.WithMinus = (srcString[pos] == kSwitchMinus);
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								if (matchedSwitch.WithMinus)
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync									pos++;
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							}
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							break;
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						}
121baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					case SwitchType.PostChar:
122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						{
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							if (tailSize < switchForm.MinLen)
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								throw new Exception("switch is not full");
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							string charSet = switchForm.PostCharSet;
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							const int kEmptyCharValue = -1;
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							if (tailSize == 0)
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								matchedSwitch.PostCharIndex = kEmptyCharValue;
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							else
130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							{
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								int index = charSet.IndexOf(srcString[pos]);
132baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								if (index < 0)
133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync									matchedSwitch.PostCharIndex = kEmptyCharValue;
134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								else
135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								{
136baa3858d3f5d128a5c8466b700098109edcad5f2repo sync									matchedSwitch.PostCharIndex = index;
137baa3858d3f5d128a5c8466b700098109edcad5f2repo sync									pos++;
138baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								}
139baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							}
140baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							break;
141baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						}
142baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					case SwitchType.LimitedPostString:
143baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					case SwitchType.UnLimitedPostString:
144baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						{
145baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							int minLen = switchForm.MinLen;
146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							if (tailSize < minLen)
147baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								throw new Exception("switch is not full");
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							if (type == SwitchType.UnLimitedPostString)
149baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							{
150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								matchedSwitch.PostStrings.Add(srcString.Substring(pos));
151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								return true;
152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							}
153baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							String stringSwitch = srcString.Substring(pos, minLen);
154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							pos += minLen;
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							for (int i = minLen; i < switchForm.MaxLen && pos < len; i++, pos++)
156baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							{
157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								char c = srcString[pos];
158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								if (IsItSwitchChar(c))
159baa3858d3f5d128a5c8466b700098109edcad5f2repo sync									break;
160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync								stringSwitch += c;
161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							}
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							matchedSwitch.PostStrings.Add(stringSwitch);
163baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							break;
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						}
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				}
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			}
167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			return true;
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public void ParseStrings(SwitchForm[] switchForms, string[] commandStrings)
172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			int numCommandStrings = commandStrings.Length;
174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			bool stopSwitch = false;
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			for (int i = 0; i < numCommandStrings; i++)
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			{
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				string s = commandStrings[i];
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if (stopSwitch)
179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					NonSwitchStrings.Add(s);
180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				else
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (s == kStopSwitchParsing)
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					stopSwitch = true;
183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				else
184baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (!ParseString(s, switchForms))
185baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					NonSwitchStrings.Add(s);
186baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			}
187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public SwitchResult this[int index] { get { return _switches[index]; } }
190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
191baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public static int ParseCommand(CommandForm[] commandForms, string commandString,
192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			out string postString)
193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
194baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			for (int i = 0; i < commandForms.Length; i++)
195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			{
196baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				string id = commandForms[i].IDString;
197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if (commandForms[i].PostStringMode)
198baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				{
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (commandString.IndexOf(id) == 0)
200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					{
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						postString = commandString.Substring(id.Length);
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						return i;
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					}
204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				}
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				else
206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (commandString == id)
207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				{
208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					postString = "";
209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					return i;
210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				}
211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			}
212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			postString = "";
213baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			return -1;
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		static bool ParseSubCharsCommand(int numForms, CommandSubCharsSet[] forms,
217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			string commandString, ArrayList indices)
218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			indices.Clear();
220baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			int numUsedChars = 0;
221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			for (int i = 0; i < numForms; i++)
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			{
223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				CommandSubCharsSet charsSet = forms[i];
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				int currentIndex = -1;
225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				int len = charsSet.Chars.Length;
226baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				for (int j = 0; j < len; j++)
227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				{
228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					char c = charsSet.Chars[j];
229baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					int newIndex = commandString.IndexOf(c);
230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					if (newIndex >= 0)
231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					{
232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						if (currentIndex >= 0)
233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							return false;
234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						if (commandString.IndexOf(c, newIndex + 1) >= 0)
235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync							return false;
236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						currentIndex = j;
237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync						numUsedChars++;
238baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					}
239baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				}
240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				if (currentIndex == -1 && !charsSet.EmptyAllowed)
241baa3858d3f5d128a5c8466b700098109edcad5f2repo sync					return false;
242baa3858d3f5d128a5c8466b700098109edcad5f2repo sync				indices.Add(currentIndex);
243baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			}
244baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			return (numUsedChars == commandString.Length);
245baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
246baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		const char kSwitchID1 = '-';
247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		const char kSwitchID2 = '/';
248baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
249baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		const char kSwitchMinus = '-';
250baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		const string kStopSwitchParsing = "--";
251baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
252baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		static bool IsItSwitchChar(char c)
253baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
254baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			return (c == kSwitchID1 || c == kSwitchID2);
255baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
256baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
257baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
258baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	public class CommandForm
259baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
260baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public string IDString = "";
261baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public bool PostStringMode = false;
262baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public CommandForm(string idString, bool postStringMode)
263baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		{
264baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			IDString = idString;
265baa3858d3f5d128a5c8466b700098109edcad5f2repo sync			PostStringMode = postStringMode;
266baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		}
267baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
268baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
269baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	class CommandSubCharsSet
270baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	{
271baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public string Chars = "";
272baa3858d3f5d128a5c8466b700098109edcad5f2repo sync		public bool EmptyAllowed = false;
273baa3858d3f5d128a5c8466b700098109edcad5f2repo sync	}
274baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
275