make get_tok_value() and subst_tok() work well also with strings containing tokens with no value.

This commit is contained in:
schippes 2020-08-17 01:08:13 +02:00
parent 574900e1df
commit c5440c2b0f
3 changed files with 40 additions and 17 deletions

View File

@ -1145,12 +1145,26 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
}
}
else if(!strcmp(argv[1],"gettok") )
else if(!strcmp(argv[1],"subst_tok") )
{
char *s=NULL;
my_strdup(894, &s, subst_token(argv[2], argv[3], strcmp(argv[4], "NULL") ? argv[4] : NULL));
Tcl_SetResult(interp, s, TCL_VOLATILE);
my_free(1150, &s);
}
else if(!strcmp(argv[1],"get_tok_size") )
{
char s[30];
my_snprintf(s, S(s), "%d", (int)get_tok_size);
Tcl_SetResult(interp, s, TCL_VOLATILE);
}
else if(!strcmp(argv[1],"get_tok") )
{
char *s=NULL;
Tcl_ResetResult(interp);
my_strdup(648, &s, get_tok_value(argv[2], argv[3], 0));
Tcl_AppendResult(interp, s, NULL);
Tcl_SetResult(interp, s, TCL_VOLATILE);
my_free(649, &s);
}
else if(!strcmp(argv[1],"load_symbol") )

View File

@ -283,10 +283,6 @@ int set_different_token(char **s,char *new, char *old, int object, int n)
my_new = new;
dbg(1, "set_different_token(): *s=%s, new=%s, old=%s n=%d\n",*s, new, old, n);
if(new==NULL) return 0;
sizetok=CADCHUNKALLOC;
token=my_malloc(427, sizetok);
sizeval=CADCHUNKALLOC;
value=my_malloc(429, sizeval);
/* parse new string and add / change attributes that are missing / different from old */
while(1) {
c=*my_new++;
@ -478,7 +474,7 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
register int token_pos=0, value_pos=0;
int quote=0;
int escape=0;
int tok_size = 0;
int cmp = 1;
if(s==NULL) {
my_free(976, &result);
@ -508,6 +504,11 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
if(!escape) quote=!quote;
}
if(state==XTOKEN) {
if(!cmp) { /* previous token matched search and was without value, return get_tok_size */
result[0] = '\0';
get_tok_value_size = 0;
return result;
}
if(c=='"') {
if((with_quotes & 1) || escape) token[token_pos++]=c;
}
@ -521,15 +522,16 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
else if( (c == '\\') && escape ) result[value_pos++]=c; /* 20170414 add escaped backslashes */
} else if(state==XENDTOK || state==XSEPARATOR) {
if(token_pos) {
tok_size = token_pos;
token[token_pos]='\0';
if( !(cmp = strcmp(token,tok)) ) {
get_tok_size = token_pos; /* report back also token size, useful to check if requested token exists */
}
dbg(2, "get_tok_value(): token=%s\n", token);
token_pos=0;
}
} else if(state==XEND) {
result[value_pos]='\0';
if( !strcmp(token,tok) ) {
get_tok_size = tok_size; /* report back also token size, useful to check if requested token exists */
if( !cmp ) {
get_tok_value_size = value_pos; /* return also size so to avoid using strlen 20180926 */
return result;
}
@ -769,6 +771,7 @@ 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 quote=0;
int done_subst=0;
int done_delete = 0;
int escape=0;
int cmptok = 1;
@ -776,7 +779,7 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
my_free(989, &result);
return "";
}
dbg(1, "subst_token(%s, %s, %s)\n", s, tok, new_val);
dbg(0, "subst_token(%s, %s, %s)\n", s, tok, new_val);
sizetok=CADCHUNKALLOC;
token=my_malloc(451, sizetok);
size=CADCHUNKALLOC;
@ -808,7 +811,8 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
result[result_pos++] = c;
} else if(state==XSEPARATOR) {
token[token_pos] = '\0';
if(!(cmptok = strcmp(token,tok)) && !new_val) {
if(!(cmptok = strcmp(token,tok)) && !new_val && !done_delete) {
done_delete = 1;
result_pos = result_save_pos;
dbg(3, "subst_token(): result_pos=%d\n", result_pos);
} else {
@ -843,6 +847,11 @@ char *subst_token(const char *s, const char *tok, const char *new_val)
else result[result_pos++]=c;
} else if(state==XENDTOK) {
token[token_pos]='\0';
if(!(strcmp(token,tok)) && !new_val && !done_delete) {
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;

View File

@ -2108,7 +2108,7 @@ proc edit_prop {txtlabel} {
if {$selected_tok eq {<ALL>} } {
set retval $retval_orig
} else {
set retval [xschem gettok $retval_orig $selected_tok]
set retval [xschem get_tok $retval_orig $selected_tok]
regsub -all {\\?"} $retval {"} retval
}
.dialog.e1 delete 1.0 end
@ -2120,7 +2120,7 @@ proc edit_prop {txtlabel} {
if {$selected_tok eq {<ALL>} } {
set retval $retval_orig
} else {
set retval [xschem gettok $retval_orig $selected_tok]
set retval [xschem get_tok $retval_orig $selected_tok]
regsub -all {\\?"} $retval {"} retval
}
.dialog.e1 delete 1.0 end
@ -2259,7 +2259,7 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } {
if {$selected_tok eq {<ALL>} } {
set retval $retval_orig
} else {
set retval [xschem gettok $retval_orig $selected_tok]
set retval [xschem get_tok $retval_orig $selected_tok]
regsub -all {\\?"} $retval {"} retval
}
.dialog.e1 delete 1.0 end
@ -2273,7 +2273,7 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } {
if {$selected_tok eq {<ALL>} } {
set retval $retval_orig
} else {
set retval [xschem gettok $retval_orig $selected_tok]
set retval [xschem get_tok $retval_orig $selected_tok]
regsub -all {\\?"} $retval {"} retval
}
.dialog.e1 delete 1.0 end