From: Tim Janik Date: Mon, 4 Jan 1999 13:49:05 +0000 (+0000) Subject: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros so their X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=72b139a74d0fbc2a8924e81a201020655f084cbd;p=dana%2Fcg-glib.git adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros so their Mon Jan 4 14:38:11 1999 Tim Janik * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros so their arguments get only evaluated once. changed g_strconcat3_a to have the same semantics as g_strconcat, i.e. if a certain argument is NULL, the rest of the parameter list is skipped. * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be able to compile on all systems. added test for g_strconcat() semantics. * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! --- diff --git a/ChangeLog b/ChangeLog index 663aaa6b..19c0e076 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 663aaa6b..19c0e076 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson * Released GLib 1.1.12 diff --git a/glib.h b/glib.h index 46b61425..dc55a9bb 100644 --- a/glib.h +++ b/glib.h @@ -309,7 +309,7 @@ extern "C" { # define g_new0_a(type, count) \ ((type *) memset (alloca ((unsigned) sizeof (type) * (count)), 0, \ ((unsigned) sizeof (type) * (count)))) -#endif +#endif /* G_HAVE_ALLOCA */ #define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ @@ -1469,47 +1469,64 @@ gpointer g_memdup (gconstpointer mem, * All macros take a special first argument: the target gchar* string */ #if G_HAVE_ALLOCA - # define g_strdup_a(newstr,str) G_STMT_START { \ - if ((str) == NULL) (newstr) = NULL; \ - else { \ - const char *__old = (str); \ - char *__new; \ + gchar *__new; \ + const gchar *__old = (str); \ + if (__old) \ + { \ size_t __len = strlen (__old) + 1; \ __new = alloca (__len); \ memcpy (__new, __old, __len); \ - (newstr) = __new; \ } \ + else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - # define g_strndup_a(newstr,str,n) G_STMT_START { \ - if ((str) == NULL) (newstr) = NULL; \ - else { \ - const char *__old = (str); \ - char *__new; \ + gchar *__new; \ + const gchar *__old = (str); \ + if (__old) \ + { \ + guint __n = (n); \ size_t __len = strlen (__old); \ - if (__len > (n)) __len = (n); \ + if (__len > (__n)) \ + __len = (__n); \ __new = alloca (__len + 1); \ memcpy (__new, __old, __len); \ __new[__len] = 0; \ - (newstr) = __new; \ } \ + else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - # define g_strconcat3_a(newstr,str1,str2,str3) G_STMT_START { \ - size_t __len1 = ((str1) == (gchar*)NULL) ? 0 : strlen((str1)); \ - size_t __len2 = ((str2) == (gchar*)NULL) ? 0 : strlen((str2)); \ - size_t __len3 = ((str3) == (gchar*)NULL) ? 0 : strlen((str3)); \ - char *__sptr, *__new = \ - alloca (__len1 + __len2 + __len3 + 1); \ - __sptr = __new; \ - if (__len1){memcpy (__sptr, (str1), __len1); __sptr += __len1;} \ - if (__len2){memcpy (__sptr, (str2), __len2); __sptr += __len2;} \ - if (__len3){memcpy (__sptr, (str3), __len3); __sptr += __len3;} \ - *__sptr = '\0'; \ - (newstr) = __new; \ + const gchar *__str1 = (str1); \ + const gchar *__str2 = (str2); \ + const gchar *__str3 = (str3); \ + gchar *__new; \ + if (__str1) { \ + size_t __len1 = strlen (__str1); \ + if (__str2) { \ + size_t __len2 = strlen (__str2); \ + if (__str3) { \ + size_t __len3 = strlen (__str3); \ + __new = alloca (__len1 + __len2 + __len3 + 1); \ + __new[__len1 + __len2 + __len3] = 0; \ + memcpy (__new + __len1 + __len2, __str3, __len3); \ + } else { \ + __new = alloca (__len1 + __len2 + 1); \ + __new[__len1 + __len2] = 0; \ + } \ + memcpy (__new + __len1, __str2, __len2); \ + } else { \ + __new = alloca (__len1 + 1); \ + __new[__len1] = 0; \ + } \ + memcpy (__new, __str1, __len1); \ + } else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - #endif /* G_HAVE_ALLOCA */ diff --git a/glib/glib.h b/glib/glib.h index 46b61425..dc55a9bb 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -309,7 +309,7 @@ extern "C" { # define g_new0_a(type, count) \ ((type *) memset (alloca ((unsigned) sizeof (type) * (count)), 0, \ ((unsigned) sizeof (type) * (count)))) -#endif +#endif /* G_HAVE_ALLOCA */ #define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ @@ -1469,47 +1469,64 @@ gpointer g_memdup (gconstpointer mem, * All macros take a special first argument: the target gchar* string */ #if G_HAVE_ALLOCA - # define g_strdup_a(newstr,str) G_STMT_START { \ - if ((str) == NULL) (newstr) = NULL; \ - else { \ - const char *__old = (str); \ - char *__new; \ + gchar *__new; \ + const gchar *__old = (str); \ + if (__old) \ + { \ size_t __len = strlen (__old) + 1; \ __new = alloca (__len); \ memcpy (__new, __old, __len); \ - (newstr) = __new; \ } \ + else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - # define g_strndup_a(newstr,str,n) G_STMT_START { \ - if ((str) == NULL) (newstr) = NULL; \ - else { \ - const char *__old = (str); \ - char *__new; \ + gchar *__new; \ + const gchar *__old = (str); \ + if (__old) \ + { \ + guint __n = (n); \ size_t __len = strlen (__old); \ - if (__len > (n)) __len = (n); \ + if (__len > (__n)) \ + __len = (__n); \ __new = alloca (__len + 1); \ memcpy (__new, __old, __len); \ __new[__len] = 0; \ - (newstr) = __new; \ } \ + else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - # define g_strconcat3_a(newstr,str1,str2,str3) G_STMT_START { \ - size_t __len1 = ((str1) == (gchar*)NULL) ? 0 : strlen((str1)); \ - size_t __len2 = ((str2) == (gchar*)NULL) ? 0 : strlen((str2)); \ - size_t __len3 = ((str3) == (gchar*)NULL) ? 0 : strlen((str3)); \ - char *__sptr, *__new = \ - alloca (__len1 + __len2 + __len3 + 1); \ - __sptr = __new; \ - if (__len1){memcpy (__sptr, (str1), __len1); __sptr += __len1;} \ - if (__len2){memcpy (__sptr, (str2), __len2); __sptr += __len2;} \ - if (__len3){memcpy (__sptr, (str3), __len3); __sptr += __len3;} \ - *__sptr = '\0'; \ - (newstr) = __new; \ + const gchar *__str1 = (str1); \ + const gchar *__str2 = (str2); \ + const gchar *__str3 = (str3); \ + gchar *__new; \ + if (__str1) { \ + size_t __len1 = strlen (__str1); \ + if (__str2) { \ + size_t __len2 = strlen (__str2); \ + if (__str3) { \ + size_t __len3 = strlen (__str3); \ + __new = alloca (__len1 + __len2 + __len3 + 1); \ + __new[__len1 + __len2 + __len3] = 0; \ + memcpy (__new + __len1 + __len2, __str3, __len3); \ + } else { \ + __new = alloca (__len1 + __len2 + 1); \ + __new[__len1 + __len2] = 0; \ + } \ + memcpy (__new + __len1, __str2, __len2); \ + } else { \ + __new = alloca (__len1 + 1); \ + __new[__len1] = 0; \ + } \ + memcpy (__new, __str1, __len1); \ + } else \ + __new = NULL; \ + (newstr) = __new; \ } G_STMT_END - #endif /* G_HAVE_ALLOCA */ diff --git a/tests/alloca-test.c b/tests/alloca-test.c index 0f019619..0d1b02f7 100644 --- a/tests/alloca-test.c +++ b/tests/alloca-test.c @@ -34,18 +34,17 @@ int main (int argc, char *argv[]) { -#ifdef G_HAVE_ALLOCA gchar *string; GlibTestInfo *gti; gint i, j; - + string = g_alloca(80); g_assert(string != NULL); for (i = 0; i < 80; i++) string[i] = 'x'; string[79] = 0; g_assert(strlen(string) == 79); - + gti = g_new_a(GlibTestInfo, 2); string = g_alloca(2); strcpy(string, "x"); @@ -57,34 +56,33 @@ main (int argc, gti[i].age = 42; } g_assert(strcmp(string, "x") == 0); - + string = g_new0_a(char, 40); for (i = 0; i < 39; i++) string[i] = 'x'; g_assert(strlen(string) == 39); - + g_strdup_a(string, GLIB_TEST_STRING); g_assert(string != NULL); g_assert(strcmp(string, GLIB_TEST_STRING) == 0); g_strdup_a(string, NULL); g_assert(string == NULL); - + g_strndup_a(string, GLIB_TEST_STRING, 5); g_assert(string != NULL); g_assert(strlen(string) == 5); g_assert(strcmp(string, GLIB_TEST_STRING_5) == 0); g_strndup_a(string, NULL, 20); g_assert(string == NULL); - + g_strconcat3_a(string, GLIB_TEST_STRING, GLIB_TEST_STRING, GLIB_TEST_STRING); g_assert(string != NULL); g_assert(strcmp(string, GLIB_TEST_STRING GLIB_TEST_STRING - GLIB_TEST_STRING) == 0); - -#else - exit(77); /* tell automake test was skipped */ -#endif - + GLIB_TEST_STRING) == 0); + g_strconcat3_a (string, "1", NULL, "2"); + g_assert (strcmp (string, "1") == 0); + + return 0; }