diff options
author | Sebastian Wilhelmi <wilhelmi@ira.uka.de> | 2000-07-20 16:58:54 +0000 |
---|---|---|
committer | Sebastian Wilhelmi <wilhelmi@src.gnome.org> | 2000-07-20 16:58:54 +0000 |
commit | fec9828ac62918374fb8aa94e15a9bdf554e269e (patch) | |
tree | 7f327de3ead1d7355b5fa6144d6e264afb34e4e9 /glib | |
parent | 84114c5321e4d7e4701f77f7f0e2b9b739d4035c (diff) | |
download | glib-fec9828ac62918374fb8aa94e15a9bdf554e269e.tar.gz |
Mark the functions g_basename and g_dirname deprecated. They will issue an
2000-07-20 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gutils.c, glib.h: Mark the functions g_basename and g_dirname
deprecated. They will issue an warning once, when compiled with
G_ENABLE_DEBUG, but continue to work as before. Instead the
functions g_path_get_basename and g_path_get_dirname should be
used, which BOTH return newly allocated memory, that has to freed
by g_free. The new g_path_get_basename now strips trailing slashes
from the path. This fixes #5097. For discussion see
http://mail.gnome.org/pipermail/gtk-devel-list/2000-April/003139.html
* gwin32.c, testglib.c, tests/dirname-test.c: Use the new
functions instead of the old ones.
* gmodule/libgplugin_a.c, gmodule/testgmodule.c: Use
g_path_get_basename instead of the deprecated g_basename.
Diffstat (limited to 'glib')
-rw-r--r-- | glib/glib.h | 11 | ||||
-rw-r--r-- | glib/gutils.c | 75 | ||||
-rw-r--r-- | glib/gwin32.c | 8 |
3 files changed, 90 insertions, 4 deletions
diff --git a/glib/glib.h b/glib/glib.h index 732aa0485..fdfb68773 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -1701,15 +1701,22 @@ gint g_vsnprintf (gchar *string, gulong n, gchar const *format, va_list args); -gchar* g_basename (const gchar *file_name); /* Check if a file name is an absolute path */ gboolean g_path_is_absolute (const gchar *file_name); /* In case of absolute paths, skip the root part */ gchar* g_path_skip_root (gchar *file_name); -/* strings are newly allocated with g_malloc() */ +/* These two functions are deprecated and will be removed in the next + * major release of GLib. Use g_path_get_dirname/g_path_get_basename + * instead. Whatch out! The string returned by g_path_get_basename + * must be g_freed, while the string returned by g_basename must not.*/ +gchar* g_basename (const gchar *file_name); gchar* g_dirname (const gchar *file_name); + +/* The returned strings are newly allocated with g_malloc() */ gchar* g_get_current_dir (void); +gchar* g_path_get_basename (const gchar *file_name); +gchar* g_path_get_dirname (const gchar *file_name); /* Get the codeset for the current locale */ /* gchar * g_get_codeset (void); */ diff --git a/glib/gutils.c b/glib/gutils.c index c9f2c2805..794f4ea69 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -278,6 +278,17 @@ gchar* g_basename (const gchar *file_name) { register gchar *base; +#ifdef G_ENABLE_DEBUG + static gboolean first_call = TRUE; + + if (first_call) + { + g_warning("g_basename is deprecated. Use g_path_get_basename instead."); + g_warning("Watch out! You have to g_free the string returned by " + "g_path_get_basename."); + first_call = FALSE; + } +#endif /* G_ENABLE_DEBUG */ g_return_val_if_fail (file_name != NULL, NULL); @@ -293,6 +304,52 @@ g_basename (const gchar *file_name) return (gchar*) file_name; } +gchar* +g_path_get_basename (const gchar *file_name) +{ + register gint base; + register gint last_nonslash; + guint len; + gchar *retval; + + g_return_val_if_fail (file_name != NULL, NULL); + + if (file_name[0] == '\0') + /* empty string */ + return g_strdup ("."); + + last_nonslash = strlen (file_name) - 1; + + while (last_nonslash >= 0 && file_name [last_nonslash] == G_DIR_SEPARATOR) + last_nonslash--; + + if (last_nonslash == -1) + /* string only containing slashes */ + return g_strdup (G_DIR_SEPARATOR_S); + +#ifdef G_OS_WIN32 + if (last_nonslash == 1 && isalpha (file_name[0]) && file_name[1] == ':') + /* string only containing slashes and a drive */ + return g_strdup (G_DIR_SEPARATOR_S); +#endif /* G_OS_WIN32 */ + + base = last_nonslash; + + while (base >=0 && file_name [base] != G_DIR_SEPARATOR) + base--; + +#ifdef G_OS_WIN32 + if (base == -1 && isalpha (file_name[0]) && file_name[1] == ':') + base = 1; +#endif /* G_OS_WIN32 */ + + len = last_nonslash - base; + retval = g_malloc (len + 1); + memcpy (retval, file_name + base + 1, len); + retval [len] = '\0'; + return retval; +} + gboolean g_path_is_absolute (const gchar *file_name) { @@ -326,7 +383,7 @@ g_path_skip_root (gchar *file_name) } gchar* -g_dirname (const gchar *file_name) +g_path_get_dirname (const gchar *file_name) { register gchar *base; register guint len; @@ -348,6 +405,22 @@ g_dirname (const gchar *file_name) } gchar* +g_dirname (const gchar *file_name) +{ +#ifdef G_ENABLE_DEBUG + static gboolean first_call = TRUE; + + if (first_call) + { + g_warning("g_dirname is deprecated. Use g_path_get_dirname instead."); + first_call = FALSE; + } +#endif /* G_ENABLE_DEBUG */ + + return g_path_get_dirname (file_name); +} + +gchar* g_get_current_dir (void) { gchar *buffer = NULL; diff --git a/glib/gwin32.c b/glib/gwin32.c index b5e2d8007..9fdd417dc 100644 --- a/glib/gwin32.c +++ b/glib/gwin32.c @@ -131,6 +131,7 @@ struct dirent* g_win32_readdir (DIR *dir) { static struct dirent result; + gchar *basename; g_return_val_if_fail (dir != NULL, NULL); @@ -153,7 +154,12 @@ g_win32_readdir (DIR *dir) } } } - strcpy (result.d_name, g_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName)); + + basename = g_path_get_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName); + + strcpy (result.d_name, basename); + + g_free (basename); return &result; } |