]> granicus.if.org Git - postgis/commitdiff
Refactor the memory management routines to account for the fact that variadic functio...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Tue, 23 Sep 2008 19:44:57 +0000 (19:44 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Tue, 23 Sep 2008 19:44:57 +0000 (19:44 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@2995 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/lwutil.c
liblwgeom/vsprintf.c
lwgeom/lwgeom_functions_analytic.c
lwgeom/lwgeom_pg.c
lwgeom/lwgeom_pg.h

index e2992a7ee87ccdaf0c41f2879de1ebf93fb62b08..5e3a532be58a40cf732b14634cf95192f83ab4c9 100644 (file)
@@ -2,8 +2,8 @@
 #define _LIBLWGEOM_H 1
 
 #include "../postgis_config.h"
+#include <stdarg.h>
 #include <stdio.h>
-/* #include "compat.h" */
 
 #define INTEGRITY_CHECKS 1
 
@@ -30,7 +30,10 @@ extern void lwgeom_install_default_allocators(void);
 typedef void* (*lwallocator)(size_t size);
 typedef void* (*lwreallocator)(void *mem, size_t size);
 typedef void (*lwfreeor)(void* mem);
-typedef void (*lwreporter)(const char* fmt, ...);
+typedef void (*lwreporter)(const char* fmt, va_list ap);
+
+void lwnotice(const char *fmt, ...);
+void lwerror(const char *fmt, ...);
 
 #ifndef C_H
 
@@ -52,15 +55,17 @@ typedef int int32;
 void *default_allocator(size_t size);
 void *default_reallocator(void *mem, size_t size);
 void default_freeor(void *ptr);
-void default_errorreporter(const char *fmt, ...);
-void default_noticereporter(const char *fmt, ...);
+void default_errorreporter(const char *fmt, va_list ap);
+void default_noticereporter(const char *fmt, va_list ap);
 
 /* globals */
 extern lwreallocator lwrealloc_var;
 extern lwallocator lwalloc_var;
 extern lwfreeor lwfree_var;
-extern lwreporter lwerror;
-extern lwreporter lwnotice;
+extern lwreporter lwerror_var;
+extern lwreporter lwnotice_var;
+
+extern int lw_vasprintf (char **result, const char *format, va_list args);
 
 /* Debug macros */
 #if POSTGIS_DEBUG_LEVEL > 0
index 95206089cc08f7fecd1d8a03d10bb66053da600f..be991acd73fcf440493e3dc112bf5b7557b56b52 100644 (file)
 void *init_allocator(size_t size);
 void init_freeor(void *mem);
 void *init_reallocator(void *mem, size_t size);
-void init_noticereporter(const char *fmt, ...);
-void init_errorreporter(const char *fmt, ...);
+void init_noticereporter(const char *fmt, va_list ap);
+void init_errorreporter(const char *fmt, va_list ap);
 
 lwallocator lwalloc_var = init_allocator;
 lwreallocator lwrealloc_var = init_reallocator;
 lwfreeor lwfree_var = init_freeor;
-lwreporter lwerror = init_errorreporter;
-lwreporter lwnotice = init_noticereporter;
+lwreporter lwnotice_var = init_noticereporter;
+lwreporter lwerror_var = init_errorreporter;
 
 static char *lwgeomTypeName[] = {
        "Unknown",
@@ -40,6 +40,40 @@ static char *lwgeomTypeName[] = {
 };
 
 
+/*
+ * lwnotice/lwerror handlers
+ *
+ * Since variadic functions cannot pass their parameters directly, we need
+ * wrappers for these functions to convert the arguments into a va_list
+ * structure.
+ */
+
+void
+lwnotice(const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+
+       /* Call the supplied function */
+       (*lwnotice_var)(fmt, ap);
+
+       va_end(ap);
+}
+
+void
+lwerror(const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+
+       /* Call the supplied function */
+       (*lwerror_var)(fmt, ap);
+
+       va_end(ap);
+}
+
 /*
  * Initialisation allocators
  *
@@ -75,27 +109,19 @@ init_reallocator(void *mem, size_t size)
 }
 
 void
-init_noticereporter(const char *fmt, ...)
+init_noticereporter(const char *fmt, va_list ap)
 {
-       va_list ap;
-
        lwgeom_init_allocators();
 
-       va_start(ap, fmt);
-       lwnotice(fmt, ap);
-       va_end(ap);
+       (*lwnotice_var)(fmt, ap);
 }
        
 void
-init_errorreporter(const char *fmt, ...)
+init_errorreporter(const char *fmt, va_list ap)
 {
-       va_list ap;
-
        lwgeom_init_allocators();
 
-       va_start(ap, fmt);
-       lwerror(fmt, ap);
-       va_end(ap);
+       (*lwerror_var)(fmt, ap);
 }
 
 
@@ -128,46 +154,38 @@ default_reallocator(void *mem, size_t size)
 }
 
 void
-default_noticereporter(const char *fmt, ...)
+default_noticereporter(const char *fmt, va_list ap)
 {
        char *msg;
-       va_list ap;
-
-       va_start (ap, fmt);
 
        /*
         * This is a GNU extension.
         * Dunno how to handle errors here.
         */
-       if (!vasprintf (&msg, fmt, ap))
+       if (!lw_vasprintf (&msg, fmt, ap))
        {
                va_end (ap);
                return;
        }
        printf("%s\n", msg);
-       va_end(ap);
        free(msg);
 }
 
 void
-default_errorreporter(const char *fmt, ...)
+default_errorreporter(const char *fmt, va_list ap)
 {
        char *msg;
-       va_list ap;
-
-       va_start (ap, fmt);
 
        /*
         * This is a GNU extension.
         * Dunno how to handle errors here.
         */
-       if (!vasprintf (&msg, fmt, ap))
+       if (!lw_vasprintf (&msg, fmt, ap))
        {
                va_end (ap);
                return;
        }
        fprintf(stderr, "%s\n", msg);
-       va_end(ap);
        free(msg);
        exit(1);
 }
@@ -183,8 +201,8 @@ void lwgeom_install_default_allocators(void)
        lwalloc_var = default_allocator;
        lwrealloc_var = default_reallocator;
        lwfree_var = default_freeor;
-       lwerror = default_errorreporter;        
-       lwnotice = default_noticereporter;
+       lwerror_var = default_errorreporter;    
+       lwnotice_var = default_noticereporter;
 }
  
 
index ded821490e1060b020847a68e3e826e7dd80e14a..a183b5fb284850ccd6005f8544c3bc8f44e91ec6 100644 (file)
@@ -36,6 +36,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 int global_total_width;
 #endif
 
+
+int lw_vasprintf (char **result, const char *format, va_list args);
+int lw_asprintf
+#if __STDC__
+     (char **result, const char *format, ...);
+#else
+     (result, va_alist);
+     char **result;
+     va_dcl
+#endif
+
+
 static int
 int_vasprintf (result, format, args)
      char **result;
@@ -127,16 +139,16 @@ int_vasprintf (result, format, args)
 }
 
 int
