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

Reply via email to