- Introducted Arg2Tcl as a replacement for some calls to Arg2Text

- Fixed a memory leak
This commit is contained in:
zolliker
2006-04-11 07:26:55 +00:00
parent e25fb68080
commit da3dfd9d76
11 changed files with 184 additions and 92 deletions

View File

@ -11,6 +11,7 @@
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "tcl.h"
#include "splitter.h"
typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
@ -116,7 +117,7 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
char pBueffel[132];
char *pChar;
CharType eWhat;
int i;
int i, n;
if(!pLine)return NULL;
@ -142,9 +143,14 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
pChar++;
while( (isEnd(*pChar) != 2) && (CheckSpecial(pChar) != eQuote))
{
pBueffel[i] = *pChar;
if (*pChar == '\\') {
pBueffel[i] = Tcl_Backslash(pChar, &n);
pChar += n;
} else {
pBueffel[i] = *pChar;
pChar++;
}
i++;
pChar++;
}
pBueffel[i] = '\0';
pChar++;
@ -226,17 +232,14 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
/* loop through arguments */
for( i = 0; i < argc; i++)
{
/* figure out what we have */
for(ii = 0; ii < strlen(argv[i]); ii++)
{
eWhat = CheckSpecial(argv[i]);
/* skip whitespace */
if(eWhat == eSpace)
/* figure out what we have */
for(ii = 0; ii < strlen(argv[i]); ii++)
{
continue;
}
eWhat = CheckSpecial(argv[i]);
/* skip whitespace */
if(eWhat != eSpace) break;
}
/* Create Token */
if(pList == NULL)
{
@ -253,13 +256,6 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
/* copy text always */
pCurrent->text = strdup(argv[i]);
/* text */
if(eWhat == eeText)
{
pCurrent->Type = eText;
break;
}
/* numbers */
if(eWhat == eNum)
{
@ -275,9 +271,11 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
pCurrent->Type = eFloat;
sscanf(argv[i],"%f",&(pCurrent->fVal));
}
break;
}
}
else
{ /* all else is text */
pCurrent->Type = eText;
}
}
return pList;
}
@ -401,6 +399,71 @@ typedef enum _CharType {eSpace, eNum,eeText,eQuote} CharType;
}
return 1;
}
/*--------------------------------------------------------------------------*/
char *Arg2Tcl(int argc, char *argv[], char *buffer, int buffersize) {
int i, l, firstArgToQuote, quote;
char ch;
char *res, *arg;
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;
} else {
l += 3;
}
}
if (l > buffersize) {
buffer = calloc(l,1);
if (buffer == NULL) return NULL;
}
res = buffer;
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++;
}
if (i >= firstArgToQuote) *res++ = '"';
*res++ = ' ';
}
if (res > buffer) res--; /* remove trailing space */
*res='\0';
return buffer;
}
/*============================================================================
Testprogram, can be activated by defining MAIN