[postgis-commits] svn - r3023 - in trunk: liblwgeom lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Sun Sep 28 08:32:47 PDT 2008
Author: mcayland
Date: 2008-09-28 08:32:46 -0700 (Sun, 28 Sep 2008)
New Revision: 3023
Modified:
trunk/liblwgeom/liblwgeom.h
trunk/liblwgeom/lwgeom.c
trunk/liblwgeom/lwgparse.c
trunk/liblwgeom/wktparse.h
trunk/lwgeom/lwgeom_inout.c
trunk/lwgeom/lwgeom_ogc.c
trunk/lwgeom/lwgeom_pg.c
Log:
Update (E)WKT/WKB parser to return a structure (LWGEOM_PARSER_RESULT) instead of just the serialized lwgeom. This is in preparation for returning more detailed error information back to the caller.
Modified: trunk/liblwgeom/liblwgeom.h
===================================================================
--- trunk/liblwgeom/liblwgeom.h 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/liblwgeom.h 2008-09-28 15:32:46 UTC (rev 3023)
@@ -1128,7 +1128,15 @@
#define PARSER_CHECK_NONE 0
#define PARSER_CHECK_ALL (PARSER_CHECK_MINPOINTS | PARSER_CHECK_ODD | PARSER_CHECK_CLOSURE)
+/*
+ * Parser result structure: returns the result of attempting to convert (E)WKT/(E)WKB to LWGEOM
+ */
+typedef struct struct_lwgeom_parser_result
+{
+ SERIALIZED_LWGEOM *serialized_lwgeom;
+} LWGEOM_PARSER_RESULT;
+
/* Parser access routines */
extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags);
extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder);
@@ -1136,7 +1144,7 @@
extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *ewkblen);
extern char *serialized_lwgeom_to_ewkt(uchar *serialized, int flags);
-extern SERIALIZED_LWGEOM *serialized_lwgeom_from_ewkt(char *wkt_input, int flags);
+extern int serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags);
extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size);
extern char *serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size);
Modified: trunk/liblwgeom/lwgeom.c
===================================================================
--- trunk/liblwgeom/lwgeom.c 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/lwgeom.c 2008-09-28 15:32:46 UTC (rev 3023)
@@ -513,8 +513,10 @@
size_t hexewkblen = size*2;
char *hexewkb;
long int i;
+ int result;
LWGEOM *ret;
SERIALIZED_LWGEOM *serialized_lwgeom;
+ LWGEOM_PARSER_RESULT lwg_parser_result;
/* "HEXify" the EWKB */
hexewkb = lwalloc(hexewkblen+1);
@@ -522,7 +524,7 @@
hexewkb[hexewkblen] = '\0';
/* Rely on grammar parser to construct a LWGEOM */
- serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags);
+ result = serialized_lwgeom_from_ewkt(&lwg_parser_result, hexewkb, flags);
/* Free intermediate HEXified representation */
lwfree(hexewkb);
@@ -542,22 +544,16 @@
/*
* Make a serialzed LWGEOM object from a WKT input string
*/
-SERIALIZED_LWGEOM *
-serialized_lwgeom_from_ewkt(char *wkt_input, int flags)
+int
+serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags)
{
- SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input, flags,
+
+ int result = parse_lwg(lwg_parser_result, wkt_input, flags,
lwalloc, lwerror);
-
LWDEBUGF(2, "serialized_lwgeom_from_ewkt with %s",wkt_input);
- if (serialized_form == NULL)
- {
- lwerror("serialized_lwgeom_from_ewkt:: couldnt parse!");
- return NULL;
- }
-
- return serialized_form;
+ return result;
}
/*
Modified: trunk/liblwgeom/lwgparse.c
===================================================================
--- trunk/liblwgeom/lwgparse.c 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/lwgparse.c 2008-09-28 15:32:46 UTC (rev 3023)
@@ -169,9 +169,9 @@
void read_collection(const char **b, read_col_func f);
void parse_wkb(const char **b);
void alloc_wkb(const char *parser);
-SERIALIZED_LWGEOM* parse_it(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
-SERIALIZED_LWGEOM* parse_lwg(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
-SERIALIZED_LWGEOM* parse_lwgi(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
void
set_srid(double d_srid)
@@ -1126,8 +1126,8 @@
/*
Parse a string and return a LW_GEOM
*/
-SERIALIZED_LWGEOM *
-parse_it(const char *geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char *geometry, int flags, allocator allocfunc, report_error errfunc)
{
LWDEBUGF(2, "parse_it: %s with parser flags %d", geometry, flags);
@@ -1136,8 +1136,9 @@
ferror_occured = 0;
- /* Setup the inital parser flags */
+ /* Setup the inital parser flags and empty the return struct */
parser_check_flags = flags;
+ lwg_parser_result->serialized_lwgeom = NULL;
init_parser(geometry);
@@ -1146,23 +1147,26 @@
close_parser();
if (ferror_occured)
- return NULL;
+ return 0;
- return make_serialized_lwgeom();
+ /* Return the parsed geometry */
+ lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom();
+
+ return -1;
}
-SERIALIZED_LWGEOM *
-parse_lwg(const char* geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc)
{
the_geom.lwgi=0;
- return parse_it(geometry, flags, allocfunc, errfunc);
+ return parse_it(lwg_parser_result, geometry, flags, allocfunc, errfunc);
}
-SERIALIZED_LWGEOM *
-parse_lwgi(const char* geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc)
{
the_geom.lwgi=1;
- return parse_it(geometry, flags, allocfunc, errfunc);
+ return parse_it(lwg_parser_result, geometry, flags, allocfunc, errfunc);
}
void
Modified: trunk/liblwgeom/wktparse.h
===================================================================
--- trunk/liblwgeom/wktparse.h 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/wktparse.h 2008-09-28 15:32:46 UTC (rev 3023)
@@ -19,6 +19,11 @@
uchar *lwgeom;
int size;
} SERIALIZED_LWGEOM;
+
+typedef struct struct_lwgeom_parser_result
+{
+ SERIALIZED_LWGEOM *serialized_lwgeom;
+} LWGEOM_PARSER_RESULT;
#endif
typedef void* (*allocator)(size_t size);
typedef void (*freeor)(void* mem);
@@ -96,8 +101,8 @@
You are responsible for freeing the returned memory.
*/
-SERIALIZED_LWGEOM* parse_lwg(const char* wkt, int flags, allocator allocfunc,report_error errfunc);
-SERIALIZED_LWGEOM* parse_lwgi(const char* wkt, int flags, allocator allocfunc,report_error errfunc);
+int parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* wkt, int flags, allocator allocfunc,report_error errfunc);
+int parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* wkt, int flags, allocator allocfunc,report_error errfunc);
char* unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags);
char* unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hexform);
int lwg_parse_yyparse(void);
Modified: trunk/lwgeom/lwgeom_inout.c
===================================================================
--- trunk/lwgeom/lwgeom_inout.c 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_inout.c 2008-09-28 15:32:46 UTC (rev 3023)
@@ -64,11 +64,15 @@
{
char *str = PG_GETARG_CSTRING(0);
SERIALIZED_LWGEOM *serialized_lwgeom;
+ LWGEOM_PARSER_RESULT lwg_parser_result;
LWGEOM *lwgeom;
PG_LWGEOM *ret;
+ int result;
/* will handle both HEXEWKB and EWKT */
- serialized_lwgeom = serialized_lwgeom_from_ewkt(str, PARSER_CHECK_ALL);
+ result = serialized_lwgeom_from_ewkt(&lwg_parser_result, str, PARSER_CHECK_ALL);
+
+ serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
@@ -463,9 +467,10 @@
text *wkt_input = PG_GETARG_TEXT_P(0);
PG_LWGEOM *ret; /*with length */
SERIALIZED_LWGEOM *serialized_lwgeom;
+ LWGEOM_PARSER_RESULT lwg_parser_result;
LWGEOM *lwgeom;
char *wkt;
- int wkt_size ;
+ int wkt_size, result;
wkt_size = VARSIZE(wkt_input)-VARHDRSZ; /* actual letters */
@@ -476,7 +481,9 @@
POSTGIS_DEBUGF(3, "in parse_WKT_lwgeom with input: '%s'",wkt);
- serialized_lwgeom = serialized_lwgeom_from_ewkt(wkt, PARSER_CHECK_ALL);
+ result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
+
+ serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
Modified: trunk/lwgeom/lwgeom_ogc.c
===================================================================
--- trunk/lwgeom/lwgeom_ogc.c 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_ogc.c 2008-09-28 15:32:46 UTC (rev 3023)
@@ -967,8 +967,10 @@
char *wkt, fc;
size_t size;
SERIALIZED_LWGEOM *serialized_lwgeom;
- PG_LWGEOM *result = NULL;
+ LWGEOM_PARSER_RESULT lwg_parser_result;
+ PG_LWGEOM *geom_result = NULL;
LWGEOM *lwgeom;
+ int result;
POSTGIS_DEBUG(2, "LWGEOM_from_text");
@@ -1002,7 +1004,9 @@
POSTGIS_DEBUGF(3, "wkt: [%s]", wkt);
- serialized_lwgeom = serialized_lwgeom_from_ewkt(wkt, PARSER_CHECK_ALL);
+ result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
+
+ serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
@@ -1013,10 +1017,10 @@
/* read user-requested SRID if any */
if ( PG_NARGS() > 1 ) lwgeom->SRID = PG_GETARG_INT32(1);
- result = pglwgeom_serialize(lwgeom);
+ geom_result = pglwgeom_serialize(lwgeom);
lwgeom_release(lwgeom);
- PG_RETURN_POINTER(result);
+ PG_RETURN_POINTER(geom_result);
}
/*
Modified: trunk/lwgeom/lwgeom_pg.c
===================================================================
--- trunk/lwgeom/lwgeom_pg.c 2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_pg.c 2008-09-28 15:32:46 UTC (rev 3023)
@@ -246,9 +246,10 @@
{
PG_LWGEOM *ret;
SERIALIZED_LWGEOM *serialized_lwgeom;
+ LWGEOM_PARSER_RESULT lwg_parser_result;
char *hexewkb;
size_t hexewkblen = ewkblen*2;
- int i;
+ int i, result;
hexewkb = lwalloc(hexewkblen+1);
for (i=0; i<ewkblen; i++)
@@ -257,8 +258,9 @@
}
hexewkb[hexewkblen] = '\0';
- serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags);
-
+ result = serialized_lwgeom_from_ewkt(&lwg_parser_result, hexewkb, flags);
+
+ serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
memcpy(VARDATA(ret), serialized_lwgeom->lwgeom, serialized_lwgeom->size);
More information about the postgis-commits
mailing list