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