- use Tcl library for splitting and merging argument lists
This commit is contained in:
116
splitter.c
116
splitter.c
@ -373,106 +373,36 @@ int isNumeric(char *pText)
|
||||
char *Arg2Tcl0(int argc, char *argv[], char *buffer, int buffersize,
|
||||
char *prepend)
|
||||
{
|
||||
int i, l, firstArgToQuote, quote, prependlen;
|
||||
char ch;
|
||||
char *res, *arg;
|
||||
int l;
|
||||
char *res, *args, *fr;
|
||||
|
||||
args = Tcl_Merge(argc, (const char **)argv);
|
||||
if (args == NULL)
|
||||
return NULL;
|
||||
fr = args;
|
||||
l = strlen(args);
|
||||
if (prepend) {
|
||||
prependlen = strlen(prepend);
|
||||
l = prependlen + 1;
|
||||
} else {
|
||||
prependlen = 0;
|
||||
l = 0;
|
||||
}
|
||||
firstArgToQuote = argc;
|
||||
quote = 0;
|
||||
for (i = 0; i < argc; i++) {
|
||||
arg = argv[i];
|
||||
if (arg == NULL)
|
||||
return NULL;
|
||||
ch = *arg++;
|
||||
if (ch == '\0')
|
||||
quote = 1;
|
||||
while (ch != '\0') {
|
||||
switch (ch) {
|
||||
case '\\':
|
||||
l += 2;
|
||||
quote = 1;
|
||||
break;
|
||||
case '"':
|
||||
l += 2;
|
||||
quote = 1;
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\v':
|
||||
case '\f':
|
||||
case '\r':
|
||||
case '\n':
|
||||
l++;
|
||||
quote = 1;
|
||||
break;
|
||||
default:
|
||||
l++;
|
||||
break;
|
||||
}
|
||||
ch = *arg++;
|
||||
}
|
||||
if (quote == 0) {
|
||||
firstArgToQuote = i + 1;
|
||||
l += 1;
|
||||
l += strlen(prepend) + 1;
|
||||
if (l >= buffersize) {
|
||||
res = calloc(l, 1);
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
} else {
|
||||
l += 3;
|
||||
res = buffer;
|
||||
}
|
||||
}
|
||||
if (l > buffersize) {
|
||||
buffer = calloc(l, 1);
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
}
|
||||
res = buffer;
|
||||
if (prepend) {
|
||||
strcpy(res, prepend);
|
||||
res += prependlen;
|
||||
*res++ = ' ';
|
||||
}
|
||||
for (i = 0; i < argc; i++) {
|
||||
if (i >= firstArgToQuote)
|
||||
*res++ = '"';
|
||||
arg = argv[i];
|
||||
ch = *arg++;
|
||||
while (ch != '\0') {
|
||||
switch (ch) {
|
||||
case '"':
|
||||
*res++ = '\\';
|
||||
*res++ = '"';
|
||||
break;
|
||||
case '\\':
|
||||
*res++ = '\\';
|
||||
*res++ = '\\';
|
||||
break;
|
||||
case '\r':
|
||||
*res++ = '\\';
|
||||
*res++ = 'r';
|
||||
break;
|
||||
case '\n':
|
||||
*res++ = '\\';
|
||||
*res++ = 'n';
|
||||
break;
|
||||
default:
|
||||
*res++ = ch;
|
||||
break;
|
||||
}
|
||||
ch = *arg++;
|
||||
strcat(res, " ");
|
||||
strcat(res, args);
|
||||
} else {
|
||||
if (l >= buffersize) {
|
||||
res = strdup(args);
|
||||
} else {
|
||||
res = buffer;
|
||||
strcpy(res, args);
|
||||
}
|
||||
if (i >= firstArgToQuote)
|
||||
*res++ = '"';
|
||||
*res++ = ' ';
|
||||
}
|
||||
if (res > buffer)
|
||||
res--; /* remove trailing space */
|
||||
*res = '\0';
|
||||
return buffer;
|
||||
Tcl_Free(fr);
|
||||
return res;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
Reference in New Issue
Block a user