]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libiberty/make-relative-prefix.c
libiberty: documentation markup and order fixes.
[thirdparty/gcc.git] / libiberty / make-relative-prefix.c
index 037809e34edfabbf5288ece771676e227b64a098..4553a7109d8244ec0ad572f6d5f415e7927824cf 100644 (file)
@@ -21,7 +21,8 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
 
 /*
 
-@deftypefn Extension {const char*} make_relative_prefix (const char *@var{progname}, const char *@var{bin_prefix}, const char *@var{prefix})
+@deftypefn Extension {const char*} make_relative_prefix (const char *@var{progname}, @
+  const char *@var{bin_prefix}, const char *@var{prefix})
 
 Given three paths @var{progname}, @var{bin_prefix}, @var{prefix},
 return the path that is in the same position relative to
@@ -201,10 +202,13 @@ free_split_directories (char **dirs)
 {
   int i = 0;
 
-  while (dirs[i] != NULL)
-    free (dirs[i++]);
+  if (dirs != NULL)
+    {
+      while (dirs[i] != NULL)
+       free (dirs[i++]);
 
-  free ((char *) dirs);
+      free ((char *) dirs);
+    }
 }
 
 /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
@@ -221,11 +225,11 @@ static char *
 make_relative_prefix_1 (const char *progname, const char *bin_prefix,
                        const char *prefix, const int resolve_links)
 {
-  char **prog_dirs, **bin_dirs, **prefix_dirs;
+  char **prog_dirs = NULL, **bin_dirs = NULL, **prefix_dirs = NULL;
   int prog_num, bin_num, prefix_num;
   int i, n, common;
   int needed_len;
-  char *ret, *ptr, *full_progname = NULL;
+  char *ret = NULL, *ptr, *full_progname;
 
   if (progname == NULL || bin_prefix == NULL || prefix == NULL)
     return NULL;
@@ -289,21 +293,22 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
        }
     }
 
-  if ( resolve_links )
-    {
-      full_progname = lrealpath (progname);
-      if (full_progname == NULL)
-       return NULL;
-    }
+  if (resolve_links)
+    full_progname = lrealpath (progname);
   else
-    full_progname = strdup(progname);
+    full_progname = strdup (progname);
+  if (full_progname == NULL)
+    return NULL;
 
   prog_dirs = split_directories (full_progname, &prog_num);
-  bin_dirs = split_directories (bin_prefix, &bin_num);
   free (full_progname);
-  if (bin_dirs == NULL || prog_dirs == NULL)
+  if (prog_dirs == NULL)
     return NULL;
 
+  bin_dirs = split_directories (bin_prefix, &bin_num);
+  if (bin_dirs == NULL)
+    goto bailout;
+
   /* Remove the program name from comparison of directory names.  */
   prog_num--;
 
@@ -320,21 +325,12 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
        }
 
       if (prog_num <= 0 || i == bin_num)
-       {
-         free_split_directories (prog_dirs);
-         free_split_directories (bin_dirs);
-         prog_dirs = bin_dirs = (char **) 0;
-         return NULL;
-       }
+       goto bailout;
     }
 
   prefix_dirs = split_directories (prefix, &prefix_num);
   if (prefix_dirs == NULL)
-    {
-      free_split_directories (prog_dirs);
-      free_split_directories (bin_dirs);
-      return NULL;
-    }
+    goto bailout;
 
   /* Find how many directories are in common between bin_prefix & prefix.  */
   n = (prefix_num < bin_num) ? prefix_num : bin_num;
@@ -346,12 +342,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
 
   /* If there are no common directories, there can be no relative prefix.  */
   if (common == 0)
-    {
-      free_split_directories (prog_dirs);
-      free_split_directories (bin_dirs);
-      free_split_directories (prefix_dirs);
-      return NULL;
-    }
+    goto bailout;
 
   /* Two passes: first figure out the size of the result string, and
      then construct it.  */
@@ -365,7 +356,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
 
   ret = (char *) malloc (needed_len);
   if (ret == NULL)
-    return NULL;
+    goto bailout;
 
   /* Build up the pathnames in argv[0].  */
   *ret = '\0';
@@ -386,6 +377,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix,
   for (i = common; i < prefix_num; i++)
     strcat (ret, prefix_dirs[i]);
 
+ bailout:
   free_split_directories (prog_dirs);
   free_split_directories (bin_dirs);
   free_split_directories (prefix_dirs);