From acc1c38efe2decbd924cf9f4844d6fb3d86fcc4b Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Tue, 14 Jul 1998 07:39:07 +0000 Subject: [PATCH] new fuction g_dirname() which returns a newlly allocated string. Tue Jul 14 09:05:18 1998 Tim Janik * glib.h: * gutils.c: new fuction g_dirname() which returns a newlly allocated string. --- ChangeLog | 6 ++++++ ChangeLog.pre-2-0 | 6 ++++++ ChangeLog.pre-2-10 | 6 ++++++ ChangeLog.pre-2-12 | 6 ++++++ ChangeLog.pre-2-2 | 6 ++++++ ChangeLog.pre-2-4 | 6 ++++++ ChangeLog.pre-2-6 | 6 ++++++ ChangeLog.pre-2-8 | 6 ++++++ glib.h | 1 + glib/glib.h | 1 + glib/gutils.c | 22 ++++++++++++++++++++++ gutils.c | 22 ++++++++++++++++++++++ testglib.c | 37 +++++++++++++++++++++++++++++++++++++ tests/testglib.c | 37 +++++++++++++++++++++++++++++++++++++ 14 files changed, 168 insertions(+) diff --git a/ChangeLog b/ChangeLog index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 79ae63b2..4f8b43f1 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: diff --git a/glib.h b/glib.h index 4ff637ac..ee81a619 100644 --- a/glib.h +++ b/glib.h @@ -840,6 +840,7 @@ gint g_snprintf (gchar *string, ...) G_GNUC_PRINTF (3, 4); gchar* g_basename (const gchar *file_name); gchar* g_getcwd (void); +gchar* g_dirname (const gchar *file_name); /* We make the assumption that if memmove isn't available, then diff --git a/glib/glib.h b/glib/glib.h index 4ff637ac..ee81a619 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -840,6 +840,7 @@ gint g_snprintf (gchar *string, ...) G_GNUC_PRINTF (3, 4); gchar* g_basename (const gchar *file_name); gchar* g_getcwd (void); +gchar* g_dirname (const gchar *file_name); /* We make the assumption that if memmove isn't available, then diff --git a/glib/gutils.c b/glib/gutils.c index 6aac98fd..80e2ddb3 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -127,6 +127,28 @@ g_basename (const gchar *file_name) return (gchar*) file_name; } +gchar* +g_dirname (const gchar *file_name) +{ + register gchar *base; + register guint len; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, '/'); + if (!base) + return g_strdup ("."); + while (base > file_name && *base == '/') + base--; + len = (guint) 1 + base - file_name; + + base = g_new (gchar, len + 1); + g_memmove (base, file_name, len); + base[len] = 0; + + return base; +} + gchar* g_getcwd (void) { diff --git a/gutils.c b/gutils.c index 6aac98fd..80e2ddb3 100644 --- a/gutils.c +++ b/gutils.c @@ -127,6 +127,28 @@ g_basename (const gchar *file_name) return (gchar*) file_name; } +gchar* +g_dirname (const gchar *file_name) +{ + register gchar *base; + register guint len; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, '/'); + if (!base) + return g_strdup ("."); + while (base > file_name && *base == '/') + base--; + len = (guint) 1 + base - file_name; + + base = g_new (gchar, len + 1); + g_memmove (base, file_name, len); + base[len] = 0; + + return base; +} + gchar* g_getcwd (void) { diff --git a/testglib.c b/testglib.c index 818e49d0..d89e7638 100644 --- a/testglib.c +++ b/testglib.c @@ -112,11 +112,48 @@ main (int argc, GRelation *relation; GTuples *tuples; gint data [1024]; + struct { + gchar *filename; + gchar *dirname; + } dirname_checks[] = { + { "/", "/" }, + { "////", "/" }, + { ".////", "." }, + { ".", "." }, + { "..", "." }, + { "../", ".." }, + { "..////", ".." }, + { "", "." }, + { "a/b", "a" }, + { "a/b/", "a/b" }, + { "c///", "c" }, + }; + guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]); + g_print ("checking size of gint8...%ld (should be 1)\n", (glong)sizeof (gint8)); g_print ("checking size of gint16...%ld (should be 2)\n", (glong)sizeof (gint16)); g_print ("checking size of gint32...%ld (should be 4)\n", (glong)sizeof (gint32)); + g_print ("checking g_dirname()..."); + for (i = 0; i < n_dirname_checks; i++) + { + gchar *dirname; + + dirname = g_dirname (dirname_checks[i].filename); + if (strcmp (dirname, dirname_checks[i].dirname) != 0) + { + g_print ("failed for \"%s\"==\"%s\" (returned: \"%s\")\n", + dirname_checks[i].filename, + dirname_checks[i].dirname, + dirname); + n_dirname_checks = 0; + } + g_free (dirname); + } + if (n_dirname_checks) + g_print ("ok\n"); + g_print ("checking doubly linked lists..."); list = NULL; diff --git a/tests/testglib.c b/tests/testglib.c index 818e49d0..d89e7638 100644 --- a/tests/testglib.c +++ b/tests/testglib.c @@ -112,11 +112,48 @@ main (int argc, GRelation *relation; GTuples *tuples; gint data [1024]; + struct { + gchar *filename; + gchar *dirname; + } dirname_checks[] = { + { "/", "/" }, + { "////", "/" }, + { ".////", "." }, + { ".", "." }, + { "..", "." }, + { "../", ".." }, + { "..////", ".." }, + { "", "." }, + { "a/b", "a" }, + { "a/b/", "a/b" }, + { "c///", "c" }, + }; + guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]); + g_print ("checking size of gint8...%ld (should be 1)\n", (glong)sizeof (gint8)); g_print ("checking size of gint16...%ld (should be 2)\n", (glong)sizeof (gint16)); g_print ("checking size of gint32...%ld (should be 4)\n", (glong)sizeof (gint32)); + g_print ("checking g_dirname()..."); + for (i = 0; i < n_dirname_checks; i++) + { + gchar *dirname; + + dirname = g_dirname (dirname_checks[i].filename); + if (strcmp (dirname, dirname_checks[i].dirname) != 0) + { + g_print ("failed for \"%s\"==\"%s\" (returned: \"%s\")\n", + dirname_checks[i].filename, + dirname_checks[i].dirname, + dirname); + n_dirname_checks = 0; + } + g_free (dirname); + } + if (n_dirname_checks) + g_print ("ok\n"); + g_print ("checking doubly linked lists..."); list = NULL; -- 2.34.1