blob: e0bb934f094c37fab166935862658c4b1d483555 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "stdafx.h"
HostConfigFlags HostConfigFlags::flags;
LPWSTR* HostConfigFlags::argsVal;
int HostConfigFlags::argsCount;
void(__stdcall *HostConfigFlags::pfnPrintUsage)();
template <>
void HostConfigFlags::Parse<bool>(ICmdLineArgsParser * parser, bool * value)
{
*value = parser->GetCurrentBoolean();
}
template <>
void HostConfigFlags::Parse<int>(ICmdLineArgsParser * parser, int* value)
{
try
{
*value = parser->GetCurrentInt();
}
catch (...)
{
// Don't do anything, *value will remain its default value.
}
}
template <>
void HostConfigFlags::Parse<BSTR>(ICmdLineArgsParser * parser, BSTR * bstr)
{
if (*bstr != NULL)
{
SysFreeString(*bstr);
}
*bstr = parser->GetCurrentString();
if (*bstr == NULL)
{
*bstr = SysAllocString(_u(""));
}
}
HostConfigFlags::HostConfigFlags() :
#define FLAG(Type, Name, Desc, Default) \
Name##IsEnabled(false), \
Name(Default),
#include "HostConfigFlagsList.h"
nDummy(0)
{
}
bool HostConfigFlags::ParseFlag(LPCWSTR flagsString, ICmdLineArgsParser * parser)
{
#define FLAG(Type, Name, Desc, Default) \
if (_wcsicmp(_u(#Name), flagsString) == 0) \
{ \
this->Name##IsEnabled = true; \
Parse<Type>(parser, &this->Name); \
return true; \
}
#include "HostConfigFlagsList.h"
return false;
}
void HostConfigFlags::PrintUsageString()
{
#define FLAG(Type, Name, Desc, Default) \
wprintf(_u("%20ls \t%ls\n"), _u(#Name), _u(#Desc));
#include "HostConfigFlagsList.h"
}
void HostConfigFlags::PrintUsage()
{
if (pfnPrintUsage)
{
pfnPrintUsage();
}
wprintf(_u("\nHost Config Flags: \n\n"));
HostConfigFlags::PrintUsageString();
ChakraRTInterface::PrintConfigFlagsUsageString();
}
int HostConfigFlags::FindArg(int argc, _In_reads_(argc) PWSTR argv[], PCWSTR targetArg, size_t targetArgLen)
{
return FindArg(argc, argv, [=](PCWSTR arg) -> bool
{
return _wcsnicmp(arg, targetArg, targetArgLen) == 0;
});
}
void HostConfigFlags::RemoveArg(int& argc, _Inout_updates_to_(argc, argc) LPWSTR argv[], int index)
{
Assert(index >= 0 && index < argc);
for (int i = index + 1; i < argc; ++i)
{
argv[i - 1] = argv[i];
}
--argc;
}
void HostConfigFlags::HandleArgsFlag(int& argc, _Inout_updates_to_(argc, argc) LPWSTR argv[])
{
const LPCWSTR argsFlag = _u("-args");
const LPCWSTR endArgsFlag = _u("-endargs");
int argsFlagLen = static_cast<int>(wcslen(argsFlag));
int i;
for (i = 1; i < argc; i++)
{
if (_wcsnicmp(argv[i], argsFlag, argsFlagLen) == 0)
{
break;
}
}
int argsStart = ++i;
for (; i < argc; i++)
{
if (_wcsnicmp(argv[i], endArgsFlag, argsFlagLen) == 0)
{
break;
}
}
int argsEnd = i;
int argsCount = argsEnd - argsStart;
if (argsCount == 0)
{
return;
}
HostConfigFlags::argsVal = new LPWSTR[argsCount];
HostConfigFlags::argsCount = argsCount;
int argIndex = argsStart;
for (i = 0; i < argsCount; i++)
{
HostConfigFlags::argsVal[i] = argv[argIndex++];
}
argIndex = argsStart - 1;
for (i = argsEnd + 1; i < argc; i++)
{
LPWSTR temp = argv[argIndex];
argv[argIndex] = argv[i];
argv[i] = temp;
argIndex++;
}
Assert(argIndex == argc - argsCount - 1 - (argsEnd < argc));
argc = argIndex;
}