#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 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);
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);
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);
/*
* 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;
}
/*
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)
/*
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);
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);
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
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);
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);
{
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);
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 */
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);
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");
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 )
/* 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);
}
/*
{
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++)
}
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);