diff --git a/src/scheduler.c b/src/scheduler.c index a91682ae..f8d0de75 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1148,8 +1148,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg 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_ResetResult(interp); + if(argc < 5) {Tcl_AppendResult(interp, "Missing arguments", NULL);return TCL_ERROR;} + my_strdup(894, &s, subst_token(argv[2], argv[3], strcmp(argv[4], "NULL") ? argv[4] : NULL)); Tcl_AppendResult(interp, s, NULL); my_free(1150, &s); } @@ -1161,12 +1162,22 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_ResetResult(interp); Tcl_AppendResult(interp, s, NULL); } - + else if(!strcmp(argv[1],"set_different_tok") ) + { + char *s = NULL; + Tcl_ResetResult(interp); + if(argc < 5) {Tcl_AppendResult(interp, "Missing arguments", NULL);return TCL_ERROR;} + my_strdup(459, &s, argv[2]); + set_different_token(&s, argv[3], argv[4], 0, 0); + Tcl_AppendResult(interp, s, NULL); + my_free(1156, &s); + } else if(!strcmp(argv[1],"get_tok") ) { char *s=NULL; - my_strdup(648, &s, get_tok_value(argv[2], argv[3], 0)); Tcl_ResetResult(interp); + if(argc < 4) {Tcl_AppendResult(interp, "Missing arguments", NULL);return TCL_ERROR;} + my_strdup(648, &s, get_tok_value(argv[2], argv[3], 0)); Tcl_AppendResult(interp, s, NULL); my_free(649, &s); } diff --git a/src/token.c b/src/token.c index e12be7d8..371339f0 100644 --- a/src/token.c +++ b/src/token.c @@ -268,7 +268,7 @@ int match_symbol(const char *name) /* never returns -1, if symbol not found loa /* update **s modifying only the token values that are */ /* different between *new and *old */ /* return 1 if s modified 20081221 */ -int set_different_token(char **s,char *new, char *old, int object, int n) +int set_different_token(char **s,const char *new, const char *old, int object, int n) { register int c, state=XBEGIN, space; char *token=NULL, *value=NULL; @@ -277,7 +277,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) int quote=0; int escape=0; int mod; - char *my_new; + const char *my_new; mod=0; my_new = new; @@ -292,6 +292,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) while(1) { c=*my_new++; space=SPACE(c) ; + if(c=='"' && !escape) quote=!quote; if( (state==XBEGIN || state==XENDTOK) && !space && c != '=') state=XTOKEN; else if( state==XTOKEN && space) state=XENDTOK; else if( (state==XTOKEN || state==XENDTOK) && c=='=') state=XSEPARATOR; @@ -307,9 +308,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) } if(state==XTOKEN) token[token_pos++]=c; else if(state==XVALUE) { - if(c=='"' && !escape) quote=!quote; value[value_pos++]=c; - escape = (c=='\\' && !escape); } else if(state==XENDTOK || state==XSEPARATOR) { if(token_pos) { @@ -336,6 +335,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) } state=XBEGIN; } + escape = (c=='\\' && !escape); if(c=='\0') break; } @@ -345,6 +345,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) while(old) { c=*old++; space=SPACE(c) ; + if(c=='"' && !escape) quote=!quote; if( (state==XBEGIN || state==XENDTOK) && !space && c != '=') state=XTOKEN; else if( state==XTOKEN && space) state=XENDTOK; else if( (state==XTOKEN || state==XENDTOK) && c=='=') state=XSEPARATOR; @@ -360,9 +361,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) } if(state==XTOKEN) token[token_pos++]=c; else if(state==XVALUE) { - if(c=='"' && !escape) quote=!quote; value[value_pos++]=c; - escape = (c=='\\' && !escape); } else if(state==XENDTOK || state==XSEPARATOR) { if(token_pos) { @@ -389,6 +388,7 @@ int set_different_token(char **s,char *new, char *old, int object, int n) value_pos=0; state=XBEGIN; } + escape = (c=='\\' && !escape); if(c=='\0') break; } my_free(974, &token); @@ -775,7 +775,6 @@ char *subst_token(const char *s, const char *tok, const char *new_val) int escape=0, matched_tok=0; if(s==NULL){ - size = 0; my_free(989, &result); return ""; } diff --git a/src/xschem.h b/src/xschem.h index 619d89a7..5e641b9d 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -975,7 +975,7 @@ extern void hilight_child_pins(void); extern void hilight_parent_pins(void); extern struct node_hashentry **get_node_table_ptr(void); extern void change_elem_order(void); -extern int set_different_token(char **s,char *new, char *old, int object, int n); +extern int set_different_token(char **s,const char *new, const char *old, int object, int n); extern void print_hilight_net(int show); extern void change_layer(); extern void launcher(); /* 20161102 */