/*** Copyright (C) 2022-2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuCmdLine.cpp Date: 2022-1-31 Author: Reece ***/ #include #include "AuCmdLine.hpp" #include "AuCmdLinePlatform.hpp" namespace Aurora::CmdLine { static const AuString kEmptyString; static AuList gCmdFlags; static AuList gCmdValues; static AuHashMap gCmdValueMap; static AuHashMap> gCmdValueArrayMap; static AuHashMap gCmdFlagLookup; static AuList gCmdLineString; AUKN_SYM const AuList &GetCommandLineArguments() { return gCmdLineString; } AUKN_SYM bool HasFlag(const AuString &key) { return gCmdFlagLookup.find(key) != gCmdFlagLookup.end(); } AUKN_SYM bool HasValue(const AuString &key) { return gCmdValueArrayMap.find(key) != gCmdValueArrayMap.end() || gCmdValueMap.find(key) != gCmdValueMap.end(); } AUKN_SYM const AuString &GetValue(const AuString &key, const AuString &defaultValue) { auto itr = gCmdValueMap.find(key); if (itr == gCmdValueMap.end()) { return defaultValue; } else { return itr->second; } } AUKN_SYM AuOptional GetValue(const AuString &key) { auto itr = gCmdValueMap.find(key); if (itr == gCmdValueMap.end()) { return AuOptional {}; } return itr->second; } AUKN_SYM const AuList &GetValues(const AuString &key) { static AuList kMissing; auto itr = gCmdValueArrayMap.find(key); if (itr != gCmdValueArrayMap.end()) { return itr->second; } return kMissing; } AUKN_SYM const AuList &GetFlags() { return gCmdFlags; } AUKN_SYM const AuList &GetValues() { return gCmdValues; } static void ProcessArgs() { AuString extendedLine; AuString key; //for (const auto &arg : gCmdLineString) for (int i = 0; i < gCmdLineString.size(); i++) { const auto &arg = gCmdLineString[i]; #if defined(AURORA_PLATFORM_WIN32) if (arg[arg.size() - 1] == '\\' && (arg.size() > 1)) { extendedLine += arg.substr(0, arg.size() - 1); if (arg[arg.size() - 2] != '\\') { extendedLine += ' '; continue; } } else #endif { extendedLine += arg; } auto doesStartWithSwitch = [](auto &in) { return (in[0] == '/') || (in.find("--") == 0); }; auto containsAssign = [](auto &in) { return (in.find("=") != AuString::npos); }; auto valueAssignment = extendedLine.find('='); if (valueAssignment == extendedLine.npos) { if (doesStartWithSwitch(extendedLine)) { if (i != gCmdLineString.size() - 1) { const auto &next = gCmdLineString[i + 1]; if (!doesStartWithSwitch(next) && !containsAssign(next)) { extendedLine += '='; continue; } } extendedLine = extendedLine.substr(1 + (extendedLine[0] != '/')); } gCmdFlags.push_back(extendedLine); gCmdFlagLookup[extendedLine] = true; } else { key = extendedLine.substr(0, valueAssignment); extendedLine = extendedLine.substr(valueAssignment + 1); if (doesStartWithSwitch(key)) { key = key.substr(1 + (key[0] != '/')); } gCmdValues.push_back(key); { auto itr = gCmdValueMap.find(key); if (itr != gCmdValueMap.end()) { auto val = (*itr).second; gCmdValueMap.erase(itr); auto &arry = gCmdValueArrayMap[key]; arry.push_back(val); arry.push_back(extendedLine); } else { gCmdValueMap[key] = extendedLine; } } } extendedLine.clear(); } } void Init() { gCmdLineString = GetCmdString(); if (gCmdLineString.size()) { gCmdLineString.erase(gCmdLineString.begin()); } ProcessArgs(); } void Deinit() { gCmdFlags.clear(); gCmdValues.clear(); gCmdValueMap.clear(); gCmdFlagLookup.clear(); gCmdLineString.clear(); } }