extern void deparse_hex(uchar str, char *result);
/* Parser access routines */
-extern char *unparse_WKT(uchar* serialized, lwallocator alloc, lwfreeor free);
-extern char *unparse_WKB(uchar* serialized, lwallocator alloc, lwfreeor free, char endian, size_t *outsize, uchar hex);
-
-extern SERIALIZED_LWGEOM *parse_lwgeom_wkt(char *wkt_input);
+extern SERIALIZED_LWGEOM *ewkt_to_lwgeom(char *wkt_input);
extern char *lwgeom_to_ewkt(LWGEOM *lwgeom);
extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder);
extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, size_t ewkblen);
extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *ewkblen);
+extern char *serialized_lwgeom_to_ewkt(uchar *serialized);
+extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size);
+extern char *serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size);
+
+
extern void *lwalloc(size_t size);
extern void *lwrealloc(void *mem, size_t size);
extern void lwfree(void *mem);
}
}
+
+/*
+ * Make a LWGEOM object from a WKT input string
+ */
+SERIALIZED_LWGEOM *
+ewkt_to_lwgeom(char *wkt_input)
+{
+ SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input,
+ lwalloc, lwerror);
+
+
+ LWDEBUGF(2, "ewkt_to_lwgeom with %s",wkt_input);
+
+ if (serialized_form == NULL)
+ {
+ lwerror("ewkt_to_lwgeom:: couldnt parse!");
+ return NULL;
+ }
+
+ return serialized_form;
+}
+
/*
* Return an alloced string
*/
hexewkb[hexewkblen] = '\0';
/* Rely on grammar parser to construct a LWGEOM */
- serialized_lwgeom = parse_lwgeom_wkt(hexewkb);
+ serialized_lwgeom = ewkt_to_lwgeom(hexewkb);
/* Free intermediate HEXified representation */
lwfree(hexewkb);
return ret;
}
+
+/*
+ * Parser functions for working with serialized LWGEOMs. Useful for cases where
+ * the function input is already serialized, e.g. some input and output functions
+ */
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_ewkt(uchar *serialized)
+{
+ return unparse_WKT(serialized, lwalloc, lwfree);
+}
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size)
+{
+ return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 1);
+}
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size)
+{
+ return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 0);
+}
+
+
/*
* geom1 same as geom2
* iff
}
-SERIALIZED_LWGEOM *
-parse_lwgeom_wkt(char *wkt_input)
-{
- SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input,
- lwalloc, lwerror);
-
-
- LWDEBUGF(2, "parse_lwgeom_wkt with %s",wkt_input);
-
- if (serialized_form == NULL)
- {
- lwerror("parse_WKT:: couldnt parse!");
- return NULL;
- }
-
- return serialized_form;
-
-}
/*
* Find interpolation point I
/*char *semicolonLoc; */
lwgeom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result_cstring = unparse_WKT(SERIALIZED_FORM(lwgeom),lwalloc,lwfree);
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom));
#if 0
semicolonLoc = strchr(result_cstring,';');
geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", unparse_WKT(SERIALIZED_FORM(geom), malloc, free));
+ POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom)));
geosgeom = POSTGIS2GEOS(geom);
if ( ! geosgeom ) PG_RETURN_NULL();
result = GEOS2POSTGIS(geosgeom, TYPE_HASZ(geom->type));
GEOSGeom_destroy(geosgeom);
- POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", unparse_WKT(SERIALIZED_FORM(result), malloc, free));
+ POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result)));
PG_FREE_IF_COPY(geom, 0);
/* lwgeom serialized form */
in = (PG_LWGEOM*)PG_DETOAST_DATUM(entry->key);
- POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", unparse_WKT(in+VARHDRSZ, malloc, free));
+ POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt(in+VARHDRSZ));
if (in == NULL)
{
PG_LWGEOM *ret;
/* will handle both HEXEWKB and EWKT */
- serialized_lwgeom = parse_lwgeom_wkt(str);
+ serialized_lwgeom = ewkt_to_lwgeom(str);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
char *result;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,-1,NULL,1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, NULL);
PG_RETURN_CSTRING(result);
}
}
}
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,
- byteorder, &size, 1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), byteorder, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
size_t size;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,-1,&size,1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
lwgeom_input = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
#ifdef BINARY_FROM_HEX
- hexized_wkb_srid = unparse_WKB(SERIALIZED_FORM(lwgeom_input),
- lwalloc, lwfree, byteorder, &size, 1);
+ hexized_wkb_srid = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size);
LWDEBUGF(3, "in WKBFromLWGEOM with WKB = '%s'", hexized_wkb_srid);
#else /* ndef BINARY_FROM_HEX */
- hexized_wkb = unparse_WKB(SERIALIZED_FORM(lwgeom_input),
- lwalloc, lwfree, byteorder, &size, 0);
+ hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size);
size_result = size+VARHDRSZ;
result = palloc(size_result);
#ifdef PROFILE
profstop(PROF_QRUN);
- lwnotice("unparse_WKB: prof: %lu", proftime[PROF_QRUN]);
+ lwnotice("serialized_lwgeom_to_ewkb: prof: %lu", proftime[PROF_QRUN]);
#endif
LWDEBUGF(3, "Output size is %lu (comp: %lu)",
POSTGIS_DEBUGF(3, "in parse_WKT_lwgeom with input: '%s'",wkt);
- serialized_lwgeom = parse_lwgeom_wkt(wkt);
+ serialized_lwgeom = ewkt_to_lwgeom(wkt);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
POSTGIS_DEBUG(3, "LWGEOM_recv advancing StringInfo buffer");
- POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free,-1,NULL,1));
+ POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), -1, NULL));
/* Set cursor to the end of buffer (so the backend is happy) */
buf->cursor = buf->len;
POSTGIS_DEBUGF(3, "wkt: [%s]", wkt);
- serialized_lwgeom = parse_lwgeom_wkt(wkt);
+ serialized_lwgeom = ewkt_to_lwgeom(wkt);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
ogclwgeom = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1(
LWGEOM_force_2d, PointerGetDatum(lwgeom)));
- result_cstring = unparse_WKT(SERIALIZED_FORM(ogclwgeom),lwalloc,lwfree);
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom));
semicolonLoc = strchr(result_cstring,';');
}
hexewkb[hexewkblen] = '\0';
- serialized_lwgeom = parse_lwgeom_wkt(hexewkb);
+ serialized_lwgeom = ewkt_to_lwgeom(hexewkb);
ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *outsize)
{
uchar *srl = &(geom->type);
- return unparse_WKB(srl, lwalloc, lwfree,
- byteorder, outsize, 0);
+ return serialized_lwgeom_to_ewkb(srl, byteorder, outsize);
}
/*