int main()

in BusTools/SpiTestTool/main.cpp [316:418]


int main (Platform::Array<Platform::String^>^ args)
{
    String^ friendlyName;
    int chipSelectLine = 0;
    SpiMode mode = SpiMode(-1);
    int dataBitLength = 0;
    int clockFrequency = 0;

    for (unsigned int optind = 1; optind < args->Length; optind += 2) {
        PCWSTR arg1 = args->get(optind)->Data();
        if (!_wcsicmp(arg1, L"-h") || !_wcsicmp(arg1, L"/h") ||
            !_wcsicmp(arg1, L"-?") || !_wcsicmp(arg1, L"/?")) {

            PrintUsage(args->get(0)->Data());
            return 0;
        }

        if (!_wcsicmp(arg1, L"-l") || !_wcsicmp(arg1, L"-list")) {
            ListSpiControllers();
            return 0;
        }

        if (arg1[0] != L'-') {
            std::wcerr << L"Unexpected positional parameter: " << arg1 << L"\n";
            return 1;
        }

        if (args->get(optind)->Length() != 2) {
            std::wcerr << L"Invalid option format: " << arg1 << L"\n";
            return 1;
        }

        if ((optind + 1) >= args->Length) {
            std::wcerr << L"Missing required parameter for option: " << arg1 << L"\n";
            return 1;
        }
        PCWSTR arg2 = args->get(optind + 1)->Data();

        wchar_t *endptr;
        switch (towlower(arg1[1])) {
        case L'n':
            friendlyName = args->get(optind + 1);
            break;
        case L'c':
            chipSelectLine = static_cast<int>(
                wcstoul(arg2, &endptr, 0));
            break;
        case L'm':
        {
            unsigned long modeUlong = wcstoul(arg2, &endptr, 0);
            if ((modeUlong < 0) || (modeUlong > 3)) {
                std::wcerr << L"Invalid mode value: " << modeUlong <<
                    L". Mode must be in the range [0, 3]\n";
                return 1;
            }
            mode = static_cast<SpiMode>(modeUlong);
            static_assert(int(SpiMode::Mode0) == 0, "Verifying SpiMode::Mode0 is 0");
            static_assert(int(SpiMode::Mode1) == 1, "Verifying SpiMode::Mode1 is 1");
            static_assert(int(SpiMode::Mode2) == 2, "Verifying SpiMode::Mode2 is 2");
            static_assert(int(SpiMode::Mode3) == 3, "Verifying SpiMode::Mode3 is 3");

            break;
        }
        case L'd':
            dataBitLength = static_cast<int>(wcstoul(arg2, &endptr, 0));
            if (dataBitLength == 0) {
                std::wcerr << L"Invalid data bit length\n";
                return 1;
            }
            break;
        case L'f':
            clockFrequency = static_cast<int>(wcstoul(arg2, &endptr, 0));
            if (clockFrequency == 0) {
                std::wcerr << L"Invalid clock frequency\n";
                return 1;
            }
            break;
        default:
            std::wcerr << L"Unrecognized option: " << arg1 << L"\n";
            return 1;
        }
    }

    try {
        auto device = MakeDevice(
            friendlyName,
            chipSelectLine,
            mode,
            dataBitLength,
            clockFrequency);

        std::wcout << L"  Type 'help' for a list of commands\n";
        ShowPrompt(device);
    } catch (const wexception& ex) {
        std::wcerr << L"Error: " << ex.wwhat() << L"\n";
        return 1;
    } catch (Platform::Exception^ ex) {
        std::wcerr << L"Error: " << ex->Message->Data() << L"\n";
        return 1;
    }

    return 0;
}