122 lines
3.2 KiB
C++
122 lines
3.2 KiB
C++
#include "normPostProcess.h"
|
|
#include "protoDebug.h"
|
|
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
NormPostProcessor::NormPostProcessor()
|
|
: process_argv(NULL), process_argc(0)
|
|
{
|
|
|
|
}
|
|
|
|
NormPostProcessor::~NormPostProcessor()
|
|
{
|
|
SetCommand(NULL);
|
|
}
|
|
|
|
void NormPostProcessor::GetCommand(char* buffer, unsigned int buflen)
|
|
{
|
|
if (process_argv && buffer)
|
|
{
|
|
|
|
unsigned int i = 0;
|
|
while (buflen && (i < process_argc))
|
|
{
|
|
strncpy(buffer, process_argv[i], buflen);
|
|
unsigned int len = strlen(process_argv[i]);
|
|
if (len < buflen)
|
|
{
|
|
buflen -= len;
|
|
buffer += len;
|
|
}
|
|
else
|
|
{
|
|
buflen = 0;
|
|
break;
|
|
}
|
|
i++;
|
|
if (i < process_argc)
|
|
{
|
|
*buffer++= ' ';
|
|
buflen--;
|
|
}
|
|
}
|
|
}
|
|
else if (buflen && buffer)
|
|
{
|
|
if (buflen < 4)
|
|
buffer[0] = '\0';
|
|
else
|
|
strncpy(buffer, "none", 4);
|
|
if (buflen > 4) buffer[4] = '\0';
|
|
}
|
|
} // end NormPostProcessor::GetCommand()
|
|
|
|
bool NormPostProcessor::SetCommand(const char* cmd)
|
|
{
|
|
// 1) Delete old command resources
|
|
if (process_argv)
|
|
{
|
|
char** arg = process_argv;
|
|
while (*arg)
|
|
{
|
|
delete *arg;
|
|
arg++;
|
|
}
|
|
delete process_argv;
|
|
process_argv = NULL;
|
|
process_argc = 0;
|
|
}
|
|
|
|
// 2) Count the number of tokens
|
|
if (!cmd) return true; // post processing disabled
|
|
if (!strcmp(cmd, "none")) return SetCommand(NULL);
|
|
const char* ptr = cmd;
|
|
unsigned int argCount = 0;
|
|
while (isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
while ('\0' != *ptr)
|
|
{
|
|
argCount++;
|
|
while (!isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
while (isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
}
|
|
if (!argCount) return true; // post processing disabled
|
|
|
|
// 3) Allocate new process_argv array (2 extra slots, one for "target",
|
|
// and one for terminating NULL pointer.
|
|
if (!(process_argv = new char*[argCount+2]))
|
|
{
|
|
DMSG(0, "NormPostProcessor::SetCommand new(process_argv) error: %s\n",
|
|
strerror(errno));
|
|
return false;
|
|
}
|
|
memset((void*)process_argv, 0, (argCount+2)*sizeof(char**));
|
|
process_argc = argCount;
|
|
|
|
// 4) Fill in process_argv[] array with individual args
|
|
ptr = cmd;
|
|
while (isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
unsigned int index = 0;
|
|
while ('\0' != *ptr)
|
|
{
|
|
const char* argStart = ptr;
|
|
while (!isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
unsigned int argLength = ptr - argStart;
|
|
char* arg;
|
|
if (!(arg = new char[argLength+1]))
|
|
{
|
|
SetCommand(NULL);
|
|
DMSG(0, "NormPostProcessor::SetCommand new(process_arg) error: %s\n",
|
|
strerror(errno));
|
|
return false;
|
|
}
|
|
strncpy(arg, argStart, argLength);
|
|
arg[argLength] = '\0';
|
|
process_argv[index++] = arg;
|
|
while (isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
|
}
|
|
return true;
|
|
} // end NormPostProcessor::SetCommand()
|