return ASIZE (lvec); } /* Subroutines. */ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0, doc: /* Load module FILE. */) (Lisp_Object file) { dynlib_handle_ptr handle; emacs_init_function module_init; void *gpl_sym; CHECK_STRING (file); handle = dynlib_open (SSDATA (file)); if (!handle) error ("Cannot load file %s: %s", SDATA (file), dynlib_error ()); gpl_sym = dynlib_sym (handle, "plugin_is_GPL_compatible"); if (!gpl_sym) error ("Module %s is not GPL compatible", SDATA (file)); module_init = (emacs_init_function) dynlib_func (handle, "emacs_module_init"); if (!module_init) error ("Module %s does not have an init function.", SDATA (file)); struct emacs_runtime_private rt; /* Includes the public emacs_env. */ struct emacs_env_private priv; initialize_environment (&rt.pub, &priv); struct emacs_runtime pub =
geos_handle_t *geom_geos_init(char const *geos_lib, errorstream_t *error) { GPKG_TLS_KEY_CREATE(last_geos_error); geos_handle_t* handle = NULL; void *lib = NULL; handle = (geos_handle_t*)sqlite3_malloc(sizeof(geos_handle_t)); if (handle == NULL) { error_append(error, "Could not allocate memory for GEOS handle"); goto error; } memset(handle, 0, sizeof(geos_handle_t)); lib = dynlib_open(geos_lib); if (lib == NULL) { error_append(error, "Could not open library '%s'", geos_lib); goto error; } handle->geos_lib = lib; handle->api.initGEOS_r = (GEOSContextHandle_t (*)(GEOSMessageHandler,GEOSMessageHandler)) dynlib_sym(lib, "initGEOS_r"); handle->api.finishGEOS_r = (void (*)(GEOSContextHandle_t)) dynlib_sym(lib, "finishGEOS_r"); handle->api.GEOSversion = (const char * (*)()) dynlib_sym(lib, "GEOSversion"); handle->api.GEOSisClosed_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSisClosed_r"); handle->api.GEOSisEmpty_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSisEmpty_r"); handle->api.GEOSisSimple_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSisSimple_r"); handle->api.GEOSisRing_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSisRing_r"); handle->api.GEOSisValid_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSisValid_r"); handle->api.GEOSPreparedCovers_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedCovers_r"); handle->api.GEOSPreparedCoveredBy_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedCoveredBy_r"); handle->api.GEOSPreparedDisjoint_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedDisjoint_r"); handle->api.GEOSPreparedIntersects_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedIntersects_r"); handle->api.GEOSPreparedTouches_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedTouches_r"); handle->api.GEOSPreparedCrosses_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedCrosses_r"); handle->api.GEOSPreparedWithin_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedWithin_r"); handle->api.GEOSPreparedContains_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedContains_r"); handle->api.GEOSPreparedOverlaps_r = (int (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPreparedOverlaps_r"); handle->api.GEOSEquals_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSEquals_r"); handle->api.GEOSArea_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*,double*)) dynlib_sym(lib, "GEOSArea_r"); handle->api.GEOSLength_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*,double*)) dynlib_sym(lib, "GEOSLength_r"); handle->api.GEOSDistance_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*,double*)) dynlib_sym(lib, "GEOSDistance_r"); handle->api.GEOSHausdorffDistance_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*,double*)) dynlib_sym(lib, "GEOSHausdorffDistance_r"); handle->api.GEOSBoundary_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSBoundary_r"); handle->api.GEOSConvexHull_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSConvexHull_r"); handle->api.GEOSEnvelope_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSEnvelope_r"); handle->api.GEOSGetCentroid_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGetCentroid_r"); handle->api.GEOSGeomGetNumPoints_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeomGetNumPoints_r"); handle->api.GEOSGeomGetPointN_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,int)) dynlib_sym(lib, "GEOSGeomGetPointN_r"); handle->api.GEOSGeomGetStartPoint_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeomGetStartPoint_r"); handle->api.GEOSGeomGetEndPoint_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeomGetEndPoint_r"); handle->api.GEOSGetNumInteriorRings_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGetNumInteriorRings_r"); handle->api.GEOSGetInteriorRingN_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,int)) dynlib_sym(lib, "GEOSGetInteriorRingN_r"); handle->api.GEOSGetExteriorRing_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGetExteriorRing_r"); handle->api.GEOSGetNumGeometries_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGetNumGeometries_r"); handle->api.GEOSGetGeometryN_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,int)) dynlib_sym(lib, "GEOSGetGeometryN_r"); handle->api.GEOSDifference_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSDifference_r"); handle->api.GEOSSymDifference_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSSymDifference_r"); handle->api.GEOSIntersection_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSIntersection_r"); handle->api.GEOSUnion_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*)) dynlib_sym(lib, "GEOSUnion_r"); handle->api.GEOSBuffer_r = (GEOSGeometry* (*)(GEOSContextHandle_t,const GEOSGeometry*,double,int)) dynlib_sym(lib, "GEOSBuffer_r"); handle->api.GEOSRelatePattern_r = (char (*)(GEOSContextHandle_t,const GEOSGeometry*,const GEOSGeometry*,const char *)) dynlib_sym(lib, "GEOSRelatePattern_r"); handle->api.GEOSGeomTypeId_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeomTypeId_r"); handle->api.GEOSGetSRID_r = (int (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGetSRID_r"); handle->api.GEOSSetSRID_r = (void (*)(GEOSContextHandle_t,const GEOSGeometry*,int)) dynlib_sym(lib, "GEOSSetSRID_r"); handle->api.GEOSGeom_createPoint_r = (GEOSGeometry* (*)(GEOSContextHandle_t,GEOSCoordSequence*)) dynlib_sym(lib, "GEOSGeom_createPoint_r"); handle->api.GEOSGeom_createEmptyPoint_r = (GEOSGeometry* (*)(GEOSContextHandle_t)) dynlib_sym(lib, "GEOSGeom_createEmptyPoint_r"); handle->api.GEOSGeom_createLinearRing_r = (GEOSGeometry* (*)(GEOSContextHandle_t,GEOSCoordSequence*)) dynlib_sym(lib, "GEOSGeom_createLinearRing_r"); handle->api.GEOSGeom_createLineString_r = (GEOSGeometry* (*)(GEOSContextHandle_t,GEOSCoordSequence*)) dynlib_sym(lib, "GEOSGeom_createLineString_r"); handle->api.GEOSGeom_createEmptyLineString_r = (GEOSGeometry* (*)(GEOSContextHandle_t)) dynlib_sym(lib, "GEOSGeom_createEmptyLineString_r"); handle->api.GEOSGeom_createEmptyPolygon_r = (GEOSGeometry* (*)(GEOSContextHandle_t)) dynlib_sym(lib, "GEOSGeom_createEmptyPolygon_r"); handle->api.GEOSGeom_createPolygon_r = (GEOSGeometry* (*)(GEOSContextHandle_t,GEOSGeometry*,GEOSGeometry**,unsigned int)) dynlib_sym(lib, "GEOSGeom_createPolygon_r"); handle->api.GEOSGeom_createCollection_r = (GEOSGeometry* (*)(GEOSContextHandle_t,int,GEOSGeometry**,unsigned int)) dynlib_sym(lib, "GEOSGeom_createCollection_r"); handle->api.GEOSGeom_createEmptyCollection_r = (GEOSGeometry* (*)(GEOSContextHandle_t,int)) dynlib_sym(lib, "GEOSGeom_createEmptyCollection_r"); handle->api.GEOSGeom_getCoordSeq_r = (const GEOSCoordSequence* (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeom_getCoordSeq_r"); handle->api.GEOSCoordSeq_create_r = (GEOSCoordSequence* (*)(GEOSContextHandle_t,unsigned int,unsigned int)) dynlib_sym(lib, "GEOSCoordSeq_create_r"); handle->api.GEOSCoordSeq_getSize_r = (int (*)(GEOSContextHandle_t,const GEOSCoordSequence*,unsigned int *)) dynlib_sym(lib, "GEOSCoordSeq_getSize_r"); handle->api.GEOSCoordSeq_getX_r = (int (*)(GEOSContextHandle_t,const GEOSCoordSequence*,unsigned int,double*)) dynlib_sym(lib, "GEOSCoordSeq_getX_r"); handle->api.GEOSCoordSeq_getY_r = (int (*)(GEOSContextHandle_t,const GEOSCoordSequence*,unsigned int,double*)) dynlib_sym(lib, "GEOSCoordSeq_getY_r"); handle->api.GEOSCoordSeq_setX_r = (int (*)(GEOSContextHandle_t,GEOSCoordSequence*,unsigned int,double)) dynlib_sym(lib, "GEOSCoordSeq_setX_r"); handle->api.GEOSCoordSeq_setY_r = (int (*)(GEOSContextHandle_t,GEOSCoordSequence*,unsigned int,double)) dynlib_sym(lib, "GEOSCoordSeq_setY_r"); handle->api.GEOSPrepare_r = (GEOSPreparedGeometry const *(*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSPrepare_r"); handle->api.GEOSPreparedGeom_destroy_r = (void (*)(GEOSContextHandle_t,const GEOSPreparedGeometry*)) dynlib_sym(lib, "GEOSPreparedGeom_destroy_r"); handle->api.GEOSGeom_destroy_r = (void (*)(GEOSContextHandle_t,const GEOSGeometry*)) dynlib_sym(lib, "GEOSGeom_destroy_r"); // Only init GEOS if the bare minimum set of functions is available to // initialize, cleanup and determine the version number. if (handle->api.initGEOS_r && handle->api.finishGEOS_r && handle->api.GEOSversion) { handle->context = handle->api.initGEOS_r(geom_null_msg_handler, geom_tls_msg_handler); if (handle->context != NULL) { return handle; } else { error_append(error, "GEOS initialization failed"); } } else { error_append(error, "Could not load symbols 'initGEOS_r', 'finishGEOS_r' and/or 'GEOSversion' from '%s'", geos_lib); } error: if (handle != NULL) { sqlite3_free(handle); } if (lib != NULL) { dynlib_close(lib); } return NULL; }