From: Mark Cave-Ayland Date: Sun, 28 Sep 2008 15:32:46 +0000 (+0000) Subject: Update (E)WKT/WKB parser to return a structure (LWGEOM_PARSER_RESULT) instead of... X-Git-Tag: 1.4.0b1~689 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b6083bfddcefadc259707114125cb9e4a99f4771;p=postgis 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. git-svn-id: http://svn.osgeo.org/postgis/trunk@3023 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/liblwgeom.h b/liblwgeom/liblwgeom.h index 811a862cb..3105b77f5 100644 --- a/liblwgeom/liblwgeom.h +++ b/liblwgeom/liblwgeom.h @@ -1128,6 +1128,14 @@ extern void deparse_hex(uchar str, char *result); #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); @@ -1136,7 +1144,7 @@ extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen); 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); diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index eb22d9d55..80ef5f7ac 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -513,8 +513,10 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) 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 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) 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 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) /* * 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, - lwalloc, lwerror); + 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; } /* diff --git a/liblwgeom/lwgparse.c b/liblwgeom/lwgparse.c index 6f5be5fe5..e10c055c6 100644 --- a/liblwgeom/lwgparse.c +++ b/liblwgeom/lwgparse.c @@ -169,9 +169,9 @@ void read_wkb_ordinate_array(const char **b); 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 @@ alloc_wkb(const char *parser) /* 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 @@ parse_it(const char *geometry, int flags, allocator allocfunc, report_error errf 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 @@ parse_it(const char *geometry, int flags, allocator allocfunc, report_error errf close_parser(); if (ferror_occured) - return NULL; + return 0; + + /* Return the parsed geometry */ + lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom(); - return 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 diff --git a/liblwgeom/wktparse.h b/liblwgeom/wktparse.h index 2f013a540..37fa2db7f 100644 --- a/liblwgeom/wktparse.h +++ b/liblwgeom/wktparse.h @@ -19,6 +19,11 @@ typedef struct serialized_lwgeom { 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 @@ void alloc_wkb(const char* parser); 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); diff --git a/lwgeom/lwgeom_inout.c b/lwgeom/lwgeom_inout.c index 75e63006d..78a7c554e 100644 --- a/lwgeom/lwgeom_inout.c +++ b/lwgeom/lwgeom_inout.c @@ -64,11 +64,15 @@ Datum LWGEOM_in(PG_FUNCTION_ARGS) { 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 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS) 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 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS) 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); diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index fda123085..58cdd7cdc 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -967,8 +967,10 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) 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 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) 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 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) /* 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); } /* diff --git a/lwgeom/lwgeom_pg.c b/lwgeom/lwgeom_pg.c index 2328405fb..bf3ce92a4 100644 --- a/lwgeom/lwgeom_pg.c +++ b/lwgeom/lwgeom_pg.c @@ -246,9 +246,10 @@ pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen) { 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; isize + VARHDRSZ); SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ); memcpy(VARDATA(ret), serialized_lwgeom->lwgeom, serialized_lwgeom->size);