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",