$NetBSD: patch-ac,v 1.4 2003/01/08 02:36:00 thorpej Exp $

--- libidu/scanners.c.orig	Tue Jan  7 18:24:27 2003
+++ libidu/scanners.c	Tue Jan  7 18:24:29 2003
@@ -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));
@@ -65,8 +78,14 @@
 struct language languages_0[] =
 {
   { "C", parse_args_c, get_token_c, help_me_c },
+  { "C++", parse_args_c, get_token_c, help_me_c },
+  { "cpp", parse_args_c, get_token_c, help_me_c },
+  { "cc", parse_args_c, get_token_c, help_me_c },
   { "asm", parse_args_asm, get_token_asm, help_me_asm },
+  { "S", parse_args_asm, get_token_asm, help_me_asm },
+  { "s", parse_args_asm, get_token_asm, help_me_asm },
   { "text", parse_args_text, get_token_text, help_me_text },
+  { "make", parse_args_text, get_token_text, help_me_text },
 };
 struct language const *languages_N = &languages_0[cardinalityof (languages_0)];
 
@@ -482,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;
 
@@ -501,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')
@@ -520,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;
@@ -530,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
@@ -574,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 != '"')
@@ -662,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
 	{
@@ -868,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;
 
@@ -886,18 +903,25 @@
       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 != '<')
+	  while (c == ' ' || c == '\t')
 	    c = getc (in_FILE);
+	  if (c == '\n' || ISEOF(c))
+	    {
+	      new_line = 1;
+	      goto top;
+	    }
+	  if (c != '"' && c != '<')
+	    goto next;
 	  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);
@@ -906,7 +930,7 @@
 	  || strequ (id_0, "define")
 	  || strequ (id_0, "undef"))
 	goto next;
-      while (c != '\n')
+      while ((c != '\n') && !ISEOF(c))
 	c = getc (in_FILE);
       new_line = 1;
       goto top;
@@ -967,18 +991,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
     {
@@ -989,7 +1013,7 @@
       goto next;
     }
 
-  *id = '\0';
+  APPEND_CHAR('\0');
   for (id = id_0; *id; id++)
     if (ISIGNORE (*id))
       goto next;
@@ -1153,7 +1177,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;
@@ -1170,19 +1193,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
     {
