public CommandLine(String[] aArgs, String[] aValidOpts) { int i, iArg, iOpt; // Keep a list of valid option names. m_sValidOptions = new Abbrevs(aValidOpts); // Temporary lists of raw arguments and options and their // associated values. String[] aArgList = new String[aArgs.Length]; Option[] aOptList = new Option[aArgs.Length]; // Reset counters of raw arguments and option/value pairs found // so far. iArg = 0; iOpt = 0; // Iterate through words of command line. for (i = 0; i < aArgs.Length; i++) { // Check for option or raw argument. if (aArgs[i].StartsWith("/") || aArgs[i].StartsWith("-")) { String strOpt; String strVal = null; bool bRequiresValue; bool bCanHaveValue; // It's an option. Strip leading '/' or '-' and // anything after a value separator (':' or // '='). int iColon = aArgs[i].IndexOfAny(new char[] { ':', '=' }); if (iColon == -1) { strOpt = aArgs[i].Substring(1); } else { strOpt = aArgs[i].Substring(1, iColon - 1); } // Look it up in the table of valid options (to // check it exists, get the full option name and // to see if an associated value is expected). strOpt = m_sValidOptions.Lookup(strOpt, out bRequiresValue, out bCanHaveValue); // Check that the user hasn't specified a value separator for an option // that doesn't take a value. if (!bCanHaveValue && (iColon != -1)) { throw new TlbImpGeneralException(Resource.FormatString("Err_NoValueRequired", strOpt), ErrorCode.Err_NoValueRequired, true); } // Check that the user has put a colon if the option requires a value. if (bRequiresValue && (iColon == -1)) { throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); } // Go look for a value if there is one. if (bCanHaveValue && iColon != -1) { if (iColon == (aArgs[i].Length - 1)) { // No value separator, or // separator is at end of // option; look for value in // next command line arg. if (i + 1 == aArgs.Length) { throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); } else { if ((aArgs[i + 1].StartsWith("/") || aArgs[i + 1].StartsWith("-"))) { throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); } strVal = aArgs[i + 1]; i++; } } else { // Value is in same command line // arg as the option, substring // it out. strVal = aArgs[i].Substring(iColon + 1); } } // Build the option value pair. aOptList[iOpt++] = new Option(strOpt, strVal); } else { // Command line word is a raw argument. aArgList[iArg++] = aArgs[i]; } } // Allocate the non-temporary arg and option lists at exactly // the right size. m_aArgList = new String[iArg]; m_aOptList = new Option[iOpt]; // Copy in the values we've calculated. Array.Copy(aArgList, m_aArgList, iArg); Array.Copy(aOptList, m_aOptList, iOpt); // Reset enumeration cursors to start of lists. m_iArgCursor = 0; m_iOptCursor = 0; }
public CommandLine(String[] aArgs, String[] aValidOpts) { // Keep a list of valid option names. m_sValidOptions = new Abbrevs(aValidOpts); // Temporary lists of raw arguments and options and their // associated values. var aArgList = new String[aArgs.Length]; var aOptList = new Option[aArgs.Length]; // Reset counters of raw arguments and option/value pairs found // so far. int iArg = 0; int iOpt = 0; // Iterate through words of command line. for (int i = 0; i < aArgs.Length; i++) { // Check for option or raw argument. if (aArgs[i].StartsWith("/") || aArgs[i].StartsWith("-")) { // It's an option. Strip leading '/' or '-' and // anything after a value separator (':' or // '='). int iColon = aArgs[i].IndexOfAny(new char[] {':', '='}); String strOpt; if (iColon == -1) strOpt = aArgs[i].Substring(1); else strOpt = aArgs[i].Substring(1, iColon - 1); // Look it up in the table of valid options (to // check it exists, get the full option name and // to see if an associated value is expected). bool bRequiresValue; bool bCanHaveValue; strOpt = m_sValidOptions.Lookup(strOpt, out bRequiresValue, out bCanHaveValue); // Check that the user hasn't specified a value separator for an option // that doesn't take a value. if (!bCanHaveValue && (iColon != -1)) throw new TlbImpGeneralException(Resource.FormatString("Err_NoValueRequired", strOpt), ErrorCode.Err_NoValueRequired, true); // Check that the user has put a colon if the option requires a value. if (bRequiresValue && (iColon == -1)) throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); String strVal = null; // Go look for a value if there is one. if (bCanHaveValue && iColon != -1) { if (iColon == (aArgs[i].Length - 1)) { // No value separator, or // separator is at end of // option; look for value in // next command line arg. if (i + 1 == aArgs.Length) { throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); } else { if ((aArgs[i + 1].StartsWith( "/" ) || aArgs[i + 1].StartsWith( "-" ))) throw new TlbImpGeneralException(Resource.FormatString("Err_ValueRequired", strOpt), ErrorCode.Err_ValueRequired, true); strVal = aArgs[i+1]; i++; } } else { // Value is in same command line // arg as the option, substring // it out. strVal = aArgs[i].Substring(iColon + 1); } } // Build the option value pair. aOptList[iOpt++] = new Option(strOpt, strVal); } else { // Command line word is a raw argument. aArgList[iArg++] = aArgs[i]; } } // Allocate the non-temporary arg and option lists at exactly // the right size. m_aArgList = new String[iArg]; m_aOptList = new Option[iOpt]; // Copy in the values we've calculated. Array.Copy(aArgList, m_aArgList, iArg); Array.Copy(aOptList, m_aOptList, iOpt); // Reset enumeration cursors to start of lists. m_iArgCursor = 0; m_iOptCursor = 0; }