From 81224ac5ac0406d44b83f2db8412e816a7f077fb Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Sun, 3 Jan 1999 00:53:58 +0000 Subject: [PATCH] Added g_alloca, g_new_a, g_new0_a macros. --- ChangeLog | 5 +++++ ChangeLog.pre-2-0 | 5 +++++ ChangeLog.pre-2-10 | 5 +++++ ChangeLog.pre-2-12 | 5 +++++ ChangeLog.pre-2-2 | 5 +++++ ChangeLog.pre-2-4 | 5 +++++ ChangeLog.pre-2-6 | 5 +++++ ChangeLog.pre-2-8 | 5 +++++ glib.h | 10 ++++++++++ glib/glib.h | 10 ++++++++++ testglib.c | 34 ++++++++++++++++++++++++++++++++++ tests/testglib.c | 34 ++++++++++++++++++++++++++++++++++ 12 files changed, 128 insertions(+) diff --git a/ChangeLog b/ChangeLog index 89dbef1..8d8c211 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 89dbef1..8d8c211 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + Sat Jan 2 16:45:44 EST 1999 Jeff Garzik * testglib.c: Added g_strdup_printf check. diff --git a/glib.h b/glib.h index a716075..46b6142 100644 --- a/glib.h +++ b/glib.h @@ -301,6 +301,16 @@ extern "C" { ((type *) g_realloc (mem, (unsigned) sizeof (type) * (count))) #endif /* __DMALLOC_H__ */ +/* alloca-based counterparts of the above routines */ +#if G_HAVE_ALLOCA +# define g_alloca alloca +# define g_new_a(type, count) \ + ((type *) alloca ((unsigned) sizeof (type) * (count))) +# define g_new0_a(type, count) \ + ((type *) memset (alloca ((unsigned) sizeof (type) * (count)), 0, \ + ((unsigned) sizeof (type) * (count)))) +#endif + #define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ sizeof (type), \ diff --git a/glib/glib.h b/glib/glib.h index a716075..46b6142 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -301,6 +301,16 @@ extern "C" { ((type *) g_realloc (mem, (unsigned) sizeof (type) * (count))) #endif /* __DMALLOC_H__ */ +/* alloca-based counterparts of the above routines */ +#if G_HAVE_ALLOCA +# define g_alloca alloca +# define g_new_a(type, count) \ + ((type *) alloca ((unsigned) sizeof (type) * (count))) +# define g_new0_a(type, count) \ + ((type *) memset (alloca ((unsigned) sizeof (type) * (count)), 0, \ + ((unsigned) sizeof (type) * (count)))) +#endif + #define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ sizeof (type), \ diff --git a/testglib.c b/testglib.c index df87c72..50ec6fb 100644 --- a/testglib.c +++ b/testglib.c @@ -42,6 +42,11 @@ else \ #define GLIB_TEST_STRING "el dorado " #define GLIB_TEST_STRING_5 "el do" +typedef struct { + guint age; + gchar name[40]; +} GlibTestInfo; + static gboolean node_build_string (GNode *node, gpointer data) @@ -294,6 +299,7 @@ main (int argc, GRelation *relation; GTuples *tuples; gint data [1024]; + GlibTestInfo *gti; struct { gchar *filename; gchar *dirname; @@ -905,6 +911,34 @@ main (int argc, g_print ("ok\n"); #ifdef G_HAVE_ALLOCA + g_print ("checking alloca()-based allocation routines..."); + + 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"); + for (i = 0; i < 2; i++) { + for (j = 0; j < 40; j++) + gti[i].name[j] = 'x'; + gti[i].name[39] = 0; + g_assert(strlen(gti[i].name) == 39); + 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_print ("ok\n"); + g_print ("checking alloca()-based string duplication routines..."); g_strdup_a(string, GLIB_TEST_STRING); diff --git a/tests/testglib.c b/tests/testglib.c index df87c72..50ec6fb 100644 --- a/tests/testglib.c +++ b/tests/testglib.c @@ -42,6 +42,11 @@ else \ #define GLIB_TEST_STRING "el dorado " #define GLIB_TEST_STRING_5 "el do" +typedef struct { + guint age; + gchar name[40]; +} GlibTestInfo; + static gboolean node_build_string (GNode *node, gpointer data) @@ -294,6 +299,7 @@ main (int argc, GRelation *relation; GTuples *tuples; gint data [1024]; + GlibTestInfo *gti; struct { gchar *filename; gchar *dirname; @@ -905,6 +911,34 @@ main (int argc, g_print ("ok\n"); #ifdef G_HAVE_ALLOCA + g_print ("checking alloca()-based allocation routines..."); + + 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"); + for (i = 0; i < 2; i++) { + for (j = 0; j < 40; j++) + gti[i].name[j] = 'x'; + gti[i].name[39] = 0; + g_assert(strlen(gti[i].name) == 39); + 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_print ("ok\n"); + g_print ("checking alloca()-based string duplication routines..."); g_strdup_a(string, GLIB_TEST_STRING); -- 2.7.4