Cope with NUL seperated directives. Fix reporting of unparseable directives.
authorNick Clifton <nickc@redhat.com>
Fri, 27 Jun 2003 08:10:57 +0000 (08:10 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 27 Jun 2003 08:10:57 +0000 (08:10 +0000)
ld/ChangeLog
ld/deffilep.y

index 37a9e49e7243e376d5e9a7be07d0f94be655a800..1d6ed6714a09cc7143226d9d890332e1c4e73f78 100644 (file)
@@ -1,3 +1,9 @@
+2003-06-27  Nick Clifton  <nickc@redhat.com>
+
+       * deffilep.y (def_file_add_directive): Cope with NUL seperated
+       directives.  Fix reporting of unparseable directives.
+       (def_error): Check for a NULL def_filename.
+
 2003-06-27  Alan Modra  <amodra@bigpond.net.au>
 
        * emultempl/aix.em: Convert to C90, remove unnecessary prototypes
index 45b1bda6f43a936f4cf6176eeeaae4d94e76ec52..fba1c2e6fbc615539781e1286edb11b4cfab5244 100644 (file)
@@ -601,18 +601,26 @@ def_file_add_directive (my_def, param, len)
 {
   def_file *save_def = def;
   const char *pend = param + len;
-  const char *tend = param;
+  char * tend = (char *) param;
   int i;
 
   def = my_def;
 
   while (param < pend)
     {
-      while (param < pend && ISSPACE (*param))
+      while (param < pend && (ISSPACE (*param) || * param == '\n' || * param == 0))
        param++;
 
-      for (tend = param + 1;
-          tend < pend && !(ISSPACE (tend[-1]) && *tend == '-');
+      if (param == pend)
+       break;
+
+      /* Scan forward until we encounter any of:
+          - the end of the buffer
+         - the start of a new option
+         - a newline seperating options
+          - a NUL seperating options.  */
+      for (tend = (char *) (param + 1);
+          tend < pend && !(ISSPACE (tend[-1]) && *tend == '-') && (*tend != '\n') && (*tend != 0);
           tend++)
        ;
 
@@ -628,15 +636,22 @@ def_file_add_directive (my_def, param, len)
              lex_parse_string = param + len + 1;
              lex_forced_token = diropts[i].token;
              saw_newline = 0;
-             def_parse ();
+             if (def_parse ())
+               continue;
              break;
            }
        }
 
       if (!diropts[i].param)
-       /* xgettext:c-format */
-       einfo (_("Warning: .drectve `%.*s' unrecognized\n"),
-              tend - param, param);
+       {
+         char saved;
+
+         saved = * tend;
+         * tend = 0;
+         /* xgettext:c-format */
+         einfo (_("Warning: .drectve `%s' unrecognized\n"), param);
+         * tend = saved;
+       }
 
       lex_parse_string = 0;
       param = tend;
@@ -843,7 +858,7 @@ static int
 def_error (err)
      const char *err;
 {
-  einfo ("%P: %s:%d: %s\n", def_filename, linenumber, err);
+  einfo ("%P: %s:%d: %s\n", def_filename ? def_filename : "<unknown-file>", linenumber, err);
 
   return 0;
 }