Minor change for consistency with latest bootstrap_flex.git (append function)
authorNick Downing <downing.nick@gmail.com>
Sat, 23 Jun 2018 04:59:08 +0000 (14:59 +1000)
committerNick Downing <downing.nick@gmail.com>
Sat, 23 Jun 2018 04:59:08 +0000 (14:59 +1000)
src/parse-gram.c
src/parse-gram.c.patch
src/scan-gram.c
src/scan-gram.c.patch
src/scan-gram.l

index 6ef557d..bdbacd0 100644 (file)
@@ -1745,7 +1745,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio
 extern char piece_temp[];
 extern char *piece[];
 extern int piece0, piece1;
-void insert_piece(int n, const void *str);
+void piece_insert(int n, const void *str);
 int piece2, piece3;
 static void peek(int *yychar_p, YYSTYPE *yylval_p, YYLTYPE *yylloc_p) {
  if (*yychar_p == YYEMPTY)
@@ -1758,9 +1758,9 @@ static void peek(int *yychar_p, YYSTYPE *yylval_p, YYLTYPE *yylloc_p) {
  piece1 += 2;
 }
 #define insert_before(n, str) \
- do { insert_piece(piece2 + (n) * 2, (str)); ++piece3; } while (0)
+ do { piece_insert(piece2 + (n) * 2, (str)); ++piece0; ++piece3; } while (0)
 #define insert_after(n, str) \
- do { insert_piece(piece2 + (n) * 2 + 1, (str)); ++piece3; } while (0)
+ do { piece_insert(piece2 + (n) * 2 + 1, (str)); ++piece0; ++piece3; } while (0)
 int
 yyparse (void)
 {
index 5e7e893..07dc3e1 100644 (file)
@@ -1,5 +1,5 @@
---- parse-gram.c.orig  2018-06-14 17:52:45.371946333 +1000
-+++ parse-gram.c       2018-06-15 08:48:43.493541783 +1000
+--- parse-gram.c.orig  2018-06-23 14:56:48.644152186 +1000
++++ parse-gram.c       2018-06-23 14:57:33.624150282 +1000
 @@ -1742,6 +1742,25 @@
  | yyparse.  |
  `----------*/
@@ -7,7 +7,7 @@
 +extern char piece_temp[];
 +extern char *piece[];
 +extern int piece0, piece1;
-+void insert_piece(int n, const void *str);
++void piece_insert(int n, const void *str);
 +int piece2, piece3;
 +static void peek(int *yychar_p, YYSTYPE *yylval_p, YYLTYPE *yylloc_p) {
 + if (*yychar_p == YYEMPTY)
@@ -20,9 +20,9 @@
 + piece1 += 2;
 +}
 +#define insert_before(n, str) \
-+ do { insert_piece(piece2 + (n) * 2, (str)); ++piece3; } while (0)
++ do { piece_insert(piece2 + (n) * 2, (str)); ++piece0; ++piece3; } while (0)
 +#define insert_after(n, str) \
-+ do { insert_piece(piece2 + (n) * 2 + 1, (str)); ++piece3; } while (0)
++ do { piece_insert(piece2 + (n) * 2 + 1, (str)); ++piece0; ++piece3; } while (0)
  int
  yyparse (void)
  {
@@ -44,7 +44,7 @@
  
    /* If YYLEN is nonzero, implement the default value of the action:
       '$$ = $1'.
-@@ -2768,6 +2798,23 @@
+@@ -2792,6 +2822,23 @@
      if (yychar_backup != yychar)
        YY_LAC_DISCARD ("yychar change");
    }
index edd01e4..7c5ac4e 100644 (file)
@@ -70,10 +70,12 @@ char piece_temp[100];
 char *piece[10000];
 int piece0;
 int piece1;
-void insert_piece(int n, const char *str) {
+void piece_append(const char *str) {
+ piece[piece1++] = strdup(str);
+}
+void piece_insert(int n, const char *str) {
  memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
  piece[n] = strdup(str);
- ++piece0;
  ++piece1;
 }
 
@@ -1488,13 +1490,13 @@ YY_DECL
  size_t n = strlen(yytext);
  if (n) {
   sprintf(piece_temp, "<token value=\"%d\">", result);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   piece_esc(yytext, n);
-  piece[piece1++] = strdup("</token>");
+  piece_append("</token>");
  }
  else {
   sprintf(piece_temp, "<token value=\"%d\" />", result);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
  }
 #endif
  piece_pack();
@@ -2022,9 +2024,9 @@ YY_RULE_SETUP
     bracketed_id_str = NULL;
     BEGIN SC_AFTER_IDENTIFIER;
  piece_pack();
- piece[piece1++] = strdup("<Id>");
+ piece_append("<Id>");
  flush();
- piece[piece1++] = strdup("</Id>");
+ piece_append("</Id>");
  piece_pack();
   }
        YY_BREAK
@@ -2036,9 +2038,9 @@ YY_RULE_SETUP
 #if 1
  piece_pack();
  sprintf(piece_temp, "<Int value=\"%d\">", val->integer);
- piece[piece1++] = strdup(piece_temp);
+ piece_append(piece_temp);
  piece_esc(gram_text, yy_c_buf_p - gram_text);
- piece[piece1++] = strdup("</Int>");
+ piece_append("</Int>");
  piece_pack();
  return ~INT;
 #else
@@ -2054,9 +2056,9 @@ YY_RULE_SETUP
 #if 1
  piece_pack();
  sprintf(piece_temp, "<Int value=\"%d\">", val->integer);
- piece[piece1++] = strdup(piece_temp);
+ piece_append(piece_temp);
  piece_esc(gram_text, yy_c_buf_p - gram_text);
- piece[piece1++] = strdup("</Integer>");
+ piece_append("</Integer>");
  piece_pack();
  return ~INT;
 #else
@@ -2077,19 +2079,19 @@ YY_RULE_SETUP
 case 70:
 YY_RULE_SETUP
 #line 331 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; flush(); piece[piece1++] = strdup("<EscapedCharacter>");
+token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; flush(); piece_append("<EscapedCharacter>");
        YY_BREAK
 /* Strings. */
 case 71:
 YY_RULE_SETUP
 #line 334 "src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING; flush(); piece[piece1++] = strdup("<EscapedString>");
+token_start = loc->start; BEGIN SC_ESCAPED_STRING; flush(); piece_append("<EscapedString>");
        YY_BREAK
 /* Prologue. */
 case 72:
 YY_RULE_SETUP
 #line 337 "src/scan-gram.l"
-code_start = loc->start; BEGIN SC_PROLOGUE; flush(); piece[piece1++] = strdup("<Prologue>");
+code_start = loc->start; BEGIN SC_PROLOGUE; flush(); piece_append("<Prologue>");
        YY_BREAK
 /* Code in between braces.  */
 case 73:
@@ -2101,7 +2103,7 @@ YY_RULE_SETUP
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
  flush();
- piece[piece1++] = strdup("<BracedCode>");
+ piece_append("<BracedCode>");
   }
        YY_BREAK
 /* Semantic predicate. */
@@ -2113,7 +2115,7 @@ YY_RULE_SETUP
     nesting = 0;
     code_start = loc->start;
  flush();
- piece[piece1++] = strdup("<Predicate>");
+ piece_append("<Predicate>");
     BEGIN SC_PREDICATE;
   }
        YY_BREAK
@@ -2121,12 +2123,12 @@ YY_RULE_SETUP
 case 75:
 YY_RULE_SETUP
 #line 359 "src/scan-gram.l"
-piece_pack(); piece[piece1++] = strdup("&lt;<TagAny>*</TagAny>&gt;"); ++piece0; return ~TAG_ANY; /*return TAG_ANY;*/
+piece_pack(); piece_append("&lt;<TagAny>*</TagAny>&gt;"); ++piece0; return ~TAG_ANY; /*return TAG_ANY;*/
        YY_BREAK
 case 76:
 YY_RULE_SETUP
 #line 360 "src/scan-gram.l"
-piece_pack(); piece[piece1++] = strdup("&lt;<TagNone />&gt;"); ++piece0; return ~TAG_NONE; /*return TAG_NONE;*/
+piece_pack(); piece_append("&lt;<TagNone />&gt;"); ++piece0; return ~TAG_NONE; /*return TAG_NONE;*/
        YY_BREAK
 case 77:
 YY_RULE_SETUP
@@ -2136,7 +2138,7 @@ YY_RULE_SETUP
     token_start = loc->start;
     BEGIN SC_TAG;
  flush();
- piece[piece1++] = strdup("<Tag>");
+ piece_append("<Tag>");
   }
        YY_BREAK
 case 78:
@@ -2400,7 +2402,7 @@ YY_RULE_SETUP
     loc->start = token_start;
     val->code = last_string;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</EscapedString>");
+ piece_append("</EscapedString>");
     return STRING;
   }
        YY_BREAK
@@ -2441,7 +2443,7 @@ YY_RULE_SETUP
                 _("extra characters in character literal"));
     STRING_FREE;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</EscapedCharacter>");
+ piece_append("</EscapedCharacter>");
     return CHAR;
   }
        YY_BREAK
@@ -2473,7 +2475,7 @@ YY_RULE_SETUP
         val->uniqstr = uniqstr_new (last_string);
         STRING_FREE;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</Tag>");
+ piece_append("</Tag>");
         return TAG;
       }
     STRING_GROW;
@@ -2512,9 +2514,9 @@ YY_RULE_SETUP
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", (int)c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
        YY_BREAK
@@ -2531,52 +2533,52 @@ YY_RULE_SETUP
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", (int)c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
        YY_BREAK
 case 103:
 YY_RULE_SETUP
 #line 671 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a'); piece[piece1++] = strdup("<Escape char=\"7\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\a'); piece_append("<Escape char=\"7\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 672 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b'); piece[piece1++] = strdup("<Escape char=\"8\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\b'); piece_append("<Escape char=\"8\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 673 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f'); piece[piece1++] = strdup("<Escape char=\"12\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\f'); piece_append("<Escape char=\"12\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 674 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n'); piece[piece1++] = strdup("<Escape char=\"10\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\n'); piece_append("<Escape char=\"10\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 675 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r'); piece[piece1++] = strdup("<Escape char=\"13\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\r'); piece_append("<Escape char=\"13\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 108:
 YY_RULE_SETUP
 #line 676 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t'); piece[piece1++] = strdup("<Escape char=\"9\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\t'); piece_append("<Escape char=\"9\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 case 109:
 YY_RULE_SETUP
 #line 677 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v'); piece[piece1++] = strdup("<Escape char=\"11\">"); flush(); piece[piece1++] = strdup("</Escape>");
+obstack_1grow (&obstack_for_string, '\v'); piece_append("<Escape char=\"11\">"); flush(); piece_append("</Escape>");
        YY_BREAK
 /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
 case 110:
 YY_RULE_SETUP
 #line 680 "src/scan-gram.l"
-obstack_1grow (&obstack_for_string, gram_text[1]); sprintf(piece_temp, "<Escape char=\"%d\">", gram_text[1]); piece[piece1++] = strdup(piece_temp); flush(); piece[piece1++] = strdup("</Escape>"); 
+obstack_1grow (&obstack_for_string, gram_text[1]); sprintf(piece_temp, "<Escape char=\"%d\">", gram_text[1]); piece_append(piece_temp); flush(); piece_append("</Escape>"); 
        YY_BREAK
 case 111:
 YY_RULE_SETUP
@@ -2590,9 +2592,9 @@ YY_RULE_SETUP
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
        YY_BREAK
@@ -2629,7 +2631,7 @@ STRING_GROW;
 case 114:
 YY_RULE_SETUP
 #line 719 "src/scan-gram.l"
-STRING_GROW; BEGIN context_state; /*piece[piece1++] = strdup("</Character>");*/
+STRING_GROW; BEGIN context_state; /*piece_append("</Character>");*/
        YY_BREAK
 case 115:
 /* rule 115 can match eol */
@@ -2647,7 +2649,7 @@ unexpected_eof (token_start, "'");
 case 116:
 YY_RULE_SETUP
 #line 726 "src/scan-gram.l"
-STRING_GROW; BEGIN context_state; /*piece[piece1++] = strdup("</String>");*/
+STRING_GROW; BEGIN context_state; /*piece_append("</String>");*/
        YY_BREAK
 case 117:
 /* rule 117 can match eol */
@@ -2673,7 +2675,7 @@ YY_RULE_SETUP
     context_state = YY_START;
     token_start = loc->start;
  /*flush();
- piece[piece1++] = strdup("<Character>");*/
+ piece_append("<Character>");*/
     BEGIN SC_CHARACTER;
   }
        YY_BREAK
@@ -2685,7 +2687,7 @@ YY_RULE_SETUP
     context_state = YY_START;
     token_start = loc->start;
  /*flush();
- piece[piece1++] = strdup("<String>");*/
+ piece_append("<String>");*/
     BEGIN SC_STRING;
   }
        YY_BREAK
@@ -2758,7 +2760,7 @@ YY_RULE_SETUP
         loc->start = code_start;
         val->code = last_string;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</BracedCode>"); 
+ piece_append("</BracedCode>"); 
         return BRACED_CODE;
       }
   }
@@ -2777,7 +2779,7 @@ YY_RULE_SETUP
         loc->start = code_start;
         val->code = last_string;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</Predicate>");
+ piece_append("</Predicate>");
         return BRACED_PREDICATE;
       }
     else
@@ -2798,7 +2800,7 @@ YY_RULE_SETUP
     loc->start = code_start;
     val->code = last_string;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</Prologue>");
+ piece_append("</Prologue>");
     return PROLOGUE;
   }
        YY_BREAK
index 122276b..f41bf48 100644 (file)
@@ -1,6 +1,6 @@
---- scan-gram.c.orig   2018-06-15 15:35:57.635168211 +1000
-+++ scan-gram.c        2018-06-23 10:48:16.772600940 +1000
-@@ -66,6 +66,17 @@
+--- scan-gram.c.orig   2018-06-23 14:56:48.656152185 +1000
++++ scan-gram.c        2018-06-23 14:57:16.820150994 +1000
+@@ -66,6 +66,19 @@
  /* %endif */
  /* end standard C headers. */
  
@@ -8,17 +8,19 @@
 +char *piece[10000];
 +int piece0;
 +int piece1;
-+void insert_piece(int n, const char *str) {
++void piece_append(const char *str) {
++ piece[piece1++] = strdup(str);
++}
++void piece_insert(int n, const char *str) {
 + memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
 + piece[n] = strdup(str);
-+ ++piece0;
 + ++piece1;
 +}
 +
  /* %if-c-or-c++ */
  /* flex integer type definitions */
  
-@@ -253,7 +264,21 @@
+@@ -253,7 +266,21 @@
                } \
        while ( 0 )
  
@@ -40,7 +42,7 @@
  
  #ifndef YY_TYPEDEF_YY_SIZE_T
  #define YY_TYPEDEF_YY_SIZE_T
-@@ -1395,8 +1420,88 @@
+@@ -1395,8 +1422,88 @@
  
  /** The main scanner function which does all the work.
   */
 + size_t n = strlen(yytext);
 + if (n) {
 +  sprintf(piece_temp, "<token value=\"%d\">", result);
-+  piece[piece1++] = strdup(piece_temp);
++  piece_append(piece_temp);
 +  piece_esc(yytext, n);
-+  piece[piece1++] = strdup("</token>");
++  piece_append("</token>");
 + }
 + else {
 +  sprintf(piece_temp, "<token value=\"%d\" />", result);
-+  piece[piece1++] = strdup(piece_temp);
++  piece_append(piece_temp);
 + }
 +#endif
 + piece_pack();
        register yy_state_type yy_current_state;
        register char *yy_cp, *yy_bp;
        register int yy_act;
-@@ -1475,7 +1580,12 @@
+@@ -1475,7 +1582,12 @@
                gram__load_buffer_state( );
                }
  
index f19643b..7f65772 100644 (file)
@@ -286,9 +286,9 @@ eqopt    ([[:space:]]*=)?
     bracketed_id_str = NULL;
     BEGIN SC_AFTER_IDENTIFIER;
  piece_pack();
- piece[piece1++] = strdup("<Id>");
+ piece_append("<Id>");
  flush();
- piece[piece1++] = strdup("</Id>");
+ piece_append("</Id>");
  piece_pack();
   }
 
@@ -297,9 +297,9 @@ eqopt    ([[:space:]]*=)?
 #if 1
  piece_pack();
  sprintf(piece_temp, "<Int value=\"%d\">", val->integer);
- piece[piece1++] = strdup(piece_temp);
+ piece_append(piece_temp);
  piece_esc(yytext, yy_c_buf_p - yytext);
- piece[piece1++] = strdup("</Int>");
+ piece_append("</Int>");
  piece_pack();
  return ~INT;
 #else
@@ -311,9 +311,9 @@ eqopt    ([[:space:]]*=)?
 #if 1
  piece_pack();
  sprintf(piece_temp, "<Int value=\"%d\">", val->integer);
- piece[piece1++] = strdup(piece_temp);
+ piece_append(piece_temp);
  piece_esc(yytext, yy_c_buf_p - yytext);
- piece[piece1++] = strdup("</Integer>");
+ piece_append("</Integer>");
  piece_pack();
  return ~INT;
 #else
@@ -328,13 +328,13 @@ eqopt    ([[:space:]]*=)?
   }
 
   /* Characters.  */
-  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; flush(); piece[piece1++] = strdup("<EscapedCharacter>");
+  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; flush(); piece_append("<EscapedCharacter>");
 
   /* Strings. */
-  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; flush(); piece[piece1++] = strdup("<EscapedString>");
+  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; flush(); piece_append("<EscapedString>");
 
   /* Prologue. */
-  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; flush(); piece[piece1++] = strdup("<Prologue>");
+  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; flush(); piece_append("<Prologue>");
 
   /* Code in between braces.  */
   "{" {
@@ -343,7 +343,7 @@ eqopt    ([[:space:]]*=)?
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
  flush();
- piece[piece1++] = strdup("<BracedCode>");
+ piece_append("<BracedCode>");
   }
 
   /* Semantic predicate. */
@@ -351,19 +351,19 @@ eqopt    ([[:space:]]*=)?
     nesting = 0;
     code_start = loc->start;
  flush();
- piece[piece1++] = strdup("<Predicate>");
+ piece_append("<Predicate>");
     BEGIN SC_PREDICATE;
   }
 
   /* A type. */
-  "<*>"       piece_pack(); piece[piece1++] = strdup("&lt;<TagAny>*</TagAny>&gt;"); ++piece0; return ~TAG_ANY; /*return TAG_ANY;*/
-  "<>"        piece_pack(); piece[piece1++] = strdup("&lt;<TagNone />&gt;"); ++piece0; return ~TAG_NONE; /*return TAG_NONE;*/
+  "<*>"       piece_pack(); piece_append("&lt;<TagAny>*</TagAny>&gt;"); ++piece0; return ~TAG_ANY; /*return TAG_ANY;*/
+  "<>"        piece_pack(); piece_append("&lt;<TagNone />&gt;"); ++piece0; return ~TAG_NONE; /*return TAG_NONE;*/
   "<"         {
     nesting = 0;
     token_start = loc->start;
     BEGIN SC_TAG;
  flush();
- piece[piece1++] = strdup("<Tag>");
+ piece_append("<Tag>");
   }
 
   "%%" {
@@ -564,7 +564,7 @@ eqopt    ([[:space:]]*=)?
     loc->start = token_start;
     val->code = last_string;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</EscapedString>");
+ piece_append("</EscapedString>");
     return STRING;
   }
   <<EOF>>   unexpected_eof (token_start, "\"");
@@ -595,7 +595,7 @@ eqopt    ([[:space:]]*=)?
                 _("extra characters in character literal"));
     STRING_FREE;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</EscapedCharacter>");
+ piece_append("</EscapedCharacter>");
     return CHAR;
   }
   "\n"      unexpected_newline (token_start, "'");
@@ -619,7 +619,7 @@ eqopt    ([[:space:]]*=)?
         val->uniqstr = uniqstr_new (last_string);
         STRING_FREE;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</Tag>");
+ piece_append("</Tag>");
         return TAG;
       }
     STRING_GROW;
@@ -646,9 +646,9 @@ eqopt    ([[:space:]]*=)?
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", (int)c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
 
@@ -662,22 +662,22 @@ eqopt    ([[:space:]]*=)?
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", (int)c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
 
-  \\a   obstack_1grow (&obstack_for_string, '\a'); piece[piece1++] = strdup("<Escape char=\"7\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\b   obstack_1grow (&obstack_for_string, '\b'); piece[piece1++] = strdup("<Escape char=\"8\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\f   obstack_1grow (&obstack_for_string, '\f'); piece[piece1++] = strdup("<Escape char=\"12\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\n   obstack_1grow (&obstack_for_string, '\n'); piece[piece1++] = strdup("<Escape char=\"10\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\r   obstack_1grow (&obstack_for_string, '\r'); piece[piece1++] = strdup("<Escape char=\"13\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\t   obstack_1grow (&obstack_for_string, '\t'); piece[piece1++] = strdup("<Escape char=\"9\">"); flush(); piece[piece1++] = strdup("</Escape>");
-  \\v   obstack_1grow (&obstack_for_string, '\v'); piece[piece1++] = strdup("<Escape char=\"11\">"); flush(); piece[piece1++] = strdup("</Escape>");
+  \\a   obstack_1grow (&obstack_for_string, '\a'); piece_append("<Escape char=\"7\">"); flush(); piece_append("</Escape>");
+  \\b   obstack_1grow (&obstack_for_string, '\b'); piece_append("<Escape char=\"8\">"); flush(); piece_append("</Escape>");
+  \\f   obstack_1grow (&obstack_for_string, '\f'); piece_append("<Escape char=\"12\">"); flush(); piece_append("</Escape>");
+  \\n   obstack_1grow (&obstack_for_string, '\n'); piece_append("<Escape char=\"10\">"); flush(); piece_append("</Escape>");
+  \\r   obstack_1grow (&obstack_for_string, '\r'); piece_append("<Escape char=\"13\">"); flush(); piece_append("</Escape>");
+  \\t   obstack_1grow (&obstack_for_string, '\t'); piece_append("<Escape char=\"9\">"); flush(); piece_append("</Escape>");
+  \\v   obstack_1grow (&obstack_for_string, '\v'); piece_append("<Escape char=\"11\">"); flush(); piece_append("</Escape>");
 
   /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); sprintf(piece_temp, "<Escape char=\"%d\">", yytext[1]); piece[piece1++] = strdup(piece_temp); flush(); piece[piece1++] = strdup("</Escape>"); 
+  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); sprintf(piece_temp, "<Escape char=\"%d\">", yytext[1]); piece_append(piece_temp); flush(); piece_append("</Escape>"); 
  
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
     int c = convert_ucn_to_byte (yytext);
@@ -688,9 +688,9 @@ eqopt    ([[:space:]]*=)?
  {
       obstack_1grow (&obstack_for_string, c);
   sprintf(piece_temp, "<Escape char=\"%d\">", c);
-  piece[piece1++] = strdup(piece_temp);
+  piece_append(piece_temp);
   flush();
-  piece[piece1++] = strdup("</Escape>"); 
+  piece_append("</Escape>"); 
  }
   }
   \\(.|\n)      {
@@ -716,14 +716,14 @@ eqopt    ([[:space:]]*=)?
 
 <SC_CHARACTER>
 {
-  "'"           STRING_GROW; BEGIN context_state; /*piece[piece1++] = strdup("</Character>");*/
+  "'"           STRING_GROW; BEGIN context_state; /*piece_append("</Character>");*/
   \n            unexpected_newline (token_start, "'");
   <<EOF>>       unexpected_eof (token_start, "'");
 }
 
 <SC_STRING>
 {
-  "\""          STRING_GROW; BEGIN context_state; /*piece[piece1++] = strdup("</String>");*/
+  "\""          STRING_GROW; BEGIN context_state; /*piece_append("</String>");*/
   \n            unexpected_newline (token_start, "\"");
   <<EOF>>       unexpected_eof (token_start, "\"");
 }
@@ -740,7 +740,7 @@ eqopt    ([[:space:]]*=)?
     context_state = YY_START;
     token_start = loc->start;
  /*flush();
- piece[piece1++] = strdup("<Character>");*/
+ piece_append("<Character>");*/
     BEGIN SC_CHARACTER;
   }
   "\"" {
@@ -748,7 +748,7 @@ eqopt    ([[:space:]]*=)?
     context_state = YY_START;
     token_start = loc->start;
  /*flush();
- piece[piece1++] = strdup("<String>");*/
+ piece_append("<String>");*/
     BEGIN SC_STRING;
   }
   "/"{splice}"*" {
@@ -795,7 +795,7 @@ eqopt    ([[:space:]]*=)?
         loc->start = code_start;
         val->code = last_string;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</BracedCode>"); 
+ piece_append("</BracedCode>"); 
         return BRACED_CODE;
       }
   }
@@ -811,7 +811,7 @@ eqopt    ([[:space:]]*=)?
         loc->start = code_start;
         val->code = last_string;
         BEGIN INITIAL;
- piece[piece1++] = strdup("</Predicate>");
+ piece_append("</Predicate>");
         return BRACED_PREDICATE;
       }
     else
@@ -830,7 +830,7 @@ eqopt    ([[:space:]]*=)?
     loc->start = code_start;
     val->code = last_string;
     BEGIN INITIAL;
- piece[piece1++] = strdup("</Prologue>");
+ piece_append("</Prologue>");
     return PROLOGUE;
   }