Fix assembler segfault on gcc/crtstuff.c file.
[deliverable/binutils-gdb.git] / gas / depend.c
index fcb150040473a0cbb39ad12a92df45f8b6424736..05a970809c48088badeed42bd6723bf81f454535 100644 (file)
@@ -1,5 +1,5 @@
 /* depend.c - Handle dependency tracking.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -23,8 +23,7 @@
 /* The file to write to, or NULL if no dependencies being kept.  */
 static char *dep_file = NULL;
 
-struct dependency
-{
+struct dependency {
   char *file;
   struct dependency *next;
 };
@@ -35,13 +34,12 @@ static struct dependency *dep_chain = NULL;
 /* Current column in output file.  */
 static int column = 0;
 
+static int quote_string_for_make PARAMS ((FILE *, char *));
 static void wrap_output PARAMS ((FILE *, char *, int));
 
 /* Number of columns allowable.  */
 #define MAX_COLUMNS 72
-
 \f
-
 /* Start saving dependencies, to be written to FILENAME.  If this is
    never called, then dependency tracking is simply skipped.  */
 
@@ -65,7 +63,7 @@ register_dependency (filename)
 
   for (dep = dep_chain; dep != NULL; dep = dep->next)
     {
-      if (! strcmp (filename, dep->file))
+      if (!strcmp (filename, dep->file))
        return;
     }
 
@@ -75,6 +73,70 @@ register_dependency (filename)
   dep_chain = dep;
 }
 
+/* Quote a file name the way `make' wants it, and print it to FILE.
+   If FILE is NULL, do no printing, but return the length of the
+   quoted string.
+
+   This code is taken from gcc with only minor changes.  */
+
+static int
+quote_string_for_make (file, src)
+     FILE *file;
+     char *src;
+{
+  char *p = src;
+  int i = 0;
+  for (;;)
+    {
+      char c = *p++;
+      switch (c)
+       {
+       case '\0':
+       case ' ':
+       case '\t':
+         {
+           /* GNU make uses a weird quoting scheme for white space.
+              A space or tab preceded by 2N+1 backslashes represents
+              N backslashes followed by space; a space or tab
+              preceded by 2N backslashes represents N backslashes at
+              the end of a file name; and backslashes in other
+              contexts should not be doubled.  */
+           char *q;
+           for (q = p - 1; src < q && q[-1] == '\\'; q--)
+             {
+               if (file)
+                 putc ('\\', file);
+               i++;
+             }
+         }
+         if (!c)
+           return i;
+         if (file)
+           putc ('\\', file);
+         i++;
+         goto ordinary_char;
+
+       case '$':
+         if (file)
+           putc (c, file);
+         i++;
+         /* Fall through.  This can mishandle things like "$(" but
+            there's no easy fix.  */
+       default:
+       ordinary_char:
+         /* This can mishandle characters in the string "\0\n%*?[\\~";
+            exactly which chars are mishandled depends on the `make' version.
+            We know of no portable solution for this;
+            even GNU make 3.76.1 doesn't solve the problem entirely.
+            (Also, '\0' is mishandled due to our calling conventions.)  */
+         if (file)
+           putc (c, file);
+         i++;
+         break;
+       }
+    }
+}
+
 /* Append some output to the file, keeping track of columns and doing
    wrapping as necessary.  */
 
@@ -84,12 +146,16 @@ wrap_output (f, string, spacer)
      char *string;
      int spacer;
 {
-  int len = strlen (string);
+  int len = quote_string_for_make (NULL, string);
 
   if (len == 0)
     return;
 
-  if (column && MAX_COLUMNS - 1 /*spacer*/ - 2 /*` \'*/ < column + len)
+  if (column
+      && (MAX_COLUMNS
+         - 1 /* spacer */
+         - 2 /* ` \'   */
+         < column + len))
     {
       fprintf (f, " \\\n ");
       column = 0;
@@ -103,7 +169,7 @@ wrap_output (f, string, spacer)
       ++column;
     }
 
-  fputs (string, f);
+  quote_string_for_make (f, string);
   column += len;
 
   if (spacer == ':')
@@ -127,7 +193,7 @@ print_dependencies ()
   f = fopen (dep_file, "w");
   if (f == NULL)
     {
-      as_warn ("Can't open `%s' for writing", dep_file);
+      as_warn (_("Can't open `%s' for writing"), dep_file);
       return;
     }
 
@@ -139,5 +205,5 @@ print_dependencies ()
   putc ('\n', f);
 
   if (fclose (f))
-    as_warn ("Can't close %s", dep_file);
+    as_warn (_("Can't close `%s'"), dep_file);
 }
This page took 0.025859 seconds and 4 git commands to generate.