Bootstrapped and regtested on x86_64-linux-gnu. Ok for trunk?

fixincludes/

        * fixfixes.c (print_quote): Define it unconditionally, taking
          and returning const char *.
          (machine_name_fix): Output quoted strings verbatim.
---
 fixincludes/fixfixes.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/fixincludes/fixfixes.c b/fixincludes/fixfixes.c
index 5b23a8b640d..2f4ee28a897 100644
--- a/fixincludes/fixfixes.c
+++ b/fixincludes/fixfixes.c
@@ -78,15 +78,14 @@ static void fix (const char* filname ATTRIBUTE_UNUSED , \
                  const char* text ATTRIBUTE_UNUSED , \
                  tFixDesc* p_fixd ATTRIBUTE_UNUSED )
 
-#ifdef NEED_PRINT_QUOTE
 /*
  *  Skip over a quoted string.  Single quote strings may
  *  contain multiple characters if the first character is
  *  a backslash.  Especially a backslash followed by octal digits.
  *  We are not doing a correctness syntax check here.
  */
-static char*
-print_quote(char q, char* text )
+static const char*
+print_quote(char q, const char* text )
 {
   fputc( q, stdout );
 
@@ -118,7 +117,6 @@ print_quote(char q, char* text )
 
   return text;
 }
-#endif /* NEED_PRINT_QUOTE */
 
 
 /*
@@ -488,7 +486,7 @@ FIX_PROC_HEAD( char_macro_def_fix )
 FIX_PROC_HEAD( machine_name_fix )
 {
   regmatch_t match[2];
-  const char *line, *base, *limit, *p, *q;
+  const char *line, *base, *limit, *p, *q, *quote;
   regex_t *label_re, *name_re;
   char scratch[SCRATCHSZ];
   size_t len;
@@ -533,7 +531,7 @@ FIX_PROC_HEAD( machine_name_fix )
       for (;;)
         {
         again:
-          if (base == limit)
+          if (base >= limit)
             break;
 
           if (xregexec (name_re, base, 1, match, REG_NOTBOL))
@@ -543,6 +541,26 @@ FIX_PROC_HEAD( machine_name_fix )
           if (match[0].rm_eo > limit - base)
             break;
 
+          /* Looking for the next non-escaped quote in the line.  */
+          quote = base - 1;
+          do
+            {
+              quote++;
+              quote = strpbrk (quote, "'\"");
+              if (quote && quote > limit)
+                quote = NULL;
+            }
+          while (quote && quote[-1] == '\\');
+
+          if (quote && match[0].rm_eo > quote - base)
+            {
+              /* Match is after the quote: print the quoted string and
+                 everything before it verbatim.  */
+              fwrite (text, 1, quote - text, stdout);
+              base = text = print_quote (*quote, quote + 1);
+              goto again;
+            }
+
           p = base + match[0].rm_so;
           base += match[0].rm_eo;
 
-- 
2.32.0


Reply via email to