#define _LIBLWGEOM_H 1
#include "../postgis_config.h"
+#include <stdarg.h>
#include <stdio.h>
-/* #include "compat.h" */
#define INTEGRITY_CHECKS 1
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
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
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",
};
+/*
+ * 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
*
}
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);
}
}
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);
}
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;
}
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;
}
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
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;
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 */
#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);
}
else grid.ipm=0;
#if POSTGIS_DEBUG_LEVEL >= 4
- grid_print(&grid, lwnotice);
+ grid_print(&grid);
#endif
/* Return input geometry if grid is null */
}
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);
}
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 *
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 */