Factor out the code to do the datadir-relocation for gdbinit
authorChristian Biesinger <cbiesinger@google.com>
Tue, 20 Aug 2019 21:38:29 +0000 (16:38 -0500)
committerChristian Biesinger <cbiesinger@google.com>
Wed, 11 Sep 2019 21:30:00 +0000 (16:30 -0500)
This simplifies get_init_files and makes it possible to reuse
this code in an upcoming patch for SYSTEM_GDBINIT_DIR.

gdb/ChangeLog:

2019-09-11  Christian Biesinger  <cbiesinger@google.com>

* main.c (relocate_gdbinit_path_maybe_in_datadir): Factor this code
out of get_init_files.
(get_init_files): Update.

gdb/ChangeLog
gdb/main.c

index 27eae1d400b3c3d61e8bb6a1c2fc88127131c1d6..91b860c78a3ffb38544faaf3d2a116f23e54736c 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-11  Christian Biesinger  <cbiesinger@google.com>
+
+       * main.c (relocate_gdbinit_path_maybe_in_datadir): Factor this code
+       out of get_init_files.
+       (get_init_files): Update.
+
 2019-09-11  Christian Biesinger  <cbiesinger@google.com>
 
        * main.c (get_init_files): Change to use std::string.
index e32ed6227023c108137f13435cba703766e92078..9e2288959016930b71321630cf6ab66533003cf2 100644 (file)
@@ -191,6 +191,47 @@ relocate_gdb_directory (const char *initial, bool relocatable)
   return dir;
 }
 
+/* Given a gdbinit path in FILE, adjusts it according to the gdb_datadir
+   parameter if it is in the data dir, or passes it through relocate_path
+   otherwise.  */
+
+static std::string
+relocate_gdbinit_path_maybe_in_datadir (const std::string& file)
+{
+  size_t datadir_len = strlen (GDB_DATADIR);
+
+  std::string relocated_path;
+
+  /* If SYSTEM_GDBINIT lives in data-directory, and data-directory
+     has been provided, search for SYSTEM_GDBINIT there.  */
+  if (gdb_datadir_provided
+      && datadir_len < file.length ()
+      && filename_ncmp (file.c_str (), GDB_DATADIR, datadir_len) == 0
+      && IS_DIR_SEPARATOR (file[datadir_len]))
+    {
+      /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR
+        to gdb_datadir.  */
+
+      size_t start = datadir_len;
+      for (; IS_DIR_SEPARATOR (file[start]); ++start)
+       ;
+      relocated_path = (std::string (gdb_datadir) + SLASH_STRING
+                       + file.substr (start));
+    }
+  else
+    {
+      char *relocated = relocate_path (gdb_program_name,
+                                      file.c_str (),
+                                      SYSTEM_GDBINIT_RELOCATABLE);
+      if (relocated != nullptr)
+       {
+         relocated_path = relocated;
+         xfree (relocated);
+       }
+    }
+    return relocated_path;
+}
+
 /* Compute the locations of init files that GDB should source and
    return them in SYSTEM_GDBINIT, HOME_GDBINIT, LOCAL_GDBINIT.  If
    there is no system gdbinit (resp. home gdbinit and local gdbinit)
@@ -212,37 +253,8 @@ get_init_files (std::string *system_gdbinit,
 
       if (SYSTEM_GDBINIT[0])
        {
-         size_t datadir_len = strlen (GDB_DATADIR);
-         size_t sys_gdbinit_len = strlen (SYSTEM_GDBINIT);
-         std::string relocated_sysgdbinit;
-
-         /* If SYSTEM_GDBINIT lives in data-directory, and data-directory
-            has been provided, search for SYSTEM_GDBINIT there.  */
-         if (gdb_datadir_provided
-             && datadir_len < sys_gdbinit_len
-             && filename_ncmp (SYSTEM_GDBINIT, GDB_DATADIR, datadir_len) == 0
-             && IS_DIR_SEPARATOR (SYSTEM_GDBINIT[datadir_len]))
-           {
-             /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR
-                to gdb_datadir.  */
-
-             size_t start = datadir_len;
-             for (; IS_DIR_SEPARATOR (SYSTEM_GDBINIT[start]); ++start)
-               ;
-             relocated_sysgdbinit = (std::string (gdb_datadir) + SLASH_STRING
-                                     + &SYSTEM_GDBINIT[start]);
-           }
-         else
-           {
-             char *relocated = relocate_path (gdb_program_name,
-                                              SYSTEM_GDBINIT,
-                                              SYSTEM_GDBINIT_RELOCATABLE);
-             if (relocated != nullptr)
-               {
-                 relocated_sysgdbinit = relocated;
-                 xfree (relocated);
-               }
-           }
+         std::string relocated_sysgdbinit
+           = relocate_gdbinit_path_maybe_in_datadir (SYSTEM_GDBINIT);
          if (!relocated_sysgdbinit.empty ()
              && stat (relocated_sysgdbinit.c_str (), &s) == 0)
            sysgdbinit = relocated_sysgdbinit;