- use Tcl library for splitting and merging argument lists

This commit is contained in:
zolliker
2011-08-29 14:41:23 +00:00
parent 1e23f3c7b4
commit 56523419b2
5 changed files with 85 additions and 125 deletions

View File

@ -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;
}
/*--------------------------------------------------------------------------*/