ENH: add convenience function to convert Windows command line args into Unix argc/argv. Pulled and cleaned from PV/VV/VJ init code
This commit is contained in:
parent
c593bfc7d2
commit
a662af88de
|
@ -3138,6 +3138,109 @@ void SystemTools::Delay(unsigned int msec)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SystemTools::ConvertWindowsCommandLineToUnixArguments(
|
||||||
|
const char *cmd_line, int *argc, char ***argv)
|
||||||
|
{
|
||||||
|
if (!cmd_line || !argc || !argv)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A space delimites an argument except when it is inside a quote
|
||||||
|
|
||||||
|
(*argc) = 1;
|
||||||
|
|
||||||
|
size_t cmd_line_len = strlen(cmd_line);
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < cmd_line_len; i++)
|
||||||
|
{
|
||||||
|
while (isspace(cmd_line[i]) && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i < cmd_line_len)
|
||||||
|
{
|
||||||
|
if (cmd_line[i] == '\"')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
while (cmd_line[i] != '\"' && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
(*argc)++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (!isspace(cmd_line[i]) && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
(*argc)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(*argv) = new char* [(*argc) + 1];
|
||||||
|
(*argv)[(*argc)] = NULL;
|
||||||
|
|
||||||
|
// Set the first arg to be the exec name
|
||||||
|
|
||||||
|
(*argv)[0] = new char [1024];
|
||||||
|
#ifdef _WIN32
|
||||||
|
::GetModuleFileName(0, (*argv)[0], 1024);
|
||||||
|
#else
|
||||||
|
(*argv)[0][0] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Allocate the others
|
||||||
|
|
||||||
|
int j;
|
||||||
|
for (j = 1; j < (*argc); j++)
|
||||||
|
{
|
||||||
|
(*argv)[j] = new char [cmd_line_len + 10];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the args
|
||||||
|
|
||||||
|
size_t pos = 0;
|
||||||
|
int argc_idx = 1;
|
||||||
|
|
||||||
|
for (i = 0; i < cmd_line_len; i++)
|
||||||
|
{
|
||||||
|
while (isspace(cmd_line[i]) && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i < cmd_line_len)
|
||||||
|
{
|
||||||
|
if (cmd_line[i] == '\"')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
pos = i;
|
||||||
|
while (cmd_line[i] != '\"' && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
memcpy((*argv)[argc_idx], &cmd_line[pos], i - pos);
|
||||||
|
(*argv)[argc_idx][i - pos] = '\0';
|
||||||
|
argc_idx++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos = i;
|
||||||
|
while (!isspace(cmd_line[i]) && i < cmd_line_len)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
memcpy((*argv)[argc_idx], &cmd_line[pos], i - pos);
|
||||||
|
(*argv)[argc_idx][i - pos] = '\0';
|
||||||
|
argc_idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
|
kwsys_stl::string SystemTools::GetOperatingSystemNameAndVersion()
|
||||||
{
|
{
|
||||||
kwsys_stl::string res;
|
kwsys_stl::string res;
|
||||||
|
|
|
@ -410,6 +410,12 @@ public:
|
||||||
*/
|
*/
|
||||||
static bool IsSubDirectory(const char* fileOrDir, const char* dir);
|
static bool IsSubDirectory(const char* fileOrDir, const char* dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the path to a string that can be used in a unix makefile.
|
||||||
|
* double slashes are removed, and spaces are escaped.
|
||||||
|
*/
|
||||||
|
static kwsys_stl::string ConvertToUnixOutputPath(const char*);
|
||||||
|
|
||||||
/** -----------------------------------------------------------------
|
/** -----------------------------------------------------------------
|
||||||
* File Manipulation Routines
|
* File Manipulation Routines
|
||||||
* -----------------------------------------------------------------
|
* -----------------------------------------------------------------
|
||||||
|
@ -655,11 +661,14 @@ public:
|
||||||
static kwsys_stl::string GetOperatingSystemNameAndVersion();
|
static kwsys_stl::string GetOperatingSystemNameAndVersion();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the path to a string that can be used in a unix makefile.
|
* Convert windows-style arguments given as a command-line string
|
||||||
* double slashes are removed, and spaces are escaped.
|
* into more traditional argc/argv arguments.
|
||||||
|
* Note that argv[0] will be assigned the executable name using
|
||||||
|
* the ::GetModuleFileName function.
|
||||||
*/
|
*/
|
||||||
static kwsys_stl::string ConvertToUnixOutputPath(const char*);
|
static void ConvertWindowsCommandLineToUnixArguments(
|
||||||
|
const char *cmd_line, int *argc, char ***argv);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// these two functions can be called from ConvertToOutputPath
|
// these two functions can be called from ConvertToOutputPath
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue