fix bug in ALLOC() macro, tcl_hook() function
This commit is contained in:
parent
5d26115bd2
commit
f4e5f70de1
|
|
@ -1172,6 +1172,17 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
Tcl_ResetResult(interp);
|
Tcl_ResetResult(interp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if(!strcmp(argv[1],"translate") )
|
||||||
|
{
|
||||||
|
if(argc>3) {
|
||||||
|
Tcl_ResetResult(interp);
|
||||||
|
Tcl_AppendResult(interp, translate(atoi(argv[2]), argv[3]), NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!strcmp(argv[1],"print_spice_element") )
|
||||||
|
{
|
||||||
|
if(argc>2) print_spice_element(stderr, atoi(argv[2]));
|
||||||
|
}
|
||||||
else if(!strcmp(argv[1],"subst_tok") )
|
else if(!strcmp(argv[1],"subst_tok") )
|
||||||
{
|
{
|
||||||
char *s=NULL;
|
char *s=NULL;
|
||||||
|
|
|
||||||
133
src/token.c
133
src/token.c
|
|
@ -155,6 +155,23 @@ void hash_all_names(int n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void tcl_hook(char **res)
|
||||||
|
{
|
||||||
|
char * result = *res;
|
||||||
|
if(result && strstr(result, "tcleval(")== result) {
|
||||||
|
size_t s;
|
||||||
|
char *tclcmd=NULL;
|
||||||
|
s = strlen(result) + 100;
|
||||||
|
tclcmd = my_malloc(1197, s);
|
||||||
|
my_snprintf(tclcmd, s, "tclpropeval2 {%s}", result);
|
||||||
|
dbg(1, "tclpropeval2 {%s}", result);
|
||||||
|
tcleval(tclcmd);
|
||||||
|
my_strdup2(1198, res, tclresult());
|
||||||
|
my_free(1199, &tclcmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void clear_instance_hash()
|
void clear_instance_hash()
|
||||||
{
|
{
|
||||||
inst_free_hash(table);
|
inst_free_hash(table);
|
||||||
|
|
@ -296,8 +313,8 @@ int set_different_token(char **s,const char *new, const char *old, int object, i
|
||||||
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(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE) {
|
else if(state==XVALUE) {
|
||||||
value[value_pos++]=c;
|
value[value_pos++]=c;
|
||||||
|
|
@ -343,8 +360,8 @@ int set_different_token(char **s,const char *new, const char *old, int object, i
|
||||||
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(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE) {
|
else if(state==XVALUE) {
|
||||||
value[value_pos++]=c;
|
value[value_pos++]=c;
|
||||||
|
|
@ -411,7 +428,7 @@ const char *list_tokens(const char *s, int with_quotes)
|
||||||
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(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(c=='"') {
|
if(c=='"') {
|
||||||
if(!escape) quote=!quote;
|
if(!escape) quote=!quote;
|
||||||
}
|
}
|
||||||
|
|
@ -480,8 +497,8 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
|
||||||
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(result, 100, value_pos, size);
|
ALLOC(result, 0, value_pos, size);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(c=='"') {
|
if(c=='"') {
|
||||||
if(!escape) quote=!quote;
|
if(!escape) quote=!quote;
|
||||||
}
|
}
|
||||||
|
|
@ -531,7 +548,6 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return template string excluding name=... and token=value where token listed in extra */
|
/* return template string excluding name=... and token=value where token listed in extra */
|
||||||
|
|
||||||
const char *get_sym_template(char *s,char *extra)
|
const char *get_sym_template(char *s,char *extra)
|
||||||
{
|
{
|
||||||
static char *result=NULL;
|
static char *result=NULL;
|
||||||
|
|
@ -557,7 +573,7 @@ const char *get_sym_template(char *s,char *extra)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
l = strlen(s);
|
l = strlen(s);
|
||||||
ALLOC(result, l+100, 0, sizeres);
|
ALLOC(result, l+1, 0, sizeres);
|
||||||
sizetok = sizeval = CADCHUNKALLOC;
|
sizetok = sizeval = CADCHUNKALLOC;
|
||||||
my_realloc(438, &value,sizeval);
|
my_realloc(438, &value,sizeval);
|
||||||
my_realloc(439, &token,sizetok);
|
my_realloc(439, &token,sizetok);
|
||||||
|
|
@ -569,8 +585,8 @@ const char *get_sym_template(char *s,char *extra)
|
||||||
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) state=XEND;
|
else if( state==XVALUE && space && !quote) state=XEND;
|
||||||
ALLOC(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XBEGIN) {
|
if(state==XBEGIN) {
|
||||||
result[result_pos++] = c;
|
result[result_pos++] = c;
|
||||||
} else if(state==XTOKEN) {
|
} else if(state==XTOKEN) {
|
||||||
|
|
@ -763,8 +779,8 @@ const char *subst_token(const char *s, const char *tok, const char *new_val)
|
||||||
space=SPACE(c);
|
space=SPACE(c);
|
||||||
if(c == '"' && !escape) quote=!quote;
|
if(c == '"' && !escape) quote=!quote;
|
||||||
/* alloc data */
|
/* alloc data */
|
||||||
ALLOC(result, 100, result_pos, size);
|
ALLOC(result, 0, result_pos, size);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
|
|
||||||
/* parsing state machine */
|
/* parsing state machine */
|
||||||
/* states: */
|
/* states: */
|
||||||
|
|
@ -995,8 +1011,8 @@ void print_vhdl_element(FILE *fd, int inst)
|
||||||
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) state=XEND;
|
else if( state==XVALUE && space && !quote) state=XEND;
|
||||||
ALLOC(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE) {
|
else if(state==XVALUE) {
|
||||||
if(c=='"' && !escape) quote=!quote;
|
if(c=='"' && !escape) quote=!quote;
|
||||||
|
|
@ -1134,8 +1150,8 @@ void print_generic(FILE *fd, char *ent_or_comp, int symbol)
|
||||||
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) state=XEND;
|
else if( state==XVALUE && space && !quote) state=XEND;
|
||||||
ALLOC(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE)
|
else if(state==XVALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -1239,8 +1255,8 @@ void print_verilog_param(FILE *fd, int symbol)
|
||||||
else if( state==XSEPARATOR && !space) state=XVALUE;
|
else if( state==XSEPARATOR && !space) state=XVALUE;
|
||||||
else if( state==XVALUE && space && !quote) state=XEND;
|
else if( state==XVALUE && space && !quote) state=XEND;
|
||||||
|
|
||||||
ALLOC(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE)
|
else if(state==XVALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -1331,7 +1347,7 @@ void print_spice_subckt(FILE *fd, int symbol)
|
||||||
state = XSEPARATOR;
|
state = XSEPARATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++]=c;
|
token[token_pos++]=c;
|
||||||
}
|
}
|
||||||
|
|
@ -1406,17 +1422,16 @@ void print_spice_element(FILE *fd, int inst)
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
int result_pos = 0;
|
int result_pos = 0;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
/* struct inst_hashentry *ptr; */
|
|
||||||
|
|
||||||
size = CADCHUNKALLOC;
|
size = CADCHUNKALLOC;
|
||||||
my_realloc(1211, &result, size);
|
my_realloc(1211, &result, size);
|
||||||
result[0] = '\0';
|
result[0] = '\0';
|
||||||
|
|
||||||
my_strdup(483, &template,
|
my_strdup(483, &template, (xctx.inst[inst].ptr+ xctx.sym)->templ);
|
||||||
(xctx.inst[inst].ptr+ xctx.sym)->templ);
|
/* my_strdup(483, &template, translate(inst, (xctx.inst[inst].ptr+ xctx.sym)->templ) ); */
|
||||||
|
/* tcl_hook(&template); */
|
||||||
|
dbg(0, "template=%s\n", template);
|
||||||
my_strdup(484, &name,xctx.inst[inst].instname);
|
my_strdup(484, &name,xctx.inst[inst].instname);
|
||||||
/* my_strdup(485, &name,get_tok_value(xctx.inst[inst].prop_ptr,"name",0)); */
|
|
||||||
if (!name) my_strdup(43, &name, get_tok_value(template, "name", 0));
|
if (!name) my_strdup(43, &name, get_tok_value(template, "name", 0));
|
||||||
|
|
||||||
/* allow format string override in instance */
|
/* allow format string override in instance */
|
||||||
|
|
@ -1438,7 +1453,7 @@ void print_spice_element(FILE *fd, int inst)
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
/* always make room for some characters so the single char writes to result do not need reallocs */
|
/* always make room for some characters so the single char writes to result do not need reallocs */
|
||||||
ALLOC(result, 100, result_pos, size);
|
ALLOC(result, 0, result_pos, size);
|
||||||
c=*s++;
|
c=*s++;
|
||||||
if(c=='\\') {
|
if(c=='\\') {
|
||||||
escape=1;
|
escape=1;
|
||||||
|
|
@ -1457,7 +1472,7 @@ void print_spice_element(FILE *fd, int inst)
|
||||||
dbg(1, "print_spice_element: c=%c, space=%d, escape=%d roken_pos=%d\n", c, space, escape, token_pos);
|
dbg(1, "print_spice_element: c=%c, space=%d, escape=%d roken_pos=%d\n", c, space, escape, token_pos);
|
||||||
state=XSEPARATOR;
|
state=XSEPARATOR;
|
||||||
}
|
}
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++]=c;
|
token[token_pos++]=c;
|
||||||
}
|
}
|
||||||
|
|
@ -1617,21 +1632,11 @@ void print_spice_element(FILE *fd, int inst)
|
||||||
}
|
}
|
||||||
} /* while(1) */
|
} /* while(1) */
|
||||||
|
|
||||||
if(result && strstr(result, "tcleval(")== result) {
|
|
||||||
size_t s;
|
/* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions
|
||||||
char *tclcmd=NULL;
|
* can be calculated */
|
||||||
char *instname = NULL;
|
tcl_hook(&result);
|
||||||
my_strdup(1195, &instname,xctx.inst[inst].instname);
|
|
||||||
if (!instname) my_strdup(1196, &instname, get_tok_value((xctx.inst[inst].ptr+ xctx.sym)->templ, "name", 0));
|
|
||||||
s = result_pos + strlen(instname) + strlen(xctx.inst[inst].name) + 100;
|
|
||||||
tclcmd = my_malloc(1197, s);
|
|
||||||
my_snprintf(tclcmd, s, "tclpropeval2 {%s} {%s} {%s}", result, instname, xctx.inst[inst].name);
|
|
||||||
dbg(1, "tclpropeval2 {%s} {%s} {%s}", result, instname, xctx.inst[inst].name);
|
|
||||||
tcleval(tclcmd);
|
|
||||||
my_strdup2(1198, &result, tclresult());
|
|
||||||
my_free(1199, &tclcmd);
|
|
||||||
my_free(1200, &instname);
|
|
||||||
}
|
|
||||||
fprintf(fd, "%s", result);
|
fprintf(fd, "%s", result);
|
||||||
my_free(1019, &template);
|
my_free(1019, &template);
|
||||||
my_free(1020, &format);
|
my_free(1020, &format);
|
||||||
|
|
@ -1768,7 +1773,7 @@ void print_tedax_element(FILE *fd, int inst)
|
||||||
state=XSEPARATOR;
|
state=XSEPARATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++]=c; /* 20171029 remove escaping backslashes */
|
token[token_pos++]=c; /* 20171029 remove escaping backslashes */
|
||||||
}
|
}
|
||||||
|
|
@ -1974,8 +1979,8 @@ void print_verilog_element(FILE *fd, int inst)
|
||||||
else if( state==XSEPARATOR && !space) state=XVALUE;
|
else if( state==XSEPARATOR && !space) state=XVALUE;
|
||||||
else if( state==XVALUE && space && !quote) state=XEND;
|
else if( state==XVALUE && space && !quote) state=XEND;
|
||||||
|
|
||||||
ALLOC(value, 100, value_pos, sizeval);
|
ALLOC(value, 0, value_pos, sizeval);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XVALUE)
|
else if(state==XVALUE)
|
||||||
{
|
{
|
||||||
|
|
@ -2161,7 +2166,7 @@ void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 20071217 *
|
||||||
state=XSEPARATOR;
|
state=XSEPARATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++]=c; /* 20171029 remove escaping backslashes */
|
token[token_pos++]=c; /* 20171029 remove escaping backslashes */
|
||||||
}
|
}
|
||||||
|
|
@ -2330,7 +2335,7 @@ void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level primiti
|
||||||
state=XSEPARATOR;
|
state=XSEPARATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) {
|
if(state==XTOKEN) {
|
||||||
token[token_pos++]=c;
|
token[token_pos++]=c;
|
||||||
}
|
}
|
||||||
|
|
@ -2483,7 +2488,7 @@ const char *find_nth(const char *str, char sep, int n)
|
||||||
/* substitute given tokens in a string with their corresponding values */
|
/* substitute given tokens in a string with their corresponding values */
|
||||||
/* ex.: name=@name w=@w l=@l ---> name=m112 w=3e-6 l=0.8e-6 */
|
/* ex.: name=@name w=@w l=@l ---> name=m112 w=3e-6 l=0.8e-6 */
|
||||||
/* if s==NULL return emty string */
|
/* if s==NULL return emty string */
|
||||||
const char *translate(int inst, char* s)
|
const char *translate(int inst, const char* s)
|
||||||
{
|
{
|
||||||
static char empty[]="";
|
static char empty[]="";
|
||||||
static char *result=NULL;
|
static char *result=NULL;
|
||||||
|
|
@ -2501,7 +2506,6 @@ const char *translate(int inst, char* s)
|
||||||
int escape=0;
|
int escape=0;
|
||||||
char date[200];
|
char date[200];
|
||||||
|
|
||||||
|
|
||||||
if(!s) {
|
if(!s) {
|
||||||
my_free(1063, &result);
|
my_free(1063, &result);
|
||||||
return empty;
|
return empty;
|
||||||
|
|
@ -2532,8 +2536,8 @@ const char *translate(int inst, char* s)
|
||||||
&& token_pos > 1 ) state=XSEPARATOR;
|
&& token_pos > 1 ) state=XSEPARATOR;
|
||||||
|
|
||||||
|
|
||||||
ALLOC(result, 100, result_pos, size);
|
ALLOC(result, 0, result_pos, size);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if(state==XTOKEN) token[token_pos++]=c;
|
if(state==XTOKEN) token[token_pos++]=c;
|
||||||
else if(state==XSEPARATOR)
|
else if(state==XSEPARATOR)
|
||||||
{
|
{
|
||||||
|
|
@ -2549,7 +2553,7 @@ const char *translate(int inst, char* s)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!get_tok_size && token[0] =='$') {
|
if(!get_tok_size && token[0] =='$') {
|
||||||
tmp=token_pos + 100; /* we need token_pos -1 chars, ( strlen(token+1) ) , excluding leading '$' */
|
tmp=token_pos -1 ; /* we need token_pos -1 chars, ( strlen(token+1) ) , excluding leading '$' */
|
||||||
ALLOC(result, tmp, result_pos, size);
|
ALLOC(result, tmp, result_pos, size);
|
||||||
dbg(2, "translate(): token=%s, token_pos = %d\n", token, token_pos);
|
dbg(2, "translate(): token=%s, token_pos = %d\n", token, token_pos);
|
||||||
memcpy(result+result_pos, token + 1, tmp+1);
|
memcpy(result+result_pos, token + 1, tmp+1);
|
||||||
|
|
@ -2745,21 +2749,9 @@ const char *translate(int inst, char* s)
|
||||||
dbg(2, "translate(): returning %s\n", result);
|
dbg(2, "translate(): returning %s\n", result);
|
||||||
my_free(1067, &token);
|
my_free(1067, &token);
|
||||||
|
|
||||||
if(result && strstr(result, "tcleval(")== result) {
|
/* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions
|
||||||
size_t s;
|
* can be calculated */
|
||||||
char *tclcmd=NULL;
|
tcl_hook(&result);
|
||||||
char *instname = NULL;
|
|
||||||
my_strdup(643, &instname,xctx.inst[inst].instname);
|
|
||||||
if (!instname) my_strdup(1188, &instname, get_tok_value((xctx.inst[inst].ptr+ xctx.sym)->templ, "name", 0));
|
|
||||||
s = result_pos + strlen(instname) + strlen(xctx.inst[inst].name) + 100;
|
|
||||||
tclcmd = my_malloc(1191, s);
|
|
||||||
my_snprintf(tclcmd, s, "tclpropeval2 {%s} {%s} {%s}", result, instname, xctx.inst[inst].name);
|
|
||||||
dbg(1, "tclpropeval2 {%s} {%s} {%s}", result, instname, xctx.inst[inst].name);
|
|
||||||
tcleval(tclcmd);
|
|
||||||
my_strdup2(1189, &result, tclresult());
|
|
||||||
my_free(1190, &tclcmd);
|
|
||||||
my_free(1192, &instname);
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2800,8 +2792,8 @@ const char *translate2(struct Lcc *lcc, int level, char* s)
|
||||||
else if (state == XTOKEN && ( (space && !escape) || c == '@' || (!space && escape)) && token_pos > 1) {
|
else if (state == XTOKEN && ( (space && !escape) || c == '@' || (!space && escape)) && token_pos > 1) {
|
||||||
state = XSEPARATOR;
|
state = XSEPARATOR;
|
||||||
}
|
}
|
||||||
ALLOC(result, 100, result_pos, size);
|
ALLOC(result, 0, result_pos, size);
|
||||||
ALLOC(token, 100, token_pos, sizetok);
|
ALLOC(token, 0, token_pos, sizetok);
|
||||||
if (state == XTOKEN) token[token_pos++] = c;
|
if (state == XTOKEN) token[token_pos++] = c;
|
||||||
else if (state == XSEPARATOR) {
|
else if (state == XSEPARATOR) {
|
||||||
token[token_pos] = '\0';
|
token[token_pos] = '\0';
|
||||||
|
|
@ -2866,6 +2858,9 @@ const char *translate2(struct Lcc *lcc, int level, char* s)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions
|
||||||
|
* can be calculated */
|
||||||
|
tcl_hook(&result);
|
||||||
my_free(1070, &token);
|
my_free(1070, &token);
|
||||||
my_free(1071, &value1);
|
my_free(1071, &value1);
|
||||||
my_free(1072, &value2);
|
my_free(1072, &value2);
|
||||||
|
|
|
||||||
|
|
@ -302,13 +302,14 @@ extern char win_temp_dir[PATH_MAX];
|
||||||
* hold additional 'add' characters starting at position 'pos' */
|
* hold additional 'add' characters starting at position 'pos' */
|
||||||
#define ALLOC(dest_string, add, pos, size) \
|
#define ALLOC(dest_string, add, pos, size) \
|
||||||
do { \
|
do { \
|
||||||
int tmp = add; \
|
int _xx_tmp = add; \
|
||||||
if (pos + tmp >= size) { \
|
if (pos + _xx_tmp >= size) { \
|
||||||
size = (1 + (pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC; \
|
size = (1 + (pos + _xx_tmp) / CADCHUNKALLOC) * CADCHUNKALLOC; \
|
||||||
my_realloc(1212, &dest_string, size); \
|
my_realloc(1212, &dest_string, size); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned short type;
|
unsigned short type;
|
||||||
|
|
@ -930,7 +931,7 @@ extern struct int_hashentry *int_hash_lookup(struct int_hashentry **table, const
|
||||||
|
|
||||||
extern const char *find_nth(const char *str, char sep, int n);
|
extern const char *find_nth(const char *str, char sep, int n);
|
||||||
extern int isonlydigit(const char *s);
|
extern int isonlydigit(const char *s);
|
||||||
extern const char *translate(int inst, char* s);
|
extern const char *translate(int inst, const char* s);
|
||||||
extern const char* translate2(struct Lcc *lcc, int level, char* s);
|
extern const char* translate2(struct Lcc *lcc, int level, char* s);
|
||||||
extern void print_tedax_element(FILE *fd, int inst);
|
extern void print_tedax_element(FILE *fd, int inst);
|
||||||
extern void print_spice_element(FILE *fd, int inst);
|
extern void print_spice_element(FILE *fd, int inst);
|
||||||
|
|
|
||||||
|
|
@ -1861,13 +1861,13 @@ proc tclpropeval {s instname symname} {
|
||||||
}
|
}
|
||||||
|
|
||||||
# this hook is called in translate() if whole string is contained in a tcleval(...) construct
|
# this hook is called in translate() if whole string is contained in a tcleval(...) construct
|
||||||
proc tclpropeval2 {s instname symname} {
|
proc tclpropeval2 {s} {
|
||||||
# puts ">>>> $s $instname $symname"
|
# puts ">>>> $s $instname $symname"
|
||||||
regsub {^tcleval\(} $s {} s
|
regsub {^tcleval\(} $s {} s
|
||||||
regsub {\)([ \n\t]*)$} $s {\1} s
|
regsub {\)([ \n\t]*)$} $s {\1} s
|
||||||
if { [catch {subst $s} res] } {
|
if { [catch {subst $s} res] } {
|
||||||
puts "tclpropeval2: $res instance: $instname"
|
puts "tclpropeval2: $res"
|
||||||
set res {}
|
set res {<ERROR>}
|
||||||
}
|
}
|
||||||
return $res
|
return $res
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue