adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros so their
authorTim Janik <timj@gtk.org>
Mon, 4 Jan 1999 13:49:05 +0000 (13:49 +0000)
committerTim Janik <timj@src.gnome.org>
Mon, 4 Jan 1999 13:49:05 +0000 (13:49 +0000)
Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>

        * 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!

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib.h
glib/glib.h
tests/alloca-test.c

index 663aaa6..19c0e07 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
index 663aaa6..19c0e07 100644 (file)
@@ -1,3 +1,15 @@
+Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>
+
+       * 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 <amundson@gtk.org>
 
         * Released GLib 1.1.12 
diff --git a/glib.h b/glib.h
index 46b6142..dc55a9b 100644 (file)
--- 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 */
 
 
index 46b6142..dc55a9b 100644 (file)
@@ -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 */
 
 
index 0f01961..0d1b02f 100644 (file)
@@ -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;
 }