-vasprintf (result, format, args)
+lw_vasprintf (result, format, args)
      char **result;
      const char *format;
      va_list args;
 {
-  return int_vasprintf (result, format, &args);
+  return int_vasprintf (result, format, args);
 }
 
 int
-asprintf
+lw_asprintf
 #if __STDC__
      (char **result, const char *format, ...)
 #else
@@ -155,7 +167,7 @@ asprintf
   va_start (args);
   format = va_arg (args, char *);
 #endif
-  done = vasprintf (result, format, args);
+  done = lw_vasprintf (result, format, args);
   va_end (args);
 
   return done;
index e28416fdef180d33e373119eda6e6cdf01c85ceb..48884719f3b1612ff4200d8e07f92dadfec45161 100644 (file)
@@ -505,7 +505,7 @@ Datum LWGEOM_snaptogrid(PG_FUNCTION_ARGS);
 Datum LWGEOM_snaptogrid_pointoff(PG_FUNCTION_ARGS);
 static int grid_isNull(const gridspec *grid);
 #if POSTGIS_DEBUG_LEVEL > 0 
-static void grid_print(const gridspec *grid, lwreporter printer);
+static void grid_print(const gridspec *grid);
 #endif
 
 /* A NULL grid is a grid in which size in all dimensions is 0 */
