Adapt GDB integration to newest patches
[bpt/guile.git] / libguile / load.c
index a68d96d..74f3bb4 100644 (file)
@@ -402,24 +402,24 @@ SCM scm_listofnullstr;
 /* Utility functions for assembling C strings in a buffer.
  */
 
-struct stringbuf {
+struct stringbuf
+{
   char *buf, *ptr;
   size_t buf_len;
 };
 
-static void
-stringbuf_free (void *data)
-{
-  struct stringbuf *buf = (struct stringbuf *)data;
-  free (buf->buf);
-}
-
 static void
 stringbuf_grow (struct stringbuf *buf)
 {
-  size_t ptroff = buf->ptr - buf->buf;
-  buf->buf_len *= 2; 
-  buf->buf = scm_realloc (buf->buf, buf->buf_len);
+  size_t ptroff, prev_len;
+  void *prev_buf = buf->buf;
+
+  prev_len = buf->buf_len;
+  ptroff = buf->ptr - buf->buf;
+
+  buf->buf_len *= 2;
+  buf->buf = scm_gc_malloc_pointerless (buf->buf_len, "search-path");
+  memcpy (buf->buf, prev_buf, prev_len);
   buf->ptr = buf->buf + ptroff;
 }
 
@@ -469,23 +469,22 @@ stringbuf_cat (struct stringbuf *buf, char *str)
     }
 }
 
-  
+/* Return non-zero if STR is suffixed by a dot followed by one of
+   EXTENSIONS.  */
 static int
-scm_c_string_has_an_ext (char *str, size_t len, SCM extensions)
+string_has_an_ext (SCM str, SCM extensions)
 {
   for (; !scm_is_null (extensions); extensions = SCM_CDR (extensions))
     {
-      char *ext;
-      size_t extlen;
-      int match;
-      ext = scm_to_locale_string (SCM_CAR (extensions));
-      extlen = strlen (ext);
-      match = (len > extlen && str[len - extlen - 1] == '.'
-               && strncmp (str + (len - extlen), ext, extlen) == 0);
-      free (ext);
-      if (match)
-        return 1;
+      SCM extension;
+
+      extension = SCM_CAR (extensions);
+      if (scm_is_true (scm_string_suffix_p (extension, str,
+                                           SCM_UNDEFINED, SCM_UNDEFINED,
+                                           SCM_UNDEFINED, SCM_UNDEFINED)))
+       return 1;
     }
+
   return 0;
 }
 
@@ -557,6 +556,7 @@ search_path (SCM path, SCM filename, SCM extensions, SCM require_exts,
   char *filename_chars;
   size_t filename_len;
   SCM result = SCM_BOOL_F;
+  char initial_buffer[256];
 
   if (scm_ilength (path) < 0)
     scm_misc_error ("%search-path", "path is not a proper list: ~a",
@@ -575,8 +575,7 @@ search_path (SCM path, SCM filename, SCM extensions, SCM require_exts,
   if (is_absolute_file_name (filename))
     {
       if ((scm_is_false (require_exts) ||
-           scm_c_string_has_an_ext (filename_chars, filename_len,
-                                    extensions))
+           string_has_an_ext (filename, extensions))
           && stat (filename_chars, stat_buf) == 0
           && !(stat_buf->st_mode & S_IFDIR))
         result = filename;
@@ -594,8 +593,7 @@ search_path (SCM path, SCM filename, SCM extensions, SCM require_exts,
        if (*endp == '.')
          {
             if (scm_is_true (require_exts) &&
-                !scm_c_string_has_an_ext (filename_chars, filename_len,
-                                          extensions))
+                !string_has_an_ext (filename, extensions))
               {
                 /* This filename has an extension, but not one of the right
                    ones... */
@@ -618,9 +616,8 @@ search_path (SCM path, SCM filename, SCM extensions, SCM require_exts,
   if (scm_is_null (extensions))
     extensions = scm_listofnullstr;
 
-  buf.buf_len = 512;
-  buf.buf = scm_malloc (buf.buf_len);
-  scm_dynwind_unwind_handler (stringbuf_free, &buf, SCM_F_WIND_EXPLICITLY);
+  buf.buf_len = sizeof initial_buffer;
+  buf.buf = initial_buffer;
 
   /* Try every path element.
    */