better subst_token() function (add value to token with no value, delete token with no value), added comments
This commit is contained in:
parent
c5440c2b0f
commit
8e4e23cf2d
123
src/token.c
123
src/token.c
|
|
@ -771,7 +771,6 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
|
||||||
int token_pos=0, result_pos=0, result_save_pos = 0;
|
int token_pos=0, result_pos=0, result_save_pos = 0;
|
||||||
int quote=0;
|
int quote=0;
|
||||||
int done_subst=0;
|
int done_subst=0;
|
||||||
int done_delete = 0;
|
|
||||||
int escape=0;
|
int escape=0;
|
||||||
int cmptok = 1;
|
int cmptok = 1;
|
||||||
|
|
||||||
|
|
@ -779,7 +778,7 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
|
||||||
my_free(989, &result);
|
my_free(989, &result);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
dbg(0, "subst_token(%s, %s, %s)\n", s, tok, new_val);
|
dbg(1, "subst_token(%s, %s, %s)\n", s, tok, new_val);
|
||||||
sizetok=CADCHUNKALLOC;
|
sizetok=CADCHUNKALLOC;
|
||||||
token=my_malloc(451, sizetok);
|
token=my_malloc(451, sizetok);
|
||||||
size=CADCHUNKALLOC;
|
size=CADCHUNKALLOC;
|
||||||
|
|
@ -788,31 +787,50 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
|
||||||
while( s ) {
|
while( s ) {
|
||||||
c=*s++;
|
c=*s++;
|
||||||
space=SPACE(c);
|
space=SPACE(c);
|
||||||
if( (state==XBEGIN || state==XENDTOK) && !space && c != '=') {
|
if( (state==XBEGIN || state==XENDTOK) && !space && c != '=') {
|
||||||
result_save_pos = result_pos-1;
|
if(!cmptok) { /* add value to a (previously) matching token with no value */
|
||||||
if(result_save_pos < 0) result_save_pos = 0;
|
if(!done_subst && new_val) {
|
||||||
|
result[result_pos-1]='=';
|
||||||
|
if(new_val[0]) {
|
||||||
|
tmp = strlen(new_val)+1; /* add 1 char for space at end */
|
||||||
|
} else {
|
||||||
|
new_val = "\"\"";
|
||||||
|
tmp = 3; /* add 1 char for space at end */
|
||||||
|
}
|
||||||
|
if(result_pos + tmp >= size) {
|
||||||
|
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
||||||
|
my_realloc(457, &result, size);
|
||||||
|
}
|
||||||
|
memcpy(result + result_pos ,new_val, tmp + 1);/* copy new_val and add 1 char for space */
|
||||||
|
result_pos += tmp;
|
||||||
|
result[result_pos-1]= ' '; /* space at end */
|
||||||
|
done_subst = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result_save_pos = result_pos;
|
||||||
token_pos=0 ;
|
token_pos=0 ;
|
||||||
state=XTOKEN;
|
state=XTOKEN;
|
||||||
} else if( state==XTOKEN && space) state=XENDTOK;
|
} else if( state==XTOKEN && space) state=XENDTOK;
|
||||||
else if( (state==XTOKEN || state==XENDTOK) && c=='=') state=XSEPARATOR;
|
else if( (state==XTOKEN || state==XENDTOK) && c=='=') state=XSEPARATOR;
|
||||||
else if( state==XSEPARATOR && !space) state=XVALUE;
|
else if( state==XSEPARATOR && !space) state=XVALUE;
|
||||||
else if( state==XVALUE && space && !quote && !escape) state=XEND;
|
else if( state==XVALUE && space && !quote && !escape) state=XEND;
|
||||||
|
|
||||||
|
/* alloc data */
|
||||||
if(result_pos >= size) {
|
if(result_pos >= size) {
|
||||||
size += CADCHUNKALLOC;
|
size += CADCHUNKALLOC;
|
||||||
my_realloc(455, &result, size);
|
my_realloc(455, &result, size);
|
||||||
}
|
}
|
||||||
if(token_pos >= sizetok) {
|
if(token_pos >= sizetok) {
|
||||||
sizetok += CADCHUNKALLOC;
|
sizetok += CADCHUNKALLOC;
|
||||||
my_realloc(456, &token, sizetok); /* 20171104 **Long** standing bug fixed, was doing realloc on result instead of token. */
|
my_realloc(456, &token, sizetok);
|
||||||
/* causing the program to crash on first very long token encountered */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++] = c;
|
token[token_pos++] = c;
|
||||||
result[result_pos++] = c;
|
result[result_pos++] = c;
|
||||||
} else if(state==XSEPARATOR) {
|
} else if(state==XSEPARATOR || state == XENDTOK) {
|
||||||
token[token_pos] = '\0';
|
token[token_pos] = '\0';
|
||||||
if(!(cmptok = strcmp(token,tok)) && !new_val && !done_delete) {
|
if(!(cmptok = strcmp(token,tok)) && !new_val) { /* matching token with value and NULL new_val: delete token */
|
||||||
done_delete = 1;
|
|
||||||
result_pos = result_save_pos;
|
result_pos = result_save_pos;
|
||||||
dbg(3, "subst_token(): result_pos=%d\n", result_pos);
|
dbg(3, "subst_token(): result_pos=%d\n", result_pos);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -822,64 +840,39 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
|
||||||
if(c == '"' && !escape) quote=!quote;
|
if(c == '"' && !escape) quote=!quote;
|
||||||
if(c == '\\') escape = 1;
|
if(c == '\\') escape = 1;
|
||||||
else escape = 0;
|
else escape = 0;
|
||||||
if(!cmptok)
|
if(!cmptok ) { /* if matching token found end NULL new_val skip also value */
|
||||||
{
|
if(!done_subst && new_val) { /* replace value of a matching token */
|
||||||
if(!done_subst)
|
if(new_val[0]) {
|
||||||
{
|
tmp = strlen(new_val);
|
||||||
if(new_val && new_val[0]) {
|
} else {
|
||||||
tmp = strlen(new_val);
|
new_val = "\"\"";
|
||||||
} else if(new_val) {
|
tmp = 2;
|
||||||
new_val = "\"\"";
|
}
|
||||||
tmp = 2;
|
if(result_pos + tmp >= size) {
|
||||||
}
|
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
||||||
if(new_val) {
|
my_realloc(457, &result, size);
|
||||||
if(result_pos + tmp >= size)
|
}
|
||||||
{
|
memcpy(result + result_pos ,new_val, tmp + 1); /* 20180923 */
|
||||||
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
result_pos += tmp;
|
||||||
my_realloc(457, &result, size);
|
done_subst = 1;
|
||||||
}
|
}
|
||||||
memcpy(result + result_pos ,new_val, tmp + 1); /* 20180923 */
|
|
||||||
result_pos += tmp;
|
|
||||||
}
|
|
||||||
done_subst = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else result[result_pos++]=c;
|
else result[result_pos++]=c;
|
||||||
} else if(state==XENDTOK) {
|
} else if(state == XEND || state == XBEGIN) {
|
||||||
token[token_pos]='\0';
|
if(cmptok || new_val) result[result_pos++] = c; /* if deleting a token skip also following spaces up to next token */
|
||||||
if(!(strcmp(token,tok)) && !new_val && !done_delete) {
|
state = XBEGIN;
|
||||||
done_delete = 1;
|
|
||||||
result_pos = result_save_pos;
|
|
||||||
dbg(3, "subst_token(): result_pos=%d\n", result_pos);
|
|
||||||
}
|
|
||||||
result[result_pos++] = c;
|
|
||||||
} else if(state == XEND) {
|
|
||||||
if(c=='\0' || !(result_save_pos == 0 && !cmptok && !new_val) ) result[result_pos++] = c;
|
|
||||||
state = XBEGIN;
|
|
||||||
} else if(state == XBEGIN) {
|
|
||||||
if(c=='\0' || !(result_save_pos == 0 && !cmptok && !new_val) ) result[result_pos++] = c;
|
|
||||||
}
|
}
|
||||||
if(c == '\0') break;
|
if(c == '\0') break;
|
||||||
} /* end while */
|
} /* end while */
|
||||||
if(!done_subst) { /* 04052001 if tok not found add tok=new_value at end */
|
if(!done_subst) { /* 04052001 if tok not found add tok=new_value at end */
|
||||||
if(result[0] == '\0' && new_val) {
|
if(new_val) {
|
||||||
if(!new_val[0]) new_val = "\"\"";
|
if(!new_val[0]) new_val = "\"\"";
|
||||||
tmp = strlen(new_val) + strlen(tok) + 2;
|
tmp = strlen(new_val) + strlen(tok) + 2; /* 20171104 */
|
||||||
if(result_pos + tmp >= size) {
|
if(result_pos + tmp >= size) {
|
||||||
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
||||||
my_realloc(458, &result,size);
|
my_realloc(460, &result,size);
|
||||||
}
|
}
|
||||||
my_realloc(459, &result, size);
|
my_snprintf(result + result_pos - 1, size, " %s=%s", tok, new_val ); /* 20171104, 20171201 -> result_pos-1 */
|
||||||
my_snprintf(result, size, "%s=%s", tok, new_val ); /* overflow safe 20161122 */
|
|
||||||
}
|
|
||||||
else if(new_val) {
|
|
||||||
if(!new_val[0]) new_val = "\"\"";
|
|
||||||
tmp = strlen(new_val) + strlen(tok) + 2; /* 20171104 */
|
|
||||||
if(result_pos + tmp >= size) {
|
|
||||||
size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC;
|
|
||||||
my_realloc(460, &result,size);
|
|
||||||
}
|
|
||||||
my_snprintf(result + result_pos - 1, size, " %s=%s", tok, new_val ); /* 20171104, 20171201 -> result_pos-1 */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbg(2, "subst_token(): returning: %s\n",result);
|
dbg(2, "subst_token(): returning: %s\n",result);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue