- Introducted Arg2Tcl as a replacement for some calls to Arg2Text
- Fixed a memory leak
This commit is contained in:
105
splitter.c
105
splitter.c
@ -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
|
||||
|
Reference in New Issue
Block a user