Fix for bug #711240: dynamic buffer handling of C literal strings in stringLiteral()
authorborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 28 Mar 2003 19:40:38 +0000 (19:40 +0000)
committerborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 28 Mar 2003 19:40:38 +0000 (19:40 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2427 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCC.lex

index 722dc3dfb60ce957a23c396e137ecbb611ecb961..af77ad749541b8a5814fa4cde47e123c1c8c915f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-03-28  Borut Razem <borut.razem@siol.net>
+
+       * src/SDCC.lex: Fix for bug #711240: dynamic buffer handling of C
+          literal strings in stringLiteral()
+       * support/Util/dbuf.c, support/Util/dbuf.h: added: dynamic buffer handling
+       * src/Makefile.bcc, src/Makefile.in, src\src.dsp: added support/Util/dbuf.c
+          to the project
+
 2003-03-27  Paul Stoffregen <paul@pjrc.com>
 
        * src/SDCCpeeph.c (pcDistance): accurate byte distance for mcs51
index edd1ee5dabcc6dd032800e0dc13ec2dfa17b730a..87ea7762a79846a8c2fb6a175e27bde3d9eaee80 100644 (file)
@@ -35,7 +35,8 @@ IS       (u|U|l|L)*
 #include <ctype.h>
 #include "common.h"
 #include "newalloc.h"
-    
+#include "dbuf.h"
+
 char *stringLiteral();
 char *currFname;
 
@@ -334,91 +335,93 @@ int check_type()
        }
 }
 
-char strLitBuff[2048]; // TODO: this is asking for the next bug :)
-
 /*
  * Change by JTV 2001-05-19 to not concantenate strings
  * to support ANSI hex and octal escape sequences in string liteals 
  */
 
-char *stringLiteral () {
+char *stringLiteral()
+{
+#define STR_BUF_CHUNCK_LEN  1024
   int ch;
-  char *str = strLitBuff;
-  
-  *str++ = '\"';
+  static struct dbuf_s dbuf;
+  char buf[2];
+
+  if (dbuf.alloc == 0)
+    dbuf_init(&dbuf, STR_BUF_CHUNCK_LEN);
+  else
+    dbuf_set_size(&dbuf, 0);
+
+
+  dbuf_append(&dbuf, "\"", 1);
   /* put into the buffer till we hit the first \" */
-  
-  while (1) {
-    ch = input();
-    
-    if (!ch)
-      break; /* end of input */
-    
-    /* if it is a \ then escape char's are allowed */
-    if (ch == '\\') {
-      ch=input();
-      if (ch=='\n') {
-       /* \<newline> is a continuator */
-       lineno=++yylineno;
-       column=0;
-       continue;
+
+  while ((ch = input()) != 0) {
+    switch (ch) {
+    case '\\':
+      /* if it is a \ then escape char's are allowed */
+      ch = input();
+      if (ch == '\n') {
+        /* \<newline> is a continuator */
+        lineno = ++yylineno;
+        column = 0;
       }
-      *str++ = '\\'; /* backslash in place */
-      *str++ = ch; /* get the escape char, no further check */
-      continue; /* carry on */
-    }
-    
-    /* if new line we have a new line break, which is illegal */
-    if (ch == '\n') {
-      werror (W_NEWLINE_IN_STRING);
-      *str++ = '\n';
-      lineno=++yylineno;
-      column=0;
-      continue;
-    }
-    
-    /* if this is a quote then we have work to do */
-    /* find the next non whitespace character     */
-    /* if that is a double quote then carry on    */
-    if (ch == '\"') {
-      *str++  = ch ; /* Pass end of this string or substring to evaluator */
+      else {
+        buf[0] = '\\';
+        buf[1] = ch;
+        dbuf_append(&dbuf, buf, 2); /* get the escape char, no further check */
+      }
+      break; /* carry on */
+
+    case '\n':
+      /* if new line we have a new line break, which is illegal */
+      werror(W_NEWLINE_IN_STRING);
+      dbuf_append(&dbuf, "\n", 1);
+      lineno = ++yylineno;
+      column = 0;
+      break;
+
+    case '"':
+      /* if this is a quote then we have work to do */
+      /* find the next non whitespace character     */
+      /* if that is a double quote then carry on    */
+      dbuf_append(&dbuf, "\"", 1);  /* Pass end of this string or substring to evaluator */
       while ((ch = input()) && (isspace(ch) || ch=='\\')) {
-       switch (ch) {
-       case '\\':
-         if ((ch=input())!='\n') {
-           werror (W_STRAY_BACKSLASH, column);
-           unput(ch);
-         } else {
-           lineno=++yylineno;
-           column=0;
-         }
-         break;
-       case '\n':
-         yylineno++;
-         break;
-       }
+        switch (ch) {
+        case '\\':
+          if ((ch = input()) != '\n') {
+            werror(W_STRAY_BACKSLASH, column);
+            unput(ch);
+          }
+          else {
+            lineno = ++yylineno;
+            column = 0;
+          }
+          break;
+
+        case '\n':
+          yylineno++;
+          break;
+        }
       }
 
       if (!ch) 
-       break; 
+        goto out;
 
       if (ch != '\"') {
-       unput(ch) ;
-       break ;
+        unput(ch) ;
+        goto out;
       }
+      break;
+
+    default:
+      buf[0] = ch;
+      dbuf_append(&dbuf, buf, 1);  /* Put next substring introducer into output string */
     }
-    *str++  = ch; /* Put next substring introducer into output string */
-  }  
-  *str = '\0';
-  
-  /* If we aren't going to fix it, at least trap it. */
-  if (strlen(strLitBuff) >= sizeof(strLitBuff))
-  {
-       fprintf(stderr, "Internal error: strLitBuff overflowed.\n");
-       exit(-1);
   }
-  
-  return strLitBuff;
+
+out:
+  return (char *)dbuf_c_str(&dbuf);
 }
 
 void doPragma (int op, char *cp)