]> granicus.if.org Git - postgis/commitdiff
Update (E)WKT/WKB parser to return a structure (LWGEOM_PARSER_RESULT) instead of...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 28 Sep 2008 15:32:46 +0000 (15:32 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 28 Sep 2008 15:32:46 +0000 (15:32 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@3023 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/lwgeom.c
liblwgeom/lwgparse.c
liblwgeom/wktparse.h
lwgeom/lwgeom_inout.c
lwgeom/lwgeom_ogc.c
lwgeom/lwgeom_pg.c

index 811a862cbbfb7fad805947d308dacbf225754fa0..3105b77f5f19573047c84be60e19a25e0fc5c32c 100644 (file)
@@ -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);
 
index eb22d9d55f2fdb6857954f6196d4a573d255e8fb..80ef5f7ac08f89fbafa46bc59a7bb9111aa55015 100644 (file)
@@ -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;
 }
 
 /*
index 6f5be5fe52cf33e776d286b3a9d9de6400698718..e10c055c65a3746e3f2796e44880e8f81b145746 100644 (file)
@@ -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
index 2f013a54006d7f18206205a1a4afa03e9c41067f..37fa2db7fa09ccb88139e22fad0d4a845375a307 100644 (file)
@@ -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);
index 75e63006d9f1dc4a5d7eef255d76295705d9c52c..78a7c554e81c39e71993b4cbc357d13510692743 100644 (file)
@@ -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);
index fda123085eeea48b7eca661c168bfd107a84ade3..58cdd7cdcd6e9c656d56894badc24b8dc6eb7c42 100644 (file)
@@ -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);
 }
 
 /*
index 2328405fba2d0d423baa868b8be1a577162c6cc3..bf3ce92a4b6aa21cacbfd5368b84c419b885708c 100644 (file)
@@ -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; i<ewkblen; i++)
@@ -257,8 +258,9 @@ pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen)
        }
        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);