2007-10-08 Carlos O'Donell <carlos@codesourcery.com>
authorCarlos O'Donell <carlos@codesourcery.com>
Mon, 8 Oct 2007 13:50:18 +0000 (13:50 +0000)
committerCarlos O'Donell <carlos@codesourcery.com>
Mon, 8 Oct 2007 13:50:18 +0000 (13:50 +0000)
* resrc.c (read_rc_file): Rename e to edit, and c to dir.
Pass dir to windres_add_include_dir.  Add comments.
(close_input_stream): Check pclose error, and call fatal if
the preprocessor failed.
* windres.c (windres_add_include_dir): Assert that p is non-NULL,
and not an empty string.

binutils/resrc.c
binutils/windres.c

index a621319c5920ead17e931cf842fd86c0ca181d8f..8a5900bdc489bc86041cfd5898b3a3ee733ea8d7 100644 (file)
@@ -441,30 +441,37 @@ read_rc_file (const char *filename, const char *preprocessor,
   /* Setup the default resource import path taken from input file.  */
   else if (strchr (filename, '/') != NULL || strchr (filename, '\\') != NULL)
     {
-      char *e, *c;
+      char *edit, *dir;
 
       if (filename[0] == '/'
          || filename[0] == '\\'
          || filename[1] == ':')
-       e = c = xstrdup (filename);
+        /* Absolute path.  */
+       edit = dir = xstrdup (filename);
       else
        {
-         e = c = xmalloc (strlen (filename) + 3);
-         sprintf (c, "./%s", filename);
+         /* Relative path.  */
+         edit = dir = xmalloc (strlen (filename) + 3);
+         sprintf (dir, "./%s", filename);
        }
-      e += strlen (c);
-      while (e > c && (e[-1] != '\\' && e[-1] != '/'))
+
+      /* Walk dir backwards stopping at the first directory separator.  */
+      edit += strlen (dir);
+      while (edit > dir && (edit[-1] != '\\' && edit[-1] != '/'))
        {
-         --e;
-         e[0] = 0;
+         --edit;
+         edit[0] = 0;
        }
+
       /* Cut off trailing slash.  */
-      --e;
-      e[0] = 0;
-      while ((e = strchr (c, '\\')) != NULL)
-       *e = '/';
+      --edit;
+      edit[0] = 0;
 
-      windres_add_include_dir (e);
+      /* Convert all back slashes to forward slashes.  */
+      while ((edit = strchr (dir, '\\')) != NULL)
+       *edit = '/';
+
+      windres_add_include_dir (dir);
     }
 
   istream_type = (use_temp_file) ? ISTREAM_FILE : ISTREAM_PIPE;
@@ -588,7 +595,19 @@ close_input_stream (void)
   else
     {
       if (cpp_pipe != NULL)
-       pclose (cpp_pipe);
+        {
+         int err;
+         err = pclose (cpp_pipe);
+         /* We are reading from a pipe, therefore we don't
+             know if cpp failed or succeeded until pclose.  */
+         if (err != 0 || errno == ECHILD)
+           {
+             /* Since this is also run via xatexit, safeguard.  */
+             cpp_pipe = NULL;
+             cpp_temp_file = NULL;
+             fatal (_("preprocessing failed."));
+           }
+        }
     }
 
   /* Since this is also run via xatexit, safeguard.  */
index ac643ad59a01eeed8633951c3a7ee0ae6fbf0e9f..a4b466c5a5c9026b59439cbdcb7e9f7091dd702a 100644 (file)
@@ -765,6 +765,12 @@ windres_add_include_dir (const char *p)
 {
   struct include_dir *n, **pp;
 
+  /* Computing paths is often complicated and error prone.
+     The easiest way to check for mistakes is at the time
+     we add them to include_dirs.  */
+  assert (p != NULL);
+  assert (*p != '\0');
+
   n = xmalloc (sizeof *n);
   n->next = NULL;
   n->dir = (char * ) p;