@@ -522,9 +522,9 @@ grid_isNull(const gridspec *grid)
 #if POSTGIS_DEBUG_LEVEL > 0 
 /* Print grid using given reporter */
 static void
-grid_print(const gridspec *grid, lwreporter printer)
+grid_print(const gridspec *grid)
 {
-       printer("GRID(%g %g %g %g, %g %g %g %g)",
+       lwnotice("GRID(%g %g %g %g, %g %g %g %g)",
                grid->ipx, grid->ipy, grid->ipz, grid->ipm,
                grid->xsize, grid->ysize, grid->zsize, grid->msize);
 }
@@ -869,7 +869,7 @@ Datum LWGEOM_snaptogrid_pointoff(PG_FUNCTION_ARGS)
        else grid.ipm=0;
 
 #if POSTGIS_DEBUG_LEVEL >= 4 
-       grid_print(&grid, lwnotice);
+       grid_print(&grid);
 #endif
 
        /* Return input geometry if grid is null */
index 4b8bb95467c00ec85a0525b019520ca51fe3cdb0..8afe0969d74fa6233163c1500b8286bbd207e575 100644 (file)
@@ -59,40 +59,33 @@ pg_free(void *ptr)
 }
 
 void
-pg_error(const char *fmt, ...)
+pg_error(const char *fmt, va_list ap)
 {
 #define ERRMSG_MAXLEN 256
 
        char errmsg[ERRMSG_MAXLEN+1];
-       va_list ap;
 
-       va_start (ap, fmt);
        vsnprintf (errmsg, ERRMSG_MAXLEN, fmt, ap);
-       va_end (ap);
 
        errmsg[ERRMSG_MAXLEN]='\0';
        ereport(ERROR, (errmsg_internal("%s", errmsg)));
 }
 
 void
-pg_notice(const char *fmt, ...)
+pg_notice(const char *fmt, va_list ap)
 {
        char *msg;
-       va_list ap;
-
-       va_start (ap, fmt);
 
        /*
         * This is a GNU extension.
         * Dunno how to handle errors here.
         */
-       if (!vasprintf (&msg, fmt, ap))
+       if (!lw_vasprintf (&msg, fmt, ap))
        {
                va_end (ap);
                return;
        }
        ereport(NOTICE, (errmsg_internal("%s", msg)));
-       va_end(ap);
        free(msg);
 }
 
@@ -103,8 +96,8 @@ lwgeom_init_allocators(void)
        lwalloc_var = pg_alloc;
        lwrealloc_var = pg_realloc;
        lwfree_var = pg_free;
-       lwerror = pg_error;
-       lwnotice = pg_notice;
+       lwerror_var = pg_error;
+       lwnotice_var = pg_notice;
 }
 
 PG_LWGEOM *
index b6aa9a46404581abea24c46d88e23b64c786e76d..ce8f19f94828472f6b5b34b26cd14a986aace48e 100644 (file)
@@ -11,8 +11,8 @@
 void *pg_alloc(size_t size);
 void *pg_realloc(void *ptr, size_t size);
 void pg_free(void *ptr);
-void pg_error(const char *msg, ...);
-void pg_notice(const char *msg, ...);
+void pg_error(const char *msg, va_list vp);
+void pg_notice(const char *msg, va_list vp);
 
 
 /* Debugging macros */