The SVF parser crashes, too... here's another patch...
Description: fixes SVF parser segfaulting --- urjtag-0.10+r2007.orig/src/svf/svf.c +++ urjtag-0.10+r2007/src/svf/svf.c @@ -68,7 +68,7 @@ #undef DEBUG -int urj_svf_parse (urj_svf_parser_priv_t *priv_data, urj_chain_t *chain); +int urj_svf_parse (urj_svf_parser_priv_t *priv_data, urj_chain_t *chain,void * scanner); /* @@ -1114,6 +1114,7 @@ urj_svf_run (urj_chain_t *chain, FILE *S urj_svf_parser_priv_t priv; int c = ~EOF; int num_lines; + void * scanner; uint32_t old_frequency = urj_tap_cable_get_frequency (chain->cable); /* get number of lines in svf file so we can give user some feedback on long @@ -1231,7 +1232,8 @@ urj_svf_run (urj_chain_t *chain, FILE *S if (urj_svf_bison_init (&priv, SVF_FILE, num_lines)) { - urj_svf_parse (&priv, chain); + scanner=priv.scanner; + urj_svf_parse (&priv, chain,scanner); urj_svf_bison_deinit (&priv); } --- urjtag-0.10+r2007.orig/src/svf/svf_bison.y +++ urjtag-0.10+r2007/src/svf/svf_bison.y @@ -25,9 +25,12 @@ */ %pure-parser -%parse-param {urj_svf_parser_priv_t *priv_data} +%parse-param {urj_svf_parser_priv_t *priv_data} %parse-param {urj_chain_t *chain} -%lex-param {urj_chain_t *chain} +%parse-param {void *scanner} + +%lex-param {void *scanner} + %name-prefix "urj_svf_" %locations @@ -43,15 +46,13 @@ /* interface to flex */ #include "svf_bison.h" -#define YYLEX_PARAM priv_data->scanner -int yylex (YYSTYPE *, YYLTYPE *, void *); // @@@@ RFHH need to define YYPRINTF in terms of urj_log() #define YYERROR_VERBOSE -void yyerror(YYLTYPE *, urj_svf_parser_priv_t *priv_data, urj_chain_t *, const char *); +void yyerror(YYLTYPE *, urj_svf_parser_priv_t *priv_data, urj_chain_t *,void * , const char *); static void urj_svf_free_ths_params(struct ths_params *); %} @@ -147,7 +148,7 @@ svf_statement | PIOMAP '(' direction IDENTIFIER piomap_rec ')' ';' { urj_log (URJ_LOG_LEVEL_ERROR, "PIOMAP not implemented\n"); - yyerror(&@$, priv_data, chain, "PIOMAP"); + yyerror(&@$, priv_data, chain, scanner, "PIOMAP"); YYERROR; } @@ -155,7 +156,7 @@ svf_statement { free($<cvalue>2); urj_log (URJ_LOG_LEVEL_ERROR, "PIO not implemented\n"); - yyerror(&@$, priv_data, chain, "PIO"); + yyerror(&@$, priv_data, chain, scanner,"PIO"); YYERROR; } @@ -169,7 +170,7 @@ svf_statement rt->end_state = $5; if (urj_svf_runtest(chain, priv_data, rt) != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "RUNTEST"); + yyerror(&@$, priv_data, chain, scanner,"RUNTEST"); YYERROR; } } @@ -184,7 +185,7 @@ svf_statement rt->end_state = $4; if (urj_svf_runtest(chain, priv_data, rt) != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "RUNTEST"); + yyerror(&@$, priv_data, chain, scanner,"RUNTEST"); YYERROR; } } @@ -199,7 +200,7 @@ svf_statement urj_svf_free_ths_params(p); if (result != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "SDR"); + yyerror(&@$, priv_data, chain, scanner,"SDR"); YYERROR; } } @@ -214,7 +215,7 @@ svf_statement urj_svf_free_ths_params(p); if (result != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "SIR"); + yyerror(&@$, priv_data, chain, scanner,"SIR"); YYERROR; } } @@ -222,7 +223,7 @@ svf_statement | STATE path_states stable_state ';' { if (urj_svf_state(chain, priv_data, &(priv_data->parser_params.path_states), $<token>3) != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "STATE"); + yyerror(&@$, priv_data, chain, scanner,"STATE"); YYERROR; } } @@ -237,7 +238,7 @@ svf_statement urj_svf_free_ths_params(p); if (result != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "TDR"); + yyerror(&@$, priv_data, chain, scanner,"TDR"); YYERROR; } } @@ -252,7 +253,7 @@ svf_statement urj_svf_free_ths_params(p); if (result != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "TIR"); + yyerror(&@$, priv_data, chain, scanner,"TIR"); YYERROR; } } @@ -260,7 +261,7 @@ svf_statement | TRST trst_mode ';' { if (urj_svf_trst(chain, priv_data, $<token>2) != URJ_STATUS_OK) { - yyerror(&@$, priv_data, chain, "TRST"); + yyerror(&@$, priv_data, chain, scanner,"TRST"); YYERROR; } } @@ -443,7 +444,7 @@ direction ; %% void -yyerror (YYLTYPE *locp, urj_svf_parser_priv_t *priv_data, urj_chain_t *chain, +yyerror (YYLTYPE *locp, urj_svf_parser_priv_t *priv_data, urj_chain_t *chain,void * scanner, const char *error_string) { urj_log (URJ_LOG_LEVEL_ERROR, "Error occurred for SVF command, line %d, column %d-%d:\n %s.\n",