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
|
||||
}
|
||||
|
||||
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 res;
|
||||
|
|
|
@ -410,6 +410,12 @@ public:
|
|||
*/
|
||||
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
|
||||
* -----------------------------------------------------------------
|
||||
|
@ -655,11 +661,14 @@ public:
|
|||
static kwsys_stl::string GetOperatingSystemNameAndVersion();
|
||||
|
||||
/**
|
||||
* Convert the path to a string that can be used in a unix makefile.
|
||||
* double slashes are removed, and spaces are escaped.
|
||||
* Convert windows-style arguments given as a command-line string
|
||||
* 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:
|
||||
// these two functions can be called from ConvertToOutputPath
|
||||
|
||||
|
|
Loading…
Reference in New Issue