$NetBSD: patch-aq,v 1.1 2002/04/03 16:26:58 joda Exp $

--- libidu/scanners.c~	Wed Apr  3 14:29:42 2002
+++ libidu/scanners.c	Wed Apr  3 14:37:59 2002
@@ -44,6 +44,19 @@
 extern void usage __P((void));
 extern char *program_name;
 
+static char *id_0;
+static size_t id_0_len;
+#define APPEND_CHAR(C)  do {				\
+    if(id_0 == NULL || id == id_0 + id_0_len) {		\
+	size_t __pos = id_0 ? id - id_0 : 0;		\
+	id_0 = xrealloc(id_0, id_0_len + BUFSIZ);	\
+	id_0_len += BUFSIZ;				\
+	id = id_0 + __pos;				\
+    }							\
+    *id++ = (C);					\
+    } while(0);
+
+
 /****************************************************************************/
 
 struct lang_args **parse_language_map_file __P((char const *file_name, struct lang_args **next_ptr));
@@ -488,7 +501,6 @@
 #define ARGS ((struct args_c const *) args)
   static int new_line = 1;
   unsigned short const *rct = &ARGS->ctype[1];
-  char id_0[BUFSIZ];
   char *id = id_0;
   int c;
 
@@ -507,10 +519,10 @@
       if (!ISID1ST (c))
 	goto next;
       id = id_0;
-      *id++ = c;
+      APPEND_CHAR(c);
       while (ISIDREST (c = getc (in_FILE)))
-	*id++ = c;
-      *id = '\0';
+	APPEND_CHAR(c);
+      APPEND_CHAR('\0');
       if (strequ (id_0, "include"))
 	{
 	  while (c == ' ' || c == '\t')
@@ -526,7 +538,7 @@
 	      c = getc (in_FILE);
 	      while (c != '\n' && c != EOF && c != '"')
 		{
-		  *id++ = c;
+		  APPEND_CHAR(c);
 		  c = getc (in_FILE);
 		}
 	      *flags = TOK_STRING;
@@ -536,16 +548,16 @@
 	      c = getc (in_FILE);
 	      while (c != '\n' && c != EOF && c != '>')
 		{
-		  *id++ = c;
+		  APPEND_CHAR(c);
 		  c = getc (in_FILE);
 		}
 	      *flags = TOK_STRING;
 	    }
 	  else if (ISID1ST (c))
 	    {
-	      *id++ = c;
+	      APPEND_CHAR(c);
 	      while (ISIDREST (c = getc (in_FILE)))
-		*id++ = c;
+		APPEND_CHAR(c);
 	      *flags = TOK_NAME;
 	    }
 	  else
@@ -580,14 +592,14 @@
     {
     case '"':
       id = id_0;
-      *id++ = c = getc (in_FILE);
+      APPEND_CHAR(c = getc (in_FILE));
       for (;;)
 	{
 	  while (ISQ2BORING (c))
-	    *id++ = c = getc (in_FILE);
+	    APPEND_CHAR(c = getc (in_FILE));
 	  if (c == '\\')
 	    {
-	      *id++ = c = getc (in_FILE);
+	      APPEND_CHAR(c = getc (in_FILE));
 	      continue;
 	    }
 	  else if (c != '"')
@@ -668,18 +680,18 @@
 	  return 0;
 	}
       id = id_0;
-      *id++ = c;
+      APPEND_CHAR(c);
       if (ISID1ST (c))
 	{
 	  *flags = TOK_NAME;
 	  while (ISIDREST (c = getc (in_FILE)))
-	    *id++ = c;
+	    APPEND_CHAR(c);
 	}
       else if (ISDIGIT (c))
 	{
 	  *flags = TOK_NUMBER;
 	  while (ISNUMBER (c = getc (in_FILE)))
-	    *id++ = c;
+	    APPEND_CHAR(c);
 	}
       else
 	{
@@ -874,7 +886,6 @@
 #define ARGS ((struct args_asm const *) args)
   static int new_line = 1;
   unsigned char const *rct = &ARGS->ctype[1];
-  char id_0[BUFSIZ];
   char *id = id_0;
   int c;
 
@@ -892,18 +903,18 @@
       if (!ISID1ST (c))
 	goto next;
       id = id_0;
-      *id++ = c;
+      APPEND_CHAR(c);
       while (ISIDREST (c = getc (in_FILE)))
-	*id++ = c;
-      *id = '\0';
+	APPEND_CHAR(c);
+      APPEND_CHAR('\0');
       if (strequ (id_0, "include"))
 	{
 	  while (c != '"' && c != '<')
 	    c = getc (in_FILE);
 	  id = id_0;
-	  *id++ = c = getc (in_FILE);
+	  APPEND_CHAR(c = getc (in_FILE));
 	  while ((c = getc (in_FILE)) != '"' && c != '>')
-	    *id++ = c;
+	    APPEND_CHAR(c);
 	  *flags = TOK_STRING;
 	  obstack_grow0 (&tokens_obstack, id_0, id - id_0);
 	  return (struct token *) obstack_finish (&tokens_obstack);
@@ -973,18 +984,18 @@
       obstack_grow0 (&tokens_obstack, "_", 1);
       return (struct token *) obstack_finish (&tokens_obstack);
     }
-  *id++ = c;
+  APPEND_CHAR(c);
   if (ISID1ST (c))
     {
       *flags = TOK_NAME;
       while (ISIDREST (c = getc (in_FILE)))
-	*id++ = c;
+	APPEND_CHAR(c);
     }
   else if (ISNUMBER (c))
     {
       *flags = TOK_NUMBER;
       while (ISNUMBER (c = getc (in_FILE)))
-	*id++ = c;
+	APPEND_CHAR(c);
     }
   else
     {
@@ -995,7 +1006,7 @@
       goto next;
     }
 
-  *id = '\0';
+  APPEND_CHAR('\0');
   for (id = id_0; *id; id++)
     if (ISIGNORE (*id))
       goto next;
@@ -1159,7 +1170,6 @@
 get_token_text (FILE *in_FILE, void const *args, int *flags)
 {
 #define ARGS ((struct args_text const *) args)
-  static char id_0[BUFSIZ];
   unsigned char const *rct = &ARGS->ctype[1];
   int c;
   char *id = id_0;
@@ -1176,19 +1186,19 @@
       return 0;
     }
   id = id_0;
-  *id++ = c;
+  APPEND_CHAR(c);
   if (ISID1ST (c))
     {
       *flags = TOK_NAME;
       while (ISIDREST (c = getc (in_FILE)))
 	if (!ISIDSQUEEZE (c))
-	  *id++ = c;
+	  APPEND_CHAR(c);
     }
   else if (ISNUMBER (c))
     {
       *flags = TOK_NUMBER;
       while (ISNUMBER (c = getc (in_FILE)))
-	*id++ = c;
+	APPEND_CHAR(c);
     }
   else
     {
