ogdi-ogdi_4_1_0/000077500000000000000000000000001345660466700136235ustar00rootroot00000000000000ogdi-ogdi_4_1_0/.cvsignore000066400000000000000000000000521345660466700156200ustar00rootroot00000000000000bin config.status config.log config.cache ogdi-ogdi_4_1_0/.gitignore000066400000000000000000000002151345660466700156110ustar00rootroot00000000000000bin/ config.log config.status config/Linux.mak config/common.mak OBJ.Linux OBJ.win32 OBJ.win64 lib/Linux ogdi-config ogdi.pc autom4te.cache/ ogdi-ogdi_4_1_0/.travis.yml000066400000000000000000000007471345660466700157440ustar00rootroot00000000000000compiler: gcc language: cpp cache: apt: true directories: - $HOME/.ccache before_install: - sudo apt install libz-dev libexpat-dev ccache install: - export TOPDIR=$PWD - CC="ccache gcc" ./configure --with-zlib --with-expat --prefix=$HOME/install-ogdi - make - make install -j3 script: - echo "done" notifications: #email: # recipients: # - gdal-commits@lists.osgeo.org irc: channels: - "irc.freenode.org#gdal" use_notice: true ogdi-ogdi_4_1_0/ChangeLog000066400000000000000000001061171345660466700154030ustar00rootroot000000000000002018-03-01 Even Rouault * various changes to support Win64 and MSVC 2015 2018-03-01 Even Rouault * ogdi/driver/vrf/feature.c, object.c, vrf.h: make sure to take into account tile id when merging feature segments, and deal with situations where consecutive segments of same feature in edge table are not mergeable. Needed on some DNC products. 2016-07-19 Even Rouault * New 3.2.0 release 2016-07-11 Even Rouault * ogdi/c-api/ecs_dyna.c: fix ecs_OpenDynamicLib on 64 bit Windows (OGDI #72) * external/rpc_win32/LIBRPC/xdr_floa.c: make it work on AMD64 * Make iconv dependency optional and detect it in configure * makefile: if TARGET=win32, create config/common.mak from config/common.mak.in * config/win32: remove FLAGS_X86DEF = /D_X86_ no longer needed 2016-07-08 Even Rouault Fix various compilation problems on Windows (contributed by Jerome Siot) 2016-07-07 Even Rouault * ogdi/driver/vrf/utils.c: fix stack buffer overflow in vrf_GetMetadata() when reading the level in CAT files. Found by GCC 5.2 -faddress=sanitize 2016-07-06 Even Rouault * ogdi/include/ecs_util.h: upgrade OGDI_RELEASEDATE to 20160705 * ogdi/c-api/server.c: fix memory leaks in error code paths of svr_CreateServer() * ogdi/c-api/ecsassoc.c: ecs_SetError(): display error message on stderr if memory allocation fails. * ogdi/driver/vrf/feature.c: add heuristics in vrf_get_ring_coords() to detect cycling topology of edges that lead to endless looping and eventually crashes. Be robust to memory allocation failures in various places, and properly cleanup allocated structures when returning. * ogdi/driver/vrf/object.c: implement ecs_SetErrorShouldStop() logic in the various _getNext.... methods * ogdi/driver/vrf/vrf.c: fix memory leaks in error code paths of dyn_SelectLayer() * vpflib/vpfread.c: index_pos(): no longer clamp index values to [1,table.nrows] but error out. read_new_row(): be robust to memory allocation failures. * vpflib/vpftable.c: vpf_open_table(): be robust to wrong nrows values for memory tables. 2016-07-04 Even Rouault * Error handling: Add a ecs_SetErrorShouldStop() function that can be used internally when the code is able to recover from an error. The user may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO as environment variable (the default being YES: stop on error). Add a ecs_SetReportErrorFunction() method to install a custom callback that will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still aware of errors that occured. If not defined, the error will be logged in stderr. * VPF: Avoid a missing fcs file in a coverage to prevent opening any coverage of the library (fix opening of DNC17/COA17A dataset) if OGDI_STOP_ON_ERROR=NO is defined as environment variable, and otherwise better report the error * VPF: _getNextObject / _getObject functions: validate the value of the tile_id to avoid a potential out-of-bounds read. Fix crash on dqyarea@dqy layer of DNC17/H1708311. 2016-06-28 Even Rouault * Fix all warnings about unused variables raised by GCC 4.8 2016-06-28 Even Rouault * Actually fix build against proj >= 4.8 (assuming that projects.h is installed, which is the case in Ubuntu 14.04 for example) (OGDI #71) 2016-06-28 Even Rouault * Fix memory leak in ADRG driver 2016-06-27 Even Rouault * Fix mat_inverse() to not use variable length arrays (OGDI #65) 2016-06-27 Even Rouault * Fix build against proj >= 4.9 * Grow some buffers in VRF driver (patch by Craig Bruce) * Fix compiler warnings raised by GCC 4.4 * VPF: Fix off-by-one extra write in vpf_colum_name[] in read_thematic_index_header(). Reported by clang 2009-05-08 Frank Warmerdam * ogdi/drivers/vrf/feature.c: fix count type to be int32 to avoid variable corruption on 64bit systems (#2787502). 2008-05-28 Balint Cristian * New 3.2.0beta2 release * fix path case sensitive problem for vpf driver * fix build on GNU/kFreeBSD * avoid bashism in makefiles 2007-05-09 Balint Cristian * Prepare for 3.2.0beta2 release. 2007-05-09 Balint Cristian From: Even Rouault Date: Friday 21:14:18 * fix filename case sensitivy problems (for Unix-like systems). * fix incorrect use of sprintf in vrf_GetMetadata. * report wgs84 instead of nad83, not sure whether that is true for all VPF products, but at least it's correct for VMAP products that *must* be WGS84. A better fix would be to read the VPF table that contains this information. * fix a few minor memory leaks and memory usage issues. * enable XMIN, YMIN, XMAX and YMAX columns to be of type double in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * add .pjt and .tjt as possible extensions for join tables (VMAP2i 'MIG2i000' product). * fix duplicated layers report (VMAP2i 'MIG2i000' product). * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * optionnaly, convert text to UTF-8 when environment variable CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable on Windows I guess (only tested on Linux) and maybe too specific. * enable reading of VPF products without table indexes file (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when there is a variable length field in one table, an index should exist, but some test products don't follow this. The approach here is to read the whole table content and build the index in memory. 2007-03-26 Frank Warmerdam * ogdi/glutil/RCa00246 temp file removed, per request from frankie@debiangis. ============================================================================ 2007-02-24 Balint Cristian * Prepare for 3.2.0beta1 release. 2007-02-24 Balint Cristian * Clear olso tilestruct while freeing memory in dyn_freelayerpriv(). glibc mtrace() reports zero malloc problems now. Thanks to djdejohn for the report ! ============================================================================ 2007-02-12 Balint Cristian * Prepare for 3.1.6 release. * add ogdi.pc.in and ogdi-config scripts 2007-02-12 Balint Cristian Hide plugins from system libs path: * move plugins to $LIB_INST/ogdi subfolder (this is std. now). * add dlopen patch in c-api for run-time to be able find those plugins for that case that we hided plugins from system wide. * small typo in ChangeLog. We shouldn't expose plugin libs to system wide lib search path, this would break FHS, its better to keep them hidden, and only ogdi binary handle those. * use -soname and mark our exposed library, so exclude plugins. * libogdi31.so is now libogdi.so.3.1 with libogdi.3 soname. but should be findable now with -logdi. Release versioning: - MAJOR releases represents major ABI changes in the exposed shared lib. This should not be so offen, only once with major code change wich due to a change in how ogdi is called external by other applications. - MINOR releases represents revisions or bugfixes over ogdi. 2007-02-12 Balint Cristian * fix some gcc warnings, uninited variables, and unused variables. ============================================================================= 2005-02-28 Frank Warmerdam * Prepare for 3.1.5 release. 2004-10-26 Frank Warmerdam * ogdi/drivers/vrf/utils.c: the path parsing regex was being freed, but then not recompiled if needed again later. Was breaking some efforts to open a second VRF datasource after the first was closed. * README: slight improvements in build explanation. * ogdi/contrib/ogdi_info/ogdi_info.c: minor improvements. 2004-10-25 Frank Warmerdam * ogdi/driver/vrf/vrfswq.c: fixed case of 1 character wide string fields as per bug 809737. * vpflib/vpfprim.c: Fixed bug in create_edge_rec() with getting the left face id if it is in 'I' format, instead of 'K' format such as occurs in the rference layer of VMAP0 products. * ogdi/driver/vrf/utils.c: Use short for "buffint" variable. This is the level number used in forming metadata. This corrects a complaint noticed in valgrind. Likely to cause problems on big endian systems as well (crazy level numbers). * ogdi/driver/vrf/vrfswq.c: Fixed so that comparisons to string fields longer than one character work. Fixed so that trailing spaces are trimmed off string values read from disk before applying comparisons. 2004-10-19 Frank Warmerdam * ogdi/drivers/vrf/object.c: Fixed memory leak for line layers with an attribute query in effect (primList) as reported by Jerome Waymel. 2004-10-05 Frank Warmerdam * ogdi/drivers/vrf/vrfswq.c: fixed memory leak. * README: updated to reflect use of configure. ============================================================================= 2004-10-04 Frank Warmerdam * Release OGDI 3.1.3. 2004-03-29 Frank Warmerdam * ogdi/drivers/rpf/utils.c: Check for FSDEVG field is present in TOC file. As per Bug 917678. 2004-03-26 Frank Warmerdam * ogdi/drivers/rpf/rpf.c: Fixed computation of nbfeature in dyn_SelectRegion() as it is unduely sensitive to rounding error issues. As per Bug 924250 from Mark Aubin. 2004-02-19 Frank Warmerdam * ogdi/drivers/vrf/vrf.c: fixed serious bug in releaseAllLayers(). Only every other layer was effectively being released resulting in major leaks of file handles and other resources in application accessing multiple layers at once and not explicitly releasing them. * vpflib/musedir.c: added some include files to avoid warnings in unix builds. * ogdi/c-api/client.c: ecs_DestroyServer() now does an ecs_CleanUp() on cln_dummy_result to avoid noisy memory leak. * ogdi/drivers/vrf/feature.c: fixed leak of edge_rec.coords memory in the bug 741854 fix in vrf_get_ring_coords(). 2004-02-18 Frank Warmerdam * contrib/ogdi_info/ogdi_info.c: use ecs_CleanUp() to free contents of result from cln_DestroyClient(). Minor memory leak. * vpflib/strfunc.c: leftjust() - avoid use of strcpy() for overlapping string moves. Reported by Craig Bruce, verified with valgrind. ============================================================================= 2003-12-15 Frank Warmerdam * Release OGDI 3.1.2. * ogdi/include/ecs_util.h: updated version to 3.1.2. * config/darwin.cfg: new configuration file for MacOS 10.3. * vpflib/ coorgeom.c, vpfprim.c, vpftable.h, xvt.h: Avoid use of obsolete values.h and malloc.h in order to compile properly on MacOS 10.3. Submitted by Greg Allen. 2003-08-27 Frank Warmerdam * ogdi/c-api/ecssplit.c: Modififed ecs_SplitURL() to release regular expression resources if called with a NULL url. * ogdi/c-api/client.c: Modified cln_DestroyClient() to call ecs_SplitURL(NULL) to free static resources.Well, go * ogdi/drivers/adrg/utils.c: Fixed problem in _read_adrg(), _read_overview(), and _initRegionWithDefault() such that the files were never closed. As per bug 795612. * ogdi/drivers/adrg/adrg.c: Fixed _releaseAllLayers() so it release from the last layer to the first. It seems that ecs_FreeLayer() now decrements the s->nblayers but didn't use to at some point in the distant past. This bug was discovered while investigating the leaks described in sourceforge bug 795612. 2003-05-22 Frank Warmerdam * ogdi/driver/vrf/feature.c, utils.c: Fixed several problems related to bug 741854, primarily related to VITD area features causing hangs and crashes. 2003-01-29 Frank Warmerdam * ogdi/include/ecs_util.h: fixed spelling of length in a few places. 2002-12-18 Frank Warmerdam * ogdi/include/ecs_util.h: If PI is undefined try to use M_PI. If not available define with much more precision. As per bug report from Craig Bruce. ============================================================================= 2002-03-28 Frank Warmerdam * OGDI 3.1.1 Release. * external/zlib/*: Upgraded to zlib 1.1.4 to avoid widely publicized security problem with zlib 1.1.3. 2002-02-21 Frank Warmerdam * configure.in: Don't include /usr/local/lib in LIBS path, and -I/usr/local/include in CFLAGS by default. * contrib/mkbindist.sh: completed (also added README-BIN.TXT). * contrib/ogdi_import/ogdi_import.c: fixed bug building with old (included with OGDI) PROJ.4 library. * ogdi/gltpd/{asyncsvr.c,ecs_svc.c}: Undefied svc_fdset if defined to avoid dependence on recent libc on linux. 2002-02-08 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: Fixed serious bug importing floating point fields with unknown precision. 2001-12-14 Frank Warmerdam * contrib/ogdi_info/ogdi_info.c: don't try to reproject to latlong if already in latlong. 2001-12-11 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: fixed region handling if GetLayerRegion() fails - default to global bounds. 2001-11-13 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: added -no-dict option. 2001-10-17 Frank Warmerdam * README: Correct reference to devdir since it isn't normally called that in a source release. 2001-10-09 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: added preliminary support for setting the output (client) projection. 2001-10-01 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: various fixes related to region overriding, and computing the size of the output raster. * ogdi/c-api/client.c: fixed problems in cln_CalcCtlPoints() with very small regions, equivelent to one pixel of data. Sometimes produced a degenerate transformation. 2001-09-28 Frank Warmerdam * ogdi/include/ecs_util.h: Added the OGDI_VERSION and OGDI_RELEASEDATE macros in ecs_util.h. 2001-09-17 Frank Warmerdam * configure.in: don't add /usr/local/lib to LIBS by default. It makes it hard to avoid using stuff from /usr/local. ============================================================================ 2001-09-17 Frank Warmerdam * OGDI 3.0 Final Released 2001-08-27 Frank Warmerdam * OGDI 3.1Beta2 Issued. * ogdi/driver/rpf/rpf.c: Fixed computation of width and height in GetRasterInfo(). Update test suite accordingly. * vpflib/muse_dir.c: Fixed check for DOT_FOUND to only look in the last component of the path, not the whole path, otherwise directories with dots in them cause problems. * external/expat/makefile: fixed declaration for WORDS_BIGENDIAN macro. 2001-08-16 Frank Warmerdam * ogdi/driver/vrf: feature.c, vrf.h Removed MAXRINGS and MAXSEGS limits. Arrays now dynamically grown. See Bug 450045. * ogdi/driver/vrf: vrf.c, vrf.h, object.c, feature.c: added support for merging line features based on the relationship implied by the join table (relating a set of primitive geometries with one feature). This patch was submitted by Frank Warmerdam in 1999. See bug 222422. * ogdi/driver/vrf/utils.c: partially rewrite vrf_build_coverage_capabilities() to avoid repeating entries and to get rid of temp. * ogdi/contrib/ogdi_import/ogdi_import.c: fixed roundoff error in calcuation of xsize/ysize from region. * ogdi/c-api/client.c: Modified cln_ConvRegion() to avoid roundoff errors in initial computation of intwidth and intheight. As per bug 450042. * ogdi/driver/rpf/rpf.c: Ensure that only Image and Matrix types are accepted by dyn_SelectLayer(). 2001-07-17 Frank Warmerdam * ogdi/include/ecs_util.h: fixed case where DISABLE_CVSID is defined. * contrib/ogdi_info/ogdi_info.c: fixed reporting of text layers. * contrib/ogdi_import/ogdi_import.c: added support for writing text, points and areas. 2001-07-05 Frank Warmerdam * ogdi/driver/vrf/utils.c: Fixed bug in vrf_GetMetadata() that resulted in first layer of a class appearing twice in metadata. See SourceForge bug 111181 originally reported by R.K.Beck@t-online.de to the ogdi-dev list. 2001-06-29 Frank Warmerdam * ogdi/driver/vrf/utils.c: Fixed unterminated string. * ogdi/driver/vrf/vrf.c: Fix memory leaks if FCS not found. 2001-06-26 Frank Warmerdam * vpflib: musedir.h, musedir.c, vpfbrows.c, vpfspx.c, vpftable.c, vpftidx.c - renamed file_open() to muse_file_open() to avoid conflicts with FITS library. * ogdi/driver/rpf/utils.c: implemented vrf_fopen_ci() for case insensitive access to files. 2001-06-25 Frank Warmerdam * ogdi/driver/vrf: swq.c, vrfswq.c Added WIN32 redifinition of strcasecmp() to stricmp(). * ogdi/driver/adrg/adrg.c:Made cleanup safer if verifyLocation() fails. 2001-06-23 Frank Warmerdam * NEWS: added file. * ogdi/driver/adrg: adrg.c, adrg.h Added capabilities support. Cache layer list when opening datastore. 2001-06-22 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: enabled RGB support. * ogdi/driver/adrg/ddadrg.tcl new, came from DND. * ogdi/driver/adrg: adrg.c, object.c, utils.c, adrg.h Incorporated Image support from DND, added standard headers. * ogdi/include/ecs_util.h: Fixed typo in ECS_SETGEOMIMAGEVALUE(). 2001-06-21 Frank Warmerdam * ogdi/driver/vrf: added ECS_CVSID to all source files. 2001-06-20 Frank Warmerdam * ogdi/driver/vrf: vrf.c, swq.c, swq.h, vrf.h, makefile Added full implementation of restricted_where support based on SWQ. This adds brackets to expressions. 2001-06-13 Frank Warmerdam * ogdi/driver/vrf/*: Updated source headers. * ogdi/c-api/ecs_capabililties.c, ogdi/driver/dted/dted.c, ogdi/driver/vrf/util.c, ogdi/driver/rpf/rpf.c: Fixed capabilities to match 6.2 spec (BoundingBox, resx, resy, LatLongBoundingBox). 2001-05-30 Frank Warmerdam * contrib/ogdi_import/ogdi_import.c: utilize layer capabitilies if available to set region and resolution. * ogdi/drivers/rpf/rpf.c: Modified capabilities returned to have real information about each layer instead of just dummy global bounds info. 2001-05-04 Frank Warmerdam * contrib/gdal: added contributed GDAL raster server. * ogdi/c-api/client.c: clear autoCache in cln_SelectRegion(). 2001-04-19 Frank Warmerdam * contrib/ogdi_info/ogdi_info.c: improve region bounds reporting. * external/expat: config.h, makefile: make portable * external/expat/makefile, external/zlib/makefile: only create a dynamic library, not a static one. * external/expat/expat_ogdi.def: created. * config/common.mak: make soft link from libogdi.so to libogdi31.so during install. * Updated test suite for dted/ecstile.c changes. Collectively the following fix DTED bug 233252. * ogdi/c-api/ecstile.c: fixed round off errors in calculation of t->linelength, and placed coord.x/y at center of pixel instead of the corner. * ogdi/drvers/dted/object.c: moved pos_y to the middle of the desired row. Generated errors in unsupported functions. * ogdi/drivers/dted/dted.c: fixed bugs with computing nbfeature. 2001-04-16 Frank Warmerdam * ogdi/drivers/rpf/rpf.c: added capabilities support. * makefile, ogdi/include/makefile: added special non-local install rules for include files and creating target directories. * config/common.mak, config/generic.mak.in: added non-local install support (normally into /usr/local). 2001-04-12 Frank Warmerdam * ogdi/c-api/ogdi.def: added various capabilities related entry points. * ogdi/c-api/ecsdist.c, ogdi/include/ecs_util.h: Added ecs_GetPixelFromRGB() and ecs_GetRGBFromPixel(). * test_suite/scripts/rpf: added test for Image support. * ogdi/drivers/rpf: rpf.c, rpf.h, object.c, utils.c Applied DND Image support patches, and added source headers. * ogdi/c-api: ecs_capabilities.c client.c ogdi/include/ecs_util.h Completed initial capabilities implemention in client. * contrib/ogdi_info/ogdi_info.c: added capabilities and extension dumping support. * test_suite/scripts/dted, test_suite/scripts/vpf: added capture of capabilities documents. * configure, configure.in, config/generic.mak.in: added the ability to substitute for zlib using configure options. * ogdi/c-api/ecs_capabilities.c: initial implementation of _ecs_ParseCapabilities(), still incomplete. * ogdi/c-api/makefile: added ecs_capabilities.c * ogdi/c-api/client.c: added support for initializing and freeing new capabilities related fields in ecs_Client. * ogdi/include/ecs_utils.h: added ecs_LayerCapabilities, and additions to ecs_util.h. * configure.in, configure, config/common.mak, config/generic.mak.in: Added a support for linking in Expat, and controlling whether it is internal, external or disabled from configure. * external/expat/*: added using Expat release 1.95.1. * external/makefile: optionally add expat to subdirs. 2001-04-11 Frank Warmerdam * ogdi/drivers/vrf: vrf.c, utils.c, vrf.h Added ogdi_capabilities support. 2001-04-10 Frank Warmerdam * ogdi/drivers/dted/dted.c: add ogdi_capabilities support. * contrib/ogdi_info/ogdi_info.c: added support for reporting Image values. * testsuite/scripts/dted: added Image test (test 3). * ogdi/drivers/dted: dted.c, dted.h, object.c, utils.c Upgraded with changes from DND to support Image layers. Patch also includes change to exclude zero elevations when computing mincat/maxcat. New style headers also applied. 2001-04-09 Frank Warmerdam * config/win32.mak: Strip down DLL name to get .def name without version. * config/common.mak: added OGDI_VERSION declaration. * external/zlib/makefile, ogdi/c-api/makefile: Added OGDI_VERISION to .so / .dll filename. * external/zlib: upgraded zlib to 1.1.3. Added OGDI_ZLIB.TXT to describe issues about ZLIB use within OGDI. * contrib/ogdi_info/ogdi_info.c: added -no-proj option. Fixed up test suite to use this to avoid projection availability differences on Unix and Windows. * ogdi/c-api: client.c, ecs_dyna.c, ecs_xdrz.c, ecsdist.c, ecsgeo.c, ecshash.c, ecsinfo.c, ecslist.c, ecsregex.c, ecssplit.c, ecstile.c, gmath.c, gmath.h, opendir.c, opendir.h, server.c ogdi/gltpd: asyncsvr.c, ecs_sif.c ogdi/include/ecs_utils.h, ogdi/tcl_interface/ecs_tcl.c Applied new source headers. 2001-03-22 Frank Warmerdam * mkbindist.sh: frist attempt at binary distribution script. 2001-03-11 Frank Warmerdam * include/win32: removed heapagnt.h, shmalloc.h, smrtheap.h, AVDEFS.H, PAN.H, TARGET.H, avtypes.h, pafs.h, edat.h, portable.h, product.h, proto.h, status_d.h. They were not used, and contained problematic licenses. 2001-02-20 Frank Warmerdam * proj/biveval.c: upgraded to code from PROJ.4.4.2 to avoid bug in SGI compiler. * ogdi/c-api/client.c: fixed cln_ConvRegion() bug, which was screwing up region resolutions. Updated test_suite accordingly. http://sourceforge.net/bugs/?func=detailbug&bug_id=133190&group_id=11181 2001-02-19 Frank Warmerdam * ogdi/glutil/iofile.c: added stdlib.h to avoid warnings. * vpflib/vpfprop.c, vpflib/vpftable.c: avoid unnecessary definition of MAXINT or MAXSHORT. * ogdi/c-api/ecs_dyna.c: use MISSING_DLFCN_H instead of _LINUX. * vpflib/coorgeom.c: use MISSING_FLOAT_H flag. * vpflib/include/machine.h: make unix platforms more generic. * vpflib/makefile: pass BIG_ENDIAN flag into compiles. * win32.mak: switch to BIG_ENDIAN, and add /DMISSING_DLFCN_H. * Added configure, configure.in, aclocal, and config/generic.mak.in as part of implementing "GNU configure" support for OGDI. * config/common.mak: default TARGET based on $(shell uname). * makefile: make compilation of proj conditional on PROJ_SETTING. * restored compilation of ogdi/glutil, still used in some places. * testsuite: added RPF test data, and script. * ogdi/makefile: removed glutil from subdirs, it doesn't seem to play a role in normal OGDI. * mkogdidist.sh: added new file for making source distributions. 2001-02-18 Frank Warmerdam * ogdi/drivers/adrg: adrg.c adrg.h object.c utils.c ogdi/drivers/dted: dted.c, object.c ogdi/drivers/skeleton: skeleton.c, skeleton.h, open.c, object.c ogdi/drivers/network/remote.c ogdi/drivers/vrf: feature.c, object.c, open.c, vrf.c ogdi/drivers/rpf: object.c, rpf.c, rpf.h, utils.c Avoid unused argument and other warnings. * ogdi/datum_driver/canada/dtcanada.c, ogdi/datum_driver/usa/dtusa.c ogdi/c-api: client.c ecsgeo.c, ogdi/include/ecs_util.h contrib/ogdi_info/ogdi_info.c Fixed so that PROJ.4.4.x with projUV instead of UV will also work. * */makefile: include explicit clean targets, and get rid of test targets alltogether to avoid override messages from GNUmake. * readme.sun: removed, adequately addressed in build.html. * modif.txt: removed, and incorporated into ChangeLog. * ogdi/gltpd: ecs_sif.c, asyncsvr.c Cleanup lots of compiler warnings. 2001-02-17 Frank Warmerdam * ogdi/c-api: ecs_xdrz.c, ecshash.c ecstile.c server.c Avoid compiler warnings about unused variables, and signed/unsigned stuff. * ogdi/c-api/makefile, ogdi/gltpd/makefile: Disable running rpcgen unless explicitly requested due to problems. 2001-02-07 Frank Warmerdam * ogdi/driver/vrf: vrf.c, utils.c Fixed a variety of memory leak problems, partly based on contributions from PCI, and Intergraph. http://sourceforge.net/bugs/?func=detailbug&bug_id=122434&group_id=11181 * vpflib/vpftable.c: Avoid problem in vpf_open_table() with mixture of unix and dos style separators. * ogdi/driver/dted/utils.c, dted.c: Fixed various memory leaks. * ogdi/c-api/server.c: Modified svr_DestroyServer() to free rasterconversion.coef.coef_val if non-null to fix memory leak. 2001-02-02 Frank Warmerdam * ogdi/driver/rpf/utils.c: Fixed bug with lpriv->ff being freed multiple times when it wasn't reinitialized to NULL in case of error. http://sourceforge.net/bugs/?func=detailbug&bug_id=130944&group_id=11181 * ogdi/driver/rpf/rpf.c: Fixed dyn_GetRasterInfo() to return proper row/column values for current region. As per: http://sourceforge.net/bugs/?func=detailbug&group_id=11181&bug_id=130943 * config/win32.mak: don't force debugtype to be coff. 2001-01-09 Frank Warmerdam * Updated test scripts to support operating against a server (OGDI_HOST), and updated to reflect the VRF bug fix. * Fixed bug in reading and display of VALUE DESCRRIPTION TABLE's in the vrf_Getmetadata() call of the vrf driver. See http://sourceforge.net/bugs/?func=detailbug&bug_id=128211&group_id=11181 * Renamed MAKEFILE to Makefile in external/rpc_win32/TEST, SERVICE, and TEST. 2000-11-23 Frank Warmerdam * Added DTED test scripts in test_suite/scripts/dted. * Added contrib section with ogdi_info, and ogdi_import. 2000-11-22 Frank Warmerdam * Fixed devdir/ogdi/drivers/dted/utils.c so that: - closedir() is not called on dirlist2 if it was never opened. - Removed a big chunk of #ifdef'ed out code. - Ignore CVS directories. http://sourceforge.net/bugs/?func=detailbug&bug_id=123178&group_id=11181 * Modify the ECSRESULTTYPE, ECSRESULT, ECSGEOMTYPE, ECSGEOM, ECSAREARING, ECSERROR, ECSSUCCESS, ECSEOF, ECSPROJ, ECSMESSAGE, ECSREGION, ECSTEXT, ECSRASTERINFO, ECSRASTERINFONB, ECSRASTERINFOCAT, ECSOBJECT, ECSOBJECTID, ECSOBJECTATTR, ECSRASTER, ECS_SETGEOMBOUNDINGBOX, ECS_SETGEOMLINECOORD, ECS_SETGEOMMATRIXVALUE, and ECS_SETGEOMIMAGEVALUE macros so they "protect" complex arguments. The ECS_SET* macros were converted to subscoped statements. http://sourceforge.net/bugs/?func=detailbug&bug_id=122425&group_id=11181 * Added test_suite tree including some test data to CVS repository. Note, this from the root, not under devdir. * Added .cvsignore files marking off OBJ.* directories. 2000-11-21 Frank Warmerdam * vpflib/vpftable.c: vpf_open_table() - memset() the table structure to zero to ensure no fields are uninitialized thereby causing problems in vpf_close_table() http://sourceforge.net/bugs/?func=detailbug&bug_id=123132&group_id=11181 * vpflib/vpftable.c: vpf_close_table() ... don't fclose(table->fp) if it is NULL. This can occur if no features are selected (for instance the wrong family type is used for a layer). http://sourceforge.net/bugs/?func=detailbug&bug_id=123132&group_id=11181 * Query strings passed to VRF driver with double quoted strings wouldn't work properly (ie. contourl@elev(hqc="1")) because one extra character was being eaten by code in vpflib/vpfquery.c. Applied fix suggested by Duncan Chaundy (PCI). http://sourceforge.net/bugs/?func=detailbug&bug_id=122597&group_id=11181 * Added Ecs_tcl_Init() entry point in ecs_tcl.c. This appears to be needed for Tcl8.x dynamic loading on Unix. http://sourceforge.net/bugs/?func=detailbug&bug_id=123077&group_id=11181 2000-11-10 Frank Warmerdam * Change Crown copyrigh back to LAS copyright, but with the same rights of use and distributions as the crown copyright code. ogdi/c-api: client.c, ecsdist.c, server.c ogdi/attr_driver/odbc: odbc.c, makefile, odbc.h ogdi/attr_drier: makefile datum_driver: makefile datum_driver/canada: dtcanada.c, makefile, nadconv.c, navconv.h, sdms.c datum_driver/usa: dtusa.c, makefile external/rpc_win32/makefile external/rpc_win32/LIBRPC/makefile external/rpc_win32/RPCGEN/makefile external/zlib/makefile ogdi/driver/adrg: adrg.c, adrg.h, utils.c, object.c, makefile ogdi/driver/dted: dted.c, dted.h, object.c, utils.c, makefile ogdi/driver/network: makefile ogdi/driver/rpf: makefile, rpf.c, utils.c, rpf.h ogdi/driver/skeleton: makefile, skeleton.c, object.c, open.c, skeleton.h, utils.c ogdi/driver/vrf: feature.c, object.c, vrf.c, utils.c, open.c, vrf.h, makefile ogdi/gltp: makefile ogdi/glutil: makefile ogdi/include: ecs.x, ecs_util.h, makefile, ecs.h ogdi/include/sun: ecs.h ogdi/tcl_interface: ecs_tcl.c, makefile 2000-11-09 Frank Warmerdam * remove files in the devdir/ogdi/doc directory. They are out of date (ogdi.ps), and available from other places (proj.4). They also add alot of heft to an ogdi cvs checkout. 2000-11-02 Frank Warmerdam * Added LICENSE file summarizing licenses in effect in source tree. * Change LAS copyright message to crown copyright on the following files: ogdi/c-api: client.c, ecsdist.c, server.c ogdi/attr_driver/odbc: odbc.c, makefile, odbc.h ogdi/attr_drier: makefile datum_driver: makefile datum_driver/canada: dtcanada.c, makefile, nadconv.c, navconv.h, sdms.c datum_driver/usa: dtusa.c, makefile external/rpc_win32/makefile external/rpc_win32/LIBRPC/makefile external/rpc_win32/RPCGEN/makefile external/zlib/makefile ogdi/driver/adrg: adrg.c, adrg.h, utils.c, object.c, makefile ogdi/driver/dted: dted.c, dted.h, object.c, utils.c, makefile ogdi/driver/network: makefile ogdi/driver/rpf: makefile, rpf.c, utils.c, rpf.h ogdi/driver/skeleton: makefile, skeleton.c, object.c, open.c, skeleton.h, utils.c ogdi/driver/vrf: feature.c, object.c, vrf.c, utils.c, open.c, vrf.h, makefile ogdi/gltp: makefile ogdi/glutil: makefile ogdi/include: ecs.x, ecs_util.h, makefile, ecs.h ogdi/include/sun: ecs.h ogdi/tcl_interface: ecs_tcl.c, makefile 2000-10-29 Frank Warmerdam * Made config/mkinstalldirs executable. * Added config/linux.mak. * Added ChangeLog file. * Imported OGDI 3.0 Beta into CVS. ------------------------------------------------------------------------------ OGDI 3.0 beta Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Files changed: devdir\ogdi\c-api\client.c devdir\ogdi\c-api\server.c devdir\ogdi\driver\skeleton\skeleton.c devdir\ogdi\driver\skeleton\skeleton.h devdir\ogdi\include\ecs_util.h devdir\ogdi\makefile devdir\ogdi\driver\makefile devdir\ogdi\examples\example2\example2.c devdir\ogdi\examples\example2\makefile Files removed: devdir\ogdi\ogdi.def devdir\ogdi\c-api\ecs.def devdir\ogdi\driver\network\libremote.def Files added: devdir\ogdi\examples\example2\example2.c devdir\ogdi\examples\example2\makefile devdir\ogdi\ogdi\driver\skeleton\datadict.h Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Remarks: -The function svr_BroadCloseLayers() in server.c seems to be useless and it contains the following errors: The argument to ecs_OpenDynamicLib should be "ogdi" instead of "ecs". The argument passed to ecs_CloseDynamicLib() should be "handle" instead of "func". Also, this function does nat have to load the cln_BroadCloseLayer because both svr_BroadCloseLayers() and cln_BroadCloseLayers() are in the same library. -The function cln_BroadCloseLayers() in client.c seems to be useless. -To conclude, I suggest to remove svr_BroadCloseLayers() and cln_BroadCloseLayers() from the core. -Both example1 and example2 directories contain example1.c and the makefile to build this example. To correct the error, I took the makefile and the example2.c file from the previous core and I copied them in the example2 directory of the present core. -The file datadict.h was missing to build the skeleton driver. I took the one from the previous core. ogdi-ogdi_4_1_0/HOWTO-RELEASE000066400000000000000000000023461345660466700155310ustar00rootroot00000000000000 Notes on Preparing an OGDI Source Release ========================================= 1) Ensure the OGDI_VERSION and OGDI_RELEASEDATE values are up to date in ogdi/include/ecs_util.h. 2) Update OGDI_MINOR OGDI_MAJOR and OGDI_VERSION in configure.ac for proper soname versioning of libraries. Run autoconf to regenerate configure script. 3) Do complete test builds on several platforms - at least Linux, Solaris, and Windows NT. 4) Run testsuite on these platforms. 5) Add release notice in ChangeLog. 6) Update the NEWS file based on a digested form of the ChangeLog file. 7) If this is a major public release, apply a tag to the source for the release. Normally tags are not incorporated for alpha and beta releases to avoid tag pollution. ie. git tag -a ogdi_3_2_1 8) Create the source distributions using the mkogdidist.sh script. The version name should include subrelease name components as appropriate. ie. mkogdidist.sh 3.1beta2 9) Publish the resulting files. For public (ie. final) releases they should be put up on the SourceForge file download manager area. 10) Announce release. For public releases announce to ogdidev mailing list, and on Freshmeat.net. ogdi-ogdi_4_1_0/LICENSE000066400000000000000000000273441345660466700146420ustar00rootroot00000000000000 Much of OGDI is implicitly or explicitly under the following two licenses (year varies a bit): Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. or Copyright (C) 1997 Her Majesty the Queen in Right of Canada. Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of Her Majesty the Queen in Right of Canada not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Her Majesty the Queen in Right of Canada makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. New files written by 3i are under this copyright: Copyright (C) 2001 Information Interoperability Institute (3i) Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of 3i not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. 3i makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. =============================================================================== =============================================================================== ogdi/c-api/marix.c is: * A public domain implementation. * * Author: Balint Cristian * * matrix invert code derivate from GRASS project (< 4.0 version): * http://grass.itc.it/ * http://en.wikipedia.org/wiki/Invertible_matrix * * * matrix multiply algorithm: * http://en.wikipedia.org/wiki/Matrix_multiplication * * * matrix transpose algorithm: * http://en.wikipedia.org/wiki/Transpose =============================================================================== ogdi/c-api/opendir.c/h is: * @(#)dir.c 1.4 87/11/06 Public Domain. * * A public domain implementation of BSD directory routines for * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), =============================================================================== include/win32/unistd.h: * Copyright (c) 1994 Software Research Associates, Inc. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. Software Research * Associates makes no representations about the suitability of this software * for any purpose. It is provided "as is" without express or implied * warranty. =============================================================================== include/win32/rpc/auth.h (and others): /********************************************************************* * RPC for the Windows NT Operating System * 1993 by Martin F. Gergeleit * Users may use, copy or modify Sun RPC for the Windows NT Operating * System according to the Sun copyright below. * * RPC for the Windows NT Operating System COMES WITH ABSOLUTELY NO * WARRANTY, NOR WILL I BE LIABLE FOR ANY DAMAGES INCURRED FROM THE * USE OF. USE ENTIRELY AT YOUR OWN RISK!!! *********************************************************************/ /* @(#)auth.h 2.3 88/08/07 4.0 RPCSRC; from 1.17 88/02/08 SMI */ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 =============================================================================== proj/*: Public Domain. =============================================================================== vpflib/*: The vpflib library contains the public domain VPFVIEW C code included with the Digital Chart of the World, Edition 1, which was pruned and ported to work on "POSIX"-like systems. NIMA's LICENSE Disclaimer of VPFVIEW C source code: /********************************************************************************** /* U.S. National Imagery and Mapping Agency -- UNCLASSIFIED -- * * VPFView 2.1 Distribution - Source Code Disclaimer: * * 1. The VPFView source code ("the software") is provided free of charge via the * Internet by the National Imagery and Mapping Agency (NIMA) of the United States * Department of Defense. Although NIMA makes no copyright claim under Title 17 * U.S.C.,NIMA claims copyrights in the source code under other legal regimes. NIMA * hereby grants to each user of the software a license to use and distribute the * software, and develop derivative works. * * 2. Warranty Disclaimer: The software was developed to meet only the internal * requirements of the U.S. National Imagery and Mapping Agency. The software * is provided "as is," and no warranty, express or implied, including but not * limited to the implied warranties of merchantability and fitness for particular * purpose or arising by statute or otherwise in law or from a course of dealing * or usage in trade, is made by NIMA as to the accuracy and functioning of the * software. * * 3. NIMA and its personnel are not required to provide technical support or general * assistance with respect to the software. * * 4. Neither NIMA nor its personnel will be liable for any claims, losses, or * damages arising from or connected with the use of the software. The user agrees * to hold harmless the United States National Imagery and Mapping Agency. The user * Is sole and exclusive remedy is to stop using the software. * * 5. NIMA requests that products developed using the software credit the source of * the software with the following statement, "The product was developed using VPFView, * a product of the National Imagery and Mapping Agency." * * 6. For any products developed using the software, NIMA requires a disclaimer that * use of the software does not indicate endorsement or approval of the product by * the Secretary of Defense or the National Imagery and Mapping Agency. Pursuant to * the United States Code, 10 U.S.C. ß 2797, the name of the National Imagery and * Mapping Agency, the initials "NIMA", the seal of the National Imagery and * Mapping Agency, or any colorable imitation thereof shall not be used to imply * approval, endorsement, or authorization of a product without prior written * permission from United States Secretary of Defense. * */ =============================================================================== external/rpc_win32/*/*: /********************************************************************* * RPC for the Windows NT Operating System * 1993 by Martin F. Gergeleit * Users may use, copy or modify Sun RPC for the Windows NT Operating * System according to the Sun copyright below. * * RPC for the Windows NT Operating System COMES WITH ABSOLUTELY NO * WARRANTY, NOR WILL I BE LIABLE FOR ANY DAMAGES INCURRED FROM THE * USE OF. USE ENTIRELY AT YOUR OWN RISK!!! *********************************************************************/ /* @(#)svc.c 2.4 88/08/11 4.0 RPCSRC; from 1.44 88/02/08 SMI */ /* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ =============================================================================== external/zlib/*: Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler gzip@prep.ai.mit.edu madler@alumni.caltech.edu ogdi-ogdi_4_1_0/NEWS000066400000000000000000000127341345660466700143310ustar00rootroot00000000000000 OGDI Core News ============== The NEWS file is just used to sumarize major changes, and new features. 4.1.0 ===== o Remove DTED driver that used the ecsrregex.c functionality removed in the below bullet. o Remove ogdi/c-api/ecshash.c and ogdi/c-api/ecsregex.c, which were considered incompatible of DFSG & OSD (https://github.com/libogdi/ogdi/issues/13) 4.0.0 ===== o Remove PROJ.4 dependency, functionality and related API With PROJ 6 being released and removing completely projects.h old API, a major upgrade would have been needed. I'd rater choose to completely cut off PROJ related functionality from OGDI. For the VRF case, projection support can be done through the GDAL/OGR OGDI driver. The dtusa and dtcanada drivers are removed. The following functions are removed from ecs_util.h: cln_SetServerProjection cln_SetClientProjection cln_ProjInit cln_CompareProjections cln_ConvRegion cln_ConvTtoS cln_ConvStoT cln_ChangeProjection cln_ChangeProjectionArea cln_ChangeProjectionLine cln_ChangeProjectionPoint cln_ChangeProjectionMatrix cln_ChangeProjectionImage cln_ChangeProjectionText ecs_distance_meters o Update server version to 4.0 to reflect removal of SetServerProjection capability o Build: add -fPIC when required o Rename aclocal.m4 to acinclude.m4 and apply stricter quoting o Respect LDFLAGS provided to ./configure o Fall back to libtirpc if libc does not provide rpc/rpc.h o Don't hardcode compiler to fix cross compilation. 3.2.1 ===== o MSVC 2015 related fixes o Win64 target o VRF: fixes for some linear features in DNC products 3.2.0 ===== o Fix Windows build issues o Harding of VRF driver regarding corrupted datasets o Extra fixes for buffer overflows and 64 bit issues. o Compiler warning fixes o PROJ >= 4.8 support 3.2.0beta2 ========== o Fix filename case sensitivity problems. o Further fix memory leaks. o Fix read the VMAP2i 'MIG2i000' product. o Handle 'L' (Latin1) type for text files. o Suport optional text to UTF-8 convert. 3.2.0beta1 ========== o Fix 64 bit platforms. o Fix malloc/free problem in rpf.c 3.1.6 ===== o Hide internal plugin objects from system libs path on unixes. o Release versioning using soname of libogdi shared library. o Clean up tons of compiler warnings over GCC. 3.1.5 ===== o Fixed serious bugs with untiled VPF products (like rference layer in VMAP0) o Fixed a few minor memory leaks, and at least one major one in VPF driver when using query expression. o Fixed serious bug in VPF reader when reader is re-loaded after one use. o Fixed several other issues in VPF driver. 3.1.4 ===== o Fixed bug in VRF driver when one client connection is closed and another opened. o Fixed severe problems with VRF driver and selection expressions for string fields. o Fixed severe problem composing area polygons from non-tiled VRF datastores (such as VMAP0 rference layer). o Fixed additional memory leaks. o Improvements in README for how to build on Unix and windows. 3.1.3 ===== o Fixed major leak in VPF driver. o Support TOC files without FSDEVG field. o Fixed rounding error in computing "nbfeature" in RPF driver (rounding issue) o Assorted other minor bug fixes, and memory leak cleanup. 3.1.2 ===== o Minor fixes for MacOS 10.3 support (older versions of MacOS won't work easily) o Fixed minor memory leaks in core. o Fixed major file handle leak in ADRG driver. o Fixed bugs in VPF driver, especially for VITD datasets. 3.1.1 ===== o Upgraded to ZLIB 1.1.4 to avoid buffer overflow security risk in zlib 1.1.3. o Various bugs fixed, and improvements to ogdi_info, and ogdi_import utilities. o Fixed problems in cln_CalcCtlPoints() with very small regions, equivelent to one pixel of data. Sometimes produced a degenerate transformation. o Added OGDI_VERSION and OGDI_RELEASEDATE macros in ecs_util.h. 3.1.0 ===== Essentially the same as 3.1Beta1. 3.1Beta1 ======== o Implement support for XML Capabilities (as per Proposal 6: Capabilities Metadata). This includes: - Added support for reaturning correct capabilities to adrg, dted, rpf and vpf drivers. - Added support for parsing capabilities documents, in libogdi utilizing Expat (incorporated into the source tree under devdir/external). - Added public client side API for accessing capabilities and version information (cln_GetLayerCapabilities(), cln_GetVersion()). o Upgraded VPF driver to support brackets in query expression. Implemented using generic "restricted_where" processor (swq.c). o Upgraded ADRG, RPF and DTED drivers to support Image (as well as Matrix) family support based on updates supplied by DND. o Added contributed GDAL raster driver as contrib/gdal. o Updated zlib in external/zlib to 1.1.3. o Embed version number in OGDI shared libraries (eg. libogdi31.so). 3.1Alpha ======== o Incorporated contrib/ogdi_import, and contrib/ogdi_info sample applications. o Updated build system to include configure script, install target, and various cleanups and simplifications. RPCGEN is no longer run by default. External versions of libz and PROJ.4 can be utilized. o Updated licenses within source code to reflect the redistributable nature of code written by LAS on contract to DND. o Variety of bug fixes, primarily to drivers. o Remove warnings during build from core code. ogdi-ogdi_4_1_0/README000066400000000000000000000037741345660466700145160ustar00rootroot00000000000000 OGDI README =========== OGDI developer and user resources can be found online at: http://ogdi.sourceforge.net/ Building ======== Detailed building instructions are available at: http://ogdi.sourceforge.net/build.html Unix ---- 1) Set TOPDIR to point to the home directory of the OGDI source tree. eg. TOPDIR=/usr/ogdi-3.1.3 export TOPDIR 2) Run configure. eg. ./configure 3) Build with make (GNUmake is required). make NOTE: on some platforms you will need to add the shared libraries to your LD_LIBRARY_PATH for the link phase to complete. eg. LD_LIBRARY_PATH=$TOPDIR/bin/Linux export LD_LIBRARY_PATH 4) Install. make install Windows ------- Windows works similarly, but a preset configuration is used instead of building one with configure. Requirements: o Cygwin (build shell) from http://www.cygwin.com/ with the GNU Make utility o Microsoft Visual C++ (make sure it works at the commandline from bash, run VCVARS32.BAT / VCVARSALL.BAT if not). Make sure that the link.exe command that comes with Cygwin does not override the link.exe of Visual Studio. You may need to alter the PATH to make sure Visual Studio binaries come first, or rename the link.exe in Cygwin 1) Set TOPDIR to point to the home directory of the OGDI source tree. (Do not use /cygdrive/c/ syntax) eg. TOPDIR=c:/ogdi-3.1.3 export TOPDIR 2) Set the target build configuration eg. TARGET=win32 export TARGET 3) Build with make. make Running ======= Briefly, ensure that $TOPDIR/bin/$TARGET is in the path. Ensure that $TOPDIR/bin/$TARGET is in the LD_LIBRARY_PATH on Unix. To use in local mode try a command like: ogdi_info -u gltp:/vrf//home/even/data/vm2alv2_texash/texashd:/toronto/dted To use via the server, run gltpd.exe first in the background. On windows, run portmap.exe before running gltpd.exe. Then use a command like: ogdi_info -u gltp://localhost/vrf//home/even/data/vm2alv2_texash/texashd:/toronto/dted ogdi-ogdi_4_1_0/README-BIN.TXT000066400000000000000000000070441345660466700155740ustar00rootroot00000000000000 OGDI README for Binary (Executable) Distribution ================================================ Source Version: @VERSION@ Platform: @PLATFORM@ Manifest -------- This tree (ogdi-@PLATFORM@-bin.@VERSION@) contains a binary distribution of OGDI @VERSION@ for the @PLATFORM@ system (note that win32 includes Windows 98, NT, 2000 and XP). This distribution includes ready to run executables along with shared libraries suitable for linking other applications against. On Windows it includes DLLs and stub libraries for linking against. As well, all include files required for development against the client are included. ogdi-@PLATFORM@-bin.@VERSION@/bin/*: - shared libraries (unix) or DLLs (windows). - executable for gltpd (OGDI gltp server). - executables for portmapper daemon (windows only) - executables for sample client programs including: o ogdi_import: Translate OGDI vectors to shapefiles and rasters to raw binary. o ogdi_info: Dump information about, and contents of OGDI datastore in text format to the terminal window. ogdi-@PLATFORM@-bin.@VERSION@/include/*: - all include files needed for client development ogdi-@PLATFORM@-bin.@VERSION@/lib/*: - client stub libraries for dlls (windows only) Setup on Unix ------------- Generally speaking it is necessary to add the ogdi-@PLATFORM@-bin.@VERSION@/bin directory to the executable path, and the shared library path. This can often be accomplished with commands like this (assuming the distribution is unpacked under the users home directory): C-Shell: % setenv PATH $PATH:$HOME/ogdi-@PLATFORM@-bin.@VERSION@/bin % setenv LD_LIBRARY_PATH $HOME/ogdi-@PLATFORM@-bin.@VERSION@/bin Bourne Shell: % PATH=${PATH}:$HOME/ogdi-@PLATFORM@-bin.@VERSION@/bin % LD_LIBRARY_PATH=$HOME/ogdi-@PLATFORM@-bin.@VERSION@/bin % export LD_LIBRARY_PATH If it is desirable to "install" the programs they can usually be copied to a central shared directory something like this: % cp ogdi-@PLATFORM@-bin.@VERSION@/bin/*.so /usr/local/lib % cp ogdi-@PLATFORM@-bin.@VERSION@/bin/{gltpd,ogdi_import,ogdi_info} /usr/local/lib To develop a client program it should be sufficient to add the include directory to the include path, and the bin directory to the link path along with the main client library. eg. % gcc -I$HOME/ogdi-@PLATFORM@-bin.@VERSION@/include myclient.c \ -L$HOME/ogdi-@PLATFORM@-bin.@VERSION@/bin -logdi31 -ldl -lm Setup on Windows ---------------- OGDI Client programs can be run directly from the ogdi-@PLATFORM@-bin.@VERSION@/bin directory from a command window, or this directory can be added to the search path. At the DOS command prompt the directory can be added to the path using a statement like the following (assuming the distribution was unpacked under C:\): C:\> SET PATH=%PATH%;C:\ogdi-@PLATFORM@-bin.@VERSION@\bin Before running gltpd.exe (the OGDI server) it is necessary to run portmap.exe. The portmap.exe program providers "port mapper" services necessary for the RPC protocol used by gltpd. To develop code it is generally necessary to add the C:\ogdi-@PLATFORM@-bin.@VERSION@\include directory to the include path. This can be accomplished with the -IC:\ogdi-@PLATFORM@-bin.@VERSION@/include directive in NMAKE files, or in the preprocessor tab of the Visual Studio options. On windows applications should be linked against the C:\ogdi-@PLATFORM@-bin.@VERSION@\lib\ogdi31.lib file. More Information ---------------- For more information on OGDI, access to the OGDI source visit: http://ogdi.sourceforge.net/ ogdi-ogdi_4_1_0/config/000077500000000000000000000000001345660466700150705ustar00rootroot00000000000000ogdi-ogdi_4_1_0/config/common.mak.in000066400000000000000000000153751345660466700174720ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Release versioning. # # MAJOR releases represent major ABI changes in the exposed shared lib. # This should not be so offen, only once with major code change wich due # to a change in how ogdi is called external by other applications. # # MINOR releases represents revisions or bugfixes over ogdi. # # The exposed soname of lib is libogdi.so.($major) an lies in $(INST_LIB) # Plugins lies in $(INST_LIB)/ogdi/ # OGDI_MAJOR = @OGDI_MAJOR@ OGDI_MINOR = @OGDI_MINOR@ OGDI_VERSION = $(OGDI_MAJOR)$(OGDI_MINOR) # Common macros and symbols used by all platforms # # # # !!! IMPORTANT !!! # # $TARGET and $TOPDIR must be defined in the environment # # - $TARGET is the platform on which you compile; # it could be 'solaris' or 'win32' # - $TOPDIR is the root directory of OGDI source files # # # # Default definitions # AUTOCONF_CC = @CC@ ifndef CFG CFG = release endif ifndef TARGET TARGET = $(shell uname) ifeq ($(TARGET), GNU/kFreeBSD) TARGET = Linux endif endif # # Standard location of external components (not maintained # by LAS) # # # Standard location of compiled component libraries # BINDIR = $(TOPDIR)/bin/$(TARGET) LIBDIR = $(TOPDIR)/lib/$(TARGET) # # Final OS installation location. # ifndef prefix prefix = /usr/local endif exec_prefix = ${prefix} INST_INCLUDE = ${prefix}/include INST_LIB = ${exec_prefix}/lib INST_BIN = ${exec_prefix}/bin # # A location named $(LINKDIR) will be defined in the system # specific configuration files. Under win32 this will point # to the location of the export libs $(LIBDIR), but under # Unix it is the location of the shared objects $(BINDIR). # # # Standard location of software components. # CURRENT_DIR = ./ VPF_DIR = $(topdir)/vpflib # # The following can be internal or external depending on whether we # want to use the built-in versions of these libraries. # EXPAT_SETTING = internal ZLIB_SETTING = internal # # Standard location of include files. # CURRENT_INCLUDE = $(patsubst %,$(INCL_SW)%,$(subst :, ,$(VPATH))) GENERAL_INCLUDE = $(INCL_SW)$(TOPDIR)/include/$(TARGET) OGDI_INCLUDE = $(INCL_SW)$(TOPDIR)/ogdi/include VRF_INCLUDE = $(INCL_SW)$(TOPDIR)/ogdi/driver/vrf VPF_INCLUDE = $(INCL_SW)$(TOPDIR)/vpflib/include $(INCL_SW)$(TOPDIR)/vpflib ZLIB_INCLUDE = $(INCL_SW)$(TOPDIR)/external/zlib GLUTIL_INCLUDE = $(INCL_SW)$(TOPDIR)/ogdi/glutil EXPAT_INCLUDE = $(INCL_SW)$(TOPDIR)/external/expat # # Dynamic libraries (shared objects) # ODBCEXT_LINKLIB = $(LINK_SW)$(LINKDIR)$(LIB_SW)odbcext$(LIB_SUFFIX) OGDI_LINKLIB = $(LINK_SW)$(LINKDIR)$(LIB_SW)ogdi$(LIB_SUFFIX) ZLIB_LINKLIB = $(LINK_SW)$(LINKDIR)$(LIB_SW)zlib_ogdi$(OGDI_VERSION)$(LIB_SUFFIX) EXPAT_LINKLIB = $(LINK_SW)$(LINKDIR)$(LIB_SW)expat_ogdi$(OGDI_VERSION)$(LIB_SUFFIX) # # Static libraries (archives) # VPF_STATICLIB = $(LINK_SW)$(LIBDIR)/static$(LIB_SW)vpf$(LIB_SUFFIX) REMOTE_STATICLIB = $(LINK_SW)$(LIBDIR)/static$(LIB_SW)remote$(LIB_SUFFIX) GLUTIL_STATICLIB = $(LINK_SW)$(LIBDIR)/static$(LIB_SW)glutil$(LIB_SUFFIX) # # Library aggregations # # # Location of resulting object files # OBJDIR =OBJ.$(TARGET) DEPENDFILE = depend.d OBJECTS = $(SOURCES:.c=.$(OBJ_EXT)) # # When compiling in the OBJ.$(TARGET) directory, search for # the source code files in the parent directory. # VPATH = .. # # Standard target names. Do not redefine them if they have # already been set in the enclosing makefile. # TOBEGEN_STRIPPED=$(patsubst %$(OGDI_VERSION),%,$(TOBEGEN)) ifndef ARCGEN ARCHGEN = $(TOPDIR)/lib/$(TARGET)/static/$(LIB_PREFIX)$(TOBEGEN).$(ARCH_EXT) endif ifndef DYNAGEN DYNAGEN = $(TOPDIR)/bin/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT) endif ifndef SHRDGEN SHRDGEN = $(TOPDIR)/bin/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) endif ifndef PROGGEN PROGGEN = $(TOPDIR)/bin/$(TARGET)/$(TOBEGEN)$(APP_EXT) endif STANDARD_TARGETS = clean install # # Default target to be used if no others are specified. # This implies that all makefiles that include this configuration # must provide an 'all' target. # all: # # Include the platform specific configuration # include $(TOPDIR)/config/$(TARGET).mak # # Standard targets provided for all sub-makefiles # # # Create a platform-specific object directory # MKOBJECTDIR: $(MKINSTALLDIR) $(OBJDIR) # # Build the dependency file using 'makedepend' # $(DEPENDFILE): $(SOURCES) touch depend.tmp makedepend -f depend.tmp -- $(subst /I,-I,$(subst /D,-D,$(SYSTEM_INCLUDE) $(CFLAGS))) -- $^ sed -e 's?^\.\./??g' -e 's?:/?:\\?g' depend.tmp > $@ # # Clean all possible junk # default-clean: -$(RMALL) $(OBJDIR) $(TOPDIR)/lib/$(TARGET)/static/$(LIB_PREFIX)$(TOBEGEN).* $(OBJDIR) $(TOPDIR)/lib/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).* $(TOPDIR)/bin/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).* $(PROGGEN) # # Default rule(s) to install stuff if appropriate. # ifeq ($(TARGETGEN),$(DYNAGEN)) default-install: mkdir -p $(INST_LIB)/ogdi cp $(TARGETGEN) $(INST_LIB)/ogdi endif ifeq ($(TARGETGEN),$(SHRDGEN)) default-install: cp $(TARGETGEN) $(INST_LIB) cd $(INST_LIB); \ ln -s $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) \ $(LIB_PREFIX)$(TOBEGEN_STRIPPED).$(SHLIB_EXT).$(OGDI_MAJOR); \ ln -s $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) \ $(LIB_PREFIX)$(TOBEGEN_STRIPPED).$(SHLIB_EXT); \ cd $(CURDIR) endif ifeq ($(TARGETGEN),$(ARCHGEN)) default-install: endif ifeq ($(TARGETGEN),$(PROGGEN)) default-install: cp $(TARGETGEN) $(INST_BIN) endif ifeq ($(TARGETGEN),) default-install: endif install-so-link: mv -f $(INST_LIB)/$(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) $(INST_LIB) mv -f $(INST_LIB)/$(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR) $(INST_LIB) cd $(INST_LIB); ln -s $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) \ $(LIB_PREFIX)$(TOBEGEN_STRIPPED).$(SHLIB_EXT) ; \ cd $(CURDIR) install: default-install $(EXTRA_INSTALL_TARGETS) # # Include the auto-generated dependency rules. Only include # this file if executing from within the OBJ.$(TARGET) directory. # # ifeq ($(PASS),depend) # include $(DEPENDFILE) # endif # # End of the common configuration # ogdi-ogdi_4_1_0/config/darwin.mak000066400000000000000000000030101345660466700170400ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Darwin (MacOS X) configuration file # # Read in the configuration common to all Unix # include $(TOPDIR)/config/unix.mak # # platform specific Symbols # PLATFORM = darwin # # platform specific tools # AR = ar cr # # Compilation and linking flags # SHLIB_CFLAGS = -fno-common COMMON_CFLAGS = $(OPTIMIZATION) -fno-common SHLIB_LDFLAGS = -dynamiclib COMMON_LDFLAGS = $(OPTIMIZATION) # # File name extensions # SHLIB_EXT = dylib UCB_STATICLIB = # # Endian definition # BIG_ENDIAN = 1 # # make rules # $(ARCHGEN): $(OBJECTS) @echo Making archive file: $@ $(AR) $@ $^ ranlib $@ @echo $@ made successfully ... $(DYNAGEN): $(OBJECTS) @echo Making shared library: $@ $(SHLIB_LD) $(SHLIB_LDFLAGS) $(COMMON_LDFLAGS) -o $@ $^ $(LINK_LIBS) @echo $@ made successfully ... ogdi-ogdi_4_1_0/config/generic.mak.in000066400000000000000000000043071345660466700176070ustar00rootroot00000000000000# Copyright (C) 2001 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Generic unix configuration file, processed by configure to make # platform specific. # # Read in the configuration common to all Unix # include $(TOPDIR)/config/unix.mak # # platform specific Symbols # PLATFORM = $(TARGET) _SOLARIS = 1 USE_TERMIO = -DUSE_TERMIO # # platform specific tools # AR = ar cr # # Compilation and linking flags # SHLIB_CFLAGS = @C_PIC@ COMMON_CFLAGS = $(OPTIMIZATION) @CFLAGS@ @C_WFLAGS@ -DUNIX=1 @C_PIC@ @RPC_CFLAGS@ SHLIB_LDFLAGS = -shared COMMON_LDFLAGS = $(OPTIMIZATION) @LDFLAGS@ RPC_INCLUDES = @RPC_INCLUDES@ UCB_STATICLIB = TCL_INCLUDE = -I/usr/include/tcl8.3 TCL_LINKLIB = # # Install Locations # prefix = @prefix@ exec_prefix = @exec_prefix@ INST_INCLUDE = ${prefix}/include INST_LIB = @libdir@ INST_BIN = @bindir@ # # platform specific file locations # #RPC_LINKLIB = -lrpcsvc -lnsl -lsocket #RPC_LINKLIB = -ldl -ldbmalloc RPC_LINKLIB = @LIBS@ @RPC_LIBS@ # # Endian definition, could be little or big # BIG_ENDIAN = @BIG_ENDIAN@ # # Handle internal/external ZLIB library usage. # ZLIB_SETTING=@ZLIB_SETTING@ ifeq ($(ZLIB_SETTING),external) ZLIB_INCLUDE := @ZLIB_INCLUDE@ ZLIB_LINKLIB := @ZLIB_LIB@ endif # # Handle internal/external/disabled "Expat" library handling. # EXPAT_SETTING=@EXPAT_SETTING@ ifeq ($(EXPAT_SETTING),external) EXPAT_INCLUDE := @EXPAT_INCLUDE@ EXPAT_LINKLIB := @EXPAT_LIB@ endif ifeq ($(EXPAT_SETTING),disabled) EXPAT_INCLUDE := -DEXPAT_DISABLED EXPAT_LINKLIB := endif # Iconv HAVE_ICONV=@HAVE_ICONV@ ogdi-ogdi_4_1_0/config/linux.mak000066400000000000000000000027641345660466700167320ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Solaris configuration file # # Read in the configuration common to all Unix # include $(TOPDIR)/config/unix.mak # # platform specific Symbols # PLATFORM = linux _SOLARIS = 1 USE_TERMIO = -DUSE_TERMIO # # platform specific tools # AR = ar cr # # Compilation and linking flags # SHLIB_CFLAGS = -fPIC COMMON_CFLAGS = $(OPTIMIZATION) -W -Wall -ansi -fPIC -DUNIX=1 \ -D_BSD_SOURCE -D_LINUX SHLIB_LDFLAGS = -shared COMMON_LDFLAGS = $(OPTIMIZATION) RPC_INCLUDES = -DHAVE_STD_RPC_INCLUDES UCB_STATICLIB = TCL_INCLUDE = -I/usr/include/tcl8.3 TCL_LINKLIB = # # platform specific file locations # #RPC_LINKLIB = -lrpcsvc -lnsl -lsocket #RPC_LINKLIB = -ldl -ldbmalloc RPC_LINKLIB = -ldl # # Endian definition, could be little or big # BIG_ENDIAN = 0 ogdi-ogdi_4_1_0/config/mkinstalldirs000077500000000000000000000012441345660466700176770ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id$ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here ogdi-ogdi_4_1_0/config/solaris.mak000066400000000000000000000026041345660466700172400ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Solaris configuration file # # Read in the configuration common to all Unix # include $(TOPDIR)/config/unix.mak # # platform specific Symbols # PLATFORM = solaris _SOLARIS = 1 USE_TERMIO = -DUSE_TERMIO # # platform specific tools # AR = /usr/ccs/bin/ar cr # # Compilation and linking flags # SHLIB_CFLAGS = -fPIC COMMON_CFLAGS = $(OPTIMIZATION) -W -Wall -ansi -fPIC -D_SOLARIS=1 -DUNIX=1 SHLIB_LDFLAGS = -shared -h $(@F) COMMON_LDFLAGS = $(OPTIMIZATION) UCB_STATICLIB = /usr/ucblib/libucb.a # # platform specific file locations # RPC_LINKLIB = -lrpcsvc -lnsl -lsocket # # Endian definition, could be little or big # BIG_ENDIAN = 1 ogdi-ogdi_4_1_0/config/unix.mak000066400000000000000000000051011345660466700165420ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # Unix configuration file. Symbols and macros common # all Unix platforms. # UNIX = 1 UNIX_DEFINE = -Dunix # # Standard tools # CC = ${AUTOCONF_CC} LD = ${AUTOCONF_CC} SHLIB_LD = ${AUTOCONF_CC} AR = ar cr RM = rm RMALL = rm -rf FILECOPY = cp MKDIR = mkdir DIRCOPY = cp -r SHELL = /bin/sh MKINSTALLDIR = $(TOPDIR)/config/mkinstalldirs # # File name extensions # APP_EXT = ARCH_EXT = a LIB_PREFIX = lib LIB_SUFFIX = OBJ_EXT = o SHLIB_EXT = so # # Command switches # DEFINE_SW = -D INCL_SW = -I LIB_SW = $(subst :, -l,:) LINK_SW = -L ifeq ($(CFG),debug) OPTIMIZATION = -g else OPTIMIZATION = -O endif # # Standard location of compiled component libraries # LINKDIR = $(BINDIR) # # Includes # SYSTEM_INCLUDE = $(patsubst %,$(INCL_SW)%,$(subst \,/,$(subst :, ,$(INCLUDE)))) # # Library locations for link command # RPC_LINKLIB = MATH_LINKLIB = $(LIB_SW)m DL_LINKLIB = LIBC_LINKLIB = -lc # # make rules # $(ARCHGEN): $(OBJECTS) @echo Making archive file: $@ $(AR) $@ $^ @echo $@ made successfully ... $(PROGGEN): $(OBJECTS) @echo Making executable: $@ $(LD) $(COMMON_LDFLAGS) $(COMMON_CFLAGS) -o $@ $^ $(LINK_LIBS) @echo $@ made successfully ... $(SHRDGEN): $(OBJECTS) @echo Making shared library: $@ $(SHLIB_LD) $(SHLIB_LDFLAGS) $(COMMON_LDFLAGS) $(COMMON_CFLAGS) -Wl,-soname,$(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR) -o $@ $^ $(LINK_LIBS) cd $(TOPDIR)/bin/$(TARGET); ln -s $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT); \ ln -s $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR).$(OGDI_MINOR) $(LIB_PREFIX)$(TOBEGEN).$(SHLIB_EXT).$(OGDI_MAJOR); cd $(CURDIR) @echo $@ made successfully ... $(DYNAGEN): $(OBJECTS) @echo Making dynamic library: $@ $(SHLIB_LD) $(SHLIB_LDFLAGS) $(COMMON_LDFLAGS) $(COMMON_CFLAGS) -o $@ $^ $(LINK_LIBS) @echo $@ made successfully ... ogdi-ogdi_4_1_0/config/win32.mak000066400000000000000000000105061345660466700165260ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # # # # win32 configuration file # MAKE = $(MAKE_COMMAND) $(MAKEOVERRIDES) # # Platform specific symbols # Platform = win32 # # Standard tools # CC = cl.exe /nologo LD = link.exe /nologo SHLIB_LD = link.exe /nologo AR = lib.exe /nologo FILECOPY = cp MKDIR = mkdir DIRCOPY = cp -rf ifndef SHELL SHELL = /bin/sh endif MKINSTALLDIR = $(TOPDIR)/config/mkinstalldirs RSC = rc.exe RM = rm RMALL = rm -rf RMDIR = rmdir REVERSETOPDIR = $(subst /,\,$(TOPDIR)) # # File name extensions # APP_EXT = .exe ARCH_EXT = lib LIB_PREFIX = LIB_SUFFIX = .lib OBJ_EXT = obj SHLIB_EXT = dll # # Command switches # DEFINE_SW = /D INCL_SW = /I LIB_SW = / LINK_SW = # # Endian definition, could be little or big # BIG_ENDIAN = 0 # #Compilation and linking flags # # These flags are appropriate for a compiling with Visual C++ 5.0 # With these flags, you could run purify. # WINCPP_DEBUG = /GX /D_DEBUG /Zi $(CPP_DEBUG) WINCPP_RELEASE = /GX /Gi- /Gy /Od /DNDEBUG $(CPP_RELEASE) LINK_DEBUG = /DEBUG /INCREMENTAL:no /FIXED:NO LINK_RELEASE = /INCREMENTAL:no /OPT:REF #flags # These flags are appropriate for a compiling with Visual C++ 4.0 # With these flags, you could run purify. # #LINK_DEBUG = /DEBUG /INCREMENTAL:no /debugtype:cv #WINCPP_RELEASE = /GX /Gi- /Gy /O2 /DNDEBUG $(CPP_RELEASE) SMARTHEAP_LIB = ifneq ($(CFG),release) OPTIMIZATION = $(WINCPP_DEBUG) LINK_OPTIMIZATION = $(LINK_DEBUG) else OPTIMIZATION = $(WINCPP_RELEASE) LINK_OPTIMIZATION = $(LINK_RELEASE) endif SHLIB_CFLAGS = SHLIB_LDFLAGS = /DLL COMMON_LDFLAGS = /DEBUG # # Standard location of compiled component libraries # LINKDIR = $(LIBDIR) # # INCLUDE locations for include command # SYSTEM_INCLUDE = $(patsubst %,$(INCL_SW)%,$(subst \,/,$(subst ;, ,$(INCLUDE)))) COMPAT_INCLUDE = $(INCL_SW)$(TOPDIR)/include/win32/compat RPC_INCLUDE = $(INCL_SW)$(TOPDIR)/external/rpc_win32/rpc SYS_INCLUDE = $(INCL_SW)$(TOPDIR)/include/win32/sys # Library locations for link command WIN_LINKLIB = user32.lib gdi32.lib wsock32.lib advapi32.lib kernel32.lib LXLIB_LINKLIB = $(LIBDIR)/lxlib.lib ODBC_LINKLIB = odbc32.lib odbccp32.lib RPC_LINKLIB = $(LIBDIR)/static/rpc.lib # # rules # COMMON_CFLAGS = /D_WINDOWS /DWIN32 /D_MBCS \ /Dhypot=_hypot /DNO_DIRENT_H \ /DSIGQUIT=SIGBREAK /Dioctl=Ioctl /DSIGPIPE=SIGTERM \ /DSIGHUP=SIGTERM /DSIGALRM=SIGTERM /Dpopen=_popen \ /Dpclose=_pclose \ /DMISSING_DLFCN_H \ $(OPTIMIZATION) \ /W3 /YX /MD /c /Fpheaders.pch # Disabled since it causes issue on 64bit build, and no longer needed # FLAGS_X86DEF = /D_X86_ $(subst :,\:,$(ARCHGEN)): $(OBJECTS) @echo Making archive file: $@ $(AR) /OUT:$@ $^ @echo $@ made successfully ... DEF_FILE=$(TOBEGEN_STRIPPED).def RES_FILE=$(TOBEGEN).res RC_FILE=$(TOBEGEN).rc $(subst :,\:,$(DYNAGEN)): $(DEF_FILE) $(OBJECTS) @echo Making dynamic file: $@ @echo $(SHLIB_LD) /DLL $(LINK_OPTIMIZATION) \ $(filter %.$(OBJ_EXT),$^) $(LINK_LIBS) /DEF:$(filter %.def,$^) \ /OUT:$(TOBEGEN).dll \ /IMPLIB:$(TOPDIR)/lib/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).$(ARCH_EXT) \ /OUT:$@ ifndef WITHICON $(subst :,\:,$(PROGGEN)): $(OBJECTS) @echo Making executable file: $@ $(LD) $^ $(LINK_LIBS) \ $(LINK_OPTIMIZATION) $(SMARTHEAP_LINKLIB) \ /OUT:$@ else $(subst :,\:,$(PROGGEN)): $(RES_FILE) $(OBJECTS) @echo Making executable file: $@ $(LD) $(filter %.$(OBJ_EXT),$^) $(LINK_LIBS) \ $(filter %.res,$^) \ $(LINK_OPTIMIZATION) $(SMARTHEAP_LINKLIB) \ /OUT:$@ endif %.obj: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $< $(subst :,\:,$(RES_FILE)): $(RC_FILE) $(RSC) /fo"$@" $(GENERAL_INCLUDE) $(TCLTK_INCLUDE) $^ ogdi-ogdi_4_1_0/config/win64.mak000066400000000000000000000103741345660466700165360ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # # # # win32 configuration file # MAKE = $(MAKE_COMMAND) $(MAKEOVERRIDES) # # Platform specific symbols # Platform = win32 # # Standard tools # CC = cl.exe /nologo LD = link.exe /nologo SHLIB_LD = link.exe /nologo AR = lib.exe /nologo FILECOPY = cp MKDIR = mkdir DIRCOPY = cp -rf ifndef SHELL SHELL = /bin/sh endif MKINSTALLDIR = $(TOPDIR)/config/mkinstalldirs RSC = rc.exe RM = rm RMALL = rm -rf RMDIR = rmdir REVERSETOPDIR = $(subst /,\,$(TOPDIR)) # # File name extensions # APP_EXT = .exe ARCH_EXT = lib LIB_PREFIX = LIB_SUFFIX = .lib OBJ_EXT = obj SHLIB_EXT = dll # # Command switches # DEFINE_SW = /D INCL_SW = /I LIB_SW = / LINK_SW = # # Endian definition, could be little or big # BIG_ENDIAN = 0 # #Compilation and linking flags # # These flags are appropriate for a compiling with Visual C++ 5.0 # With these flags, you could run purify. # WINCPP_DEBUG = /EHsc /D_DEBUG /Zi $(CPP_DEBUG) WINCPP_RELEASE = /EHsc /Gy /Od /DNDEBUG $(CPP_RELEASE) LINK_DEBUG = /DEBUG /INCREMENTAL:no /FIXED:NO LINK_RELEASE = /INCREMENTAL:no /OPT:REF #flags # These flags are appropriate for a compiling with Visual C++ 4.0 # With these flags, you could run purify. # #LINK_DEBUG = /DEBUG /INCREMENTAL:no /debugtype:cv #WINCPP_RELEASE = /EHsc /Gi- /Gy /O2 /DNDEBUG $(CPP_RELEASE) SMARTHEAP_LIB = ifneq ($(CFG),release) OPTIMIZATION = $(WINCPP_DEBUG) LINK_OPTIMIZATION = $(LINK_DEBUG) else OPTIMIZATION = $(WINCPP_RELEASE) LINK_OPTIMIZATION = $(LINK_RELEASE) endif SHLIB_CFLAGS = SHLIB_LDFLAGS = /DLL COMMON_LDFLAGS = /DEBUG # # Standard location of compiled component libraries # LINKDIR = $(LIBDIR) # # INCLUDE locations for include command # SYSTEM_INCLUDE = $(patsubst %,$(INCL_SW)%,$(subst \,/,$(subst ;, ,$(INCLUDE)))) COMPAT_INCLUDE = $(INCL_SW)$(TOPDIR)/include/win32/compat RPC_INCLUDE = $(INCL_SW)$(TOPDIR)/external/rpc_win32/rpc SYS_INCLUDE = $(INCL_SW)$(TOPDIR)/include/win32/sys # Library locations for link command WIN_LINKLIB = user32.lib gdi32.lib wsock32.lib advapi32.lib kernel32.lib #LXLIB_LINKLIB = $(LIBDIR)/lxlib.lib ODBC_LINKLIB = odbc32.lib odbccp32.lib RPC_LINKLIB = $(LIBDIR)/static/rpc.lib # # rules # COMMON_CFLAGS = /D_WINDOWS /DWIN32 /D_MBCS \ /Dhypot=_hypot /DNO_DIRENT_H \ /DSIGQUIT=SIGBREAK /Dioctl=Ioctl /DSIGPIPE=SIGTERM \ /DSIGHUP=SIGTERM /DSIGALRM=SIGTERM /Dpopen=_popen \ /Dpclose=_pclose \ /DMISSING_DLFCN_H \ $(OPTIMIZATION) \ /W3 /MD /c /Fpheaders.pch #FLAGS_X86DEF = /D_X86_ $(subst :,\:,$(ARCHGEN)): $(OBJECTS) @echo Making archive file: $@ $(AR) /OUT:$@ $^ @echo $@ made successfully ... DEF_FILE=$(TOBEGEN_STRIPPED).def RES_FILE=$(TOBEGEN).res RC_FILE=$(TOBEGEN).rc $(subst :,\:,$(DYNAGEN)): $(DEF_FILE) $(OBJECTS) @echo Making dynamic file: $@ @echo $(SHLIB_LD) /DLL $(LINK_OPTIMIZATION) \ $(filter %.$(OBJ_EXT),$^) $(LINK_LIBS) /DEF:$(filter %.def,$^) \ /OUT:$(TOBEGEN).dll \ /IMPLIB:$(TOPDIR)/lib/$(TARGET)/$(LIB_PREFIX)$(TOBEGEN).$(ARCH_EXT) \ /OUT:$@ ifndef WITHICON $(subst :,\:,$(PROGGEN)): $(OBJECTS) @echo Making executable file: $@ $(LD) $^ $(LINK_LIBS) \ $(LINK_OPTIMIZATION) $(SMARTHEAP_LINKLIB) \ /OUT:$@ else $(subst :,\:,$(PROGGEN)): $(RES_FILE) $(OBJECTS) @echo Making executable file: $@ $(LD) $(filter %.$(OBJ_EXT),$^) $(LINK_LIBS) \ $(filter %.res,$^) \ $(LINK_OPTIMIZATION) $(SMARTHEAP_LINKLIB) \ /OUT:$@ endif %.obj: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $< $(subst :,\:,$(RES_FILE)): $(RC_FILE) $(RSC) /fo"$@" $(GENERAL_INCLUDE) $(TCLTK_INCLUDE) $^ ogdi-ogdi_4_1_0/configure000077500000000000000000004627111345660466700155450ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="config/unix.mak" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS binconfigs pkgconfigdir EXPAT_LIB EXPAT_INCLUDE EXPAT_SETTING ZLIB_LIB ZLIB_INCLUDE ZLIB_SETTING BIG_ENDIAN RPC_INCLUDES RPC_LIBS RPC_CFLAGS EGREP GREP CPP LD_SHARED C_PIC CXX_PIC C_WFLAGS CXX_WFLAGS HAVE_ICONV PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC OGDI_MINOR OGDI_MAJOR OGDI_VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_zlib with_zliblib with_zlibinc with_expat with_expatlib with_expatinc with_pkgconfigdir with_binconfigs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR CPP RPC_CFLAGS RPC_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=ARG Utilize external ZLIB support --with-zliblib=path Select ZLIB library --with-zlibinc=path Select ZLIB include directory --with-expat=ARG Utilize external Expat library, or disable Expat. --with-expatlib=path Select Expat library --with-expatinc=path Select Expat include directory --with-pkgconfigdir Use the specified pkgconfig dir (default is libdir/pkgconfig) --with-binconfigs Generate shell ogdi-config scripts as well as pkg-config data [default=yes] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path CPP C preprocessor RPC_CFLAGS C compiler flags for RPC, overriding pkg-config RPC_LIBS linker flags for RPC, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu OGDI_VERSION=4.1.0 OGDI_MAJOR=4 OGDI_MINOR=1 if test "$TOPDIR" = "" ; then as_fn_error $? "Required TOPDIR environment variable not set, see README." "$LINENO" 5 fi if test "$OS" = "Windows_NT" ; then as_fn_error $? "Please don't use configure for Windows, see README." "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -lc" >&5 $as_echo_n "checking for iconv_open in -lc... " >&6; } if ${ac_cv_lib_c_iconv_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv_open (); int main () { return iconv_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_iconv_open=yes else ac_cv_lib_c_iconv_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_iconv_open" >&5 $as_echo "$ac_cv_lib_c_iconv_open" >&6; } if test "x$ac_cv_lib_c_iconv_open" = xyes; then : HAVE_ICONV=yes fi HAVE_ICONV=$HAVE_ICONV # Remove -g from compile flags, we will add via CFG variable if # we need it. CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-g //"` CFLAGS=`echo "$CFLAGS " | sed "s/-g //"` # check for GNU compiler, and use -Wall if test "$GCC" = "yes"; then C_WFLAGS="-Wall" $as_echo "#define USE_GNUCC 1" >>confdefs.h fi if test "$GXX" = "yes"; then CXX_WFLAGS="-Wall" $as_echo "#define USE_GNUCC 1" >>confdefs.h fi CXX_WFLAGS=$CXX_WFLAGS C_WFLAGS=$C_WFLAGS echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -fPIC -c conftest.c 2>&1`"; then C_PIC=-fPIC else C_PIC= fi if test -z "`${CXX-g++} -fPIC -c conftest.c 2>&1`"; then CXX_PIC=-fPIC else CXX_PIC= fi rm -f conftest* CXX_PIC=$CXX_PIC C_PIC=$C_PIC echo 'void g(); int main(){ g(); return 0; }' > conftest1.c echo 'void g(); void g(){}' > conftest2.c ${CC} ${C_PIC} -c conftest2.c LD_SHARED="/bin/true" if test -z "`${CXX} -shared conftest2.o -o libconftest.so 2>&1`" ; then if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH" LD_LIBRARY_PATH="`pwd`" export LD_LIBRARY_PATH if test -z "`./conftest1 2>&1`" ; then echo "checking for ${CXX} -shared ... yes" LD_SHARED="${CXX} -shared" else echo "checking for ${CXX} -shared ... no(3)" fi LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD" else echo "checking for ${CXX} -shared ... no(2)" fi else echo "checking for ${CXX} -shared ... no(1)" fi if test "$LD_SHARED" = "/bin/true" \ -a -z "`ld -shared conftest2.o -o libconftest.so 2>&1`" ; then if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH" LD_LIBRARY_PATH="`pwd`" export LD_LIBRARY_PATH if test -z "`./conftest1 2>&1`" ; then echo "checking for ld -shared ... yes" LD_SHARED="ld -shared" fi LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD" fi fi if test "$LD_SHARED" = "/bin/true" ; then echo "checking for ld -shared ... no" fi rm -f conftest* libconftest* LD_SHARED=$LD_SHARED ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in rpc/rpc.h do : ac_fn_c_check_header_mongrel "$LINENO" "rpc/rpc.h" "ac_cv_header_rpc_rpc_h" "$ac_includes_default" if test "x$ac_cv_header_rpc_rpc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RPC_RPC_H 1 _ACEOF else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPC" >&5 $as_echo_n "checking for RPC... " >&6; } if test -n "$RPC_CFLAGS"; then pkg_cv_RPC_CFLAGS="$RPC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RPC_CFLAGS=`$PKG_CONFIG --cflags "libtirpc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$RPC_LIBS"; then pkg_cv_RPC_LIBS="$RPC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RPC_LIBS=`$PKG_CONFIG --libs "libtirpc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then RPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtirpc" 2>&1` else RPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtirpc" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$RPC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libtirpc) were not met: $RPC_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables RPC_CFLAGS and RPC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables RPC_CFLAGS and RPC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else RPC_CFLAGS=$pkg_cv_RPC_CFLAGS RPC_LIBS=$pkg_cv_RPC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="$CPPFLAGS $RPC_CFLAGS" fi fi done for ac_header in rpc/pmap_clnt.h float.h dlfcn.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "$ac_cv_header_rpc_pmap_clnt_h" = yes ; then RPC_INCLUDES=-DHAVE_STD_RPC_INCLUDES else RPC_INCLUDES= fi RPC_INCLUDES=$RPC_INCLUDES if test "$ac_cv_header_float_h" = no ; then CFLAGS="$CFLAGS -DMISSING_FLOAT_H" fi if test "$ac_cv_header_dlfcn_h" = no ; then CFLAGS="$CFLAGS -DMISSING_DLFCN_H" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test $ac_cv_c_bigendian = yes ; then BIG_ENDIAN=1 else BIG_ENDIAN=0 fi BIG_ENDIAN=$BIG_ENDIAN ZLIB_SETTING=internal ZLIB_INCLUDE= ZLIB_LIB= export ZLIB_LIB ZLIB_INCLUDE ZLIB_SETTING # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; fi if test "$with_zlib" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflateInit_ in -lz" >&5 $as_echo_n "checking for deflateInit_ in -lz... " >&6; } if ${ac_cv_lib_z_deflateInit_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char deflateInit_ (); int main () { return deflateInit_ (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_deflateInit_=yes else ac_cv_lib_z_deflateInit_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflateInit_" >&5 $as_echo "$ac_cv_lib_z_deflateInit_" >&6; } if test "x$ac_cv_lib_z_deflateInit_" = xyes; then : ZLIB_SETTING=external else ZLIB_SETTING=missing fi for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF fi done if test $ZLIB_SETTING = missing ; then as_fn_error $? "Unable to find external ZLIB library, give path or use default internal library." "$LINENO" 5 fi if test "$ac_cv_header_zlib_h" = no ; then as_fn_error $? "Unable to find external ZLIB zlib.h file, give path or use default internal library." "$LINENO" 5 fi ZLIB_SETTING=external ZLIB_LIB=-lz elif test "$with_zlib" != "no" -a "$with_zlib" != "" ; then if test -r $with_zlib/include/zlib.h ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $with_zlib/include/zlib.h ... found" >&5 $as_echo "checking for $with_zlib/include/zlib.h ... found" >&6; } ZLIB_INCLUDE=-I$with_zlib/include elif test -r $with_zlib/zlib.h ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $with_zlib/zlib.h ... found" >&5 $as_echo "checking for $with_zlib/zlib.h ... found" >&6; } ZLIB_INCLUDE=-I$with_zlib else as_fn_error $? "Unable to find $with_zlib/include/zlib.h" "$LINENO" 5 fi if test -r $with_zlib/lib/libz.so ; then ZLIB_LIB=$with_zlib/lib/libz.so { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $ZLIB_LIB ... found" >&5 $as_echo "checking for $ZLIB_LIB ... found" >&6; } elif test -r $with_zlib/lib/libz.a ; then ZLIB_LIB=$with_zlib/lib/libz.a { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $ZLIB_LIB ... found" >&5 $as_echo "checking for $ZLIB_LIB ... found" >&6; } elif test -r $with_zlib/libz.so ; then ZLIB_LIB=$with_zlib/libz.so { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $ZLIB_LIB ... found" >&5 $as_echo "checking for $ZLIB_LIB ... found" >&6; } elif test -r $with_zlib/libz.a ; then ZLIB_LIB=$with_zlib/libz.a { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for $ZLIB_LIB ... found" >&5 $as_echo "checking for $ZLIB_LIB ... found" >&6; } else as_fn_error $? "Unable to find $with_zlib/{lib/,}libz.{so,a}" "$LINENO" 5 fi ZLIB_SETTING=external fi # Check whether --with-zliblib was given. if test "${with_zliblib+set}" = set; then : withval=$with_zliblib; fi if test "$with_zliblib" != "" ; then ZLIB_LIB=$with_zliblib ZLIB_SETTING=external { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using ZLIB_LIB=$ZLIB_LIB for ZLIB library." >&5 $as_echo "Using ZLIB_LIB=$ZLIB_LIB for ZLIB library." >&6; } fi # Check whether --with-zlibinc was given. if test "${with_zlibinc+set}" = set; then : withval=$with_zlibinc; fi if test "$with_zlibinc" != "" ; then ZLIB_INCLUDE=-I${with_zlibinc} ZLIB_SETTING=external { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using ZLIB_INCLUDE=$ZLIB_INCLUDE for ZLIB includes." >&5 $as_echo "Using ZLIB_INCLUDE=$ZLIB_INCLUDE for ZLIB includes." >&6; } fi if test "$ZLIB_SETTING" = "internal" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using internal ZLIB implementation." >&5 $as_echo "Using internal ZLIB implementation." >&6; } fi ZLIB_SETTING=$ZLIB_SETTING ZLIB_INCLUDE=$ZLIB_INCLUDE ZLIB_LIB=$ZLIB_LIB EXPAT_SETTING=internal EXPAT_INCLUDE= EXPAT_LIB= export EXPAT_LIB EXPAT_INCLUDE EXPAT_SETTING # Check whether --with-expat was given. if test "${with_expat+set}" = set; then : withval=$with_expat; fi if test "$with_expat" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 $as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lexpat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XML_ParserCreate (); int main () { return XML_ParserCreate (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_expat_XML_ParserCreate=yes else ac_cv_lib_expat_XML_ParserCreate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 $as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then : EXPAT_SETTING=external else EXPAT_SETTING=missing fi for ac_header in expat.h do : ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" if test "x$ac_cv_header_expat_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_EXPAT_H 1 _ACEOF fi done if test $EXPAT_SETTING = missing ; then as_fn_error $? "Unable to find external Expat library, give path or use default internal library." "$LINENO" 5 fi if test "$ac_cv_header_expat_h" = no ; then as_fn_error $? "Unable to find external expat.h file, give path or use default internal library." "$LINENO" 5 fi EXPAT_SETTING=external EXPAT_LIB=-lexpat elif test "$with_expat" = "no" ; then echo "Disabled use of Expat library, and XML capabilities parsing." EXPAT_SETTING=disabled elif test "$with_expat" != "" ; then if test -r $with_expat/include/expat.h ; then echo "checking for $with_expat/include/expat.h ... found" EXPAT_INCLUDE=-I$with_expat/include elif test -r $with_expat/expat.h ; then echo "checking for $with_expat/expat.h ... found" EXPAT_INCLUDE=-I$with_expat else as_fn_error $? "Unable to find $with_expat/include/expat.h" "$LINENO" 5 fi if test -r $with_expat/lib/libexpat.so ; then EXPAT_LIB=$with_expat/lib/libexpat.so echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/lib/libexpat.a ; then EXPAT_LIB=$with_expat/lib/libexpat.a echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/libexpat.so ; then EXPAT_LIB=$with_expat/libexpat.so echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/libexpat.a ; then EXPAT_LIB=$with_expat/libexpat.a echo "checking for $EXPAT_LIB ... found" else as_fn_error $? "Unable to find $with_expat/{lib/,}libexpat.{so,a}" "$LINENO" 5 fi EXPAT_SETTING=external fi # Check whether --with-expatlib was given. if test "${with_expatlib+set}" = set; then : withval=$with_expatlib; fi if test "$with_expatlib" != "" ; then EXPAT_LIB=$with_expatlib EXPAT_SETTING=external echo "Using EXPAT_LIB=$EXPAT_LIB for Expat library." fi # Check whether --with-expatinc was given. if test "${with_expatinc+set}" = set; then : withval=$with_expatinc; fi if test "$with_expatinc" != "" ; then EXPAT_INCLUDE=-I${with_expatinc} EXPAT_SETTING=external echo "Using EXPAT_INCLUDE=$EXPAT_INCLUDE for Expat includes." fi if test "$EXPAT_SETTING" = "internal" ; then echo "Using internal Expat implementation." fi EXPAT_SETTING=$EXPAT_SETTING EXPAT_INCLUDE=$EXPAT_INCLUDE EXPAT_LIB=$EXPAT_LIB # Allow the pkg-config directory to be set # Check whether --with-pkgconfigdir was given. if test "${with_pkgconfigdir+set}" = set; then : withval=$with_pkgconfigdir; pkgconfigdir=${withval} else pkgconfigdir='${libdir}/pkgconfig' fi { $as_echo "$as_me:${as_lineno-$LINENO}: pkgconfig directory is ${pkgconfigdir}" >&5 $as_echo "$as_me: pkgconfig directory is ${pkgconfigdir}" >&6;} # Make the *-config binary config scripts optional # Check whether --with-binconfigs was given. if test "${with_binconfigs+set}" = set; then : withval=$with_binconfigs; if test "${withval}" = no; then binconfigs= { $as_echo "$as_me:${as_lineno-$LINENO}: ogdi-config scripts will not be built" >&5 $as_echo "$as_me: ogdi-config scripts will not be built" >&6;} else binconfigs='${binconfigs}' fi else binconfigs='${binconfigs}' fi # Config files, substituting as above ac_config_files="$ac_config_files config/common.mak:config/common.mak.in" ac_config_files="$ac_config_files ogdi.pc:ogdi.pc.in" ac_config_files="$ac_config_files ogdi-config:ogdi-config.in" ac_config_files="$ac_config_files config/generic.mak" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config/common.mak") CONFIG_FILES="$CONFIG_FILES config/common.mak:config/common.mak.in" ;; "ogdi.pc") CONFIG_FILES="$CONFIG_FILES ogdi.pc:ogdi.pc.in" ;; "ogdi-config") CONFIG_FILES="$CONFIG_FILES ogdi-config:ogdi-config.in" ;; "config/generic.mak") CONFIG_FILES="$CONFIG_FILES config/generic.mak" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac case $ac_file$ac_mode in "ogdi-config":F) chmod +x ogdi-config ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi target=`uname` if test "$target" = "GNU/kFreeBSD" ; then target=Linux fi mv config/generic.mak config/$target.mak ogdi-ogdi_4_1_0/configure.ac000066400000000000000000000207201345660466700161120ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(config/unix.mak) OGDI_VERSION=4.1.0 OGDI_MAJOR=4 OGDI_MINOR=1 AC_SUBST(OGDI_VERSION) AC_SUBST(OGDI_MAJOR) AC_SUBST(OGDI_MINOR) AC_CONFIG_MACRO_DIR(m4) dnl --------------------------------------------------------------------------- dnl Check if we have a doomed configuration. dnl --------------------------------------------------------------------------- if test "$TOPDIR" = "" ; then AC_MSG_ERROR([Required TOPDIR environment variable not set, see README.]) fi if test "$OS" = "Windows_NT" ; then AC_MSG_ERROR([Please don't use configure for Windows, see README.]) fi dnl Checks for programs. AC_PROG_CC PKG_PROG_PKG_CONFIG dnl We always want to check /usr/local for stuff. dnl LIBS="$LIBS -L/usr/local/lib" dnl CFLAGS="$CFLAGS -I/usr/local/include" dnl Checks for libraries. AC_CHECK_LIB(dl,dlopen,,,) AC_CHECK_LIB(c,iconv_open,HAVE_ICONV=yes,,,) AC_SUBST(HAVE_ICONV,$HAVE_ICONV) dnl check for various compiler flags. AC_COMPILER_WFLAGS AC_COMPILER_PIC AC_LD_SHARED dnl --------------------------------------------------------------------------- dnl Do we have rpc/rpc.h dnl --------------------------------------------------------------------------- AC_CHECK_HEADERS([rpc/rpc.h],, [PKG_CHECK_MODULES([RPC], [libtirpc], [CPPFLAGS="$CPPFLAGS $RPC_CFLAGS"])]) dnl --------------------------------------------------------------------------- dnl Do we have rpc/pmap_clnt.h, float.h, dlfcn.h? dnl --------------------------------------------------------------------------- AC_CHECK_HEADERS(rpc/pmap_clnt.h float.h dlfcn.h) if test "$ac_cv_header_rpc_pmap_clnt_h" = yes ; then RPC_INCLUDES=-DHAVE_STD_RPC_INCLUDES else RPC_INCLUDES= fi AC_SUBST(RPC_INCLUDES,$RPC_INCLUDES) if test "$ac_cv_header_float_h" = no ; then CFLAGS="$CFLAGS -DMISSING_FLOAT_H" fi if test "$ac_cv_header_dlfcn_h" = no ; then CFLAGS="$CFLAGS -DMISSING_DLFCN_H" fi dnl --------------------------------------------------------------------------- dnl Check endian-ness. dnl --------------------------------------------------------------------------- AC_C_BIGENDIAN if test $ac_cv_c_bigendian = yes ; then BIG_ENDIAN=1 else BIG_ENDIAN=0 fi AC_SUBST(BIG_ENDIAN,$BIG_ENDIAN) dnl --------------------------------------------------------------------------- dnl Check for zlib override. dnl --------------------------------------------------------------------------- ZLIB_SETTING=internal ZLIB_INCLUDE= ZLIB_LIB= export ZLIB_LIB ZLIB_INCLUDE ZLIB_SETTING AC_ARG_WITH(zlib,[ --with-zlib[=ARG] Utilize external ZLIB support],,) if test "$with_zlib" = "yes" ; then AC_CHECK_LIB(z,deflateInit_,ZLIB_SETTING=external,ZLIB_SETTING=missing,) AC_CHECK_HEADERS(zlib.h) if test $ZLIB_SETTING = missing ; then AC_MSG_ERROR([Unable to find external ZLIB library, give path or use default internal library.]) fi if test "$ac_cv_header_zlib_h" = no ; then AC_MSG_ERROR([Unable to find external ZLIB zlib.h file, give path or use default internal library.]) fi ZLIB_SETTING=external ZLIB_LIB=-lz elif test "$with_zlib" != "no" -a "$with_zlib" != "" ; then if test -r $with_zlib/include/zlib.h ; then AC_MSG_RESULT([checking for $with_zlib/include/zlib.h ... found]) ZLIB_INCLUDE=-I$with_zlib/include elif test -r $with_zlib/zlib.h ; then AC_MSG_RESULT([checking for $with_zlib/zlib.h ... found]) ZLIB_INCLUDE=-I$with_zlib else AC_MSG_ERROR([Unable to find $with_zlib/include/zlib.h]) fi if test -r $with_zlib/lib/libz.so ; then ZLIB_LIB=$with_zlib/lib/libz.so AC_MSG_RESULT([checking for $ZLIB_LIB ... found]) elif test -r $with_zlib/lib/libz.a ; then ZLIB_LIB=$with_zlib/lib/libz.a AC_MSG_RESULT([checking for $ZLIB_LIB ... found]) elif test -r $with_zlib/libz.so ; then ZLIB_LIB=$with_zlib/libz.so AC_MSG_RESULT([checking for $ZLIB_LIB ... found]) elif test -r $with_zlib/libz.a ; then ZLIB_LIB=$with_zlib/libz.a AC_MSG_RESULT([checking for $ZLIB_LIB ... found]) else AC_MSG_ERROR([Unable to find $with_zlib/{lib/,}libz.{so,a}]) fi ZLIB_SETTING=external fi AC_ARG_WITH(zliblib,[ --with-zliblib=path Select ZLIB library],,) if test "$with_zliblib" != "" ; then ZLIB_LIB=$with_zliblib ZLIB_SETTING=external AC_MSG_RESULT([Using ZLIB_LIB=$ZLIB_LIB for ZLIB library.]) fi AC_ARG_WITH(zlibinc,[ --with-zlibinc=path Select ZLIB include directory],,) if test "$with_zlibinc" != "" ; then ZLIB_INCLUDE=-I${with_zlibinc} ZLIB_SETTING=external AC_MSG_RESULT([Using ZLIB_INCLUDE=$ZLIB_INCLUDE for ZLIB includes.]) fi if test "$ZLIB_SETTING" = "internal" ; then AC_MSG_RESULT([Using internal ZLIB implementation.]) fi AC_SUBST(ZLIB_SETTING,$ZLIB_SETTING) AC_SUBST(ZLIB_INCLUDE,$ZLIB_INCLUDE) AC_SUBST(ZLIB_LIB,$ZLIB_LIB) dnl --------------------------------------------------------------------------- dnl Check for expat override, or disabling. dnl --------------------------------------------------------------------------- EXPAT_SETTING=internal EXPAT_INCLUDE= EXPAT_LIB= export EXPAT_LIB EXPAT_INCLUDE EXPAT_SETTING AC_ARG_WITH(expat,[ --with-expat[=ARG] Utilize external Expat library, or disable Expat.],,) if test "$with_expat" = "yes" ; then AC_CHECK_LIB(expat,XML_ParserCreate,EXPAT_SETTING=external,EXPAT_SETTING=missing,) AC_CHECK_HEADERS(expat.h) if test $EXPAT_SETTING = missing ; then AC_MSG_ERROR([Unable to find external Expat library, give path or use default internal library.]) fi if test "$ac_cv_header_expat_h" = no ; then AC_MSG_ERROR([Unable to find external expat.h file, give path or use default internal library.]) fi EXPAT_SETTING=external EXPAT_LIB=-lexpat elif test "$with_expat" = "no" ; then echo "Disabled use of Expat library, and XML capabilities parsing." EXPAT_SETTING=disabled elif test "$with_expat" != "" ; then if test -r $with_expat/include/expat.h ; then echo "checking for $with_expat/include/expat.h ... found" EXPAT_INCLUDE=-I$with_expat/include elif test -r $with_expat/expat.h ; then echo "checking for $with_expat/expat.h ... found" EXPAT_INCLUDE=-I$with_expat else AC_MSG_ERROR([Unable to find $with_expat/include/expat.h]) fi if test -r $with_expat/lib/libexpat.so ; then EXPAT_LIB=$with_expat/lib/libexpat.so echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/lib/libexpat.a ; then EXPAT_LIB=$with_expat/lib/libexpat.a echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/libexpat.so ; then EXPAT_LIB=$with_expat/libexpat.so echo "checking for $EXPAT_LIB ... found" elif test -r $with_expat/libexpat.a ; then EXPAT_LIB=$with_expat/libexpat.a echo "checking for $EXPAT_LIB ... found" else AC_MSG_ERROR([Unable to find $with_expat/{lib/,}libexpat.{so,a}]) fi EXPAT_SETTING=external fi AC_ARG_WITH(expatlib,[ --with-expatlib=path Select Expat library],,) if test "$with_expatlib" != "" ; then EXPAT_LIB=$with_expatlib EXPAT_SETTING=external echo "Using EXPAT_LIB=$EXPAT_LIB for Expat library." fi AC_ARG_WITH(expatinc,[ --with-expatinc=path Select Expat include directory],,) if test "$with_expatinc" != "" ; then EXPAT_INCLUDE=-I${with_expatinc} EXPAT_SETTING=external echo "Using EXPAT_INCLUDE=$EXPAT_INCLUDE for Expat includes." fi if test "$EXPAT_SETTING" = "internal" ; then echo "Using internal Expat implementation." fi AC_SUBST(EXPAT_SETTING,$EXPAT_SETTING) AC_SUBST(EXPAT_INCLUDE,$EXPAT_INCLUDE) AC_SUBST(EXPAT_LIB,$EXPAT_LIB) # Allow the pkg-config directory to be set AC_ARG_WITH(pkgconfigdir, AC_HELP_STRING([--with-pkgconfigdir], [Use the specified pkgconfig dir (default is libdir/pkgconfig)]), [pkgconfigdir=${withval}], [pkgconfigdir='${libdir}/pkgconfig']) AC_SUBST([pkgconfigdir]) AC_MSG_NOTICE([pkgconfig directory is ${pkgconfigdir}]) # Make the *-config binary config scripts optional AC_ARG_WITH(binconfigs, AC_HELP_STRING([--with-binconfigs], [Generate shell ogdi-config scripts as well as pkg-config data] [@<:@default=yes@:>@]), [if test "${withval}" = no; then binconfigs= AC_MSG_NOTICE([ogdi-config scripts will not be built]) else binconfigs='${binconfigs}' fi], [binconfigs='${binconfigs}']) AC_SUBST([binconfigs]) # Config files, substituting as above AC_CONFIG_FILES([config/common.mak:config/common.mak.in]) AC_CONFIG_FILES([ogdi.pc:ogdi.pc.in]) AC_CONFIG_FILES([ogdi-config:ogdi-config.in], [chmod +x ogdi-config]) AC_OUTPUT(config/generic.mak) target=`uname` if test "$target" = "GNU/kFreeBSD" ; then target=Linux fi mv config/generic.mak config/$target.mak ogdi-ogdi_4_1_0/contrib/000077500000000000000000000000001345660466700152635ustar00rootroot00000000000000ogdi-ogdi_4_1_0/contrib/gdal/000077500000000000000000000000001345660466700161725ustar00rootroot00000000000000ogdi-ogdi_4_1_0/contrib/gdal/.cvsignore000066400000000000000000000000061345660466700201660ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/contrib/gdal/gbgetsymbol.c000066400000000000000000000121411345660466700206530ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: GDAL Bridge * Purpose: Fetch a function pointer from a shared library / DLL. * Author: Frank Warmerdam, warmerda@home.com * * Adapted from cplgetsymbol.cpp. * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log$ * Revision 1.1 2001-05-04 03:13:35 warmerda * New * * Revision 1.1 2000/10/25 16:43:20 warmerda * New * * Revision 1.2 2000/09/27 13:22:07 warmerda * also allow for unix in check * * Revision 1.1 1999/04/21 23:01:31 warmerda * New * */ #include #include "gdalbridge.h" /* ==================================================================== */ /* Unix Implementation */ /* ==================================================================== */ #if defined(__unix__) || defined(unix) #include /************************************************************************/ /* GBGetSymbol() */ /* */ /* Note that this function doesn't: */ /* o prevent the reference count on the library from going up */ /* for every request, or given any opportunity to unload */ /* the library. */ /* o Attempt to look for the library in non-standard */ /* locations. */ /* o Attempt to try variations on the symbol name, like */ /* pre-prending or post-pending an underscore. */ /************************************************************************/ void *GBGetSymbol( const char * pszLibrary, const char * pszSymbolName ) { void *pLibrary; void *pSymbol; pLibrary = dlopen(pszLibrary, RTLD_LAZY); if( pLibrary == NULL ) { return NULL; } pSymbol = dlsym( pLibrary, pszSymbolName ); if( pSymbol == NULL ) { fprintf( stderr, "GBGetSymbol(): %s", dlerror() ); return NULL; } return( pSymbol ); } #endif /* def __unix__ && defined(HAVE_DLFCN_H) */ /* ==================================================================== */ /* Windows Implementation */ /* ==================================================================== */ #ifdef _WIN32 #include /************************************************************************/ /* GBGetSymbol() */ /* */ /* Note that this function doesn't: */ /* o prevent the reference count on the library from going up */ /* for every request, or given any opportunity to unload */ /* the library. */ /* o Attempt to look for the library in non-standard */ /* locations. */ /* o Attempt to try variations on the symbol name, like */ /* pre-prending or post-pending an underscore. */ /************************************************************************/ void *GBGetSymbol( const char * pszLibrary, const char * pszSymbolName ) { void *pLibrary; void *pSymbol; pLibrary = LoadLibrary(pszLibrary); if( pLibrary == NULL ) { return NULL; } pSymbol = GetProcAddress( (HINSTANCE) pLibrary, pszSymbolName ); if( pSymbol == NULL ) { fprintf( stderr, "GBGetSymbol(): Can't find requested entry point: %s\n", pszSymbolName ); return NULL; } return( pSymbol ); } #endif /* def _WIN32 */ ogdi-ogdi_4_1_0/contrib/gdal/gdal.def000066400000000000000000000006341345660466700175640ustar00rootroot00000000000000LIBRARY gdal CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetNextObject dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_GetRasterInfo dyn_GetObject dyn_GetObjectIdFromCoord dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage ogdi-ogdi_4_1_0/contrib/gdal/gdal_serv.c000066400000000000000000000633241345660466700203140ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: GDAL OGDI Server * Purpose: Implements dynamic entry points into the driver. * Author: Frank Warmerda, warmerda@home.com * ********************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ********************************************************************** * * $Log$ * Revision 1.1 2001-05-04 03:13:35 warmerda * New * * Revision 1.2 2000/08/28 20:21:47 warmerda * minimally operational * * Revision 1.1 2000/08/23 19:40:17 warmerda * New * */ #include "gdal_serv.h" static void _releaseAllLayers(ecs_Server *s); /************************************************************************/ /* dyn_CreateServer() */ /************************************************************************/ ecs_Result *dyn_CreateServer(ecs_Server *s, char *Request) { ServerPrivateData *spriv; int nPixels, nLines; OGRSpatialReferenceH hSRS; char *pszWKT; (void) Request; /* -------------------------------------------------------------------- */ /* Initialize GDAL Bridge */ /* -------------------------------------------------------------------- */ if( !GDALBridgeInitialize( ".." ) ) { ecs_SetError(&(s->result), 1, "Unable to initialize GDAL Bridge." ); return &(s->result); } GDALAllRegister(); /* -------------------------------------------------------------------- */ /* Create server private information. */ /* -------------------------------------------------------------------- */ spriv = s->priv = (ServerPrivateData *) malloc(sizeof(ServerPrivateData)); if (s->priv == NULL) { ecs_SetError(&(s->result), 1, "Could not connect to the skeleton driver, " "not enough memory"); return &(s->result); } /* -------------------------------------------------------------------- */ /* Open the file. We should eventually capture the real error */ /* message. */ /* -------------------------------------------------------------------- */ spriv->hDS = GDALOpen( s->pathname, GA_ReadOnly ); if( spriv->hDS == NULL ) { /* Don't forget to unallocate the previous priv */ free(s->priv); ecs_SetError(&(s->result), 1, "GDALOpen() open failed for given path."); return &(s->result); } /* -------------------------------------------------------------------- */ /* Establish the global bounds. We will assume an unrotated */ /* frame of reference for now, but this should be checked */ /* later. */ /* */ /* We will treat the bottom left corner as the origin for raw */ /* rasters in order to maintain a compatible orientation to */ /* georeferenced rasters. */ /* -------------------------------------------------------------------- */ nPixels = GDALGetRasterXSize( spriv->hDS ); nLines = GDALGetRasterYSize( spriv->hDS ); if( GDALGetGeoTransform( spriv->hDS, spriv->adfGeoTransform ) != CE_None || (spriv->adfGeoTransform[0] == 0.0 && spriv->adfGeoTransform[1] == 1.0 && spriv->adfGeoTransform[2] == 0.0 && spriv->adfGeoTransform[3] == 0.0 && spriv->adfGeoTransform[4] == 0.0 && spriv->adfGeoTransform[5] == 1.0 ) ) { spriv->adfGeoTransform[0] = 0.0; spriv->adfGeoTransform[1] = 1.0; spriv->adfGeoTransform[2] = 0.0; spriv->adfGeoTransform[3] = 0.0; spriv->adfGeoTransform[4] = 0.0; spriv->adfGeoTransform[5] = -1.0; } s->globalRegion.north = spriv->adfGeoTransform[3]; s->globalRegion.south = spriv->adfGeoTransform[3] + nLines * spriv->adfGeoTransform[5]; s->globalRegion.east = spriv->adfGeoTransform[0] + nPixels * spriv->adfGeoTransform[1]; s->globalRegion.west = spriv->adfGeoTransform[0]; s->globalRegion.ns_res = (s->globalRegion.north - s->globalRegion.south) / nLines; s->globalRegion.ew_res = (s->globalRegion.east - s->globalRegion.west) / nPixels; /* -------------------------------------------------------------------- */ /* Establish the projection */ /* -------------------------------------------------------------------- */ pszWKT = (char *) GDALGetProjectionRef(spriv->hDS); spriv->pszProjection = NULL; hSRS = OSRNewSpatialReference(NULL); if( OSRImportFromWkt( hSRS, &pszWKT ) != OGRERR_NONE || OSRExportToProj4( hSRS, &(spriv->pszProjection)) != OGRERR_NONE ) { /* notdef: what should we used for "ungeoreferenced" datasets? */ spriv->pszProjection = strdup("+proj=utm +ellps=clrk66 +zone=13"); } OSRDestroySpatialReference( hSRS ); ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_DestroyServer() */ /************************************************************************/ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { ServerPrivateData *spriv = s->priv; /* Release all layers selection. */ _releaseAllLayers(s); /* Release spriv */ if (spriv != NULL) { free( spriv->pszProjection ); if( spriv->hDS != NULL ) GDALClose( spriv->hDS ); free(spriv); } ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_SelectLayer() */ /************************************************************************/ ecs_Result *dyn_SelectLayer(ecs_Server *s, ecs_LayerSelection *sel) { int layer; LayerPrivateData *lpriv; ServerPrivateData *spriv = (ServerPrivateData *) s->priv; /* First, try to find an existing layer with same request and family using ecs_GetLayer. */ if ((layer = ecs_GetLayer(s,sel)) != -1) { /* If it already exists than assign currentLayer and set index to 0 to force a rewind. */ s->currentLayer = layer; s->layer[layer].index = 0; ecs_SetSuccess(&(s->result)); return &(s->result); } /* Is the layer name valid? */ if( strncmp(sel->Select,"band_",5) != 0 || atoi(sel->Select+5) < 1 || atoi(sel->Select+5) > GDALGetRasterCount(spriv->hDS) ) { ecs_SetError(&(s->result),1, "Illegal layer identifier."); return &(s->result); } /* It did not exist so we try to create it with ecs_SetLayer. Don't forget to set the current layer to this new layer. */ if ((layer = ecs_SetLayer(s,sel)) == -1) { return &(s->result); } s->currentLayer = layer; /* Allocate memory to hold private information about this new layer. */ s->layer[layer].priv = (void *) malloc(sizeof(LayerPrivateData)); if (s->layer[layer].priv == NULL) { ecs_FreeLayer(s,layer); ecs_SetError(&(s->result),1, "Not enough memory to allocate layer private data"); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; lpriv->nBand = atoi(sel->Select+5); lpriv->hBand = GDALGetRasterBand( spriv->hDS, lpriv->nBand ); lpriv->nOGDIImageType = 0; lpriv->dfMatrixScale = 1.0; lpriv->dfMatrixOffset = 0.0; if( sel->F == Image ) { switch( GDALGetRasterDataType( lpriv->hBand ) ) { case GDT_Byte: lpriv->nOGDIImageType = 2; lpriv->nGDALImageType = GDT_Byte; break; case GDT_UInt16: lpriv->nOGDIImageType = 3; lpriv->nGDALImageType = GDT_UInt16; break; case GDT_Int16: lpriv->nOGDIImageType = 4; lpriv->nGDALImageType = GDT_Int16; break; default: lpriv->nOGDIImageType = 5; lpriv->nGDALImageType = GDT_Int32; break; } } s->layer[layer].index = 0; return &(s->result); } /************************************************************************/ /* dyn_ReleaseLayer() */ /************************************************************************/ ecs_Result *dyn_ReleaseLayer(ecs_Server *s, ecs_LayerSelection *sel) { int layer; char buffer[200]; /* First, try to find an existing layer with same request and family. */ if ((layer = ecs_GetLayer(s,sel)) == -1) { sprintf(buffer,"Invalid layer %s",sel->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } /* Free the content of lpriv. */ free( s->layer[layer].priv ); /* Free the layer. */ ecs_FreeLayer(s,layer); if (s->currentLayer == layer) { s->currentLayer = -1; /* just in case released layer was selected */ } ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* _releaseAllLayers() */ /************************************************************************/ static void _releaseAllLayers(ecs_Server *s) { int i; for (i = 0; i < s->nblayer; ++i) dyn_ReleaseLayer(s,&(s->layer[i].sel)); } /************************************************************************/ /* dyn_SelectRegion() */ /************************************************************************/ ecs_Result *dyn_SelectRegion(ecs_Server *s,ecs_Region *gr) { s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; s->currentRegion.east = gr->east; s->currentRegion.west = gr->west; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; /* Reset currentLayer index to 0 to force a rewind. */ if (s->currentLayer != -1) { s->layer[s->currentLayer].index = 0; } ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_GetDictionary() */ /************************************************************************/ ecs_Result *dyn_GetDictionary(ecs_Server *s) { if (ecs_SetText(&(s->result),"")) { ecs_SetSuccess(&(s->result)); } return &(s->result); } /************************************************************************/ /* dyn_GetNextObject() */ /************************************************************************/ ecs_Result *dyn_GetNextObject(ecs_Server *s) { ServerPrivateData *spriv = s->priv; LayerPrivateData *lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; double dfULX, dfULY, dfLRX, dfLRY, dfRatio; int nXOff, nYOff, nXSize, nYSize; int nOutOffset, nFullSize, nOutSize, i; int nRasterXSize = GDALGetRasterXSize(spriv->hDS); int nRasterYSize = GDALGetRasterYSize(spriv->hDS); /* -------------------------------------------------------------------- */ /* Compute desired region in "georeferenced" coordinates. */ /* -------------------------------------------------------------------- */ dfULX = s->currentRegion.west; dfULY = s->currentRegion.north - s->currentRegion.ns_res * s->layer[s->currentLayer].index; dfLRX = s->currentRegion.east; dfLRY = s->currentRegion.north - s->currentRegion.ns_res * (s->layer[s->currentLayer].index+1); if( (dfULY+dfLRY)*0.5 < s->currentRegion.south ) { ecs_SetError( &(s->result), 2, "End of selection" ); return &(s->result); } /* -------------------------------------------------------------------- */ /* Convert into pixel coordinates but don't integerize yet. */ /* -------------------------------------------------------------------- */ dfULX = (dfULX - spriv->adfGeoTransform[0]) / spriv->adfGeoTransform[1]; dfLRX = (dfLRX - spriv->adfGeoTransform[0]) / spriv->adfGeoTransform[1]; dfULY = (dfULY - spriv->adfGeoTransform[3]) / spriv->adfGeoTransform[5]; dfLRY = (dfLRY - spriv->adfGeoTransform[3]) / spriv->adfGeoTransform[5]; /* -------------------------------------------------------------------- */ /* Convert into a raster window, but without clamping to the */ /* actual raster bounds. */ /* -------------------------------------------------------------------- */ nXOff = (int) floor(dfULX+0.5); nYOff = (int) floor(dfULY+0.5); nXSize = (int) floor(dfLRX+0.5) - nXOff; nYSize = (int) floor(dfLRY+0.5) - nYOff; nXSize = MAX(1,nXSize); nYSize = MAX(1,nYSize); /* -------------------------------------------------------------------- */ /* Is this entirely on the raster? If not compute the reduced */ /* window, and the region on the current scanline buffer to set */ /* from it. */ /* -------------------------------------------------------------------- */ nFullSize = (int) floor((s->currentRegion.east - s->currentRegion.west) / s->currentRegion.ew_res + 0.1); nOutOffset = 0; nOutSize = nFullSize; dfRatio = nFullSize / (double) nXSize; if( nXOff < 0 ) { nOutOffset = (int) floor((-nXOff) * dfRatio + 0.5); nOutSize -= nOutOffset; nXSize += nXOff; nXOff = 0; } if( nXOff + nXSize > nRasterXSize ) { int nNewXSize = nRasterXSize - nXOff; nOutSize = nOutSize - (nXSize - nNewXSize) * dfRatio; nXSize = nNewXSize; } if( nYOff < 0 ) { nYSize += nYOff; nYOff = 0; } nYSize = MAX(1,nYSize); if( nYOff + nYSize > nRasterYSize ) { nYSize = nRasterYSize - nYOff; } /* -------------------------------------------------------------------- */ /* Setup the buffer, setting to zero initially - for Matrix */ /* results. */ /* -------------------------------------------------------------------- */ if( s->layer[s->currentLayer].sel.F == Matrix ) { void *pData; ecs_SetGeomMatrix( &(s->result), nFullSize ); pData = s->result.res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix.x.x_val; memset( pData, 0, 4 * nFullSize ); if( nXSize > 0 && nYSize > 0 ) { GDALRasterIO( lpriv->hBand, GF_Read, nXOff, nYOff, nXSize, nYSize, ((float *) pData) + nOutOffset, nOutSize, 1, GDT_Float32, 0, 0 ); for( i = nOutOffset; i < nOutOffset+nOutSize; i++ ) { ((GUInt32 *) pData)[i] = (int) (((float *) pData)[i] * lpriv->dfMatrixScale + lpriv->dfMatrixOffset); } } } /* -------------------------------------------------------------------- */ /* Setup the buffer, setting to zero initially - for Matrix */ /* results. */ /* -------------------------------------------------------------------- */ else if( s->layer[s->currentLayer].sel.F == Image ) { GByte *pabyData; int nBytesPerWord; nBytesPerWord = GDALGetDataTypeSize(lpriv->nGDALImageType)/8; ecs_SetGeomImage( &(s->result), nFullSize ); pabyData = (GByte *) s->result.res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix.x.x_val; memset( pabyData, 0, 4 * nFullSize ); if( nXSize > 0 && nYSize > 0 ) { GDALRasterIO( lpriv->hBand, GF_Read, nXOff, nYOff, nXSize, nYSize, pabyData + nOutOffset * nBytesPerWord, nOutSize, 1, lpriv->nGDALImageType, 0, 0 ); } } /* -------------------------------------------------------------------- */ /* Increment current line indicator. */ /* -------------------------------------------------------------------- */ s->layer[s->currentLayer].index += 1; ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_GetObject() */ /************************************************************************/ ecs_Result *dyn_GetObject(ecs_Server *s, char *Id) { int nOldIndex; nOldIndex = s->layer[s->currentLayer].index; s->layer[s->currentLayer].index = atoi(Id); dyn_GetNextObject( s ); s->layer[s->currentLayer].index = nOldIndex; return &(s->result); } /************************************************************************/ /* dyn_GetObjectIdFromCoord() */ /************************************************************************/ ecs_Result *dyn_GetObjectIdFromCoord( ecs_Server *s, ecs_Coordinate *coord) { return &(s->result); } /************************************************************************/ /* dyn_UpdateDictionary() */ /************************************************************************/ ecs_Result *dyn_UpdateDictionary(ecs_Server *s, char *arg) { ServerPrivateData *spriv = s->priv; int i; /* Make sure an empty list is returned in all cases */ ecs_SetText(&(s->result),""); if( strcmp(arg,"ogdi_server_capabilities") == 0 ) { ecs_AddText(&(s->result), "\n" "\n" "\n" ); } else if( strcmp(arg,"ogdi_capabilities") == 0 ) { char line[256]; ecs_AddText(&(s->result), "\n" "\n" ); ecs_AddText(&(s->result), " \n" " \n" " \n" " \n" ); for( i = 0; i < GDALGetRasterCount(spriv->hDS); i++ ) { ecs_AddText(&(s->result), " \n" ); sprintf( line, " band_%d\n", i+1 ); ecs_AddText(&(s->result),line); sprintf( line, " PROJ4:%s\n", spriv->pszProjection ); ecs_AddText(&(s->result),line); sprintf(line, " \n", s->globalRegion.west, s->globalRegion.south, s->globalRegion.east, s->globalRegion.north, s->globalRegion.ew_res, s->globalRegion.ns_res ); ecs_AddText(&(s->result),line); ecs_AddText(&(s->result), " Matrix\n" " Image\n" " \n" ); } ecs_AddText(&(s->result), " \n" "\n" ); } ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_GetServerProjection() */ /************************************************************************/ ecs_Result *dyn_GetServerProjection(ecs_Server *s) { ServerPrivateData *spriv=s->priv; ecs_SetText(&(s->result), spriv->pszProjection); ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_GetGlobalBound() */ /************************************************************************/ ecs_Result *dyn_GetGlobalBound(ecs_Server *s) { ecs_SetGeoRegion(&(s->result), s->globalRegion.north, s->globalRegion.south, s->globalRegion.east, s->globalRegion.west, s->globalRegion.ns_res, s->globalRegion.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_SetServerLanguage() */ /************************************************************************/ ecs_Result *dyn_SetServerLanguage( ecs_Server *s, u_int language) { (void) language; ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_SetCompression() */ /************************************************************************/ ecs_Result *dyn_SetCompression(ecs_Server *s, ecs_Compression *compression) { (void) compression; ecs_SetSuccess(&(s->result)); return &(s->result); } /************************************************************************/ /* dyn_GetRasterInfo() */ /************************************************************************/ ecs_Result *dyn_GetRasterInfo(ecs_Server *s) { ServerPrivateData *spriv = s->priv; LayerPrivateData *lpriv; lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; /* -------------------------------------------------------------------- */ /* Handle Matrix */ /* -------------------------------------------------------------------- */ if( s->layer[s->currentLayer].sel.F == Matrix ) { int i; char szName[64]; GDALColorTableH hCT; ecs_SetRasterInfo(&(s->result), GDALGetRasterXSize( spriv->hDS ), GDALGetRasterYSize( spriv->hDS ) ); hCT = GDALGetRasterColorTable( lpriv->hBand ); if( hCT != NULL ) { for( i = 0; i < GDALGetColorEntryCount(hCT); i++ ) { GDALColorEntry sColor; GDALGetColorEntryAsRGB(hCT, i, &sColor); sprintf(szName,"%d",i); if( sColor.c4 > 0 ) ecs_AddRasterInfoCategory(&(s->result), i+1, sColor.c1, sColor.c2, sColor.c3, szName, 0 ); } } else { for( i = 1; i < 255; i++ ) { sprintf(szName,"%d-%d", (int) ((i / lpriv->dfMatrixScale) + lpriv->dfMatrixOffset), (int) (((i+1)/lpriv->dfMatrixScale)+lpriv->dfMatrixOffset-1)); ecs_AddRasterInfoCategory(&(s->result), i, i, i, i, szName, 0); } } ecs_SetSuccess(&(s->result)); } /* -------------------------------------------------------------------- */ /* Handle Image */ /* -------------------------------------------------------------------- */ else if( s->layer[s->currentLayer].sel.F == Image ) { ecs_SetRasterInfo(&(s->result), lpriv->nOGDIImageType, 0 ); ecs_AddRasterInfoCategory(&(s->result),1, 255, 255, 255,"No data",0); s->result.res.ecs_ResultUnion_u.ri.mincat = 0; s->result.res.ecs_ResultUnion_u.ri.maxcat = 255; ecs_SetSuccess(&(s->result)); } else { ecs_SetError(&(s->result), 1, "The current layer is not a Matrix or Image"); } return &(s->result); } ogdi-ogdi_4_1_0/contrib/gdal/gdal_serv.h000066400000000000000000000041601345660466700203120ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: GDAL OGDI Server * Purpose: Declarations. * Author: Frank Warmerda, warmerda@home.com * ********************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ********************************************************************** * * $Log$ * Revision 1.1 2001-05-04 03:13:35 warmerda * New * * Revision 1.2 2000/08/28 20:21:47 warmerda * minimally operational * * Revision 1.1 2000/08/23 19:40:17 warmerda * New * */ #ifndef GDAL_SERV_H #define GDAL_SERV_H #include "ecs.h" #include "gdalbridge.h" typedef struct { int nBand; GDALRasterBandH hBand; int nOGDIImageType; /* for Image type only */ int nGDALImageType; /* for Image type only */ double dfMatrixOffset; double dfMatrixScale; } LayerPrivateData; typedef struct { GDALDatasetH hDS; double adfGeoTransform[6]; char *pszProjection; } ServerPrivateData; #endif ogdi-ogdi_4_1_0/contrib/gdal/gdalbridge.c000066400000000000000000000330711345660466700204260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: GDAL Bridge * Purpose: Implementation of GDALBridgeInitialize() * Author: Frank Warmerdam, warmerda@home.com * * Adapted from cplgetsymbol.cpp. * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log$ * Revision 1.1 2001-05-04 03:13:35 warmerda * New * * Revision 1.1 2000/10/25 16:43:20 warmerda * New * * Revision 1.10 2000/09/26 15:20:32 warmerda * added GDALGetRasterBand{X,Y}Size * * Revision 1.9 2000/09/01 19:12:09 warmerda * fixed const mismatch * * Revision 1.8 2000/08/28 20:16:14 warmerda * added lots of OGRSpatialReference stuff * * Revision 1.7 2000/08/25 20:03:40 warmerda * added more entry points * * Revision 1.6 1999/09/17 03:18:08 warmerda * change to search for a list of GDAL .so/.dll files * * Revision 1.5 1999/05/07 14:08:49 warmerda * change .so name * * Revision 1.4 1999/04/22 13:35:11 warmerda * Fixed copyright header. * */ /* ==================================================================== */ /* We #define GDAL_ENTRY to nothing so that when the include */ /* file is include the real definition of the function pointer */ /* variables will occur in this files object file. */ /* ==================================================================== */ #define GDAL_ENTRY #define GDAL_NULL = NULL #include "gdalbridge.h" #include #include #ifdef _WIN32 #define PATH_SEP '\\' static const char *papszSOFilenames[] = { "gdal11.dll" ,"gdal.1.0.dll" , NULL }; #else #define PATH_SEP '/' static const char *papszSOFilenames[] = { "libgdal.1.1.so" ,"gdal.1.0.so" ,"gdal.so.1.0" ,"libgdal.so.1" , NULL }; #endif /************************************************************************/ /* GDALBridgeInitialize() */ /************************************************************************/ int GDALBridgeInitialize( const char * pszTargetDir ) { char szPath[2048]; void *pfnTest = NULL; int iSOFile; /* -------------------------------------------------------------------- */ /* The first phase is to try and find the shared library. */ /* -------------------------------------------------------------------- */ for( iSOFile = 0; papszSOFilenames[iSOFile] != NULL && pfnTest == NULL; iSOFile++ ) { if( pszTargetDir != NULL ) { sprintf( szPath, "%s%c%s", pszTargetDir, PATH_SEP, papszSOFilenames[iSOFile] ); pfnTest = GBGetSymbol( szPath, "GDALOpen" ); } if( pfnTest == NULL && getenv( "GDAL_HOME" ) != NULL ) { sprintf( szPath, "%s%c%s", getenv("GDAL_HOME"), PATH_SEP, papszSOFilenames[iSOFile] ); pfnTest = GBGetSymbol( szPath, "GDALOpen" ); } if( pfnTest == NULL ) { sprintf( szPath, papszSOFilenames[iSOFile] ); pfnTest = GBGetSymbol( szPath, "GDALOpen" ); } } if( pfnTest == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Start loading functions. */ /* -------------------------------------------------------------------- */ GDALGetDataTypeSize = (int (*)(GDALDataType)) GBGetSymbol( szPath, "GDALGetDataTypeSize" ); GDALAllRegister = (void (*)(void)) GBGetSymbol( szPath, "GDALAllRegister" ); GDALCreate = (GDALDatasetH (*)(GDALDriverH, const char *, int, int, int, GDALDataType, char ** )) GBGetSymbol( szPath, "GDALCreate" ); GDALOpen = (GDALDatasetH (*)(const char *, GDALAccess)) GBGetSymbol( szPath, "GDALOpen" ); GDALGetDriverByName = (GDALDriverH (*)(const char *)) GBGetSymbol( szPath, "GDALGetDriverByName" ); GDALClose = (void (*)(GDALDatasetH)) GBGetSymbol( szPath, "GDALClose" ); GDALGetRasterXSize = (int (*)(GDALDatasetH)) GBGetSymbol( szPath, "GDALGetRasterXSize" ); GDALGetRasterYSize = (int (*)(GDALDatasetH)) GBGetSymbol( szPath, "GDALGetRasterYSize" ); GDALGetRasterCount = (int (*)(GDALDatasetH)) GBGetSymbol( szPath, "GDALGetRasterCount" ); GDALGetRasterBand = (GDALRasterBandH (*)(GDALDatasetH, int)) GBGetSymbol( szPath, "GDALGetRasterBand" ); GDALGetProjectionRef = (const char *(*)(GDALDatasetH)) GBGetSymbol( szPath, "GDALGetProjectionRef" ); GDALSetProjection = (CPLErr (*)(GDALDatasetH, const char *)) GBGetSymbol( szPath, "GDALSetProjection" ); GDALGetGeoTransform = (CPLErr (*)(GDALDatasetH, double *)) GBGetSymbol( szPath, "GDALGetGeoTransform" ); GDALSetGeoTransform = (CPLErr (*)(GDALDatasetH, double *)) GBGetSymbol( szPath, "GDALSetGeoTransform" ); GDALGetInternalHandle = (void *(*)(GDALDatasetH, const char *)) GBGetSymbol( szPath, "GDALGetInternalHandle" ); GDALGetRasterDataType = (GDALDataType (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetRasterDataType" ); GDALGetRasterBandXSize = (int (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetRasterBandXSize" ); GDALGetRasterBandYSize = (int (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetRasterBandYSize" ); GDALGetBlockSize = (void (*)(GDALRasterBandH, int *, int *)) GBGetSymbol( szPath, "GDALGetBlockSize" ); GDALRasterIO = (CPLErr (*)(GDALRasterBandH, GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType, int, int )) GBGetSymbol( szPath, "GDALRasterIO" ); GDALReadBlock = (CPLErr (*)(GDALRasterBandH, int, int, void *)) GBGetSymbol( szPath, "GDALReadBlock" ); GDALWriteBlock = (CPLErr (*)(GDALRasterBandH, int, int, void *)) GBGetSymbol( szPath, "GDALWriteBlock" ); GDALGetOverviewCount = (int (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetOverviewCount" ); GDALGetOverview = (GDALRasterBandH (*)(GDALRasterBandH, int)) GBGetSymbol( szPath, "GDALGetOverview" ); GDALGetRasterColorInterpretation = (GDALColorInterp (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetRasterColorInterpretation" ); GDALGetColorInterpretationName = (const char *(*)(GDALColorInterp)) GBGetSymbol( szPath, "GDALGetColorInterpretationName" ); GDALGetRasterColorTable = (GDALColorTableH (*)(GDALRasterBandH)) GBGetSymbol( szPath, "GDALGetRasterColorTable" ); GDALCreateProjDef = (GDALProjDefH (*)(const char *)) GBGetSymbol( szPath, "GDALCreateProjDef" ); GDALReprojectToLongLat = (CPLErr (*)(GDALProjDefH, double *, double *)) GBGetSymbol( szPath, "GDALReprojectToLongLat" ); GDALReprojectFromLongLat = (CPLErr (*)(GDALProjDefH, double *, double *)) GBGetSymbol( szPath, "GDALReprojectFromLongLat" ); GDALDestroyProjDef = (void (*)(GDALProjDefH)) GBGetSymbol( szPath, "GDALDestroyProjDef" ); GDALDecToDMS = (const char *(*)(double, const char *, int )) GBGetSymbol( szPath, "GDALDecToDMS" ); GDALGetPaletteInterpretation = (GDALPaletteInterp (*)(GDALColorTableH)) GBGetSymbol( szPath, "GDALGetPaletteInterpretation" ); GDALGetPaletteInterpretationName = (const char *(*)(GDALPaletteInterp)) GBGetSymbol( szPath, "GDALGetPaletteInterpretationName" ); GDALGetColorEntryCount = (int (*)(GDALColorTableH)) GBGetSymbol( szPath, "GDALGetColorEntryCount" ); GDALGetColorEntry = (const GDALColorEntry *(*)(GDALColorTableH,int)) GBGetSymbol( szPath, "GDALGetColorEntry" ); GDALGetColorEntryAsRGB = (int (*)(GDALColorTableH,int, GDALColorEntry*)) GBGetSymbol( szPath, "GDALGetColorEntryAsRGB" ); GDALSetColorEntry = (void (*)(GDALColorTableH, int, const GDALColorEntry*)) GBGetSymbol( szPath, "GDALSetColorEntry" ); /* -------------------------------------------------------------------- */ /* OSR API */ /* -------------------------------------------------------------------- */ OSRNewSpatialReference = (OGRSpatialReferenceH (*)( const char * )) GBGetSymbol( szPath, "OSRNewSpatialReference" ); OSRCloneGeogCS = (OGRSpatialReferenceH (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRCloneGeogCS" ); OSRDestroySpatialReference = (void (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRDestroySpatialReference" ); OSRReference = (int (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRReference" ); OSRDereference = (int (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRDereference" ); OSRImportFromEPSG = (OGRErr (*)(OGRSpatialReferenceH,int)) GBGetSymbol( szPath, "OSRImportFromEPSG" ); OSRImportFromWkt = (OGRErr (*)(OGRSpatialReferenceH,char **)) GBGetSymbol( szPath, "OSRImportFromWkt" ); OSRImportFromProj4 = (OGRErr (*)(OGRSpatialReferenceH,const char *)) GBGetSymbol( szPath, "OSRImportFromProj4" ); OSRExportToWkt = (OGRErr (*)(OGRSpatialReferenceH, char **)) GBGetSymbol( szPath, "OSRExportToWkt" ); OSRExportToPrettyWkt = (OGRErr (*)(OGRSpatialReferenceH, char **, int)) GBGetSymbol( szPath, "OSRExportToPrettyWkt" ); OSRExportToProj4 = (OGRErr (*)(OGRSpatialReferenceH, char **)) GBGetSymbol( szPath, "OSRExportToProj4" ); OSRSetAttrValue = (OGRErr (*)(OGRSpatialReferenceH, const char *, const char *)) GBGetSymbol( szPath, "OSRSetAttrValue" ); OSRGetAttrValue = (const char *(*)(OGRSpatialReferenceH, const char *,int)) GBGetSymbol( szPath, "OSRGetAttrValue" ); OSRSetLinearUnits = (OGRErr (*)(OGRSpatialReferenceH, const char *,double)) GBGetSymbol( szPath, "OSRSetLinearUnits" ); OSRGetLinearUnits = (double (*)(OGRSpatialReferenceH, char **)) GBGetSymbol( szPath, "OSRGetLinearUnits" ); OSRIsGeographic = (int (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRIsGeographic" ); OSRIsProjected = (int (*)(OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRIsProjected" ); OSRIsSameGeogCS = (int (*)(OGRSpatialReferenceH,OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRIsSameGeogCS" ); OSRIsSame = (int (*)(OGRSpatialReferenceH,OGRSpatialReferenceH)) GBGetSymbol( szPath, "OSRIsSame" ); OSRSetProjCS = (OGRErr (*)(OGRSpatialReferenceH,const char*)) GBGetSymbol( szPath, "OSRSetProjCS" ); OSRSetWellKnownGeogCS = (OGRErr (*)(OGRSpatialReferenceH, const char *)) GBGetSymbol( szPath, "OSRSetWellKnownGeogCS" ); OSRSetGeogCS = (OGRErr (*)( OGRSpatialReferenceH hSRS, const char * pszGeogName, const char * pszDatumName, const char * pszEllipsoidName, double dfSemiMajor, double dfInvFlattening, const char * pszPMName /* = NULL */, double dfPMOffset /* = 0.0 */, const char * pszUnits /* = NULL */, double dfConvertToRadians /* = 0.0 */ )) GBGetSymbol( szPath, "OSRSetGeogCS" ); OSRGetSemiMajor = (double (*)(OGRSpatialReferenceH, OGRErr *)) GBGetSymbol( szPath, "OSRGetSemiMajor" ); OSRGetSemiMinor = (double (*)(OGRSpatialReferenceH, OGRErr *)) GBGetSymbol( szPath, "OSRGetSemiMinor" ); OSRGetInvFlattening = (double (*)(OGRSpatialReferenceH, OGRErr *)) GBGetSymbol( szPath, "OSRGetInvFlattening" ); OSRSetAuthority = (OGRErr (*)(OGRSpatialReferenceH, const char *, const char *, int)) GBGetSymbol( szPath, "OSRSetAuthority" ); OSRSetProjParm = (OGRErr (*)(OGRSpatialReferenceH, const char *, double)) GBGetSymbol( szPath, "OSRSetProjParm" ); OSRGetProjParm = (double (*)(OGRSpatialReferenceH, const char *, double, OGRErr *)) GBGetSymbol( szPath, "OSRGetProjParm" ); OSRSetUTM = (OGRErr (*)(OGRSpatialReferenceH, int, int)) GBGetSymbol( szPath, "OSRSetUTM" ); OSRGetUTMZone = (int (*)(OGRSpatialReferenceH, int *)) GBGetSymbol( szPath, "OSRGetUTMZone" ); return TRUE; } ogdi-ogdi_4_1_0/contrib/gdal/gdalbridge.h000066400000000000000000000510201345660466700204250ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: GDAL Bridge * Purpose: Declarations for GDAL Bridge support. * Author: Frank Warmerdam, warmerda@home.com * * This file needs to be kept up to date with the contents of gdal.h by hand. * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log$ * Revision 1.1 2001-05-04 03:13:35 warmerda * New * * Revision 1.1 2000/10/25 16:43:20 warmerda * New * * Revision 1.7 2000/09/26 15:20:32 warmerda * added GDALGetRasterBand{X,Y}Size * * Revision 1.6 2000/08/28 20:16:14 warmerda * added lots of OGRSpatialReference stuff * * Revision 1.5 2000/08/25 20:03:40 warmerda * added more entry points * * Revision 1.4 1999/09/17 03:18:37 warmerda * added name indirection for function pointer names for libtool * * Revision 1.3 1999/04/22 13:36:43 warmerda * Added copyright header. * */ #ifndef GDALBRIDGE_H_INCLUDED #define GDALBRIDGE_H_INCLUDED /* -------------------------------------------------------------------- */ /* Start C context. */ /* -------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ==================================================================== */ /* Standard types and defines normally supplied by cpl_port.h. */ /* ==================================================================== */ #if UINT_MAX == 65535 typedef long GInt32; typedef unsigned long GUInt32; #else typedef int GInt32; typedef unsigned int GUInt32; #endif typedef short GInt16; typedef unsigned short GUInt16; typedef unsigned char GByte; typedef int GBool; #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #ifndef NULL # define NULL 0 #endif #ifndef GDAL_ENTRY # define GDAL_ENTRY extern # define GDAL_NULL #endif /* -------------------------------------------------------------------- */ /* Significant constants. */ /* -------------------------------------------------------------------- */ /*! Pixel data types */ typedef enum { GDT_Unknown = 0, /*! Eight bit unsigned integer */ GDT_Byte = 1, /*! Sixteen bit unsigned integer */ GDT_UInt16 = 2, /*! Sixteen bit signed integer */ GDT_Int16 = 3, /*! Thirty two bit unsigned integer */ GDT_UInt32 = 4, /*! Thirty two bit signed integer */ GDT_Int32 = 5, /*! Thirty two bit floating point */ GDT_Float32 = 6, /*! Sixty four bit floating point */ GDT_Float64 = 7, /*! Complex Int16 */ GDT_CInt16 = 8, /*! Complex Int32 */ GDT_CInt32 = 9, /*! Complex Float32 */ GDT_CFloat32 = 10, /*! Complex Float64 */ GDT_CFloat64 = 11, GDT_TypeCount = 12 /* maximum type # + 1 */ } GDALDataType; GDAL_ENTRY int (*pfnGDALGetDataTypeSize)( GDALDataType ) GDAL_NULL; #define GDALGetDataTypeSize pfnGDALGetDataTypeSize typedef enum { GA_ReadOnly = 0, GA_Update = 1 } GDALAccess; typedef enum { GF_Read = 0, GF_Write = 1 } GDALRWFlag; /*! Types of color interpretation for raster bands. */ typedef enum { GCI_Undefined=0, /*! Greyscale */ GCI_GrayIndex=1, /*! Paletted (see associated color table) */ GCI_PaletteIndex=2, /*! Red band of RGBA image */ GCI_RedBand=3, /*! Green band of RGBA image */ GCI_GreenBand=4, /*! Blue band of RGBA image */ GCI_BlueBand=5, /*! Alpha (0=transparent, 255=opaque) */ GCI_AlphaBand=6, /*! Hue band of HLS image */ GCI_HueBand=7, /*! Saturation band of HLS image */ GCI_SaturationBand=8, /*! Lightness band of HLS image */ GCI_LightnessBand=9, /*! Cyan band of CMYK image */ GCI_CyanBand=10, /*! Magenta band of CMYK image */ GCI_MagentaBand=11, /*! Yellow band of CMYK image */ GCI_YellowBand=12, /*! Black band of CMLY image */ GCI_BlackBand=13 } GDALColorInterp; /*! Types of color interpretations for a GDALColorTable. */ typedef enum { /*! Grayscale (in GDALColorEntry.c1) */ GPI_Gray=0, /*! Red, Green, Blue and Alpha in (in c1, c2, c3 and c4) */ GPI_RGB=1, /*! Cyan, Magenta, Yellow and Black (in c1, c2, c3 and c4)*/ GPI_CMYK=2, /*! Hue, Lightness and Saturation (in c1, c2, and c3) */ GPI_HLS=3 } GDALPaletteInterp; /* -------------------------------------------------------------------- */ /* GDAL Specific error codes. */ /* */ /* error codes 100 to 299 reserved for GDAL. */ /* -------------------------------------------------------------------- */ typedef enum { CE_None = 0, CE_Log = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 } CPLErr; #define CPLE_AppDefined 1 #define CPLE_OutOfMemory 2 #define CPLE_FileIO 3 #define CPLE_OpenFailed 4 #define CPLE_IllegalArg 5 #define CPLE_NotSupported 6 #define CPLE_AssertionFailed 7 #define CPLE_NoWriteAccess 8 #define CPLE_WrongFormat 200 typedef int OGRErr; #define OGRERR_NONE 0 #define OGRERR_NOT_ENOUGH_DATA 1 /* not enough data to deserialize */ #define OGRERR_NOT_ENOUGH_MEMORY 2 #define OGRERR_UNSUPPORTED_GEOMETRY_TYPE 3 #define OGRERR_UNSUPPORTED_OPERATION 4 #define OGRERR_CORRUPT_DATA 5 #define OGRERR_FAILURE 6 #define OGRERR_UNSUPPORTED_SRS 7 /* -------------------------------------------------------------------- */ /* Define handle types related to various internal classes. */ /* -------------------------------------------------------------------- */ typedef void *GDALMajorObjectH; typedef void *GDALDatasetH; typedef void *GDALRasterBandH; typedef void *GDALDriverH; typedef void *GDALProjDefH; typedef void *GDALColorTableH; typedef void *OGRSpatialReferenceH; /* ==================================================================== */ /* Registration/driver related. */ /* ==================================================================== */ GDAL_ENTRY void (*pfnGDALAllRegister)( void ) GDAL_NULL; #define GDALAllRegister pfnGDALAllRegister GDAL_ENTRY GDALDatasetH (*pfnGDALCreate)( GDALDriverH hDriver, const char *, int, int, int, GDALDataType, char ** ) GDAL_NULL; #define GDALCreate pfnGDALCreate GDAL_ENTRY GDALDatasetH (*pfnGDALOpen)( const char *, GDALAccess ) GDAL_NULL; #define GDALOpen pfnGDALOpen GDAL_ENTRY GDALDriverH (*pfnGDALGetDriverByName)( const char * ) GDAL_NULL; #define GDALGetDriverByName pfnGDALGetDriverByName /* ==================================================================== */ /* GDALDataset class ... normally this represents one file. */ /* ==================================================================== */ GDAL_ENTRY void (*pfnGDALClose)( GDALDatasetH ) GDAL_NULL; #define GDALClose pfnGDALClose GDAL_ENTRY int (*pfnGDALGetRasterXSize)( GDALDatasetH ) GDAL_NULL; #define GDALGetRasterXSize pfnGDALGetRasterXSize GDAL_ENTRY int (*pfnGDALGetRasterYSize)( GDALDatasetH ) GDAL_NULL; #define GDALGetRasterYSize pfnGDALGetRasterYSize GDAL_ENTRY int (*pfnGDALGetRasterCount)( GDALDatasetH ) GDAL_NULL; #define GDALGetRasterCount pfnGDALGetRasterCount GDAL_ENTRY GDALRasterBandH (*pfnGDALGetRasterBand)( GDALDatasetH, int) GDAL_NULL; #define GDALGetRasterBand pfnGDALGetRasterBand GDAL_ENTRY const char *(*pfnGDALGetProjectionRef)( GDALDatasetH ) GDAL_NULL; #define GDALGetProjectionRef pfnGDALGetProjectionRef GDAL_ENTRY CPLErr (*pfnGDALSetProjection)( GDALDatasetH, const char * ) GDAL_NULL; #define GDALSetProjection pfnGDALSetProjection GDAL_ENTRY CPLErr (*pfnGDALGetGeoTransform)( GDALDatasetH, double* ) GDAL_NULL; #define GDALGetGeoTransform pfnGDALGetGeoTransform GDAL_ENTRY CPLErr (*pfnGDALSetGeoTransform)( GDALDatasetH, double* ) GDAL_NULL; #define GDALSetGeoTransform pfnGDALSetGeoTransform GDAL_ENTRY void *(*pfnGDALGetInternalHandle)( GDALDatasetH, const char * ) GDAL_NULL; #define GDALGetInternalHandle pfnGDALGetInternalHandle /* ==================================================================== */ /* GDALRasterBand ... one band/channel in a dataset. */ /* ==================================================================== */ GDAL_ENTRY GDALDataType (*pGDALGetRasterDataType)( GDALRasterBandH ) GDAL_NULL; #define GDALGetRasterDataType pGDALGetRasterDataType GDAL_ENTRY void (*pGDALGetBlockSize)( GDALRasterBandH, int * pnXSize, int * pnYSize ) GDAL_NULL; #define GDALGetBlockSize pGDALGetBlockSize GDAL_ENTRY CPLErr (*pGDALRasterIO)( GDALRasterBandH hRBand, GDALRWFlag eRWFlag, int nDSXOff, int nDSYOff, int nDSXSize, int nDSYSize, void * pBuffer, int nBXSize, int nBYSize, GDALDataType eBDataType, int nPixelSpace, int nLineSpace ) GDAL_NULL; #define GDALRasterIO pGDALRasterIO GDAL_ENTRY CPLErr (*pGDALReadBlock)( GDALRasterBandH, int, int, void * ) GDAL_NULL; #define GDALReadBlock pGDALReadBlock GDAL_ENTRY CPLErr (*pGDALWriteBlock)( GDALRasterBandH, int, int, void * ) GDAL_NULL; #define GDALWriteBlock pGDALWriteBlock GDAL_ENTRY int (*pGDALGetOverviewCount)( GDALRasterBandH ) GDAL_NULL; #define GDALGetOverviewCount pGDALGetOverviewCount GDAL_ENTRY GDALRasterBandH (*pGDALGetOverview)( GDALRasterBandH, int ) GDAL_NULL; #define GDALGetOverview pGDALGetOverview GDAL_ENTRY GDALColorInterp (*pGDALGetRasterColorInterpretation) ( GDALRasterBandH ) GDAL_NULL; #define GDALGetRasterColorInterpretation pGDALGetRasterColorInterpretation GDAL_ENTRY const char *(*pGDALGetColorInterpretationName)( GDALColorInterp ) GDAL_NULL; #define GDALGetColorInterpretationName pGDALGetColorInterpretationName GDAL_ENTRY GDALColorTableH (*pGDALGetRasterColorTable)( GDALRasterBandH ) GDAL_NULL; #define GDALGetRasterColorTable pGDALGetRasterColorTable GDAL_ENTRY int (*pfnGDALGetRasterBandXSize)( GDALRasterBandH ) GDAL_NULL; #define GDALGetRasterBandXSize pfnGDALGetRasterBandXSize GDAL_ENTRY int (*pfnGDALGetRasterBandYSize)( GDALRasterBandH ) GDAL_NULL; #define GDALGetRasterBandYSize pfnGDALGetRasterBandYSize /* ==================================================================== */ /* Color tables. */ /* ==================================================================== */ /** Color tuple */ typedef struct { /*! gray, red, cyan or hue */ short c1; /*! green, magenta, or lightness */ short c2; /*! blue, yellow, or saturation */ short c3; /*! alpha or blackband */ short c4; } GDALColorEntry; GDAL_ENTRY GDALPaletteInterp (*pGDALGetPaletteInterpretation)( GDALColorTableH ) GDAL_NULL; #define GDALGetPaletteInterpretation pGDALGetPaletteInterpretation GDAL_ENTRY const char *(*pGDALGetPaletteInterpretationName)(GDALPaletteInterp) GDAL_NULL; #define GDALGetPaletteInterpretationName pGDALGetPaletteInterpretationName GDAL_ENTRY int (*pGDALGetColorEntryCount)( GDALColorTableH ) GDAL_NULL; #define GDALGetColorEntryCount pGDALGetColorEntryCount GDAL_ENTRY const GDALColorEntry *(*pGDALGetColorEntry)( GDALColorTableH, int ) GDAL_NULL; #define GDALGetColorEntry pGDALGetColorEntry GDAL_ENTRY int (*pGDALGetColorEntryAsRGB)( GDALColorTableH, int, GDALColorEntry *) GDAL_NULL; #define GDALGetColorEntryAsRGB pGDALGetColorEntryAsRGB GDAL_ENTRY void (*pGDALSetColorEntry)( GDALColorTableH, int, const GDALColorEntry * ) GDAL_NULL; #define GDALSetColorEntry pGDALSetColorEntry /* ==================================================================== */ /* Projections */ /* ==================================================================== */ GDAL_ENTRY GDALProjDefH (*pGDALCreateProjDef)( const char * ) GDAL_NULL; #define GDALCreateProjDef pGDALCreateProjDef GDAL_ENTRY CPLErr (*pGDALReprojectToLongLat)( GDALProjDefH, double *, double * ) GDAL_NULL; #define GDALReprojectToLongLat pGDALReprojectToLongLat GDAL_ENTRY CPLErr (*pGDALReprojectFromLongLat)( GDALProjDefH, double *, double * ) GDAL_NULL; #define GDALReprojectFromLongLat pGDALReprojectFromLongLat GDAL_ENTRY void (*pGDALDestroyProjDef)( GDALProjDefH ) GDAL_NULL; #define GDALDestroyProjDef pGDALDestroyProjDef GDAL_ENTRY const char *(*pGDALDecToDMS)( double, const char *, int ) GDAL_NULL; #define GDALDecToDMS pGDALDecToDMS /* -------------------------------------------------------------------- */ /* ogr_srs_api.h services. */ /* -------------------------------------------------------------------- */ GDAL_ENTRY OGRSpatialReferenceH (*pOSRNewSpatialReference)( const char * ) GDAL_NULL; #define OSRNewSpatialReference pOSRNewSpatialReference GDAL_ENTRY OGRSpatialReferenceH (*pOSRCloneGeogCS)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRCloneGeogCS pOSRCloneGeogCS GDAL_ENTRY void (*pOSRDestroySpatialReference)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRDestroySpatialReference pOSRDestroySpatialReference GDAL_ENTRY int (*pOSRReference)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRReference pOSRReference GDAL_ENTRY int (*pOSRDereference)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRDereference pOSRDereference GDAL_ENTRY OGRErr (*pOSRImportFromEPSG)( OGRSpatialReferenceH, int ) GDAL_NULL; #define OSRImportFromEPSG pOSRImportFromEPSG GDAL_ENTRY OGRErr (*pOSRImportFromWkt)( OGRSpatialReferenceH, char ** ) GDAL_NULL; #define OSRImportFromWkt pOSRImportFromWkt GDAL_ENTRY OGRErr (*pOSRImportFromProj4)( OGRSpatialReferenceH, const char *) GDAL_NULL; #define OSRImportFromProj4 pOSRImportFromProj4 GDAL_ENTRY OGRErr (*pOSRExportToWkt)( OGRSpatialReferenceH, char ** ) GDAL_NULL; #define OSRExportToWkt pOSRExportToWkt GDAL_ENTRY OGRErr (*pOSRExportToPrettyWkt)( OGRSpatialReferenceH, char **, int) GDAL_NULL; #define OSRExportToPrettyWkt pOSRExportToPrettyWkt GDAL_ENTRY OGRErr (*pOSRExportToProj4)( OGRSpatialReferenceH, char **) GDAL_NULL; #define OSRExportToProj4 pOSRExportToProj4 GDAL_ENTRY OGRErr (*pOSRSetAttrValue)( OGRSpatialReferenceH hSRS, const char * pszNodePath, const char * pszNewNodeValue ) GDAL_NULL; #define OSRSetAttrValue pOSRSetAttrValue GDAL_ENTRY const char * (*pOSRGetAttrValue)( OGRSpatialReferenceH hSRS, const char * pszName, int iChild ) GDAL_NULL; #define OSRGetAttrValue pOSRGetAttrValue GDAL_ENTRY OGRErr (*pOSRSetLinearUnits)( OGRSpatialReferenceH, const char *, double ) GDAL_NULL; #define OSRSetLinearUnits pOSRSetLinearUnits GDAL_ENTRY double (*pOSRGetLinearUnits)( OGRSpatialReferenceH, char ** ) GDAL_NULL; #define OSRGetLinearUnits pOSRGetLinearUnits GDAL_ENTRY int (*pOSRIsGeographic)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRIsGeographic pOSRIsGeographic GDAL_ENTRY int (*pOSRIsProjected)( OGRSpatialReferenceH ) GDAL_NULL; #define OSRIsProjected pOSRIsProjected GDAL_ENTRY int (*pOSRIsSameGeogCS)( OGRSpatialReferenceH, OGRSpatialReferenceH ) GDAL_NULL; #define OSRIsSameGeogCS pOSRIsSameGeogCS GDAL_ENTRY int (*pOSRIsSame)( OGRSpatialReferenceH, OGRSpatialReferenceH ) GDAL_NULL; #define OSRIsSame pOSRIsSame GDAL_ENTRY OGRErr (*pOSRSetProjCS)( OGRSpatialReferenceH hSRS, const char * pszName ) GDAL_NULL; #define OSRSetProjCS pOSRSetProjCS GDAL_ENTRY OGRErr (*pOSRSetWellKnownGeogCS)( OGRSpatialReferenceH hSRS, const char * pszName ) GDAL_NULL; #define OSRSetWellKnownGeogCS pOSRSetWellKnownGeogCS GDAL_ENTRY OGRErr (*pOSRSetGeogCS)( OGRSpatialReferenceH hSRS, const char * pszGeogName, const char * pszDatumName, const char * pszEllipsoidName, double dfSemiMajor, double dfInvFlattening, const char * pszPMName /* = NULL */, double dfPMOffset /* = 0.0 */, const char * pszUnits /* = NULL */, double dfConvertToRadians /* = 0.0 */ ) GDAL_NULL; #define OSRSetGeogCS pOSRSetGeogCS GDAL_ENTRY double (*pOSRGetSemiMajor)( OGRSpatialReferenceH, OGRErr * /* = NULL */ ) GDAL_NULL; #define OSRGetSemiMajor pOSRGetSemiMajor GDAL_ENTRY double (*pOSRGetSemiMinor)( OGRSpatialReferenceH, OGRErr * /* = NULL */ ) GDAL_NULL; #define OSRGetSemiMinor pOSRGetSemiMinor GDAL_ENTRY double (*pOSRGetInvFlattening)( OGRSpatialReferenceH, OGRErr * /*=NULL*/) GDAL_NULL; #define OSRGetInvFlattening pOSRGetInvFlattening GDAL_ENTRY OGRErr (*pOSRSetAuthority)( OGRSpatialReferenceH hSRS, const char * pszTargetKey, const char * pszAuthority, int nCode ) GDAL_NULL; #define OSRSetAuthority pOSRSetAuthority GDAL_ENTRY OGRErr (*pOSRSetProjParm)( OGRSpatialReferenceH, const char *, double ) GDAL_NULL; #define OSRSetProjParm pOSRSetProjParm GDAL_ENTRY double (*pOSRGetProjParm)( OGRSpatialReferenceH hSRS, const char * pszParmName, double dfDefault /* = 0.0 */, OGRErr * /* = NULL */ ) GDAL_NULL; #define OSRGetProjParm pOSRGetProjParm GDAL_ENTRY OGRErr (*pOSRSetUTM)( OGRSpatialReferenceH hSRS, int nZone, int bNorth ) GDAL_NULL; #define OSRSetUTM pOSRSetUTM GDAL_ENTRY int (*pOSRGetUTMZone)( OGRSpatialReferenceH hSRS, int *pbNorth ) GDAL_NULL; #define OSRGetUTMZone pOSRGetUTMZone /* -------------------------------------------------------------------- */ /* This is the real entry point. It tries to load the shared */ /* libraries (given a hint of a directory it might be in). It */ /* returns TRUE if it succeeds, or FALSE otherwise. */ /* -------------------------------------------------------------------- */ int GDALBridgeInitialize( const char * ); void *GBGetSymbol( const char *, const char * ); /* -------------------------------------------------------------------- */ /* Terminate C context. */ /* -------------------------------------------------------------------- */ #ifdef __cplusplus } #endif #endif /* ndef GDALBRIDGE_H_INCLUDED */ ogdi-ogdi_4_1_0/contrib/gdal/makefile000066400000000000000000000006221345660466700176720ustar00rootroot00000000000000 TOBEGEN = gdal TARGETGEN=$(DYNAGEN) SOURCES = \ gdal_serv.c \ \ gdalbridge.c \ gbgetsymbol.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(GUTIL_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/contrib/makefile000066400000000000000000000023431345660466700167650ustar00rootroot00000000000000# Copyright (C) 2001 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # include $(TOPDIR)/config/common.mak # # Sub-directories that need to be built # subdirs = ogdi_import ogdi_info # # Default target to build everything in all sub-directories # all: $(subdirs) # # Target to allow individual sub-directories to be built # (e.g. make cgmmod) # .PHONY: $(subdirs) $(subdirs): cd $@; $(MAKE) # # Pass specialized targets into the sub-directories # .PHONY: $(STANDARD_TARGETS) $(STANDARD_TARGETS): @for i in $(subdirs); do \ $(MAKE) --directory $$i $@; \ done ogdi-ogdi_4_1_0/contrib/ogdi_import/000077500000000000000000000000001345660466700175775ustar00rootroot00000000000000ogdi-ogdi_4_1_0/contrib/ogdi_import/.cvsignore000066400000000000000000000000061345660466700215730ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/contrib/ogdi_import/dbfopen.c000066400000000000000000001167431345660466700213740ustar00rootroot00000000000000/****************************************************************************** * dbfopen.c,v 1.1 2000/11/23 19:13:49 warmerda Exp * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * dbfopen.c,v * Revision 1.1 2000/11/23 19:13:49 warmerda * new * * Revision 1.29 2000/10/05 14:36:44 warmerda * fix bug with writing very wide numeric fields * * Revision 1.28 2000/09/25 14:18:07 warmerda * Added some casts of strlen() return result to fix warnings on some * systems, as submitted by Daniel. * * Revision 1.27 2000/09/25 14:15:51 warmerda * added DBFGetNativeFieldType() * * Revision 1.26 2000/07/07 13:39:45 warmerda * removed unused variables, and added system include files * * Revision 1.25 2000/05/29 18:19:13 warmerda * avoid use of uchar, and adding casting fix * * Revision 1.24 2000/05/23 13:38:27 warmerda * Added error checks on return results of fread() and fseek(). * * Revision 1.23 2000/05/23 13:25:49 warmerda * Avoid crashing if field or record are out of range in dbfread*attribute(). * * Revision 1.22 1999/12/15 13:47:24 warmerda * Added stdlib.h to ensure that atof() is prototyped. * * Revision 1.21 1999/12/13 17:25:46 warmerda * Added support for upper case .DBF extention. * * Revision 1.20 1999/11/30 16:32:11 warmerda * Use atof() instead of sscanf(). * * Revision 1.19 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.18 1999/07/27 00:53:28 warmerda * ensure that whole old field value clear on write of string * * Revision 1.1 1999/07/05 18:58:07 warmerda * New * * Revision 1.17 1999/06/11 19:14:12 warmerda * Fixed some memory leaks. * * Revision 1.16 1999/06/11 19:04:11 warmerda * Remoted some unused variables. * * Revision 1.15 1999/05/11 03:19:28 warmerda * added new Tuple api, and improved extension handling - add from candrsn * * Revision 1.14 1999/05/04 15:01:48 warmerda * Added 'F' support. * * Revision 1.13 1999/03/23 17:38:59 warmerda * DBFAddField() now actually does return the new field number, or -1 if * it fails. * * Revision 1.12 1999/03/06 02:54:46 warmerda * Added logic to convert shapefile name to dbf filename in DBFOpen() * for convenience. * * Revision 1.11 1998/12/31 15:30:34 warmerda * Improved the interchangability of numeric and string attributes. Add * white space trimming option for attributes. * * Revision 1.10 1998/12/03 16:36:44 warmerda * Use r+b instead of rb+ for binary access. * * Revision 1.9 1998/12/03 15:34:23 warmerda * Updated copyright message. * * Revision 1.8 1997/12/04 15:40:15 warmerda * Added newline character after field definitions. * * Revision 1.7 1997/03/06 14:02:10 warmerda * Ensure bUpdated is initialized. * * Revision 1.6 1996/02/12 04:54:41 warmerda * Ensure that DBFWriteAttribute() returns TRUE if it succeeds. * * Revision 1.5 1995/10/21 03:15:12 warmerda * Changed to use binary file access, and ensure that the * field name field is zero filled, and limited to 10 chars. * * Revision 1.4 1995/08/24 18:10:42 warmerda * Added use of SfRealloc() to avoid pre-ANSI realloc() functions such * as on the Sun. * * Revision 1.3 1995/08/04 03:15:16 warmerda * Fixed up header. * * Revision 1.2 1995/08/04 03:14:43 warmerda * Added header. */ #include "shapefil.h" #include #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif static int nStringFieldLen = 0; static char * pszStringField = NULL; /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* DBFWriteHeader() */ /* */ /* This is called to write out the file header, and field */ /* descriptions before writing any actual data records. This */ /* also computes all the DBFDataSet field offset/size/decimals */ /* and so forth values. */ /************************************************************************/ static void DBFWriteHeader(DBFHandle psDBF) { unsigned char abyHeader[XBASE_FLDHDR_SZ]; int i; if( !psDBF->bNoHeader ) return; psDBF->bNoHeader = FALSE; /* -------------------------------------------------------------------- */ /* Initialize the file header information. */ /* -------------------------------------------------------------------- */ for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) abyHeader[i] = 0; abyHeader[0] = 0x03; /* memo field? - just copying */ /* date updated on close, record count preset at zero */ abyHeader[8] = psDBF->nHeaderLength % 256; abyHeader[9] = psDBF->nHeaderLength / 256; abyHeader[10] = psDBF->nRecordLength % 256; abyHeader[11] = psDBF->nRecordLength / 256; /* -------------------------------------------------------------------- */ /* Write the initial 32 byte file header, and all the field */ /* descriptions. */ /* -------------------------------------------------------------------- */ fseek( psDBF->fp, 0, 0 ); ogdi_fwrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp ); ogdi_fwrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp ); /* -------------------------------------------------------------------- */ /* Write out the newline character if there is room for it. */ /* -------------------------------------------------------------------- */ if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 ) { char cNewline; cNewline = 0x0d; ogdi_fwrite( &cNewline, 1, 1, psDBF->fp ); } } /************************************************************************/ /* DBFFlushRecord() */ /* */ /* Write out the current record if there is one. */ /************************************************************************/ static void DBFFlushRecord( DBFHandle psDBF ) { int nRecordOffset; if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) { psDBF->bCurrentRecordModified = FALSE; nRecordOffset = psDBF->nRecordLength * psDBF->nCurrentRecord + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); ogdi_fwrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); } } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle DBFOpen( const char * pszFilename, const char * pszAccess ) { DBFHandle psDBF; unsigned char *pabyBuf; int nFields, nRecords, nHeadLen, nRecLen, iField, i; char *pszBasename, *pszFullname; /* -------------------------------------------------------------------- */ /* We only allow the access strings "rb" and "r+". */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 && strcmp(pszAccess,"r+b") != 0 ) return( NULL ); /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); psDBF->fp = fopen( pszFullname, pszAccess ); if( psDBF->fp == NULL ) { sprintf( pszFullname, "%s.DBF", pszBasename ); psDBF->fp = fopen(pszFullname, pszAccess ); } free( pszBasename ); free( pszFullname ); if( psDBF->fp == NULL ) { free( psDBF ); return( NULL ); } psDBF->bNoHeader = FALSE; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) malloc(500); ogdi_fread( pabyBuf, 32, 1, psDBF->fp ); psDBF->nRecords = nRecords = pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256; psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; psDBF->nRecordLength = nRecLen = pabyBuf[10] + pabyBuf[11]*256; psDBF->nFields = nFields = (nHeadLen - 32) / 32; psDBF->pszCurrentRecord = (char *) malloc(nRecLen); /* -------------------------------------------------------------------- */ /* Read in Field Definitions */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); psDBF->pszHeader = (char *) pabyBuf; fseek( psDBF->fp, 32, 0 ); ogdi_fread( pabyBuf, nHeadLen, 1, psDBF->fp ); psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); for( iField = 0; iField < nFields; iField++ ) { unsigned char *pabyFInfo; pabyFInfo = pabyBuf+iField*32; if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = pabyFInfo[17]; } else { psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; psDBF->panFieldDecimals[iField] = 0; } psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; if( iField == 0 ) psDBF->panFieldOffset[iField] = 1; else psDBF->panFieldOffset[iField] = psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; } return( psDBF ); } /************************************************************************/ /* DBFClose() */ /************************************************************************/ void DBFClose(DBFHandle psDBF) { /* -------------------------------------------------------------------- */ /* Write out header if not already written. */ /* -------------------------------------------------------------------- */ if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); /* -------------------------------------------------------------------- */ /* Update last access date, and number of records if we have */ /* write access. */ /* -------------------------------------------------------------------- */ if( psDBF->bUpdated ) { unsigned char abyFileHeader[32]; fseek( psDBF->fp, 0, 0 ); ogdi_fread( abyFileHeader, 32, 1, psDBF->fp ); abyFileHeader[1] = 95; /* YY */ abyFileHeader[2] = 7; /* MM */ abyFileHeader[3] = 26; /* DD */ abyFileHeader[4] = psDBF->nRecords % 256; abyFileHeader[5] = (psDBF->nRecords/256) % 256; abyFileHeader[6] = (psDBF->nRecords/(256*256)) % 256; abyFileHeader[7] = (psDBF->nRecords/(256*256*256)) % 256; fseek( psDBF->fp, 0, 0 ); ogdi_fwrite( abyFileHeader, 32, 1, psDBF->fp ); } /* -------------------------------------------------------------------- */ /* Close, and free resources. */ /* -------------------------------------------------------------------- */ fclose( psDBF->fp ); if( psDBF->panFieldOffset != NULL ) { free( psDBF->panFieldOffset ); free( psDBF->panFieldSize ); free( psDBF->panFieldDecimals ); free( psDBF->pachFieldType ); } free( psDBF->pszHeader ); free( psDBF->pszCurrentRecord ); free( psDBF ); if( pszStringField != NULL ) { free( pszStringField ); pszStringField = NULL; nStringFieldLen = 0; } } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle DBFCreate( const char * pszFilename ) { DBFHandle psDBF; FILE *fp; char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Create the file. */ /* -------------------------------------------------------------------- */ fp = fopen( pszFullname, "wb" ); if( fp == NULL ) return( NULL ); fputc( 0, fp ); fclose( fp ); fp = fopen( pszFullname, "rb+" ); if( fp == NULL ) return( NULL ); free( pszFullname ); /* -------------------------------------------------------------------- */ /* Create the info structure. */ /* -------------------------------------------------------------------- */ psDBF = (DBFHandle) malloc(sizeof(DBFInfo)); psDBF->fp = fp; psDBF->nRecords = 0; psDBF->nFields = 0; psDBF->nRecordLength = 1; psDBF->nHeaderLength = 33; psDBF->panFieldOffset = NULL; psDBF->panFieldSize = NULL; psDBF->panFieldDecimals = NULL; psDBF->pachFieldType = NULL; psDBF->pszHeader = NULL; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->pszCurrentRecord = NULL; psDBF->bNoHeader = TRUE; return( psDBF ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf file before any records */ /* are written. */ /************************************************************************/ int DBFAddField(DBFHandle psDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ) { char *pszFInfo; int i; /* -------------------------------------------------------------------- */ /* Do some checking to ensure we can add records to this file. */ /* -------------------------------------------------------------------- */ if( psDBF->nRecords > 0 ) return( -1 ); if( !psDBF->bNoHeader ) return( -1 ); if( eType != FTDouble && nDecimals != 0 ) return( -1 ); /* -------------------------------------------------------------------- */ /* SfRealloc all the arrays larger to hold the additional field */ /* information. */ /* -------------------------------------------------------------------- */ psDBF->nFields++; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* -------------------------------------------------------------------- */ /* Assign the new field information fields. */ /* -------------------------------------------------------------------- */ psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; psDBF->nRecordLength += nWidth; psDBF->panFieldSize[psDBF->nFields-1] = nWidth; psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; if( eType == FTString ) psDBF->pachFieldType[psDBF->nFields-1] = 'C'; else psDBF->pachFieldType[psDBF->nFields-1] = 'N'; /* -------------------------------------------------------------------- */ /* Extend the required header information. */ /* -------------------------------------------------------------------- */ psDBF->nHeaderLength += 32; psDBF->bUpdated = FALSE; psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1); for( i = 0; i < 32; i++ ) pszFInfo[i] = '\0'; if( (int) strlen(pszFieldName) < 10 ) strncpy( pszFInfo, pszFieldName, strlen(pszFieldName)); else strncpy( pszFInfo, pszFieldName, 10); pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; if( eType == FTString ) { pszFInfo[16] = nWidth % 256; pszFInfo[17] = nWidth / 256; } else { pszFInfo[16] = nWidth; pszFInfo[17] = nDecimals; } /* -------------------------------------------------------------------- */ /* Make the current record buffer appropriately larger. */ /* -------------------------------------------------------------------- */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); return( psDBF->nFields-1 ); } /************************************************************************/ /* DBFReadAttribute() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, char chReqType ) { int nRecordOffset; unsigned char *pabyRec; void *pReturnField = NULL; static double dDoubleField; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( iField < 0 || iField >= psDBF->nFields ) return( NULL ); /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; if( fseek( psDBF->fp, nRecordOffset, 0 ) != 0 ) { fprintf( stderr, "fseek(%d) failed on DBF file.\n", nRecordOffset ); return NULL; } if( fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { fprintf( stderr, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); return NULL; } psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Ensure our field buffer is large enough to hold this buffer. */ /* -------------------------------------------------------------------- */ if( psDBF->panFieldSize[iField]+1 > nStringFieldLen ) { nStringFieldLen = psDBF->panFieldSize[iField]*2 + 10; pszStringField = (char *) SfRealloc(pszStringField,nStringFieldLen); } /* -------------------------------------------------------------------- */ /* Extract the requested field. */ /* -------------------------------------------------------------------- */ strncpy( pszStringField, ((const char *) pabyRec) + psDBF->panFieldOffset[iField], psDBF->panFieldSize[iField] ); pszStringField[psDBF->panFieldSize[iField]] = '\0'; pReturnField = pszStringField; /* -------------------------------------------------------------------- */ /* Decode the field. */ /* -------------------------------------------------------------------- */ if( chReqType == 'N' ) { dDoubleField = atof(pszStringField); pReturnField = &dDoubleField; } /* -------------------------------------------------------------------- */ /* Should we trim white space off the string attribute value? */ /* -------------------------------------------------------------------- */ #ifdef TRIM_DBF_WHITESPACE else { char *pchSrc, *pchDst; pchDst = pchSrc = pszStringField; while( *pchSrc == ' ' ) pchSrc++; while( *pchSrc != '\0' ) *(pchDst++) = *(pchSrc++); *pchDst = '\0'; while( *(--pchDst) == ' ' && pchDst != pszStringField ) *pchDst = '\0'; } #endif return( pReturnField ); } /************************************************************************/ /* DBFReadIntAttribute() */ /* */ /* Read an integer attribute. */ /************************************************************************/ int DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0; else return( (int) *pdValue ); } /************************************************************************/ /* DBFReadDoubleAttribute() */ /* */ /* Read a double attribute. */ /************************************************************************/ double DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0.0; else return( *pdValue ); } /************************************************************************/ /* DBFReadStringAttribute() */ /* */ /* Read a string attribute. */ /************************************************************************/ const char *DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); } /************************************************************************/ /* DBFGetFieldCount() */ /* */ /* Return the number of fields in this table. */ /************************************************************************/ int DBFGetFieldCount( DBFHandle psDBF ) { return( psDBF->nFields ); } /************************************************************************/ /* DBFGetRecordCount() */ /* */ /* Return the number of records in this table. */ /************************************************************************/ int DBFGetRecordCount( DBFHandle psDBF ) { return( psDBF->nRecords ); } /************************************************************************/ /* DBFGetFieldInfo() */ /* */ /* Return any requested information about the field. */ /************************************************************************/ DBFFieldType DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ) { if( iField < 0 || iField >= psDBF->nFields ) return( FTInvalid ); if( pnWidth != NULL ) *pnWidth = psDBF->panFieldSize[iField]; if( pnDecimals != NULL ) *pnDecimals = psDBF->panFieldDecimals[iField]; if( pszFieldName != NULL ) { int i; strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 ); pszFieldName[11] = '\0'; for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- ) pszFieldName[i] = '\0'; } if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F' || psDBF->pachFieldType[iField] == 'D' ) { if( psDBF->panFieldDecimals[iField] > 0 ) return( FTDouble ); else return( FTInteger ); } else { return( FTString ); } } /************************************************************************/ /* DBFWriteAttribute() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int nRecordOffset, i, j; unsigned char *pabyRec; char szSField[400], szFormat[20]; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { DBFFlushRecord( psDBF ); psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); ogdi_fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ switch( psDBF->pachFieldType[iField] ) { case 'D': case 'N': case 'F': if( psDBF->panFieldDecimals[iField] == 0 ) { int nWidth = psDBF->panFieldSize[iField]; if( sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%dd", nWidth ); sprintf(szSField, szFormat, (int) *((double *) pValue) ); if( (int)strlen(szSField) > psDBF->panFieldSize[iField] ) szSField[psDBF->panFieldSize[iField]] = '\0'; strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } else { int nWidth = psDBF->panFieldSize[iField]; if( sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%d.%df", nWidth, psDBF->panFieldDecimals[iField] ); sprintf(szSField, szFormat, *((double *) pValue) ); if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) szSField[psDBF->panFieldSize[iField]] = '\0'; strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } break; default: if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) j = psDBF->panFieldSize[iField]; else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); break; } psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFWriteDoubleAttribute() */ /* */ /* Write a double attribute. */ /************************************************************************/ int DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, double dValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteIntegerAttribute() */ /* */ /* Write a integer attribute. */ /************************************************************************/ int DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, int nValue ) { double dValue = nValue; return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteStringAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, const char * pszValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); } /************************************************************************/ /* DBFWriteTuple() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ int DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) { int nRecordOffset, i; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { DBFFlushRecord( psDBF ); psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); ogdi_fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFReadTuple() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ const char *DBFReadTuple(DBFHandle psDBF, int hEntity ) { int nRecordOffset; unsigned char *pabyRec; static char *pReturnTuple = NULL; static int nTupleLen = 0; /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); ogdi_fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; if ( nTupleLen < psDBF->nRecordLength) { nTupleLen = psDBF->nRecordLength; pReturnTuple = (char *) SfRealloc(pReturnTuple, psDBF->nRecordLength); } memcpy ( pReturnTuple, pabyRec, psDBF->nRecordLength ); return( pReturnTuple ); } /************************************************************************/ /* DBFCloneEmpty() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ DBFHandle DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) { DBFHandle newDBF; newDBF = DBFCreate ( pszFilename ); if ( newDBF == NULL ) return ( NULL ); newDBF->pszHeader = (void *) malloc ( 32 * psDBF->nFields ); memcpy ( newDBF->pszHeader, psDBF->pszHeader, 32 * psDBF->nFields ); newDBF->nFields = psDBF->nFields; newDBF->nRecordLength = psDBF->nRecordLength; newDBF->nHeaderLength = psDBF->nHeaderLength; newDBF->panFieldOffset = (void *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); newDBF->panFieldSize = (void *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); newDBF->panFieldDecimals = (void *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); newDBF->pachFieldType = (void *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(int) * psDBF->nFields ); newDBF->bNoHeader = TRUE; newDBF->bUpdated = TRUE; DBFWriteHeader ( newDBF ); DBFClose ( newDBF ); newDBF = DBFOpen ( pszFilename, "rb+" ); return ( newDBF ); } /************************************************************************/ /* DBFGetNativeFieldType() */ /* */ /* Return the DBase field type for the specified field. */ /* */ /* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ /* 'N' (Numeric, with or without decimal), */ /* 'L' (Logical), */ /* 'M' (Memo: 10 digits .DBT block ptr) */ /************************************************************************/ char DBFGetNativeFieldType( DBFHandle psDBF, int iField ) { if( iField >=0 && iField < psDBF->nFields ) return psDBF->pachFieldType[iField]; return ' '; } ogdi-ogdi_4_1_0/contrib/ogdi_import/makefile000066400000000000000000000024531345660466700213030ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty # TOBEGEN = ogdi_import TARGETGEN=$(PROGGEN) SOURCES = ogdi_import.c shpopen.c dbfopen.c INCLUDES = $(CURRENT_INCLUDE) $(OGDI_INCLUDE)\ $(ZLIB_INCLUDE) $(GENERAL_INCLUDE) $(TCLTK_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) $(FLAGS_X86DEF) LINK_LIBS= $(OGDI_LINKLIB) $(ZLIB_LINKLIB) $(RPC_LINKLIB) \ $(MATH_LINKLIB) \ $(LIBC_LINKLIB) $(UCB_STATICLIB) $(DL_LINKLIB) \ $(WIN_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR ogdi_import.c $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/contrib/ogdi_import/ogdi_import.c000066400000000000000000000731021345660466700222620ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: OGDI Contributed Clients * Purpose: Simple console import to shapefile/raw raster. * Author: Frank Warmerdam * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of the author not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. The author makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.13 2007-02-12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.12 2002/02/21 15:54:17 warmerda * fixed bug with declaration of dst * * Revision 1.11 2002/02/08 21:22:58 warmerda * fixed serious bug importing floating point fields of unknown precision * * Revision 1.10 2001/12/11 18:34:18 warmerda * fixed region handling if GetLayerRegion() fails - default to global bounds. * * Revision 1.9 2001/11/14 04:55:47 warmerda * added -no-dict option * * Revision 1.8 2001/10/09 22:48:27 warmerda * preliminary support for setting output projection * * Revision 1.7 2001/10/02 02:06:25 warmerda * various bug fixes related to region setting * * Revision 1.6 2001/08/16 13:44:52 warmerda * fixed roundoff bug xsize/ysize calc from region * * Revision 1.5 2001/07/17 19:03:42 warmerda * Added support for exporting lines, text and areas. * * Revision 1.4 2001/06/22 16:41:42 warmerda * Enabled RGBA image support. * * Revision 1.3 2001/05/30 19:13:06 warmerda * utilize layer capabitilies if available to set region and resolution * * Revision 1.2 2000/11/23 19:15:57 warmerda * added header block * */ #include "ecs.h" #include "shapefil.h" #include static int ClientID = -1; static int bNoDict = FALSE; #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif /************************************************************************/ /* CheckError() */ /************************************************************************/ static int CheckError( ecs_Result * result ) { if( ECSERROR( result ) ) { printf( "ECSERROR: %s\n", result->message ); return TRUE; } else return FALSE; } /************************************************************************/ /* AccessURL() */ /************************************************************************/ static int AccessURL( char * url, ecs_Region * region ) { ecs_Result *result; /* -------------------------------------------------------------------- */ /* Close old client if there is one active. */ /* -------------------------------------------------------------------- */ if( ClientID != -1 ) { result = cln_DestroyClient(ClientID); if( CheckError( result ) ) return( FALSE ); ClientID = -1; } /* -------------------------------------------------------------------- */ /* Open new URL/client. */ /* -------------------------------------------------------------------- */ result = cln_CreateClient(&ClientID,url); if( CheckError( result ) ) return( FALSE ); /* -------------------------------------------------------------------- */ /* print the global bounds. */ /* -------------------------------------------------------------------- */ result = cln_GetGlobalBound(ClientID); if( CheckError( result ) ) return( FALSE ); *region = ECSREGION(result); /* -------------------------------------------------------------------- */ /* Print the Dictionary (update). */ /* -------------------------------------------------------------------- */ result = cln_UpdateDictionary( ClientID, "" ); if( CheckError( result ) ) return( FALSE ); if( !bNoDict ) printf( "UpdateDictionary = \n%s\n", ECSTEXT(result) ); /* -------------------------------------------------------------------- */ /* Print the projection. */ /* -------------------------------------------------------------------- */ result = cln_GetServerProjection( ClientID ); if( CheckError( result ) ) return( FALSE ); printf( "Projection = `%s'\n", ECSTEXT(result) ); return( TRUE ); } /************************************************************************/ /* GetLayerRegion() */ /* */ /* Fetch the region and resolution for the named layer if */ /* possible, from the capabilities. */ /************************************************************************/ static void GetLayerRegion( const char *layerName, ecs_Region *region ) { const ecs_LayerCapabilities *layer; int layer_index; for( layer_index = 0; (layer = cln_GetLayerCapabilities(ClientID,layer_index)) != NULL; layer_index++ ) { if( strcmp(layer->name,layerName) == 0 ) { region->north = layer->srs_north; region->south = layer->srs_south; region->east = layer->srs_east; region->west = layer->srs_west; region->ew_res = layer->srs_ewres; region->ns_res = layer->srs_nsres; return; } } } /************************************************************************/ /* ImportVectors() */ /************************************************************************/ static void ImportVectors( ecs_Region *region, const char * layer, const char * out_file, ecs_Family featureType ) { ecs_Result *result; ecs_LayerSelection selectionLayer; SHPHandle hShape = NULL; DBFHandle hDBF; char filename[1024]; ecs_ObjAttributeFormat *oaf; int i, field_count, iText = -1, nFld; /* -------------------------------------------------------------------- */ /* Select a region ... this should be overridable from the */ /* command line. */ /* -------------------------------------------------------------------- */ result = cln_SelectRegion(ClientID,region); if( CheckError( result ) ) return; /* -------------------------------------------------------------------- */ /* Define the layer to select. For now we only support lines. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = featureType; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError(result) ) return; /* -------------------------------------------------------------------- */ /* Create the shapefile to write the lines to. */ /* -------------------------------------------------------------------- */ sprintf( filename, "%s.shp", out_file ); if( featureType == Line ) hShape = SHPCreate( filename, SHPT_ARC ); else if( featureType == Point || featureType == Text ) hShape = SHPCreate( filename, SHPT_POINT ); else if( featureType == Area ) hShape = SHPCreate( filename, SHPT_POLYGON ); if( hShape == NULL ) { fprintf( stderr, "Unable to create shapefile dataset %s\n", filename ); return; } sprintf( filename, "%s.dbf", out_file ); hDBF = DBFCreate( filename ); if( hDBF == NULL ) { fprintf( stderr, "Unable to create DBF file %s\n", filename ); return; } /* -------------------------------------------------------------------- */ /* Setup DBF schema. */ /* -------------------------------------------------------------------- */ result = cln_GetAttributesFormat( ClientID ); if( CheckError( result ) ) return; oaf = &(ECSRESULT(result).oaf); field_count = oaf->oa.oa_len; for( i = 0; i < field_count; i++ ) { switch( oaf->oa.oa_val[i].type ) { case Char: case Varchar: case Longvarchar: if( oaf->oa.oa_val[i].lenght > 0 ) nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTString, oaf->oa.oa_val[i].lenght, 0 ); else nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTString, 64, 0 ); break; case Decimal: case Smallint: case Integer: if( oaf->oa.oa_val[i].lenght > 0 ) nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTDouble, oaf->oa.oa_val[i].lenght, 0 ); else nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTString, 11, 0 ); break; case Numeric: case Real: case Float: case Double: if( oaf->oa.oa_val[i].lenght > 0 ) nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTDouble, oaf->oa.oa_val[i].lenght, oaf->oa.oa_val[i].precision ); else nFld = DBFAddField( hDBF, oaf->oa.oa_val[i].name, FTDouble, 18, 7 ); break; default: nFld = 0; fprintf( stderr, "Field %s of unrecognised type %d dropped.\n", oaf->oa.oa_val[i].name, oaf->oa.oa_val[i].type ); break; } if( nFld == -1 ) { fprintf( stderr, "Field %s was not created due to a failure in DBFAddField()\n", oaf->oa.oa_val[i].name ); } } if( featureType == Text ) { iText = DBFAddField( hDBF, "text", FTString, 64, 0 ); } /* -------------------------------------------------------------------- */ /* Process objects. */ /* -------------------------------------------------------------------- */ result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { char *pszList; int iField, iShape=0; /* -------------------------------------------------------------------- */ /* Write shapefile geometry */ /* -------------------------------------------------------------------- */ if( featureType == Area ) { ecs_Area *area = &(ECSGEOM(result).area); double *x, *y; int *parts, nPoints, iRing; SHPObject *psShape; nPoints = 0; for( iRing = 0; iRing < (int) area->ring.ring_len; iRing++ ) { ecs_FeatureRing *ring = area->ring.ring_val + iRing; nPoints += ring->c.c_len; } parts = (int *) malloc(sizeof(int) * area->ring.ring_len); x = (double *) malloc(sizeof(double) * nPoints); y = (double *) malloc(sizeof(double) * nPoints); nPoints = 0; for( iRing = 0; iRing < (int) area->ring.ring_len; iRing++ ) { ecs_FeatureRing *ring = area->ring.ring_val + iRing; parts[iRing] = nPoints; for( i = 0; i < (int) ring->c.c_len; i++ ) { x[nPoints] = ring->c.c_val[i].x; y[nPoints] = ring->c.c_val[i].y; nPoints++; } } psShape = SHPCreateObject( SHPT_POLYGON, -1, area->ring.ring_len, parts, NULL, nPoints, x, y, NULL, NULL); free( x ); free( y ); free( parts ); iShape = SHPWriteObject( hShape, -1, psShape ); SHPDestroyObject( psShape ); } else if( featureType == Line ) { ecs_Line *line = &(ECSGEOM(result).line); double *x, *y; SHPObject *psShape; x = (double *) malloc(sizeof(double) * line->c.c_len); y = (double *) malloc(sizeof(double) * line->c.c_len); for( i=0; i < (int) line->c.c_len; i++ ) { x[i] = line->c.c_val[i].x; y[i] = line->c.c_val[i].y; } psShape = SHPCreateSimpleObject( SHPT_ARC, line->c.c_len, x, y, NULL ); free( x ); free( y ); iShape = SHPWriteObject( hShape, -1, psShape ); SHPDestroyObject( psShape ); } else if( featureType == Point ) { ecs_Point *point = &(ECSGEOM(result).point); SHPObject *psShape; psShape = SHPCreateSimpleObject( SHPT_POINT, 1, &(point->c.x), &(point->c.y), NULL ); iShape = SHPWriteObject( hShape, -1, psShape ); SHPDestroyObject( psShape ); } else if( featureType == Text ) { ecs_Text *point = &(ECSGEOM(result).text); SHPObject *psShape; psShape = SHPCreateSimpleObject( SHPT_POINT, 1, &(point->c.x), &(point->c.y), NULL ); iShape = SHPWriteObject( hShape, -1, psShape ); SHPDestroyObject( psShape ); DBFWriteStringAttribute( hDBF, iShape, iText, point->desc ); } /* -------------------------------------------------------------------- */ /* Write attributes to dbf file. */ /* -------------------------------------------------------------------- */ pszList = ECSOBJECTATTR(result); for( iField = 0; iField < field_count; iField++ ) { char *pszFieldStart; int nNameLen; char chSavedChar; /* parse out the next attribute value */ if( !ecs_FindElement( pszList, &pszFieldStart, &pszList, &nNameLen, NULL ) ) { nNameLen = 0; pszFieldStart = pszList; } /* Skip any trailing white space (for string constants). */ if( nNameLen > 0 && pszFieldStart[nNameLen-1] == ' ' ) nNameLen--; /* zero terminate the single field value, but save the */ /* character we overwrote, so we can restore it when done. */ chSavedChar = pszFieldStart[nNameLen]; pszFieldStart[nNameLen] = '\0'; switch( DBFGetFieldInfo( hDBF, iField, NULL, NULL, NULL ) ) { case FTString: DBFWriteStringAttribute( hDBF, iShape, iField, pszFieldStart ); break; case FTInteger: DBFWriteIntegerAttribute( hDBF, iShape, iField, atoi(pszFieldStart) ); break; case FTDouble: DBFWriteDoubleAttribute( hDBF, iShape, iField, atof(pszFieldStart) ); break; default: break; } pszFieldStart[nNameLen] = chSavedChar; } /* -------------------------------------------------------------------- */ /* Read next object */ /* -------------------------------------------------------------------- */ result = cln_GetNextObject(ClientID); } SHPClose( hShape ); DBFClose( hDBF ); } /************************************************************************/ /* ImportMatrix() */ /************************************************************************/ static void ImportMatrix( ecs_Region *region, const char * layer, const char * out_file ) { FILE *fp_aux, *fp_raw; char filename[256]; int i, xsize, ysize; ecs_Result *result; ecs_LayerSelection selectionLayer; /* -------------------------------------------------------------------- */ /* Select a region ... this should be overridable from the */ /* command line. */ /* -------------------------------------------------------------------- */ result = cln_SelectRegion(ClientID,region); if( CheckError( result ) ) return; xsize = (int) ((region->east - region->west) / region->ew_res + 0.5); ysize = (int) ((region->north - region->south) / region->ns_res + 0.5); /* -------------------------------------------------------------------- */ /* Define the layer to select. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = Matrix; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError( result ) ) return; /* -------------------------------------------------------------------- */ /* Write .aux file header. */ /* -------------------------------------------------------------------- */ sprintf( filename, "%s.aux", out_file ); fp_aux = fopen( filename, "wt" ); sprintf( filename, "%s.raw", out_file ); fprintf( fp_aux, "AuxilaryTarget: %s\n", filename ); /* -------------------------------------------------------------------- */ /* Get the raster information. */ /* -------------------------------------------------------------------- */ result = cln_GetRasterInfo( ClientID ); if( CheckError( result ) ) return; fprintf( fp_aux, "RawDefinition: %d %d 1\n", xsize, ysize ); fprintf( fp_aux, "ChanDefinition-1: 8U 0 1 %d Swapped\n", xsize ); for( i = 0; i < (int) ECSRASTERINFO(result).cat.cat_len; i++ ) { fprintf( fp_aux, "METADATA_IMG_1_Class_%d_Name: %s\n", (int) ECSRASTERINFO(result).mincat + i, ECSRASTERINFO(result).cat.cat_val[i].label ); fprintf( fp_aux, "METADATA_IMG_1_Class_%d_Color: (RGB:%d %d %d)\n", (int) ECSRASTERINFO(result).mincat + i, ECSRASTERINFO(result).cat.cat_val[i].r, ECSRASTERINFO(result).cat.cat_val[i].g, ECSRASTERINFO(result).cat.cat_val[i].b ); } /* -------------------------------------------------------------------- */ /* Attach the projection information. */ /* -------------------------------------------------------------------- */ fprintf( fp_aux, "MapUnits: METER\n" ); fprintf( fp_aux, "UpLeftX: %24.15E\n", region->west ); fprintf( fp_aux, "UpLeftY: %25.15E\n", region->north ); fprintf( fp_aux, "LoRightX: %25.15E\n", region->east ); fprintf( fp_aux, "LoRightY: %25.15E\n", region->south ); fclose( fp_aux ); /* -------------------------------------------------------------------- */ /* open the raw data file. */ /* -------------------------------------------------------------------- */ fp_raw = fopen( filename, "wb" ); result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { static int report_flag = 0; if( (int) ECSOBJECT(result).geom.ecs_Geometry_u.matrix.x.x_len != xsize && report_flag == 0 ) { report_flag = 1; printf( "Got %d pixels, instead of expected %d pixels!\n", (int) ECSOBJECT(result).geom.ecs_Geometry_u.matrix.x.x_len, xsize ); } for( i = 0; i < xsize; i++ ) { fprintf( fp_raw, "%c", ECSRASTER(result)[i] ); } result = cln_GetNextObject(ClientID); } CheckError( result ); fclose( fp_raw ); } /************************************************************************/ /* ImportImage() */ /************************************************************************/ static void ImportImage( ecs_Region *region, const char * layer, const char * out_file ) { FILE *fp_aux, *fp_raw; char filename[256]; int i, xsize, ysize, width_code; ecs_Result *result; ecs_LayerSelection selectionLayer; /* -------------------------------------------------------------------- */ /* Select a region ... this should be overridable from the */ /* command line. */ /* -------------------------------------------------------------------- */ result = cln_SelectRegion(ClientID,region); if( CheckError( result ) ) return; xsize = (int) ((region->east - region->west) / region->ew_res + 0.5); ysize = (int) ((region->north - region->south) / region->ns_res + 0.5); /* -------------------------------------------------------------------- */ /* Define the layer to select. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = Image; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError( result ) ) return; /* -------------------------------------------------------------------- */ /* Write .aux file header. */ /* -------------------------------------------------------------------- */ sprintf( filename, "%s.aux", out_file ); fp_aux = fopen( filename, "wt" ); sprintf( filename, "%s.raw", out_file ); fprintf( fp_aux, "AuxilaryTarget: %s\n", filename ); /* -------------------------------------------------------------------- */ /* Get the raster information. */ /* -------------------------------------------------------------------- */ result = cln_GetRasterInfo( ClientID ); if( CheckError( result ) ) return; width_code = ECSRASTERINFO(result).width; if( width_code == 1 /* RGBA */ ) { fprintf( fp_aux, "RawDefinition: %d %d 4\n", xsize, ysize ); fprintf( fp_aux, "ChanDefinition-1: 8U 0 4 %d\n", xsize*4 ); fprintf( fp_aux, "ChanDefinition-2: 8U 1 4 %d\n", xsize*4 ); fprintf( fp_aux, "ChanDefinition-3: 8U 2 4 %d\n", xsize*4 ); fprintf( fp_aux, "ChanDefinition-4: 8U 3 4 %d\n", xsize*4 ); } else if( width_code == 5 /* int32 */ ) { fprintf( fp_aux, "RawDefinition: %d %d 1\n", xsize, ysize ); fprintf( fp_aux, "ChanDefinition-1: 16U 0 2 %d Swapped\n", xsize*2 ); } else { printf( "Unsupported Image raster type %d.\n", ECSRASTERINFO(result).width ); assert( FALSE ); return; } /* -------------------------------------------------------------------- */ /* Attach the projection information. */ /* -------------------------------------------------------------------- */ fprintf( fp_aux, "MapUnits: METER\n" ); fprintf( fp_aux, "UpLeftX: %24.15E\n", region->west ); fprintf( fp_aux, "UpLeftY: %25.15E\n", region->north ); fprintf( fp_aux, "LoRightX: %25.15E\n", region->east ); fprintf( fp_aux, "LoRightY: %25.15E\n", region->south ); fclose( fp_aux ); /* -------------------------------------------------------------------- */ /* open the raw data file. */ /* -------------------------------------------------------------------- */ fp_raw = fopen( filename, "wb" ); result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { static int report_flag = 0; if( (int) ECSOBJECT(result).geom.ecs_Geometry_u.matrix.x.x_len != xsize && report_flag == 0 ) { report_flag = 1; printf( "Got %d pixels, instead of expected %d pixels!\n", (int) ECSOBJECT(result).geom.ecs_Geometry_u.matrix.x.x_len, xsize ); } for( i = 0; i < xsize; i++ ) { if( width_code == 5 ) { fprintf( fp_raw, "%c%c", (ECSRASTER(result)[i] & 0xff), (ECSRASTER(result)[i] >> 8) & 0xff ); } else if( width_code == 1 ) { unsigned char red, green, blue, trans; ecs_GetRGBFromPixel( ECSRASTER(result)[i], &trans, &red, &green, &blue ); fprintf( fp_raw, "%c%c%c%c", red, green, blue, trans ); } } result = cln_GetNextObject(ClientID); } fclose( fp_raw ); } /************************************************************************/ /* main() */ /************************************************************************/ int main( int argc, char ** argv ) { ecs_Family featureType = Point; char *layer = ""; static ecs_Region reg, *region; ecs_Result *result; int i, set_region = FALSE, set_res = FALSE; char *out_file = "ogdi_out"; if( argc == 1 ) { printf("Usage: ogdi_import [-no-dict] -u url -f family\n"); printf(" [-r north south east west] [-res ns_res ew_res]\n" ); printf(" [-o filename]\n" ); printf(" -l layername [more_opts -l layername]\n" ); exit( 1 ); } /* -------------------------------------------------------------------- */ /* Handle commandline arguments. */ /* -------------------------------------------------------------------- */ for( i = 1; i < argc; i++ ) { if( i == argc - 1 ) { /* skip ... the rest require arguments. */ } else if( strcmp(argv[i],"-u") == 0 ) { AccessURL( argv[++i], ® ); if( region == NULL ) region = ® } else if( strcmp(argv[i], "-no-dict") == 0 ) { bNoDict = TRUE; } else if( strcmp(argv[i],"-o") == 0 ) { out_file = argv[++i]; } else if( strcmp(argv[i],"-op") == 0 ) { printf("No longer supported option\n"); exit(1); } else if( strcmp(argv[i], "-l") == 0 ) { layer = argv[++i]; if( !set_region ) { ecs_Region reg2 = *region; GetLayerRegion( layer, ®2 ); if( set_res ) { reg2.ew_res = region->ew_res; reg2.ns_res = region->ns_res; } *region = reg2; } if( featureType == Matrix ) { ImportMatrix( region, layer, out_file ); } else if( featureType == Image ) { ImportImage( region, layer, out_file ); } else { ImportVectors( region, layer, out_file, featureType ); } } else if( strcmp(argv[i], "-f") == 0 ) { if( strcmp(argv[i+1],"Point") == 0 ) featureType = Point; else if( strcmp(argv[i+1],"Line") == 0 ) featureType = Line; else if( strcmp(argv[i+1],"Area") == 0 ) featureType = Area; else if( strcmp(argv[i+1],"Text") == 0 ) featureType = Text; else if( strcmp(argv[i+1],"Matrix") == 0 ) featureType = Matrix; else if( strcmp(argv[i+1],"Image") == 0 ) featureType = Image; i++; } else if( strcmp(argv[i], "-r") == 0 && i < argc - 4 ) { region = ® reg.north = atof(argv[++i]); reg.south = atof(argv[++i]); reg.east = atof(argv[++i]); reg.west = atof(argv[++i]); set_region = TRUE; } else if( strcmp(argv[i], "-res") == 0 && i < argc - 2 ) { reg = *region; region = ® reg.ns_res = atof(argv[++i]); reg.ew_res = atof(argv[++i]); set_res = TRUE; } } /* -------------------------------------------------------------------- */ /* Close old client if there is one active. */ /* -------------------------------------------------------------------- */ if( ClientID != -1 ) { result = cln_DestroyClient(ClientID); if( CheckError( result ) ) return( FALSE ); ClientID = -1; } return 0; } ogdi-ogdi_4_1_0/contrib/ogdi_import/shapefil.h000066400000000000000000000266561345660466700215620ustar00rootroot00000000000000#ifndef _SHAPEFILE_H_INCLUDED #define _SHAPEFILE_H_INCLUDED /****************************************************************************** * shapefil.h,v 1.1 2000/11/23 19:14:32 warmerda Exp * * Project: Shapelib * Purpose: Primary include file for Shapelib. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * shapefil.h,v * Revision 1.1 2000/11/23 19:14:32 warmerda * New * * Revision 1.16 2000/09/25 14:15:59 warmerda * added DBFGetNativeFieldType() * * Revision 1.15 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.14 1999/11/05 14:12:05 warmerda * updated license terms * * Revision 1.13 1999/06/02 18:24:21 warmerda * added trimming code * * Revision 1.12 1999/06/02 17:56:12 warmerda * added quad'' subnode support for trees * * Revision 1.11 1999/05/18 19:11:11 warmerda * Added example searching capability * * Revision 1.10 1999/05/18 17:49:38 warmerda * added initial quadtree support * * Revision 1.9 1999/05/11 03:19:28 warmerda * added new Tuple api, and improved extension handling - add from candrsn * * Revision 1.8 1999/03/23 17:22:27 warmerda * Added extern "C" protection for C++ users of shapefil.h. * * Revision 1.7 1998/12/31 15:31:07 warmerda * Added the TRIM_DBF_WHITESPACE and DISABLE_MULTIPATCH_MEASURE options. * * Revision 1.6 1998/12/03 15:48:15 warmerda * Added SHPCalculateExtents(). * * Revision 1.5 1998/11/09 20:57:16 warmerda * Altered SHPGetInfo() call. * * Revision 1.4 1998/11/09 20:19:33 warmerda * Added 3D support, and use of SHPObject. * * Revision 1.3 1995/08/23 02:24:05 warmerda * Added support for reading bounds. * * Revision 1.2 1995/08/04 03:17:39 warmerda * Added header. * */ #include #include #include #ifdef USE_DBMALLOC #include #endif #ifdef __cplusplus extern "C" { #endif /************************************************************************/ /* Configuration options. */ /************************************************************************/ /* -------------------------------------------------------------------- */ /* Should the DBFReadStringAttribute() strip leading and */ /* trailing white space? */ /* -------------------------------------------------------------------- */ #define TRIM_DBF_WHITESPACE /* -------------------------------------------------------------------- */ /* Should we write measure values to the Multipatch object? */ /* Reportedly ArcView crashes if we do write it, so for now it */ /* is disabled. */ /* -------------------------------------------------------------------- */ #define DISABLE_MULTIPATCH_MEASURE /************************************************************************/ /* SHP Support. */ /************************************************************************/ typedef struct { FILE *fpSHP; FILE *fpSHX; int nShapeType; /* SHPT_* */ int nFileSize; /* SHP file */ int nRecords; int nMaxRecords; int *panRecOffset; int *panRecSize; double adBoundsMin[4]; double adBoundsMax[4]; int bUpdated; } SHPInfo; typedef SHPInfo * SHPHandle; /* -------------------------------------------------------------------- */ /* Shape types (nSHPType) */ /* -------------------------------------------------------------------- */ #define SHPT_NULL 0 #define SHPT_POINT 1 #define SHPT_ARC 3 #define SHPT_POLYGON 5 #define SHPT_MULTIPOINT 8 #define SHPT_POINTZ 11 #define SHPT_ARCZ 13 #define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 #define SHPT_POINTM 21 #define SHPT_ARCM 23 #define SHPT_POLYGONM 25 #define SHPT_MULTIPOINTM 28 #define SHPT_MULTIPATCH 31 /* -------------------------------------------------------------------- */ /* Part types - everything but SHPT_MULTIPATCH just uses */ /* SHPP_RING. */ /* -------------------------------------------------------------------- */ #define SHPP_TRISTRIP 0 #define SHPP_TRIFAN 1 #define SHPP_OUTERRING 2 #define SHPP_INNERRING 3 #define SHPP_FIRSTRING 4 #define SHPP_RING 5 /* -------------------------------------------------------------------- */ /* SHPObject - represents on shape (without attributes) read */ /* from the .shp file. */ /* -------------------------------------------------------------------- */ typedef struct { int nSHPType; int nShapeId; /* -1 is unknown/unassigned */ int nParts; int *panPartStart; int *panPartType; int nVertices; double *padfX; double *padfY; double *padfZ; double *padfM; double dfXMin; double dfYMin; double dfZMin; double dfMMin; double dfXMax; double dfYMax; double dfZMax; double dfMMax; } SHPObject; /* -------------------------------------------------------------------- */ /* SHP API Prototypes */ /* -------------------------------------------------------------------- */ SHPHandle SHPOpen( const char * pszShapeFile, const char * pszAccess ); SHPHandle SHPCreate( const char * pszShapeFile, int nShapeType ); void SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ); SHPObject *SHPReadObject( SHPHandle hSHP, int iShape ); int SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); void SHPDestroyObject( SHPObject * psObject ); void SHPComputeExtents( SHPObject * psObject ); SHPObject *SHPCreateObject( int nSHPType, int nShapeId, int nParts, int * panPartStart, int * panPartType, int nVertices, double * padfX, double * padfY, double * padfZ, double * padfM ); SHPObject *SHPCreateSimpleObject( int nSHPType, int nVertices, double * padfX, double * padfY, double * padfZ ); void SHPClose( SHPHandle hSHP ); const char *SHPTypeName( int nSHPType ); const char *SHPPartTypeName( int nPartType ); /* -------------------------------------------------------------------- */ /* Shape quadtree indexing API. */ /* -------------------------------------------------------------------- */ /* this can be two or four for binary or quad tree */ #define MAX_SUBNODE 4 typedef struct shape_tree_node { /* region covered by this node */ double adfBoundsMin[4]; double adfBoundsMax[4]; /* list of shapes stored at this node. The papsShapeObj pointers or the whole list can be NULL */ int nShapeCount; int *panShapeIds; SHPObject **papsShapeObj; int nSubNodes; struct shape_tree_node *apsSubNode[MAX_SUBNODE]; } SHPTreeNode; typedef struct { SHPHandle hSHP; int nMaxDepth; int nDimension; SHPTreeNode *psRoot; } SHPTree; SHPTree *SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ); void SHPDestroyTree( SHPTree * hTree ); int SHPWriteTree( SHPTree *hTree, const char * pszFilename ); SHPTree SHPReadTree( const char * pszFilename ); int SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); int SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); int SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); void SHPTreeTrimExtraNodes( SHPTree * hTree ); int *SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * ); int SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); /************************************************************************/ /* DBF Support. */ /************************************************************************/ typedef struct { FILE *fp; int nRecords; int nRecordLength; int nHeaderLength; int nFields; int *panFieldOffset; int *panFieldSize; int *panFieldDecimals; char *pachFieldType; char *pszHeader; int nCurrentRecord; int bCurrentRecordModified; char *pszCurrentRecord; int bNoHeader; int bUpdated; } DBFInfo; typedef DBFInfo * DBFHandle; typedef enum { FTString, FTInteger, FTDouble, FTInvalid } DBFFieldType; #define XBASE_FLDHDR_SZ 32 DBFHandle DBFOpen( const char * pszDBFFile, const char * pszAccess ); DBFHandle DBFCreate( const char * pszDBFFile ); int DBFGetFieldCount( DBFHandle psDBF ); int DBFGetRecordCount( DBFHandle psDBF ); int DBFAddField( DBFHandle hDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ); DBFFieldType DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ); int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); int DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, int nFieldValue ); int DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, double dFieldValue ); int DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, const char * pszFieldValue ); const char *DBFReadTuple(DBFHandle psDBF, int hEntity ); int DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); DBFHandle DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); void DBFClose( DBFHandle hDBF ); char DBFGetNativeFieldType( DBFHandle hDBF, int iField ); #ifdef __cplusplus } #endif #endif /* ndef _SHAPEFILE_H_INCLUDED */ ogdi-ogdi_4_1_0/contrib/ogdi_import/shpopen.c000066400000000000000000001653521345660466700214330ustar00rootroot00000000000000/****************************************************************************** * shpopen.c,v 1.1 2000/11/23 19:13:49 warmerda Exp * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * shpopen.c,v * Revision 1.1 2000/11/23 19:13:49 warmerda * new * * Revision 1.27 2000/07/18 15:21:33 warmerda * added better enforcement of -1 for append in SHPWriteObject * * Revision 1.26 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.25 1999/12/15 13:47:07 warmerda * Fixed record size settings in .shp file (was 4 words too long) * Added stdlib.h. * * Revision 1.24 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.23 1999/07/27 00:53:46 warmerda * added support for rewriting shapes * * Revision 1.22 1999/06/11 19:19:11 warmerda * Cleanup pabyRec static buffer on SHPClose(). * * Revision 1.21 1999/06/02 14:57:56 kshih * Remove unused variables * * Revision 1.20 1999/04/19 21:04:17 warmerda * Fixed syntax error. * * Revision 1.19 1999/04/19 21:01:57 warmerda * Force access string to binary in SHPOpen(). * * Revision 1.18 1999/04/01 18:48:07 warmerda * Try upper case extensions if lower case doesn't work. * * Revision 1.17 1998/12/31 15:29:39 warmerda * Disable writing measure values to multipatch objects if * DISABLE_MULTIPATCH_MEASURE is defined. * * Revision 1.16 1998/12/16 05:14:33 warmerda * Added support to write MULTIPATCH. Fixed reading Z coordinate of * MULTIPATCH. Fixed record size written for all feature types. * * Revision 1.15 1998/12/03 16:35:29 warmerda * r+b is proper binary access string, not rb+. * * Revision 1.14 1998/12/03 15:47:56 warmerda * Fixed setting of nVertices in SHPCreateObject(). * * Revision 1.13 1998/12/03 15:33:54 warmerda * Made SHPCalculateExtents() separately callable. * * Revision 1.12 1998/11/11 20:01:50 warmerda * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. * * Revision 1.11 1998/11/09 20:56:44 warmerda * Fixed up handling of file wide bounds. * * Revision 1.10 1998/11/09 20:18:51 warmerda * Converted to support 3D shapefiles, and use of SHPObject. * * Revision 1.9 1998/02/24 15:09:05 warmerda * Fixed memory leak. * * Revision 1.8 1997/12/04 15:40:29 warmerda * Fixed byte swapping of record number, and record length fields in the * .shp file. * * Revision 1.7 1995/10/21 03:15:58 warmerda * Added support for binary file access, the magic cookie 9997 * and tried to improve the int32 selection logic for 16bit systems. * * Revision 1.6 1995/09/04 04:19:41 warmerda * Added fix for file bounds. * * Revision 1.5 1995/08/25 15:16:44 warmerda * Fixed a couple of problems with big endian systems ... one with bounds * and the other with multipart polygons. * * Revision 1.4 1995/08/24 18:10:17 warmerda * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() * functions (such as on the Sun). * * Revision 1.3 1995/08/23 02:23:15 warmerda * Added support for reading bounds, and fixed up problems in setting the * file wide bounds. * * Revision 1.2 1995/08/04 03:16:57 warmerda * Added header. * */ #include "shapefil.h" #include #include #include #include typedef unsigned char uchar; #if UINT_MAX == 65535 typedef long int32; #else typedef int int32; #endif #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #define ByteCopy( a, b, c ) memcpy( b, a, c ) #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif static int bBigEndian; static uchar *pabyRec = NULL; static int nBufSize = 0; /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; uchar temp; for( i=0; i < length/2; i++ ) { temp = ((uchar *) wordP)[i]; ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; ((uchar *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPWriteHeader() */ /* */ /* Write out a header for the .shp and .shx files as well as the */ /* contents of the index (.shx) file. */ /************************************************************************/ static void SHPWriteHeader( SHPHandle psSHP ) { uchar abyHeader[100]; int i; int32 i32; double dValue; int32 *panSHX; /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = psSHP->nFileSize/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = psSHP->nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = psSHP->adBoundsMin[0]; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+36 ); dValue = psSHP->adBoundsMin[1]; ByteCopy( &dValue, abyHeader+44, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+44 ); dValue = psSHP->adBoundsMax[0]; ByteCopy( &dValue, abyHeader+52, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+52 ); dValue = psSHP->adBoundsMax[1]; ByteCopy( &dValue, abyHeader+60, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+60 ); dValue = psSHP->adBoundsMin[2]; /* z */ ByteCopy( &dValue, abyHeader+68, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+68 ); dValue = psSHP->adBoundsMax[2]; ByteCopy( &dValue, abyHeader+76, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+76 ); dValue = psSHP->adBoundsMin[3]; /* m */ ByteCopy( &dValue, abyHeader+84, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+84 ); dValue = psSHP->adBoundsMax[3]; ByteCopy( &dValue, abyHeader+92, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+92 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ fseek( psSHP->fpSHP, 0, 0 ); ogdi_fwrite( abyHeader, 100, 1, psSHP->fpSHP ); /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); fseek( psSHP->fpSHX, 0, 0 ); ogdi_fwrite( abyHeader, 100, 1, psSHP->fpSHX ); /* -------------------------------------------------------------------- */ /* Write out the .shx contents. */ /* -------------------------------------------------------------------- */ panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); for( i = 0; i < psSHP->nRecords; i++ ) { panSHX[i*2 ] = psSHP->panRecOffset[i]/2; panSHX[i*2+1] = psSHP->panRecSize[i]/2; if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); } ogdi_fwrite( panSHX, sizeof(int32) * 2, psSHP->nRecords, psSHP->fpSHX ); free( panSHX ); } /************************************************************************/ /* SHPOpen() */ /* */ /* Open the .shp and .shx files based on the basename of the */ /* files or either file name. */ /************************************************************************/ SHPHandle SHPOpen( const char * pszLayer, const char * pszAccess ) { char *pszFullname, *pszBasename; SHPHandle psSHP; uchar *pabyBuf; int i; double dValue; /* -------------------------------------------------------------------- */ /* Ensure the access string is one of the legal ones. We */ /* ensure the result string indicates binary to avoid common */ /* problems on Windows. */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 || strcmp(pszAccess,"r+") == 0 ) pszAccess = "r+b"; else pszAccess = "rb"; /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Initialize the info structure. */ /* -------------------------------------------------------------------- */ psSHP = (SHPHandle) malloc(sizeof(SHPInfo)); psSHP->bUpdated = FALSE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); psSHP->fpSHP = fopen(pszFullname, pszAccess ); if( psSHP->fpSHP == NULL ) { sprintf( pszFullname, "%s.SHP", pszBasename ); psSHP->fpSHP = fopen(pszFullname, pszAccess ); } if( psSHP->fpSHP == NULL ) return( NULL ); sprintf( pszFullname, "%s.shx", pszBasename ); psSHP->fpSHX = fopen(pszFullname, pszAccess ); if( psSHP->fpSHX == NULL ) { sprintf( pszFullname, "%s.SHX", pszBasename ); psSHP->fpSHX = fopen(pszFullname, pszAccess ); } if( psSHP->fpSHX == NULL ) return( NULL ); free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Read the file size from the SHP file. */ /* -------------------------------------------------------------------- */ pabyBuf = (uchar *) malloc(100); ogdi_fread( pabyBuf, 100, 1, psSHP->fpSHP ); psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[26] * 256 + pabyBuf[27]) * 2; /* -------------------------------------------------------------------- */ /* Read SHX file Header info */ /* -------------------------------------------------------------------- */ ogdi_fread( pabyBuf, 100, 1, psSHP->fpSHX ); if( pabyBuf[0] != 0 || pabyBuf[1] != 0 || pabyBuf[2] != 0x27 || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) { fclose( psSHP->fpSHP ); fclose( psSHP->fpSHX ); free( psSHP ); return( NULL ); } psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256; psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8; psSHP->nShapeType = pabyBuf[32]; /* -------------------------------------------------------------------- */ /* Read the bounds. */ /* -------------------------------------------------------------------- */ if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); memcpy( &dValue, pabyBuf+36, 8 ); psSHP->adBoundsMin[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); memcpy( &dValue, pabyBuf+44, 8 ); psSHP->adBoundsMin[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); memcpy( &dValue, pabyBuf+52, 8 ); psSHP->adBoundsMax[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); memcpy( &dValue, pabyBuf+60, 8 ); psSHP->adBoundsMax[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ memcpy( &dValue, pabyBuf+68, 8 ); psSHP->adBoundsMin[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); memcpy( &dValue, pabyBuf+76, 8 ); psSHP->adBoundsMax[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ memcpy( &dValue, pabyBuf+84, 8 ); psSHP->adBoundsMin[3] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); memcpy( &dValue, pabyBuf+92, 8 ); psSHP->adBoundsMax[3] = dValue; free( pabyBuf ); /* -------------------------------------------------------------------- */ /* Read the .shx file to get the offsets to each record in */ /* the .shp file. */ /* -------------------------------------------------------------------- */ psSHP->nMaxRecords = psSHP->nRecords; psSHP->panRecOffset = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); psSHP->panRecSize = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); ogdi_fread( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ); for( i = 0; i < psSHP->nRecords; i++ ) { int32 nOffset, nLength; memcpy( &nOffset, pabyBuf + i * 8, 4 ); if( !bBigEndian ) SwapWord( 4, &nOffset ); memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); if( !bBigEndian ) SwapWord( 4, &nLength ); psSHP->panRecOffset[i] = nOffset*2; psSHP->panRecSize[i] = nLength*2; } free( pabyBuf ); return( psSHP ); } /************************************************************************/ /* SHPClose() */ /* */ /* Close the .shp and .shx files. */ /************************************************************************/ void SHPClose(SHPHandle psSHP ) { /* -------------------------------------------------------------------- */ /* Update the header if we have modified anything. */ /* -------------------------------------------------------------------- */ if( psSHP->bUpdated ) { SHPWriteHeader( psSHP ); } /* -------------------------------------------------------------------- */ /* Free all resources, and close files. */ /* -------------------------------------------------------------------- */ free( psSHP->panRecOffset ); free( psSHP->panRecSize ); fclose( psSHP->fpSHX ); fclose( psSHP->fpSHP ); free( psSHP ); if( pabyRec != NULL ) { free( pabyRec ); pabyRec = NULL; nBufSize = 0; } } /************************************************************************/ /* SHPGetInfo() */ /* */ /* Fetch general information about the shape file. */ /************************************************************************/ void SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ) { int i; if( pnEntities != NULL ) *pnEntities = psSHP->nRecords; if( pnShapeType != NULL ) *pnShapeType = psSHP->nShapeType; for( i = 0; i < 4; i++ ) { if( padfMinBound != NULL ) padfMinBound[i] = psSHP->adBoundsMin[i]; if( padfMaxBound != NULL ) padfMaxBound[i] = psSHP->adBoundsMax[i]; } } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPCreate( const char * pszLayer, int nShapeType ) { char *pszBasename, *pszFullname; int i; FILE *fpSHP, *fpSHX; uchar abyHeader[100]; int32 i32; double dValue; /* -------------------------------------------------------------------- */ /* Establish the byte order on this system. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the two files so we can write their headers. */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); fpSHP = fopen(pszFullname, "wb" ); if( fpSHP == NULL ) return( NULL ); sprintf( pszFullname, "%s.shx", pszBasename ); fpSHX = fopen(pszFullname, "wb" ); if( fpSHX == NULL ) return( NULL ); free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = 0.0; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); ByteCopy( &dValue, abyHeader+44, 8 ); ByteCopy( &dValue, abyHeader+52, 8 ); ByteCopy( &dValue, abyHeader+60, 8 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ ogdi_fwrite( abyHeader, 100, 1, fpSHP ); /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); ogdi_fwrite( abyHeader, 100, 1, fpSHX ); /* -------------------------------------------------------------------- */ /* Close the files, and then open them as regular existing files. */ /* -------------------------------------------------------------------- */ fclose( fpSHP ); fclose( fpSHX ); return( SHPOpen( pszLayer, "r+b" ) ); } /************************************************************************/ /* _SHPSetBounds() */ /* */ /* Compute a bounds rectangle for a shape, and set it into the */ /* indicated location in the record. */ /************************************************************************/ static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) { ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); if( bBigEndian ) { SwapWord( 8, pabyRec + 0 ); SwapWord( 8, pabyRec + 8 ); SwapWord( 8, pabyRec + 16 ); SwapWord( 8, pabyRec + 24 ); } } /************************************************************************/ /* SHPComputeExtents() */ /* */ /* Recompute the extents of a shape. Automatically done by */ /* SHPCreateObject(). */ /************************************************************************/ void SHPComputeExtents( SHPObject * psObject ) { int i; /* -------------------------------------------------------------------- */ /* Build extents for this object. */ /* -------------------------------------------------------------------- */ if( psObject->nVertices > 0 ) { psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); } } /************************************************************************/ /* SHPCreateObject() */ /* */ /* Create a shape object. It should be freed with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject *SHPCreateObject( int nSHPType, int nShapeId, int nParts, int * panPartStart, int * panPartType, int nVertices, double * padfX, double * padfY, double * padfZ, double * padfM ) { SHPObject *psObject; int i, bHasM, bHasZ; psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); psObject->nSHPType = nSHPType; psObject->nShapeId = nShapeId; /* -------------------------------------------------------------------- */ /* Establish whether this shape type has M, and Z values. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARCM || nSHPType == SHPT_POINTM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_MULTIPOINTM ) { bHasM = TRUE; bHasZ = FALSE; } else if( nSHPType == SHPT_ARCZ || nSHPType == SHPT_POINTZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPOINTZ || nSHPType == SHPT_MULTIPATCH ) { bHasM = TRUE; bHasZ = TRUE; } else { bHasM = FALSE; bHasZ = FALSE; } /* -------------------------------------------------------------------- */ /* Capture parts. Note that part type is optional, and */ /* defaults to ring. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPATCH ) { psObject->nParts = MAX(1,nParts); psObject->panPartStart = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartType = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartStart[0] = 0; psObject->panPartType[0] = SHPP_RING; for( i = 0; i < nParts; i++ ) { psObject->panPartStart[i] = panPartStart[i]; if( panPartType != NULL ) psObject->panPartType[i] = panPartType[i]; else psObject->panPartType[i] = SHPP_RING; } } /* -------------------------------------------------------------------- */ /* Capture vertices. Note that Z and M are optional, but X and */ /* Y are not. */ /* -------------------------------------------------------------------- */ psObject->padfX = (double *) calloc(sizeof(double),nVertices); psObject->padfY = (double *) calloc(sizeof(double),nVertices); psObject->padfZ = (double *) calloc(sizeof(double),nVertices); psObject->padfM = (double *) calloc(sizeof(double),nVertices); assert( padfX != NULL ); assert( padfY != NULL ); for( i = 0; i < nVertices; i++ ) { psObject->padfX[i] = padfX[i]; psObject->padfY[i] = padfY[i]; if( padfZ != NULL && bHasZ ) psObject->padfZ[i] = padfZ[i]; if( padfM != NULL && bHasM ) psObject->padfM[i] = padfM[i]; } /* -------------------------------------------------------------------- */ /* Compute the extents. */ /* -------------------------------------------------------------------- */ psObject->nVertices = nVertices; SHPComputeExtents( psObject ); return( psObject ); } /************************************************************************/ /* SHPCreateSimpleObject() */ /* */ /* Create a simple (common) shape object. Destroy with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject *SHPCreateSimpleObject( int nSHPType, int nVertices, double * padfX, double * padfY, double * padfZ ) { return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, nVertices, padfX, padfY, padfZ, NULL ) ); } /************************************************************************/ /* SHPWriteObject() */ /* */ /* Write out the vertices of a new structure. Note that it is */ /* only possible to write vertices at the end of the file. */ /************************************************************************/ int SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) { int nRecordOffset, i, nRecordSize; uchar *pabyRec; int32 i32; psSHP->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Ensure that shape object matches the type of the file it is */ /* being written to. */ /* -------------------------------------------------------------------- */ assert( psObject->nSHPType == psSHP->nShapeType ); /* -------------------------------------------------------------------- */ /* Ensure that -1 is used for appends. Either blow an */ /* assertion, or if they are disabled, set the shapeid to -1 */ /* for appends. */ /* -------------------------------------------------------------------- */ assert( nShapeId == -1 || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) nShapeId = -1; /* -------------------------------------------------------------------- */ /* Add the new entity to the in memory index. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) { psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100); psSHP->panRecOffset = (int *) SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords ); psSHP->panRecSize = (int *) SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords ); } /* -------------------------------------------------------------------- */ /* Initialize record. */ /* -------------------------------------------------------------------- */ pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + psObject->nParts * 8 + 128); /* -------------------------------------------------------------------- */ /* Extract vertices for a Polygon or Arc. */ /* -------------------------------------------------------------------- */ if( psSHP->nShapeType == SHPT_POLYGON || psSHP->nShapeType == SHPT_POLYGONZ || psSHP->nShapeType == SHPT_POLYGONM || psSHP->nShapeType == SHPT_ARC || psSHP->nShapeType == SHPT_ARCZ || psSHP->nShapeType == SHPT_ARCM || psSHP->nShapeType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i; nPoints = psObject->nVertices; nParts = psObject->nParts; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); nRecordSize = 52; /* * Write part start positions. */ ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, 4 * psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); nRecordSize += 4; } /* * Write multipatch part types if needed. */ if( psSHP->nShapeType == SHPT_MULTIPATCH ) { memcpy( pabyRec + nRecordSize, psObject->panPartType, 4*psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); nRecordSize += 4; } } /* * Write the (x,y) vertex values. */ for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize + 8 ); nRecordSize += 2 * 8; } /* * Write the Z coordinates (if any). */ if( psSHP->nShapeType == SHPT_POLYGONZ || psSHP->nShapeType == SHPT_ARCZ || psSHP->nShapeType == SHPT_MULTIPATCH ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* * Write the M values, if any. */ if( psSHP->nShapeType == SHPT_POLYGONM || psSHP->nShapeType == SHPT_ARCM #ifndef DISABLE_MULTIPATCH_MEASURE || psSHP->nShapeType == SHPT_MULTIPATCH #endif || psSHP->nShapeType == SHPT_POLYGONZ || psSHP->nShapeType == SHPT_ARCZ ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Extract vertices for a MultiPoint. */ /* -------------------------------------------------------------------- */ else if( psSHP->nShapeType == SHPT_MULTIPOINT || psSHP->nShapeType == SHPT_MULTIPOINTZ || psSHP->nShapeType == SHPT_MULTIPOINTM ) { int32 nPoints; int i; nPoints = psObject->nVertices; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); ByteCopy( &nPoints, pabyRec + 44, 4 ); for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); } nRecordSize = 48 + 16 * psObject->nVertices; if( psSHP->nShapeType == SHPT_MULTIPOINTZ ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } if( psSHP->nShapeType == SHPT_MULTIPOINTZ || psSHP->nShapeType == SHPT_MULTIPOINTM ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Extract vertices for a point. */ /* -------------------------------------------------------------------- */ else if( psSHP->nShapeType == SHPT_POINT || psSHP->nShapeType == SHPT_POINTZ || psSHP->nShapeType == SHPT_POINTM ) { ByteCopy( psObject->padfX, pabyRec + 12, 8 ); ByteCopy( psObject->padfY, pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); nRecordSize = 28; if( psSHP->nShapeType == SHPT_POINTZ ) { ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } if( psSHP->nShapeType == SHPT_POINTZ || psSHP->nShapeType == SHPT_POINTM ) { ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } else { /* unknown type */ assert( FALSE ); } /* -------------------------------------------------------------------- */ /* Establish where we are going to put this record. If we are */ /* rewriting and existing record, and it will fit, then put it */ /* back where the original came from. Otherwise write at the end. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) { if( nShapeId == -1 ) nShapeId = psSHP->nRecords++; psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize; psSHP->panRecSize[nShapeId] = nRecordSize-8; psSHP->nFileSize += nRecordSize; } else { nRecordOffset = psSHP->panRecOffset[nShapeId]; } /* -------------------------------------------------------------------- */ /* Set the shape type, record number, and record size. */ /* -------------------------------------------------------------------- */ i32 = nShapeId+1; /* record # */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec, 4 ); i32 = (nRecordSize-8)/2; /* record size */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 4, 4 ); i32 = psSHP->nShapeType; /* shape type */ if( bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 8, 4 ); /* -------------------------------------------------------------------- */ /* Write out record. */ /* -------------------------------------------------------------------- */ if( fseek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 || fwrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) { printf( "Error in fseek() or fwrite().\n" ); free( pabyRec ); return -1; } free( pabyRec ); /* -------------------------------------------------------------------- */ /* Expand file wide bounds based on this shape. */ /* -------------------------------------------------------------------- */ if( psSHP->nRecords == 1 ) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0]; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); } return( nShapeId ); } /************************************************************************/ /* SHPReadObject() */ /* */ /* Read the vertices, parts, and other non-attribute information */ /* for one shape. */ /************************************************************************/ SHPObject *SHPReadObject( SHPHandle psSHP, int hEntity ) { SHPObject *psShape; /* -------------------------------------------------------------------- */ /* Validate the record/entity number. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psSHP->nRecords ) return( NULL ); /* -------------------------------------------------------------------- */ /* Ensure our record buffer is large enough. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 > nBufSize ) { nBufSize = psSHP->panRecSize[hEntity]+8; pabyRec = (uchar *) SfRealloc(pabyRec,nBufSize); } /* -------------------------------------------------------------------- */ /* Read the record. */ /* -------------------------------------------------------------------- */ fseek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ); ogdi_fread( pabyRec, psSHP->panRecSize[hEntity]+8, 1, psSHP->fpSHP ); /* -------------------------------------------------------------------- */ /* Allocate and minimally initialize the object. */ /* -------------------------------------------------------------------- */ psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); psShape->nShapeId = hEntity; memcpy( &psShape->nSHPType, pabyRec + 8, 4 ); if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) ); /* ==================================================================== */ /* Extract vertices for a Polygon or Arc. */ /* ==================================================================== */ if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC || psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_POLYGONM || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_ARCM || psShape->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i, nOffset; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* Extract part/point count, and build vertex and part arrays */ /* to proper size. */ /* -------------------------------------------------------------------- */ memcpy( &nPoints, pabyRec + 40 + 8, 4 ); memcpy( &nParts, pabyRec + 36 + 8, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); psShape->nParts = nParts; psShape->panPartStart = (int *) calloc(nParts,sizeof(int)); psShape->panPartType = (int *) calloc(nParts,sizeof(int)); for( i = 0; i < nParts; i++ ) psShape->panPartType[i] = SHPP_RING; /* -------------------------------------------------------------------- */ /* Copy out the part array from the record. */ /* -------------------------------------------------------------------- */ memcpy( psShape->panPartStart, pabyRec + 44 + 8, 4 * nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); } nOffset = 44 + 8 + 4*nParts; /* -------------------------------------------------------------------- */ /* If this is a multipatch, we will also have parts types. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( psShape->panPartType, pabyRec + nOffset, 4*nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); } nOffset += 4*nParts; } /* -------------------------------------------------------------------- */ /* Copy out the vertices from the record. */ /* -------------------------------------------------------------------- */ for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX + i, pabyRec + nOffset + i * 16, 8 ); memcpy(psShape->padfY + i, pabyRec + nOffset + i * 16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset += 16*nPoints; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( &(psShape->dfZMin), pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } } } /* ==================================================================== */ /* Extract vertices for a MultiPoint. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_MULTIPOINT || psShape->nSHPType == SHPT_MULTIPOINTM || psShape->nSHPType == SHPT_MULTIPOINTZ ) { int32 nPoints; int i, nOffset; memcpy( &nPoints, pabyRec + 44, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX+i, pabyRec + 48 + 16 * i, 8 ); memcpy(psShape->padfY+i, pabyRec + 48 + 16 * i + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset = 48 + 16*nPoints; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { memcpy( &(psShape->dfZMin), pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } } } /* ==================================================================== */ /* Extract vertices for a point. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_POINT || psShape->nSHPType == SHPT_POINTM || psShape->nSHPType == SHPT_POINTZ ) { int nOffset; psShape->nVertices = 1; psShape->padfX = (double *) calloc(1,sizeof(double)); psShape->padfY = (double *) calloc(1,sizeof(double)); psShape->padfZ = (double *) calloc(1,sizeof(double)); psShape->padfM = (double *) calloc(1,sizeof(double)); memcpy( psShape->padfX, pabyRec + 12, 8 ); memcpy( psShape->padfY, pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX ); if( bBigEndian ) SwapWord( 8, psShape->padfY ); nOffset = 20 + 8; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POINTZ ) { memcpy( psShape->padfZ, pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ ); nOffset += 8; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 8 ) { memcpy( psShape->padfM, pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM ); } /* -------------------------------------------------------------------- */ /* Since no extents are supplied in the record, we will apply */ /* them from the single vertex. */ /* -------------------------------------------------------------------- */ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; } return( psShape ); } /************************************************************************/ /* SHPTypeName() */ /************************************************************************/ const char *SHPTypeName( int nSHPType ) { switch( nSHPType ) { case 0: return "NullShape"; case SHPT_POINT: return "Point"; case SHPT_ARC: return "Arc"; case SHPT_POLYGON: return "Polygon"; case SHPT_MULTIPOINT: return "MultiPoint"; case SHPT_POINTZ: return "PointZ"; case SHPT_ARCZ: return "ArcZ"; case SHPT_POLYGONZ: return "PolygonZ"; case SHPT_MULTIPOINTZ: return "MultiPointZ"; case SHPT_POINTM: return "PointM"; case SHPT_ARCM: return "ArcM"; case SHPT_POLYGONM: return "PolygonM"; case SHPT_MULTIPOINTM: return "MultiPointM"; case SHPT_MULTIPATCH: return "MultiPatch"; default: return "UnknownShapeType"; } } /************************************************************************/ /* SHPPartTypeName() */ /************************************************************************/ const char *SHPPartTypeName( int nPartType ) { switch( nPartType ) { case SHPP_TRISTRIP: return "TriangleStrip"; case SHPP_TRIFAN: return "TriangleFan"; case SHPP_OUTERRING: return "OuterRing"; case SHPP_INNERRING: return "InnerRing"; case SHPP_FIRSTRING: return "FirstRing"; case SHPP_RING: return "Ring"; default: return "UnknownPartType"; } } /************************************************************************/ /* SHPDestroyObject() */ /************************************************************************/ void SHPDestroyObject( SHPObject * psShape ) { if( psShape == NULL ) return; if( psShape->padfX != NULL ) free( psShape->padfX ); if( psShape->padfY != NULL ) free( psShape->padfY ); if( psShape->padfZ != NULL ) free( psShape->padfZ ); if( psShape->padfM != NULL ) free( psShape->padfM ); if( psShape->panPartStart != NULL ) free( psShape->panPartStart ); if( psShape->panPartType != NULL ) free( psShape->panPartType ); free( psShape ); } ogdi-ogdi_4_1_0/contrib/ogdi_info/000077500000000000000000000000001345660466700172205ustar00rootroot00000000000000ogdi-ogdi_4_1_0/contrib/ogdi_info/.cvsignore000066400000000000000000000000061345660466700212140ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/contrib/ogdi_info/makefile000077500000000000000000000024211345660466700207220ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty # TOBEGEN = ogdi_info TARGETGEN=$(PROGGEN) SOURCES = ogdi_info.c INCLUDES = $(CURRENT_INCLUDE) $(OGDI_INCLUDE)\ $(ZLIB_INCLUDE) $(GENERAL_INCLUDE) $(TCLTK_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) $(FLAGS_X86DEF) LINK_LIBS= $(OGDI_LINKLIB) $(ZLIB_LINKLIB) $(RPC_LINKLIB) \ $(MATH_LINKLIB) \ $(LIBC_LINKLIB) $(UCB_STATICLIB) $(DL_LINKLIB) \ $(WIN_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR ogdi_info.c $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/contrib/ogdi_info/ogdi_info.c000077500000000000000000000671531345660466700213400ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: OGDI Contributed Clients * Purpose: Simple console query program for testing OGDI. * Author: Frank Warmerdam * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of the author not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. The author makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.14 2004-10-26 19:45:53 warmerda * Fixed last fix. * * Revision 1.13 2004/10/26 19:37:52 warmerda * Close old clientid if multiple -u's met. * Report errors on illegal family specifications. * * Revision 1.12 2004/02/18 21:27:13 warmerda * Use ecs_CleanUp() to recover result memory * * Revision 1.11 2001/12/14 21:22:02 warmerda * dont reproject to latlong if already latlong * * Revision 1.10 2001/08/17 00:37:15 warmerda * updated formatting of capabilities bounds * * Revision 1.9 2001/07/17 19:08:01 warmerda * Fixed reporting of Text layers. * * Revision 1.8 2001/04/19 05:28:50 warmerda * improve region bounds reporting * * Revision 1.7 2001/04/12 19:26:08 warmerda * added RGB image support * * Revision 1.6 2001/04/12 18:12:42 warmerda * Added lots of capabilities related to capabilities * * Revision 1.5 2001/04/10 14:41:47 warmerda * Added support for reporting Image values. * * Revision 1.4 2001/04/09 16:06:53 warmerda * added -no-proj support * * Revision 1.3 2001/02/19 04:46:13 warmerda * use projUV, not UV * * Revision 1.2 2000/11/23 19:10:36 warmerda * added copyright header * */ #include "ecs.h" static int ClientID = -1; static int bNoDict = FALSE; static int bNoProj = FALSE; static int nSampleFrequency = 1; /************************************************************************/ /* CheckError() */ /************************************************************************/ static int CheckError( ecs_Result * result ) { if( ECSERROR( result ) ) { printf( "ECSERROR: %s\n", result->message ); return TRUE; } else return FALSE; } /************************************************************************/ /* DumpCapabilities() */ /************************************************************************/ static void DumpCapabilities() { const ecs_LayerCapabilities *layer; int layer_index; ecs_Result *result; result = cln_GetVersion( ClientID ); if( CheckError( result ) ) return; printf( "Version: `%s'\n", ECSTEXT(result) ); for( layer_index = 0; (layer = cln_GetLayerCapabilities(ClientID,layer_index)) != NULL; layer_index++ ) { printf( "Layer %d: %s\n", layer_index, layer->name ); if( layer->title ) printf( " Title: %s\n", layer->title ); if( layer->srs ) printf( " SRS: %s\n", layer->srs ); printf( " Families: " ); if( layer->families[Area] ) printf( "Area " ); if( layer->families[Point] ) printf( "Point " ); if( layer->families[Line] ) printf( "Line " ); if( layer->families[Text] ) printf( "Text " ); if( layer->families[Image] ) printf( "Image " ); if( layer->families[Matrix] ) printf( "Matrix " ); printf( "\n" ); printf( " Bounds: n=%.4f, s=%.4f, nsres=%g\n" " e=%.4f, w=%.4f, ewres=%g\n", layer->srs_north, layer->srs_south, layer->srs_nsres, layer->srs_east, layer->srs_west, layer->srs_ewres ); if( layer->ll_bounds_set ) { printf( " LLBounds: n=%.14f, s=%.14f\n" " e=%.14f, w=%.14f\n", layer->ll_north, layer->ll_south, layer->ll_east, layer->ll_west ); } if( layer->extensions != NULL ) { int i; printf( " Extensions:" ); for( i = 0; layer->extensions[i] != NULL; i++ ) printf( " %s", layer->extensions[i] ); printf( "\n" ); } if( layer->query_expression_set ) { printf( " Query Expression:\n" ); if( layer->qe_prefix != NULL ) printf( " prefix=\"%s\"\n", layer->qe_prefix ); if( layer->qe_suffix != NULL ) printf( " suffix=\"%s\"\n", layer->qe_suffix ); if( layer->qe_format != NULL ) printf( " format=\"%s\"\n", layer->qe_format ); if( layer->qe_description != NULL ) printf( " description=\"%s\"\n", layer->qe_description ); } } } /************************************************************************/ /* DecToDMS() */ /************************************************************************/ const char * DecToDMS( double dfAngle ) { static char szDMS1[128]; static char szDMS2[128]; static int nRotator = 1; int nDeg, nMin; double dfRemainder; nDeg = (int) dfAngle; dfRemainder = (fabs(dfAngle) - fabs(nDeg)); nMin = (int) floor(dfRemainder*60.0); dfRemainder = dfRemainder - nMin / 60.0; if( nRotator == 1 ) { nRotator = 2; sprintf( szDMS1, "%4dd%2d'%7.4f\"", nDeg, nMin, dfRemainder*3600.0 ); return( szDMS1 ); } else { nRotator = 1; sprintf( szDMS2, "%4dd%2d'%7.4f\"", nDeg, nMin, dfRemainder*3600.0 ); return( szDMS2 ); } } /************************************************************************/ /* DumpGlobalRegion() */ /************************************************************************/ static int DumpGlobalRegion( ecs_Region * region ) { ecs_Result *result; ecs_Region tmpRegion; if( region == NULL ) region = &tmpRegion; /* -------------------------------------------------------------------- */ /* print the global bounds. */ /* -------------------------------------------------------------------- */ result = cln_GetGlobalBound(ClientID); if( CheckError( result ) ) return( FALSE ); printf( "Bounds\n" ); printf( "north = %f\n", ECSREGION(result).north ); printf( "south = %f\n", ECSREGION(result).south ); printf( "east = %f\n", ECSREGION(result).east ); printf( "west = %f\n", ECSREGION(result).west ); printf( "ns_res = %.9f\n", ECSREGION(result).ns_res ); printf( "ew_res = %.9f\n", ECSREGION(result).ew_res ); *region = ECSREGION(result); return TRUE; } /************************************************************************/ /* DumpRasterObject() */ /************************************************************************/ static void DumpRasterObject( ecs_Result * result, ecs_Family featureType, int nDataType ) { int i, xsize; unsigned char *raw = (unsigned char *) ECSRASTER(result); xsize = ECSOBJECT(result).geom.ecs_Geometry_u.matrix.x.x_len; printf("Object ID:%s (%d pixels)\n",ECSOBJECTID(result), xsize); for( i = 0; i < xsize; i += nSampleFrequency ) { if( nSampleFrequency != 1 ) printf( "%d:", i ); if( featureType == Matrix ) { printf( "%d ", ECSRASTER(result)[i] ); } else if( featureType == Image ) { if( nDataType == 1 ) { if( raw[i*4+3] != 0 ) printf( "%d,%d,%d ", raw[i*4], raw[i*4+1], raw[i*4+2] ); else printf( " " ); } else if( nDataType == 2 ) printf( "%d ", raw[i] ); else if( nDataType == 3 ) printf( "%d ", ((unsigned short *) ECSRASTER(result))[i] ); else if( nDataType == 4 ) printf( "%d ", ((short *) ECSRASTER(result))[i] ); else if( nDataType == 5 ) printf( "%d ", ((int *) ECSRASTER(result))[i] ); else printf( "?? " ); } } printf( "\n" ); } /************************************************************************/ /* DumpVectorObject() */ /************************************************************************/ static void DumpVectorObject( ecs_Result * result, ecs_Family featureType ) { printf("Object ID:%s\n",ECSOBJECTID(result)); printf("Object Attributes:%s\n",ECSOBJECTATTR(result)); if( featureType == Text ) { printf( "%d: (%f , %f) Text=%s\n", 0, ECSGEOM(result).text.c.x, ECSGEOM(result).text.c.y, ECSGEOM(result).text.desc ); } else if( featureType == Point ) { printf( "%d: (%f , %f)\n", 0, ECSGEOM(result).point.c.x, ECSGEOM(result).point.c.y ); } else if( featureType == Line ) { int i; for( i=0; i < (int) ECSGEOM(result).line.c.c_len; i += nSampleFrequency ) { printf("%d: (%f , %f)\n", i, ECSGEOM(result).line.c.c_val[i].x, ECSGEOM(result).line.c.c_val[i].y ); } } else if( featureType == Area ) { int i, iRing; for( iRing=0; iRing < (int) ECSGEOM(result).area.ring.ring_len; iRing++ ) { ecs_FeatureRing *ring; printf( "Ring %d\n", iRing ); ring = ECSGEOM(result).area.ring.ring_val + iRing; for( i=0; i < (int) ring->c.c_len; i += nSampleFrequency ) { printf("%d: (%f , %f)\n", i, ring->c.c_val[i].x, ring->c.c_val[i].y ); } printf( "\n" ); } } printf( "\n" ); } /************************************************************************/ /* AccessURL() */ /************************************************************************/ static int AccessURL( char * url, ecs_Region * region ) { ecs_Result *result; /* -------------------------------------------------------------------- */ /* Close old client if there is one active. */ /* -------------------------------------------------------------------- */ if( ClientID != -1 ) { result = cln_DestroyClient(ClientID); if( CheckError( result ) ) return( FALSE ); ClientID = -1; } /* -------------------------------------------------------------------- */ /* Open new URL/client. */ /* -------------------------------------------------------------------- */ result = cln_CreateClient(&ClientID,url); if( CheckError( result ) ) return( FALSE ); /* -------------------------------------------------------------------- */ /* Print the projection. */ /* -------------------------------------------------------------------- */ result = cln_GetServerProjection( ClientID ); if( CheckError( result ) ) return( FALSE ); printf( "Projection = `%s'\n", ECSTEXT(result) ); /* -------------------------------------------------------------------- */ /* Dump the global region. */ /* -------------------------------------------------------------------- */ DumpGlobalRegion( region ); /* -------------------------------------------------------------------- */ /* Print the Dictionary (update). */ /* -------------------------------------------------------------------- */ result = cln_UpdateDictionary( ClientID, "" ); if( CheckError( result ) ) return( FALSE ); if( !bNoDict ) printf( "UpdateDictionary = \n%s\n", ECSTEXT(result) ); return( TRUE ); } /************************************************************************/ /* IdSearch() */ /************************************************************************/ static void IdSearch( char * layer, ecs_Family featureType, const char * id ) { ecs_LayerSelection selectionLayer; ecs_Result *result; /* -------------------------------------------------------------------- */ /* Define the layer to select. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = featureType; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError( result ) ) return; /* -------------------------------------------------------------------- */ /* Search for the coordinate. */ /* -------------------------------------------------------------------- */ result = cln_GetObject( ClientID, (char *) id ); if( CheckError( result ) ) return; if( featureType == Matrix || featureType == Image ) { DumpRasterObject( result, featureType, 5 ); } else { DumpVectorObject( result, featureType ); } } /************************************************************************/ /* CoordSearch() */ /************************************************************************/ static void CoordSearch( char * layer, ecs_Family featureType, double x, double y ) { ecs_LayerSelection selectionLayer; ecs_Result *result; ecs_Coordinate coord; /* -------------------------------------------------------------------- */ /* Define the layer to select. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = featureType; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError( result ) ) return; /* -------------------------------------------------------------------- */ /* Search for the coordinate. */ /* -------------------------------------------------------------------- */ coord.x = x; coord.y = y; result = cln_GetObjectIdFromCoord( ClientID, &coord ); if( CheckError( result ) ) return; printf( "cln_GetObjectIdFromCoord(%f,%f) = `%s'\n", x, y, ECSTEXT(result) ); } /************************************************************************/ /* DumpDict() */ /************************************************************************/ static void DumpDict( const char * pszDictName ) { ecs_Result *result; result = cln_UpdateDictionary( ClientID, (char *) pszDictName ); if( CheckError( result ) ) return; printf( "UpdateDictionary(%s) = \n%s\n", pszDictName, ECSTEXT(result) ); } /************************************************************************/ /* DumpLayer() */ /************************************************************************/ static void DumpLayer( const char * options, ecs_Region * region, char * layer, ecs_Family featureType ) { int nObjectCount = 0, i; ecs_Result *result; ecs_Region selectionRegion; ecs_LayerSelection selectionLayer; ecs_ObjAttributeFormat *oaf; (void) options; /* -------------------------------------------------------------------- */ /* Select a region ... this should be overridable from the */ /* command line. */ /* -------------------------------------------------------------------- */ if( region != NULL ) { selectionRegion = *region; result = cln_SelectRegion(ClientID,&selectionRegion); if( CheckError( result ) ) return; } /* -------------------------------------------------------------------- */ /* Define the layer to select. */ /* -------------------------------------------------------------------- */ selectionLayer.Select = (char *) layer; selectionLayer.F = featureType; result = cln_SelectLayer(ClientID,&selectionLayer); if( CheckError( result ) ) return; DumpGlobalRegion( NULL ); /* -------------------------------------------------------------------- */ /* Dump the attribute definitions. */ /* -------------------------------------------------------------------- */ if( featureType != Matrix && featureType != Image ) { int nSampleCounter = 0; result = cln_GetAttributesFormat( ClientID ); if( CheckError( result ) ) return; oaf = &(ECSRESULT(result).oaf); for( i = 0; i < (int) oaf->oa.oa_len; i++ ) { printf( "Field %d: %s ", i, oaf->oa.oa_val[i].name ); if( oaf->oa.oa_val[i].type == Char ) printf( " (Char)" ); else if( oaf->oa.oa_val[i].type == Varchar ) printf( " (Varchar)" ); else if( oaf->oa.oa_val[i].type == Longvarchar ) printf( " (Longvarchar)" ); else if( oaf->oa.oa_val[i].type == Decimal ) printf( " (Decimal)" ); else if( oaf->oa.oa_val[i].type == Numeric ) printf( " (Numeric)" ); else if( oaf->oa.oa_val[i].type == Smallint ) printf( " (Smallint)" ); else if( oaf->oa.oa_val[i].type == Integer ) printf( " (Integer)" ); else if( oaf->oa.oa_val[i].type == Real ) printf( " (Real)" ); else if( oaf->oa.oa_val[i].type == Float ) printf( " (Float)" ); else if( oaf->oa.oa_val[i].type == Double ) printf( " (Double)" ); else printf( " (unknown)" ); printf( " %d.%d", oaf->oa.oa_val[i].lenght, oaf->oa.oa_val[i].precision ); if( oaf->oa.oa_val[i].nullable ) printf( " nullable" ); printf( "\n" ); } /* -------------------------------------------------------------------- */ /* Process all shapes. */ /* -------------------------------------------------------------------- */ result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { if( ++nSampleCounter >= nSampleFrequency ) { DumpVectorObject( result, featureType ); nSampleCounter = 0; } nObjectCount++; result = cln_GetNextObject(ClientID); } } /* -------------------------------------------------------------------- */ /* Report on matrix information. */ /* -------------------------------------------------------------------- */ if( featureType == Matrix || featureType == Image ) { int i; int nSampleCounter = 0; int nDataType = 5; printf( "RasterInfo:\n" ); result = cln_GetRasterInfo( ClientID ); if( CheckError( result ) ) return; printf( "mincat = %ld\n", ECSRASTERINFO(result).mincat ); printf( "maxcat = %ld\n", ECSRASTERINFO(result).maxcat ); printf( "width = %d", ECSRASTERINFO(result).width ); if( featureType == Image ) { nDataType = ECSRASTERINFO(result).width; if( ECSRASTERINFO(result).width == 1 ) printf( " (RGB)" ); else if( ECSRASTERINFO(result).width == 2 ) printf( " (8U)" ); else if( ECSRASTERINFO(result).width == 3 ) printf( " (16U)" ); else if( ECSRASTERINFO(result).width == 4 ) printf( " (16S)" ); else if( ECSRASTERINFO(result).width == 5 ) printf( " (32S)" ); else printf( " (unknown data type)") ; } printf( "\nheight = %d\n", ECSRASTERINFO(result).height ); printf( "cat_len = %d\n", ECSRASTERINFO(result).cat.cat_len ); for( i = 0; i < (int) ECSRASTERINFO(result).cat.cat_len; i++ ) { printf( "%d: no=%ld, rgb=%d,%d,%d %s\n", i, ECSRASTERINFO(result).cat.cat_val[i].no_cat, ECSRASTERINFO(result).cat.cat_val[i].r, ECSRASTERINFO(result).cat.cat_val[i].g, ECSRASTERINFO(result).cat.cat_val[i].b, ECSRASTERINFO(result).cat.cat_val[i].label ); } /* -------------------------------------------------------------------- */ /* Process all lines. */ /* -------------------------------------------------------------------- */ result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { if( ++nSampleCounter >= nSampleFrequency ) { DumpRasterObject( result, featureType, nDataType ); nSampleCounter = 0; } nObjectCount++; result = cln_GetNextObject(ClientID); } } /* -------------------------------------------------------------------- */ /* Release the layer, and client and cleanup. */ /* -------------------------------------------------------------------- */ /* result = cln_ReleaseLayer(ClientID,&selectionLayer); */ printf( "Object Count = %d\n", nObjectCount ); } /************************************************************************/ /* Usage() */ /************************************************************************/ static void Usage() { printf( "Usage: ogdi_info [-no-dict] [-no-proj] -u url\n" " [-dict arg] [-cap] [-ext name [layer]]\n" " -l layername -f family [-r north south east west]\n" " [-dl] [-cs easting northing]\n" " [-id object_id] [-sf sample_frequency]\n" ); exit( 1 ); } /************************************************************************/ /* main() */ /************************************************************************/ int main( int argc, char ** argv ) { ecs_Family featureType = Point; char *layer = "label"; static ecs_Region reg; ecs_Region *region = NULL; ecs_Result *result; int i; if( argc == 1 ) Usage(); /* -------------------------------------------------------------------- */ /* Handle commandline arguments. */ /* -------------------------------------------------------------------- */ for( i = 1; i < argc; i++ ) { if( strcmp(argv[i],"-dl") == 0 ) { DumpLayer( "", region, layer, featureType ); } else if( strcmp(argv[i],"-dr") == 0 ) { DumpGlobalRegion( NULL ); } else if( strcmp(argv[i], "-no-proj") == 0 ) { bNoProj = TRUE; } else if( strcmp(argv[i], "-no-dict") == 0 ) { bNoDict = TRUE; } else if( strcmp(argv[i], "-cap") == 0 ) { DumpCapabilities(); } else if( i == argc - 1 ) { /* skip ... the rest require arguments. */ Usage(); } else if( strcmp(argv[i], "-dict") == 0 ) { DumpDict( argv[++i] ); } else if( strcmp(argv[i],"-u") == 0 ) { if( ClientID != -1 ) { result = cln_DestroyClient(ClientID); if( CheckError( result ) ) return( FALSE ); ecs_CleanUp( result ); ClientID = -1; } AccessURL( argv[++i], ® ); region = ® } else if( strcmp(argv[i], "-l") == 0 ) { layer = argv[++i]; } else if( strcmp(argv[i], "-sf") == 0 ) { nSampleFrequency = atoi(argv[++i]); } else if( strcmp(argv[i], "-f") == 0 ) { if( strcmp(argv[i+1],"Point") == 0 ) featureType = Point; else if( strcmp(argv[i+1],"Line") == 0 ) featureType = Line; else if( strcmp(argv[i+1],"Area") == 0 ) featureType = Area; else if( strcmp(argv[i+1],"Text") == 0 ) featureType = Text; else if( strcmp(argv[i+1],"Matrix") == 0 ) featureType = Matrix; else if( strcmp(argv[i+1],"Image") == 0 ) featureType = Image; else fprintf( stderr, "-f argument (%s) not recognised (case matters!)\n", argv[i] ); i++; } else if( strcmp(argv[i], "-r") == 0 && i < argc - 4 ) { region = ® reg.north = atof(argv[++i]); reg.south = atof(argv[++i]); reg.east = atof(argv[++i]); reg.west = atof(argv[++i]); } else if( strcmp(argv[i], "-cs") == 0 && i < argc - 2 ) { CoordSearch( layer, featureType, atof(argv[i+1]), atof(argv[i+2]) ); i += 2; } else if( strcmp(argv[i], "-id") == 0 && i < argc - 1 ) { IdSearch( layer, featureType, argv[i+1] ); i += 1; } else if( strcmp(argv[i], "-ext") == 0 && i < argc - 1 ) { const char *layer = NULL; printf( "Check Extension %s", argv[i+1] ); if( i < argc - 2 && argv[i+2][0] != '-' ) { layer = argv[i+2]; printf( " on layer %s", layer ); } if( cln_CheckExtension( ClientID, argv[i+1], layer ) ) printf( ": enabled\n" ); else printf( ": not enabled\n" ); if( layer != NULL ) i += 2; else i += 1; } else Usage(); } /* -------------------------------------------------------------------- */ /* Close old client if there is one active. */ /* -------------------------------------------------------------------- */ if( ClientID != -1 ) { result = cln_DestroyClient(ClientID); if( CheckError( result ) ) return( FALSE ); ecs_CleanUp( result ); ClientID = -1; } return 0; } ogdi-ogdi_4_1_0/include/000077500000000000000000000000001345660466700152465ustar00rootroot00000000000000ogdi-ogdi_4_1_0/include/Linux/000077500000000000000000000000001345660466700163455ustar00rootroot00000000000000ogdi-ogdi_4_1_0/include/Linux/ogdi_macro.h000066400000000000000000000027741345660466700206330ustar00rootroot00000000000000#include #include #include #include #define ogdi_IXDR_PUT_LONG(buf, v) { \ long ZF = ((long)IXDR_PUT_INT32(buf, (long)(v))); \ ZF = ZF; \ } #define ogdi_IXDR_PUT_U_LONG(buf, v) ogdi_IXDR_PUT_LONG(buf, (long)(v)) // Hook fread/fwrite/fgets/system. Check returns for errors and print tham verbose if any. #define ogdi_read(p,s,fp) { \ unsigned int ZF = read(p,s,fp); \ if (ZF == -1 ) \ printf("Error: read error\n"); \ } #define ogdi_fread(p,s,n,fp) { \ unsigned int ZF = fread(p,s,n,fp); \ if (ZF != (unsigned) (n)) \ printf("Error: fread found %d bytes, not %d at %d\n", ZF, (int)(n), (int) ftell(fp)); \ } #define ogdi_fwrite(p,s,n,fp) { \ unsigned int ZF = fwrite(p,s,n,fp); \ if (ZF != (unsigned) (n)) \ printf("Error: fwrite wrote %d bytes, not %d at %d\n", ZF, (int)(n), (int) ftell(fp)); \ } #define ogdi_fgets(p,n,fp) { \ void *ZF = fgets(p,n,fp); \ if (ZF == NULL) \ printf("Error: fgets seek error at %d byte\n", (int)(n)); \ } #define ogdi_system(fp) { \ int ZF = system(fp); \ if (WIFSIGNALED(ZF) && \ (WTERMSIG(ZF) == SIGINT || WTERMSIG(ZF) == SIGQUIT)) \ printf("Error: shell not found or command error.\n"); \ } ogdi-ogdi_4_1_0/lib/000077500000000000000000000000001345660466700143715ustar00rootroot00000000000000ogdi-ogdi_4_1_0/lib/.cvsignore000066400000000000000000000000161345660466700163660ustar00rootroot00000000000000linux solaris ogdi-ogdi_4_1_0/m4/000077500000000000000000000000001345660466700141435ustar00rootroot00000000000000ogdi-ogdi_4_1_0/m4/acinclude.m4000066400000000000000000000046301345660466700163370ustar00rootroot00000000000000AC_DEFUN([AC_COMPILER_WFLAGS], [ # Remove -g from compile flags, we will add via CFG variable if # we need it. CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-g //"` CFLAGS=`echo "$CFLAGS " | sed "s/-g //"` # check for GNU compiler, and use -Wall if test "$GCC" = "yes"; then C_WFLAGS="-Wall" AC_DEFINE([USE_GNUCC]) fi if test "$GXX" = "yes"; then CXX_WFLAGS="-Wall" AC_DEFINE([USE_GNUCC]) fi AC_SUBST([CXX_WFLAGS],$CXX_WFLAGS) AC_SUBST([C_WFLAGS],$C_WFLAGS) ]) AC_DEFUN([AC_COMPILER_PIC], [ echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -fPIC -c conftest.c 2>&1`"; then C_PIC=-fPIC else C_PIC= fi if test -z "`${CXX-g++} -fPIC -c conftest.c 2>&1`"; then CXX_PIC=-fPIC else CXX_PIC= fi rm -f conftest* AC_SUBST([CXX_PIC],$CXX_PIC) AC_SUBST([C_PIC],$C_PIC) ]) dnl dnl Try to find something to link shared libraries with. Use "c++ -shared" dnl in preference to "ld -shared" because it will link in required c++ dnl run time support for us. dnl AC_DEFUN([AC_LD_SHARED], [ echo 'void g(); int main(){ g(); return 0; }' > conftest1.c echo 'void g(); void g(){}' > conftest2.c ${CC} ${C_PIC} -c conftest2.c LD_SHARED="/bin/true" if test -z "`${CXX} -shared conftest2.o -o libconftest.so 2>&1`" ; then if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH" LD_LIBRARY_PATH="`pwd`" export LD_LIBRARY_PATH if test -z "`./conftest1 2>&1`" ; then echo "checking for ${CXX} -shared ... yes" LD_SHARED="${CXX} -shared" else echo "checking for ${CXX} -shared ... no(3)" fi LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD" else echo "checking for ${CXX} -shared ... no(2)" fi else echo "checking for ${CXX} -shared ... no(1)" fi if test "$LD_SHARED" = "/bin/true" \ -a -z "`ld -shared conftest2.o -o libconftest.so 2>&1`" ; then if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH" LD_LIBRARY_PATH="`pwd`" export LD_LIBRARY_PATH if test -z "`./conftest1 2>&1`" ; then echo "checking for ld -shared ... yes" LD_SHARED="ld -shared" fi LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD" fi fi if test "$LD_SHARED" = "/bin/true" ; then echo "checking for ld -shared ... no" fi rm -f conftest* libconftest* AC_SUBST([LD_SHARED],$LD_SHARED) ]) ogdi-ogdi_4_1_0/makefile000066400000000000000000000035001345660466700153210ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. EXTRA_INSTALL_TARGETS = mk_nonlocal_install_dirs ifneq ($(OVERRIDE_COMMON_MAK),no) ifeq ($(TARGET),win32) IGNORE := $(shell sed "s/@OGDI_MAJOR@/3/" < $(TOPDIR)/config/common.mak.in | sed "s/@OGDI_MINOR@/2/" > $(TOPDIR)/config/common.mak) endif endif include $(TOPDIR)/config/common.mak # # Sub-directories that need to be built # subdirs = external vpflib ogdi contrib # # Default target to build everything in all sub-directories # all: $(subdirs) # # Target to allow individual sub-directories to be built # (e.g. make cmpts) # .PHONY: $(subdirs) $(subdirs): mkinstalldirs cd $@; $(MAKE) # # Make the (local) installation directories # .PHONY: mkinstalldirs mkinstalldirs: @echo making install dirs using $(MKINSTALLDIR) $(MKINSTALLDIR) $(TOPDIR)/lib/$(TARGET)/static $(MKINSTALLDIR) $(TOPDIR)/bin/$(TARGET) # # Pass specialized targets into the sub-directories # .PHONY: $(STANDARD_TARGETS) $(STANDARD_TARGETS): @for i in $(subdirs); do \ $(MAKE) --directory $$i $@; \ done mk_nonlocal_install_dirs: $(MKINSTALLDIR) $(prefix) $(exec_prefix) $(INST_LIB) $(INST_BIN) $(INST_INCLUDE) ogdi-ogdi_4_1_0/mkbindist.sh000077500000000000000000000017541345660466700161550ustar00rootroot00000000000000#!/bin/sh if [ $# -lt 1 ] ; then echo "Usage: mkbindist.sh version" echo echo "Example: mkbindist.sh 1.1.5" exit fi VERSION=$1 PLATFORM=$TARGET # # Prepare tree. # DIST_DIR=ogdi-${PLATFORM}-bin.${VERSION} rm -rf $DIST_DIR mkdir $DIST_DIR mkdir $DIST_DIR/bin mkdir $DIST_DIR/include cp bin/$TARGET/* $DIST_DIR/bin cp bin/$TARGET/*.* $DIST_DIR/bin rm -f $DIST_DIR/bin/*.pdb rm -f $DIST_DIR/bin/core rm -f $DIST_DIR/bin/*_pure* cp ogdi/include/*.h $DIST_DIR/include sed -e "s/@PLATFORM@/${TARGET}/g" < README-BIN.TXT \ | sed -e "s/@VERSION@/${VERSION}/g" > $DIST_DIR/README-BIN.TXT if test "$TARGET" = "win32" ; then mkdir $DIST_DIR/lib cp lib/$TARGET/ogdi* $DIST_DIR/lib fi # # Make compressed distribution file. # if test "$TARGET" = "win32" ; then rm -f ${DIST_DIR}.zip zip -r ${DIST_DIR}.zip $DIST_DIR echo "Created: ${DIST_DIR}.zip" else rm -f ${DIST_DIR}.tar.gz tar cf ${DIST_DIR}.tar ${DIST_DIR} gzip -9 ${DIST_DIR}.tar echo "Created: ${DIST_DIR}.tar.gz" fi ogdi-ogdi_4_1_0/mkogdidist.sh000077500000000000000000000033571345660466700163300ustar00rootroot00000000000000#!/bin/sh # # Copyright (C) 2001 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # if [ $# -lt 1 ] ; then echo "Usage: mkogdidist version" echo echo "Example: mkogdidist 3.1alpha" exit fi OGDI_VERSION=$1 DIST_NAME=ogdi-$OGDI_VERSION rm -rf dist_wrk mkdir dist_wrk cd dist_wrk git clone https://github.com/libogdi/ogdi devdir if [ \! -d devdir ] ; then echo "git clone reported an error ... abandoning mkogdidist" exit fi # remove junks find devdir -name .git -exec rm -rf {} \; # fix wrongly encoded files from tarball set +x for f in `find . -type f` ; do if file $f | grep -q ISO-8859 ; then set -x iconv -f ISO-8859-1 -t UTF-8 $f > ${f}.tmp && \ mv -f ${f}.tmp $f set +x fi if file $f | grep -q CRLF ; then set -x sed -i -e 's|\r||g' $f set +x fi done set -x mv devdir $DIST_NAME echo "${OGDI_VERSION}: `date`" > $DIST_NAME/VERSION rm -f ../${DIST_NAME}.tar.gz ../${DIST_NAME}.zip tar cf ../${DIST_NAME}.tar ${DIST_NAME} gzip -9 ../${DIST_NAME}.tar zip -r ../${DIST_NAME}.zip ${DIST_NAME} cd .. rm -rf dist_wrk ogdi-ogdi_4_1_0/ogdi-config.in000066400000000000000000000042371345660466700163460ustar00rootroot00000000000000#! /bin/sh # ogdi-config # provides configuration info for ogdi library. # Copyright (C) 2007 Balint Cristian # This file is released under the terms of GPL v2 license. # version="@OGDI_VERSION@" prefix="@prefix@" exec_prefix="@exec_prefix@" libdir="@libdir@" includedir="@includedir@/ogdi" libs="-logdi" all_libs="-logdi -lexpat -lz @RPC_LIBS@" I_opts="-I${includedir} @RPC_CFLAGS@" L_opts="" R_opts="" cppflags="" ccopts="" ldopts="" usage() { cat <attribute_priv and set attributes in it to NULL. 2. If odbc_count equal 0, the call SQLAllocEnv and set the odbcEnv 3. Increment odbc_count and set l->attribute_priv.isLinked to FALSE. 4. Call SQLAllocConnect to initialize the link between SQL and this application. If an error occur, call dyn_DeinitializeDBLink and return an error code 5. Call SQLConnect to connect to the ODBC with the attributes initialisation in l->AttributeDriverLinkPtr. Set l->AttributeDriverHandle with it. If an error occur, call dyn_DeinitializeDBLink and return an error code 6. Call SQLAllocStmt to prepare the memory of l->attribute_priv.odbcSQLInfo. If an error occur, call dyn_DeinitializeDBLink and return an error code 7. Call SQLPrepare to prepare the SQL request execution with the information in l->AttributeDriverLinkPtr.SelectionRequest. If an error occur, call dyn_DeinitializeDBLink and return an error code 8. Get the quantity of attribute columns in the selection with SQLColAttributes and set l->attribute_priv.nb_field. 9. Set l->attribute_priv.isLinked to TRUE and return a success message. ******************************************************************** */ int dyn_InitializeDBLink(s,l,error) ecs_Server *s; ecs_Layer *l; char **error; { char buffer[512]; unsigned char sqlmessage[SQL_MAX_MESSAGE_LENGTH]; unsigned char sqlstate[32]; SQLINTEGER truc; short length; PrivateODBCInfo *apriv; char **temp=NULL; l->attribute_priv = (void *) malloc(sizeof(PrivateODBCInfo)); apriv = (PrivateODBCInfo *) l->attribute_priv; if (l->attribute_priv == NULL) { *error = odbcerrorlist[0]; return 1; } apriv->nb_field = 0; apriv->isSelected = FALSE; apriv->attributes = NULL; if (odbc_count == 0) { if (SQLAllocEnv(&odbcEnv) != SQL_SUCCESS) { SQLError(odbcEnv, SQL_NULL_HDBC, SQL_NULL_HSTMT, sqlstate, &truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &length); *error = (char *)sqlmessage; dyn_DeinitializeDBLink(s,l,temp); return 1; } } odbc_count++; apriv->isLinked = FALSE; l->AttributeDriverHandle = (void *) &(apriv->odbcHandle); if (SQLAllocConnect(odbcEnv,&(apriv->odbcHandle)) != SQL_SUCCESS) { SQLError(odbcEnv, SQL_NULL_HDBC, SQL_NULL_HSTMT, sqlstate, &truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &length); *error = (char *)sqlmessage; dyn_DeinitializeDBLink(s,l,temp); return 1; } if (SQLConnect((SQLHDBC) apriv->odbcHandle, (SQLCHAR *) l->AttributeDriverLinkPtr->InformationSource, (SQLSMALLINT) SQL_NTS, (SQLCHAR *) l->AttributeDriverLinkPtr->UserDescription, (SQLSMALLINT) SQL_NTS, (SQLCHAR *) l->AttributeDriverLinkPtr->AutorizationDescription, (SQLSMALLINT) SQL_NTS) != SQL_SUCCESS) { SQLError(odbcEnv, apriv->odbcHandle, SQL_NULL_HSTMT, sqlstate, &truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &length); *error = (char *)sqlmessage; dyn_DeinitializeDBLink(s,l,temp); return 1; } if (SQLAllocStmt(apriv->odbcHandle,&(apriv->odbcSqlInfo)) != SQL_SUCCESS) { SQLError(odbcEnv, apriv->odbcHandle, SQL_NULL_HSTMT, sqlstate, &truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &length); *error = (char *)sqlmessage; dyn_DeinitializeDBLink(s,l,temp); return 1; } if (SQLPrepare(apriv->odbcSqlInfo,(unsigned char *)(l->AttrRequest),SQL_NTS) != SQL_SUCCESS) { SQLError(odbcEnv, apriv->odbcHandle, SQL_NULL_HSTMT, sqlstate, &truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &length); *error = (char *)sqlmessage; dyn_DeinitializeDBLink(s,l,temp); return 1; } SQLColAttributes(apriv->odbcSqlInfo,0,SQL_COLUMN_COUNT, buffer,255,&length,(SQLINTEGER *)&(apriv->nb_field)); apriv->isLinked = TRUE; return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_DeinitializeDBLink DESCRIPTION Deinitialize the database link END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. If the selection is link (l->attribute_priv.isLinked). Begin 1.1. Call SQLFreeStmt 1.2. Call SQLDisconnect 1.3. Call SQLFreeConnect End 2. Decrement odbc_count 3. If the odbc_count is to 0, call SQLFreeEnv ******************************************************************** */ int dyn_DeinitializeDBLink(s,l,error) ecs_Server *s; ecs_Layer *l; char **error; { PrivateODBCInfo *apriv; apriv = (PrivateODBCInfo *) l->attribute_priv; if (apriv->isLinked == TRUE) { SQLFreeStmt(apriv->odbcSqlInfo,SQL_DROP); SQLDisconnect(apriv->odbcHandle); SQLFreeConnect(apriv->odbcHandle); } if (apriv != NULL) free(apriv); l->attribute_priv = NULL; l->AttributeDriverHandle = NULL; odbc_count--; if (odbc_count <= 0) { SQLFreeEnv(odbcEnv); } return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetColumnsInfo DESCRIPTION Get the column information from the selection string END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT int *columns_qty: Quantity of columns defined in attr ecs_ObjAttribute **attr: A list of attribute information char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Initialize a table of l->attribute_priv.nb_field elements ecs_ObjAttribute in attr. 2. For each field i Begin 2.1. Call SQLColAttributes to retreive the name of the attribute and set it in attr[i].name. 2.1. Call SQLColAttributes to retreive the type of the attribute and set it in attr[i].type. 2.1. Call SQLColAttributes to retreive the lenght of the attribute and set it in attr[i].lenght. 2.1. Call SQLColAttributes to retreive the precision of the attribute and set it in attr[i].precision. 2.1. Call SQLColAttributes to retreive the nullable of the attribute and set it in attr[i].nullable. End 3. Set columns_qty with l->attribute_priv.nb_field 4. Return a success ******************************************************************** */ int dyn_GetColumnsInfo(s,l,columns_qty,attr,error) ecs_Server *s; ecs_Layer *l; int *columns_qty; ecs_ObjAttribute **attr; char **error; { int i,j; PrivateODBCInfo *apriv = (PrivateODBCInfo *) l->attribute_priv; int buffer[514]; SDWORD count; char name[33]; SWORD length; int precision; int type; int nullable; int readlength; *attr = malloc(sizeof(ecs_ObjAttribute) * apriv->nb_field); if (*attr == NULL) { *error = odbcerrorlist[0]; return 1; } for(i=0;inb_field;++i) { SQLColAttributes((SQLHSTMT) apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_NAME, name,32,&length,&count); SQLColAttributes((SQLHSTMT) apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_TYPE, buffer,513,&length,(SQLINTEGER *)&(type)); SQLColAttributes((SQLHSTMT) apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_LENGTH, buffer,513,&length,(SQLINTEGER *)&(readlength)); SQLColAttributes((SQLHSTMT) apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_PRECISION, buffer,513,&length,(SQLINTEGER *)&(precision)); SQLColAttributes((SQLHSTMT) apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_NULLABLE, buffer,513,&length,(SQLINTEGER *)&(nullable)); (*attr)[i].name = malloc(strlen(name)+1); if ((*attr)[i].name == NULL) { for(j=0;jnb_field; return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_SelectAttributes DESCRIPTION Select the attributes defined in the selection request with the attributes set in the arguments. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes int attribute_qty: The lenght of the attribute list char **attribute_list: List of attributes to be bind with the selection request OUTPUT char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. For each attribute in attribute_list Begin 1.1. Call SQLBindParameter with this attribute. If an error occur, return an error message End 2. Call SQLExecute, if an error occur, return an error message 3. Call SQLFetch. If the result is a success, set l->attribute_priv.isSelected to true. If the return code is SQL_NO_DATA_FOUND, set it to false. Else, return an error message. 4. Free the old l->attribute_priv.attribute if it's different than NULL. Set the l->attribute_priv.attributes to NULL 5. If l->attribute_priv.isSelected is true Begin 5.1. For each field i Begin Call SQLGetData for this field and concatenate the result to l->attribute_priv.attributes End End 6. Return 0 ******************************************************************** */ int dyn_SelectAttributes(s,l,attribute_qty,attribute_list,error) ecs_Server *s; ecs_Layer *l; int attribute_qty; char **attribute_list; char **error; { int i; PrivateODBCInfo *apriv = (PrivateODBCInfo *) l->attribute_priv; char theKey[128]; char buffer[1024],buffer2[256]; unsigned char sqlmessage[SQL_MAX_MESSAGE_LENGTH]; unsigned char sqlstate[32]; int truc; SDWORD length; short collength; RETCODE retcode; short count; int type; for(i=0;iodbcSqlInfo, (SQLUSMALLINT) (i+1), SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 127, 0, (SQLPOINTER) theKey, (SQLINTEGER) 0, (SQLINTEGER *) &length) != SQL_SUCCESS) { SQLError(odbcEnv, apriv->odbcHandle, apriv->odbcSqlInfo, sqlstate, (SQLINTEGER *)&truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &count); *error = (char *)sqlmessage; return 1; } } if (SQLExecute(apriv->odbcSqlInfo) != SQL_SUCCESS) { SQLError(odbcEnv, apriv->odbcHandle, apriv->odbcSqlInfo, sqlstate, (SQLINTEGER *)&truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &count); *error = (char *)sqlmessage; SQLFreeStmt(apriv->odbcSqlInfo,SQL_CLOSE); return 1; } /* 3. Call SQLFetch. If the result is a success, set l->attribute_priv.isSelected to true. If the return code is SQL_NO_DATA_FOUND, set it to false. Else, return an error message. */ retcode = SQLFetch(apriv->odbcSqlInfo); if ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) { apriv->isSelected = TRUE; } else { if (retcode == SQL_NO_DATA_FOUND) { apriv->isSelected = FALSE; } else { SQLError(odbcEnv, apriv->odbcHandle, apriv->odbcSqlInfo, sqlstate, (SQLINTEGER *)&truc, sqlmessage, SQL_MAX_MESSAGE_LENGTH - 1, &count); SQLFreeStmt(apriv->odbcSqlInfo,SQL_CLOSE); return 1; } } /* 4. Free the old l->attribute_priv.attribute if it's different than NULL. Set the l->attribute_priv.attributes to NULL */ if (apriv->attributes != NULL) free(apriv->attributes); apriv->attributes = NULL; strcpy(buffer,""); if (apriv->isSelected == TRUE) { for(i = 0; i < apriv->nb_field; ++i) { SQLGetData(apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1), SQL_C_CHAR, buffer2, 255, &length); SQLColAttributes(apriv->odbcSqlInfo,(SQLUSMALLINT) (i+1),SQL_COLUMN_TYPE, buffer,32,&collength,(SQLINTEGER *)&(type)); if ((type < 2) || (type > 8)) { sprintf(&(buffer[strlen(buffer)]),"{%s} ",buffer2); } else { sprintf(&(buffer[strlen(buffer)]),"%s ",buffer2); } } apriv->attributes = malloc(strlen(buffer)+1); if (apriv->attributes == NULL) { SQLFreeStmt(apriv->odbcSqlInfo,SQL_CLOSE); *error = odbcerrorlist[0]; return 1; } strcpy(apriv->attributes,buffer); } SQLFreeStmt(apriv->odbcSqlInfo,SQL_CLOSE); return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_IsSelected DESCRIPTION This method indicate to the ogdi if the function is inside the selection request execute in SelectAttributes END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT short *isSelected: Indication if the current object char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Return l->attribute_priv.isSelected ******************************************************************** */ int dyn_IsSelected(s,l,isSelected,error) ecs_Server *s; ecs_Layer *l; short *isSelected; char **error; { PrivateODBCInfo *apriv = (PrivateODBCInfo *) l->attribute_priv; *isSelected = apriv->isSelected; return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetSelectedAttributes DESCRIPTION Get the record in the table selected previously with dyn_SelectAttributes END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT char **attributes: A string with all the attributes char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Return l->attribute_priv.attributes ******************************************************************** */ int dyn_GetSelectedAttributes(s,l,attributes,error) ecs_Server *s; ecs_Layer *l; char **attributes; char **error; { PrivateODBCInfo *apriv = (PrivateODBCInfo *) l->attribute_priv; *attributes = apriv->attributes; return 0; } ogdi-ogdi_4_1_0/ogdi/attr_driver/odbc/odbc.h000066400000000000000000000035401345660466700210630ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME odbc.h DESCRIPTION Header file of the odbc attribute driver END_DESCRIPTION END_CSOURCE_INFORMATION Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #ifndef ODBCDRIVER #define ODBCDRIVER #include "ecs.h" #include "sql.h" #include "sqlext.h" /********************************************************************* STRUCTURE_INFORMATION NAME PrivateODBCInfo DESCRIPTION The private information of this attribute driver. END_DESCRIPTION ATTRIBUTES HSTMT odbcSqlInfo: SQL request handler int nb_field: Field quantity in the odbcSqlInfo structure int isLinked: Indicate if a link with odbc is active int isSelected: Indicate if the current request get something in it char *attributes: The attribute list. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { SQLHDBC odbcHandle; SQLHSTMT odbcSqlInfo; int nb_field; int isLinked; int isSelected; char *attributes; } PrivateODBCInfo; #endif ogdi-ogdi_4_1_0/ogdi/c-api/000077500000000000000000000000001345660466700155365ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/c-api/.cvsignore000066400000000000000000000000061345660466700175320ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/c-api/client.c000066400000000000000000002170011345660466700171610ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Control dispatch of locals client. Also control cache management * and projection changes. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.17 2016-06-28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.16 2008/05/28 01:34:30 cbalint * * Convert this file to UTF-8 * * Revision 1.15 2007/02/19 19:31:33 cbalint * Reimplement Matrix algebra under an opensource compatible license. * Modified Files: * LICENSE ogdi/c-api/client.c ogdi/c-api/makefile * Added Files: * ogdi/c-api/matrix.c ogdi/c-api/matrix.h * * Revision 1.14 2007/02/12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.13 2004/02/19 06:20:09 warmerda * ecs_CleanUp() cln_dummy_result in ecs_DestroyServer() * * Revision 1.12 2003/08/27 05:26:36 warmerda * Call ecs_SplitURL(NULL) in cln_DestroyClient() to free static resources. * This makes use of memory checkers easier even though this wasn't a *real* * memory leak. * * Revision 1.11 2001/10/01 19:51:13 warmerda * fixed bug in cln_CalcCtlPoints() with 1 pixel regions * * Revision 1.10 2001/08/16 15:34:23 warmerda * fixed roundoff bug with width/height in cln_ConvRegion * * Revision 1.9 2001/05/04 17:59:37 warmerda * clear autoCache in cln_SelectRegion * * Revision 1.8 2001/04/12 18:14:16 warmerda * added/finished capabilities support * * Revision 1.7 2001/04/12 05:31:23 warmerda * added init/free support for capabilities fields in ecs_Client * * Revision 1.6 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" #include "matrix.h" #include ECS_CVSID("$Id$"); /* Definitions specific to c_interface */ static int multiblock = 0; ecs_Result cln_dummy_result; ecs_Client *soc[MAXCLIENT] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; char *cln_messages[] = { "success", "no more memory", "client not found", "unable to set the client projection", "unable to set the server projection", "maximum number of clients reached", "cache not found", "ecs_Result do not contain an object", "unable to change the projection of this point", "unable to split this projection", "unable to convert the actual region", "unable to convert the global region", "Invalid layer type for a cache", "Invalid region returned by the server", "unable to execute the command, the OGDI is blocked" }; char cln_empty_string[1] = ""; /* *---------------------------------------------------------------------- * * cln_FreeClient: Free the client structure * * IN * ecs_Client *cln: Client to be freed * * MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 * Description: Free the cahche using the cln_FreeCache() function * instead of freeing only the cache autocache pointer * that causes memory leaks. * Addition of NULL pointer assignment after the free. * *---------------------------------------------------------------------- */ void cln_FreeClient(cln) ecs_Client **cln; { if ((*cln) != NULL) { if ((*cln)->url != NULL) { free((*cln)->url); (*cln)->url = NULL; } if ((*cln)->cache != NULL) { cln_FreeCache((*cln)->cache); (*cln)->cache = NULL; } if ((*cln)->autoCache != NULL) { cln_FreeCache((*cln)->autoCache); (*cln)->autoCache = NULL; } if ((*cln)->tclprocname != NULL) { free((*cln)->tclprocname); (*cln)->tclprocname = NULL; } if ((*cln)->mask != NULL) { if ((*cln)->mask->c.c_val != NULL) { free((*cln)->mask->c.c_val); (*cln)->mask->c.c_val = NULL; } free((*cln)->mask); (*cln)->mask = NULL; } if( (*cln)->global_extensions != NULL ) { int i; for( i = 0; (*cln)->global_extensions[i] != NULL; i++ ) free( (*cln)->global_extensions[i] ); free( (*cln)->global_extensions ); (*cln)->global_extensions = NULL; } if( (*cln)->layer_cap_count > 0 ) { int lindex; for( lindex = 0; lindex < (*cln)->layer_cap_count; lindex++ ) { ecs_LayerCapabilities *layer; int i; layer = (*cln)->layer_cap[lindex]; if( layer->name != NULL ) free( layer->name ); if( layer->title != NULL ) free( layer->title ); if( layer->srs != NULL ) free( layer->srs ); for( i = 0; layer->parents != NULL && layer->parents[i] != NULL; i++ ) { free( layer->parents[i] ); } if( layer->parents != NULL ) free( layer->parents ); for( i = 0; layer->extensions != NULL && layer->extensions[i] != NULL; i++ ) { free( layer->extensions[i] ); } if( layer->extensions != NULL ) free( layer->extensions ); if( layer->qe_prefix != NULL ) free( layer->qe_prefix ); if( layer->qe_suffix != NULL ) free( layer->qe_suffix ); if( layer->qe_format != NULL ) free( layer->qe_format ); if( layer->qe_description != NULL ) free( layer->qe_description ); free( layer ); } free( (*cln)->layer_cap ); (*cln)->layer_cap = NULL; (*cln)->layer_cap_count = 0; } free((*cln)); (*cln) = NULL; } } /* *---------------------------------------------------------------------- * * cln_AllocClient: Add a client in the table * * IN * URL: Url of the client * OUT * error_code: pointer to an error code. This code is the position * in the cln_messages. * * Results: * int: ClientID to the new client. * If negative, an error occur in the operation. * *---------------------------------------------------------------------- */ int cln_AllocClient(URL, error_code) char *URL; int *error_code; { ecs_Client *cln; int i,ClientID; *error_code = 0; /* * Found the new client position. */ ClientID = -1; for(i=0;iurl = (char *) malloc(strlen(URL)+1); if (cln->url != NULL) strcpy(cln->url,URL); cln->cache = NULL; cln->autoCache = NULL; cln->selectCache = NULL; cln->tclprocname = NULL; cln->currentSelectionFamily = 0; cln->isCurrentRegionSet = FALSE; cln->targetdatum = nodatum; cln->sourcedatum = nodatum; strcpy(cln->datumtable,""); cln->mask = NULL; strcpy( cln->server_version_str, "4.0" ); cln->server_version = 4000; } if ((cln == NULL) || (cln->url == NULL)) { cln_FreeClient(&(cln)); /* no memory space left, return a error message */ *error_code = 1; return -1; } soc[ClientID] = cln; return ClientID; } /* *---------------------------------------------------------------------- * * cln_BroadCloseLayers: For each URL, call the svr_CloseLayer command. * *---------------------------------------------------------------------- */ void cln_BroadCloseLayers() { int i; for(i=0;is)); } } } /* *---------------------------------------------------------------------- * Client creation. Will register this new client into * a global structure (soc). * * IN * URL: This string is used to create a new server * * OUT * ecs_Result: Operation result * ReturnedID: ClientID of the new client * *---------------------------------------------------------------------- */ ecs_Result *cln_CreateClient(ReturnedID,URL) int *ReturnedID; char *URL; { ecs_Client *cln; int i; ecs_Result *res; int error_code; if (multiblock != 0) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[14]); return res; } /* * Check actual clients is there is a client with the same URL. * If it's the case, return this ClientID. */ if ((i = cln_GetClientIdFromURL(URL)) >= 0) { *ReturnedID = i; ecs_SetSuccess(&cln_dummy_result); return &cln_dummy_result; } if (((*ReturnedID) = cln_AllocClient(URL,&error_code)) < 0) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[error_code]); } else { cln = soc[*ReturnedID]; /* * Call the server creation. If an error occur, destroy * the client. */ res = svr_CreateServer(&(cln->s),URL,1); if (res->error == 1) { cln_FreeClient(&cln); soc[*ReturnedID] = NULL; *ReturnedID = -1; } } return res; } /* *---------------------------------------------------------------------- * Client destruction. Will destroy the client and free * is location into soc. * * IN * ClientID: Id of the client in soc * * OUT * ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_DestroyClient(ClientID) int ClientID; { ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } msg = svr_DestroyServer(&(cln->s)); cln_FreeClient(&cln); soc[ClientID] = NULL; /* free regex resources for spliturl */ ecs_SplitURL( NULL, NULL, NULL, NULL ); ecs_CleanUp( &cln_dummy_result ); return msg; } /* *---------------------------------------------------------------------- * cln_SelectLayer: Select a layer of object in the database. * If the layer is present in a local cache, the selection * will be there. * * IN * int ClientID: Id of the client in soc * ecs_LayerSelection *ls: Layer information structure * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_SelectLayer(ClientID, ls) int ClientID; ecs_LayerSelection *ls; { ecs_Cache *CachePtr; register ecs_Client *cln; ecs_Result *res; char *error_message; ecs_CtlPoints *cpts; ecs_Region region; int regionset = FALSE; if (multiblock != 0) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[14]); return res; } cln = soc[ClientID]; if (cln == NULL) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[2]); return res; } /* * Found the cache related to this request */ CachePtr = cln_FoundCache(ClientID, ls); if (CachePtr != NULL) { cln->selectCache = CachePtr; res = &cln_dummy_result; CachePtr->currentpos = 0; ecs_SetSuccess(res); } else { cln->selectCache = NULL; res = svr_SelectLayer(&(cln->s),ls); cln->currentSelectionFamily = ls->F; if (res->error == 0 && res->res.type == GeoRegion) { region.north = res->res.ecs_ResultUnion_u.gr.north; region.south = res->res.ecs_ResultUnion_u.gr.south; region.east = res->res.ecs_ResultUnion_u.gr.east; region.west = res->res.ecs_ResultUnion_u.gr.west; region.ns_res = res->res.ecs_ResultUnion_u.gr.ns_res; region.ew_res = res->res.ecs_ResultUnion_u.gr.ew_res; regionset = TRUE; } } if ((res->error == 0) && ((cln->currentSelectionFamily == Matrix) || (cln->currentSelectionFamily == Image))) { cpts = NULL; if (!cln_SetRasterConversion(ClientID,&cpts,nn,projective,&error_message)) { res = &cln_dummy_result; ecs_SetError(res,1,error_message); return res; } } if (cln->autoCache != NULL) { cln_FreeCache(cln->autoCache); cln->autoCache = NULL; } if (regionset == TRUE) { if (region.north != region.south && region.west != region.east && region.ew_res != 0.0 && region.ns_res != 0.0) { } else { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[13]); return res; } ecs_SetGeoRegion(res,region.north, region.south, region.east, region.west, region.ns_res, region.ew_res); ecs_SetSuccess(res); } return res; } /* *---------------------------------------------------------------------- * cln_ReleaseLayer: Release a layer of object in the database. * If the layer is actually in this local cache, this selection will be * unset. * * IN * int ClientID: Id of the client in soc * ecs_LayerSelection *ls: Layer information structure * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_ReleaseLayer(ClientID, ls) int ClientID; ecs_LayerSelection *ls; { register ecs_Client *cln; ecs_Result *res; if (multiblock != 0) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[14]); return res; } cln = soc[ClientID]; if (cln == NULL) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[2]); return res; } /* * check is the actual cache is this request */ if ((cln->selectCache != NULL) && (cln->selectCache->coverage.Select != NULL) && (strcmp(cln->selectCache->coverage.Select,ls->Select) == 0) && (cln->selectCache->coverage.F == ls->F)) { cln->selectCache = NULL; } if (cln->autoCache != NULL) { cln_FreeCache(cln->autoCache); cln->autoCache = NULL; } res = svr_ReleaseLayer(&(cln->s),ls); return res; } /* *---------------------------------------------------------------------- * * cln_SelectRegion: Select the geographic region on the server. * * IN * int ClientID: Client identifier * ecs_Region *gr: Geographic region * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_SelectRegion(ClientID, gr) int ClientID; ecs_Region *gr; { ecs_Result *msg; register ecs_Client *cln; char *error_message; ecs_CtlPoints *cpts; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } cln->currentRegion.north = gr->north; cln->currentRegion.south = gr->south; cln->currentRegion.east = gr->east; cln->currentRegion.west = gr->west; cln->currentRegion.ns_res = gr->ns_res; cln->currentRegion.ew_res = gr->ew_res; cln->isCurrentRegionSet = TRUE; msg = svr_SelectRegion(&(cln->s),gr); if (cln->autoCache != NULL) { cln_FreeCache(cln->autoCache); cln->autoCache = NULL; } if ((msg->error == 0) && ((cln->currentSelectionFamily == Matrix) || (cln->currentSelectionFamily == Image))) { cpts = NULL; if (!cln_SetRasterConversion(ClientID,&cpts,nn,projective,&error_message)) { msg = &cln_dummy_result; ecs_SetError(msg,1,error_message); return msg; } } return msg; } /* *---------------------------------------------------------------------- * * cln_SelectMask -- * * Set a polygon mask for object retreival. * * PARAMETERS * INPUT * int ClientID: Client's identifier * ecs_FeatureRing *mask: The mask itself * int isInclusive: A boolean that indicate if the selected objects will be completely inside (TRUE) or only partially inside (FALSE) the polygon * * RETURN_VALUE * ecs_Result *: A structure with the result information * * PSEUDO_CODE * * 1. Set the attributes in ecs_Client with the polygon and the flag * set in the parameters of the function. * * 2. Return a success message * *---------------------------------------------------------------------- */ ecs_Result *cln_SelectMask(ClientID, mask, isInclusive) int ClientID; ecs_FeatureRing *mask; int isInclusive; { ecs_Result *msg; register ecs_Client *cln; int i; (void) isInclusive; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } if (cln->mask != NULL) { if (cln->mask->c.c_val != NULL) free(cln->mask->c.c_val); free(cln->mask); cln->mask = NULL; } cln->mask = (ecs_FeatureRing *) malloc(sizeof(ecs_FeatureRing)); if (cln->mask == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[1]); return msg; } cln->mask->centroid.x = mask->centroid.x; cln->mask->centroid.y = mask->centroid.y; cln->mask->c.c_len = mask->c.c_len; cln->mask->c.c_val = (ecs_Coordinate *) malloc(sizeof(ecs_Coordinate)*mask->c.c_len); if (cln->mask->c.c_val == NULL) { free(cln->mask); cln->mask = NULL; msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[1]); return msg; } cln->maskregion.west = cln->maskregion.east = mask->c.c_val[0].x; cln->maskregion.north = cln->maskregion.south = mask->c.c_val[0].y; for (i=0;i<(int) mask->c.c_len;i++) { cln->mask->c.c_val[i].x = mask->c.c_val[i].x; cln->mask->c.c_val[i].y = mask->c.c_val[i].y; if (cln->maskregion.west > mask->c.c_val[i].x) cln->maskregion.west = mask->c.c_val[i].x; if (cln->maskregion.east < mask->c.c_val[i].x) cln->maskregion.east = mask->c.c_val[i].x; if (cln->maskregion.south > mask->c.c_val[i].y) cln->maskregion.south = mask->c.c_val[i].y; if (cln->maskregion.north < mask->c.c_val[i].y) cln->maskregion.north = mask->c.c_val[i].y; } msg = &cln_dummy_result; ecs_SetText(msg,""); ecs_SetSuccess(msg); return msg; } /* *---------------------------------------------------------------------- * * cln_UnSelectMask -- * * Unselect a previously selected mask * * PARAMETERS * INPUT * int ClientID: Client's identifier * * RETURN_VALUE * ecs_Result *: A structure with the result information * * PSEUDO_CODE * * 1. Free the memory of the mask in ecs_Client * *---------------------------------------------------------------------- */ ecs_Result *cln_UnSelectMask(ClientID) int ClientID; { ecs_Result *msg; register ecs_Client *cln; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } if (cln->mask != NULL) { if (cln->mask->c.c_val != NULL) free(cln->mask->c.c_val); free(cln->mask); cln->mask = NULL; } msg = &cln_dummy_result; ecs_SetText(msg,""); ecs_SetSuccess(msg); return msg; } /* *---------------------------------------------------------------------- * * cln_GetDictionary: Get the dictionary from the server * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetDictionary(ClientID) int ClientID; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_GetDictionary(&(cln->s)); return msg; } /* *---------------------------------------------------------------------- * * cln_GetAttributesFormat: Get the attribute format of a given layer * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetAttributesFormat(ClientID) int ClientID; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_GetAttributesFormat(&(cln->s)); return msg; } /* *---------------------------------------------------------------------- * * cln_GetNextObject: Get the next selected object in the server. * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetNextObject(ClientID) int ClientID; { ecs_Result *msg, *obj, *temp; register ecs_Client *cln; int code; int pos; ecs_Cache *cache; int n; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } /* * Extract the object */ if (cln->selectCache) { cache = cln->selectCache; } else if (cln->autoCache) { cache = cln->autoCache; } else { cache = NULL; } msg = NULL; if (cache) { pos = cache->currentpos - cache->startpos; if (pos >= 0 && pos < cache->size) { msg = cache->o[pos]; while (!(cln_IsGeoObjectInsideMask(ClientID,msg)) && !(msg->error)) { cache->currentpos++; pos = cache->currentpos - cache->startpos; if (pos >= 0 && pos < cache->size-1) { msg = cache->o[pos]; } else { msg = &cln_dummy_result; ecs_SetSuccess(msg); break; } } cache->currentpos++; if (msg->error) { ecs_SetError(&cln_dummy_result,msg->error,msg->message); msg = &cln_dummy_result; cln_FreeCache(cln->autoCache); cln->autoCache = NULL; return msg; } } else if (cln->selectCache) { /* Not allowed outside the bounds of the cache with explicit caches */ msg = &cln_dummy_result; ecs_SetError(msg,2,"End of selection in cache"); return msg; } else { cln_FreeCache(cln->autoCache); cln->autoCache = NULL; } } if (msg == NULL) { msg = svr_GetNextObject(&(cln->s)); /* * Apply the filter of the mask if not MultiResult */ while ((msg->res.type != MultiResult) && !(msg->error) && !(cln_IsGeoObjectInsideMask(ClientID,msg))) { msg = svr_GetNextObject(&(cln->s)); } /* * If the result contains multiple pieces, we need to break * the response into separate result pieces. */ if (msg->res.type == MultiResult) { n = msg->res.ecs_ResultUnion_u.results.results_len; if (msg->error) { n++; } cache = cln_NewCache(n); if(cache == NULL) { msg = &cln_dummy_result; ecs_SetError(msg, 1, cln_messages[1]); return msg; } for (n = 0; n < (int) msg->res.ecs_ResultUnion_u.results.results_len; n++) { code = ecs_CopyResultFromUnion(&msg->res.ecs_ResultUnion_u.results.results_val[n],&obj); if (code == FALSE) { cln_FreeCache(cache); msg = &cln_dummy_result; ecs_SetError(msg, 1, cln_messages[1]); return msg; } cache->o[cache->size++] = obj; } if (msg->error) { obj = malloc(sizeof(ecs_Result)); obj->message = NULL; ecs_SetError(obj,msg->error,msg->message); cache->o[cache->size++] = obj; } cln->autoCache = cache; temp = cln_GetNextObject(ClientID); return temp; } } return msg; } /* ---------------------------------------------------------------------- cln_IsGeoObjectInsideMask Indicate if the object is inside the mask. If the object is not valid or the mask don't exist, return a success message (the program will handle the error but we must give him the chance to do it). Only vector is handle by this function, but it could be modified in the future to clip rasters. PARAMETERS INPUT int ClientID: Client's identifier ecs_Result *obj: The geographic object RETURN_VALUE int : The boolean indication if the object is outside or inside the mask PSEUDO_CODE ---------------------------------------------------------------------- */ int cln_IsGeoObjectInsideMask(ClientID, obj) int ClientID; ecs_Result *obj; { register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) return TRUE; if (obj->res.type != Object) return TRUE; if (obj->res.ecs_ResultUnion_u.dob.geom.family != Line && obj->res.ecs_ResultUnion_u.dob.geom.family != Area && obj->res.ecs_ResultUnion_u.dob.geom.family != Point && obj->res.ecs_ResultUnion_u.dob.geom.family != Text) return TRUE; /* If the mask don't exist, the object is always valid */ if (cln->mask == NULL) return TRUE; /* Check the bounding box of the object, if it's outside the extent of the mask, always return FALSE */ if (!((cln->maskregion.north > obj->res.ecs_ResultUnion_u.dob.ymin) && (cln->maskregion.south < obj->res.ecs_ResultUnion_u.dob.ymax) && (cln->maskregion.east > obj->res.ecs_ResultUnion_u.dob.xmin) && (cln->maskregion.west < obj->res.ecs_ResultUnion_u.dob.xmax))) { return FALSE; } /* Knowing the object is inside the extent of the mask is not enough. Check each corner of the extent of the object. If one of the corner is inside the mask and cln->isMaskInclusive is FALSE, return TRUE. If the four corner is inside the mask and cln->isMaskInclusive is TRUE, return TRUE. Else, return FALSE. */ if (ecs_IsPointInPolygon(cln->mask->c.c_len,cln->mask->c.c_val, obj->res.ecs_ResultUnion_u.dob.xmin, obj->res.ecs_ResultUnion_u.dob.ymin)) { if (!cln->isMaskInclusive) return TRUE; } if (ecs_IsPointInPolygon(cln->mask->c.c_len,cln->mask->c.c_val, obj->res.ecs_ResultUnion_u.dob.xmin, obj->res.ecs_ResultUnion_u.dob.ymax)) { if (!cln->isMaskInclusive) return TRUE; } if (ecs_IsPointInPolygon(cln->mask->c.c_len,cln->mask->c.c_val, obj->res.ecs_ResultUnion_u.dob.xmax, obj->res.ecs_ResultUnion_u.dob.ymin)) { if (!cln->isMaskInclusive) return TRUE; } if (ecs_IsPointInPolygon(cln->mask->c.c_len,cln->mask->c.c_val, obj->res.ecs_ResultUnion_u.dob.xmax, obj->res.ecs_ResultUnion_u.dob.ymax)) { return TRUE; } return FALSE; } /* *---------------------------------------------------------------------- * * cln_GetRasterInfo: Get the raster information for a given selected layer. * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetRasterInfo(ClientID) int ClientID; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_GetRasterInfo(&(cln->s)); return msg; } /* *---------------------------------------------------------------------- * * cln_GetObject: Get an object in the server with an id. * * IN * int ClientID: Client identifier * char *id: Identifiant of object * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetObject(ClientID,id) int ClientID; char *id; { ecs_Result *msg; register ecs_Client *cln; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } msg = svr_GetObject(&(cln->s),id); return msg; } /* *---------------------------------------------------------------------- * * cln_GetObjectIdFromCoord: Get the id of the nearest object of a point * in the selected layer. * * IN * int ClientID: Client identifier * ecs_Coordinate *coord: coordinate * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetObjectIdFromCoord(ClientID, coord) int ClientID; ecs_Coordinate *coord; { int position; double distance; double mindist; register ecs_Client *cln; ecs_Result *msg; char *id; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[2]); return msg; } if (cln->selectCache == NULL) { msg = svr_GetObjectIdFromCoord(&(cln->s),coord); } else { /* * If a cache exist for this layer, select directly the * object in this cache. */ switch(cln->selectCache->coverage.F) { case Line: case Area: case Text: case Point: position = 0; distance = ecs_DistanceObject(&(cln->selectCache->o[position]->res.ecs_ResultUnion_u.dob),coord->x,coord->y); if (distance>=0.0) mindist = distance; else mindist = HUGE_VAL; cln->selectCache->currentpos = 0; for(position=1;positionselectCache->size;position++) { distance = ecs_DistanceObject(&(cln->selectCache->o[position]->res.ecs_ResultUnion_u.dob),coord->x,coord->y); if (mindist>distance && distance>=0.0) { mindist=distance; cln->selectCache->currentpos = position; } } id = cln->selectCache->o[cln->selectCache->currentpos]->res.ecs_ResultUnion_u.dob.Id; msg = &cln_dummy_result; ecs_SetText(msg,id); break; default: msg = svr_GetObjectIdFromCoord(&(cln->s),coord); break; } } return msg; } /* *---------------------------------------------------------------------- * * cln_UpdateDictionary: Get the update dictionary information from the server * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_UpdateDictionary(ClientID, info) int ClientID; char *info; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } if (info == NULL) { info = cln_empty_string; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_UpdateDictionary(&(cln->s),info); return msg; } /* *---------------------------------------------------------------------- * * cln_GetGlobalBound: Get the global rectangle of the server. * * IN * ClientID: Client identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetGlobalBound(ClientID) int ClientID; { ecs_Result *res; register ecs_Client *cln; if (multiblock != 0) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[14]); return res; } cln = soc[ClientID]; if (cln == NULL) { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[2]); return res; } res = svr_GetGlobalBound(&(cln->s)); if (res->error == 0) { if (res->res.type == GeoRegion && res->res.ecs_ResultUnion_u.gr.north != res->res.ecs_ResultUnion_u.gr.south && res->res.ecs_ResultUnion_u.gr.west != res->res.ecs_ResultUnion_u.gr.east && res->res.ecs_ResultUnion_u.gr.ew_res != 0.0 && res->res.ecs_ResultUnion_u.gr.ns_res != 0.0) { } else { res = &cln_dummy_result; ecs_SetError(res,1,cln_messages[13]); } } return res; } /* *---------------------------------------------------------------------- * * cln_SetServerLanguage: Set the server language * * IN * int ClientID: Client identifier * u_int language: Server language applied * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_SetServerLanguage(ClientID,language) int ClientID; u_int language; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_SetServerLanguage(&(cln->s),language); return msg; } /* *---------------------------------------------------------------------- * * cln_GetServerProjection: Get the server projection. * * IN * ClientID: Client's identifier * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_GetServerProjection(ClientID) int ClientID; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_GetServerProjection(&(cln->s)); return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * cln_GetDatumInfo * * DESCRIPTION * Get the datum information from the datum projection. * * END_DESCRIPTION * * PARAMETERS * INPUT * char *projection: The projection string * END_PARAMETERS * * RETURN_VALUE * ecs_Datum: The returned information. Could be nodatum, * nad27 or nad83. * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Set ptr to the beginning of the string projection * * 2. While ptr is not the end of the string * Begin * 2.1. Compare the first 12 characters of ptr and "+datum=nad27" * without the case sensitivity. If they are the same, return * nad27. * * 2.2. Compare the first 12 characters of ptr and "+datum=nad83" * without the case sensitivity. If they are the same, return * nad83. * * 2.3. Increment ptr * End * * 3. Return nodatum * *---------------------------------------------------------------------- */ ecs_Datum cln_GetDatumInfo(projection) char *projection; { char *ptr; if (projection==NULL) return nodatum; ptr = projection; while(ptr[0]!='\0') { #ifdef _WINDOWS if (strnicmp(ptr,"+datum=nad27",12) == 0) #else if (strncasecmp(ptr,"+datum=nad27",12) == 0) #endif return nad27; #ifdef _WINDOWS if (strnicmp(ptr,"+datum=nad83",12) == 0) #else if (strncasecmp(ptr,"+datum=nad83",12) == 0) #endif return nad83; ptr++; } return nodatum; } /* *---------------------------------------------------------------------- * * cln_SetTclProc: Set in the client tclprocname with the value of the * attribute. * * IN * int ClientID: Client's identifier * char *tclproc: TCL procedure name * *---------------------------------------------------------------------- */ void cln_SetTclProc(ClientID,tclproc) int ClientID; char *tclproc; { register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) { return; } if (cln->tclprocname != NULL) free(cln->tclprocname); if (tclproc != NULL) { cln->tclprocname = (char *) malloc(strlen(tclproc)+1); if (cln->tclprocname != NULL) strcpy(cln->tclprocname, tclproc); } else { cln->tclprocname = NULL; } return; } /* *---------------------------------------------------------------------- * * cln_GetTclProc: Return the client tclprocname * * IN * int ClientID: Client's identifier * * OUT * return char *: Pointer to tclprocname. If NULL, there is no * tclprocname. * *---------------------------------------------------------------------- */ char *cln_GetTclProc(ClientID) int ClientID; { register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) { return NULL; } return cln->tclprocname; } /* *---------------------------------------------------------------------- * * cln_UpdateMaxRegion: The function update a geographic region "gr" * in a projection "A" and update it with a point (x,y) taken * in a projection "B". If "direction" is ECS_TTOS, projection "A" will * be the target projection and "B" the source. If "direction" is ECS_TTOS, * projection "A" will be the target projection and "B" the source. * * IN * int ClientID : Client's identifier * x,y : Point to convert * gr : Geographical region to convert (already allocated) * direction : Direction of convertion * first : Indicate if the point (x,y) is the first to convert * * OUT * * return int : If 0, the operation is a success. Hense, * an error code is send. This error code correspond * to a position in cln_messages. * *---------------------------------------------------------------------- */ int cln_UpdateMaxRegion(ClientID,x,y,gr,direction,first) int ClientID; double x; double y; ecs_Region *gr; int direction; int first; { double temp_x = x; double temp_y = y; if (first==TRUE) { gr->north = temp_y; gr->south = temp_y; gr->east = temp_x; gr->west = temp_x; } else { if (gr->north < temp_y) gr->north = temp_y; if (gr->south > temp_y) gr->south = temp_y; if (gr->east < temp_x) gr->east = temp_x; if (gr->west > temp_x) gr->west = temp_x; } return 0; } /* *---------------------------------------------------------------------- * * cln_ConvMBR: Convert a geographic region from a projection "A" to * a projection "B". If "direction" is ECS_TTOS, projection "A" will * be the target projection and "B" the source. If "direction" is ECS_TTOS, * projection "A" will be the target projection and "B" the source. * * IN * int ClientID : Client's identifier * double *xl : Left of MBR * double *yl : Bottom of MBR * double *xu : Right of MBR * double *yu : Top of MBR * direction : Direction of convertion * * OUT * return int : If 0, the operation is a success. Hense, * an error code is send. This error code correspond * to a position in cln_messages. * *---------------------------------------------------------------------- */ int cln_ConvMBR(ClientID,xl,yl,xu,yu,direction) int ClientID; double *xl; double *yl; double *xu; double *yu; int direction; { ecs_Region maxgr; double middle_x; double fquart_x; double squart_x; double middle_y; double fquart_y; double squart_y; int ret = 0; register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) return 2; middle_x = ((*xl)+(*xu))/2.0; middle_y = ((*yu)+(*yl))/2.0; fquart_x = (middle_x + (*xl))/2.0; squart_x = (middle_x + (*xu))/2.0; fquart_y = (middle_y + (*yl))/2.0; squart_y = (middle_y + (*yu))/2.0; cln_UpdateMaxRegion(ClientID,(*xl),(*yl),&maxgr,direction,TRUE); cln_UpdateMaxRegion(ClientID,(*xl),(*yu),&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,(*xu),(*yu),&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,(*xu),(*yl),&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,(*xu),middle_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,(*xl),middle_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,middle_x,(*yu),&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,middle_x,(*yl),&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,middle_x,middle_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,fquart_x,fquart_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,fquart_x,squart_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,squart_x,fquart_y,&maxgr,direction,FALSE); cln_UpdateMaxRegion(ClientID,squart_x,squart_y,&maxgr,direction,FALSE); (*yu) = maxgr.north; (*yl) = maxgr.south; (*xu) = maxgr.east; (*xl) = maxgr.west; ret = 0; return ret; } /* *---------------------------------------------------------------------- * * cln_ChangeProjectionImage: Change the geographic projection of an image * from source projection to target projection. * * IN * int ClientID : Client's identifier * ecs_Image *obj: Pointer to image object * * OUT * return int : error code. If 0, the operation is success. Else, * an error code correspond to a position in the cln_messages. * *---------------------------------------------------------------------- */ int cln_ChangeProjectionImage(ClientID,obj) int ClientID; ecs_Image *obj; { ClientID = 0; obj = NULL; return 0; } /* *---------------------------------------------------------------------- * * cln_PointValid: With a point (X,Y), check if this point, when converted * from target to source projection, give a equivalent result. * * IN * int ClientID : Client's identifier * double X: Pointer to X, the x coordinate to convert * double Y: Pointer to Y, the y coordinate to convert * * OUT * return int : If TRUE, this point is equivalent in both projection * *---------------------------------------------------------------------- */ int cln_PointValid(ClientID, x, y) int ClientID; double x; double y; { double ox,oy; /* Original value */ double cx,cy; /* Converted value */ double dx,dy; /* Difference between points */ register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) return FALSE; ox = x; oy = y; cx = x; cy = y; dx = ox-cx; if (dx<0) dx*=-1; if (ox<0) ox*=-1; dy = oy-cy; if (dy<0) dy*=-1; if (oy<0) oy*=-1; if (((dx/ox) > COMPARETOLERANCE) || ((dy/oy) > COMPARETOLERANCE)) { return FALSE; } return TRUE; } /* *---------------------------------------------------------------------- * * cln_GetClientIdFromURL: With an URL, return the related ClientID. * * IN * char *url: Client URL * * OUT * return int: Client ID. If >= 0, the operation is a success. * If < 0 , it failed to found the client * *---------------------------------------------------------------------- */ int cln_GetClientIdFromURL(url) char *url; { int i; for(i=0;iurl,url) == 0) { return i; } } } return -1; } /* *---------------------------------------------------------------------- * * cln_GetURLList: Get URL list * * OUT * char **urllist: Pointer to a string (char *) * return int: error_code flag. TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_GetURLList(urllist) char **urllist; { static char *retstring = NULL; int i; int lenght; *urllist = NULL; if (retstring != NULL) free(retstring); retstring = NULL; lenght = 0; retstring = (char *) malloc(1); if (retstring == NULL) return FALSE; strcpy(retstring,""); for(i=0;i0) strcat(retstring," "); /* * Concatenate url to retstring */ lenght += strlen(soc[i]->url) + 2; retstring = (char *) realloc(retstring,lenght); if (retstring == NULL) return FALSE; strcat(retstring,soc[i]->url); } } *urllist = retstring; return TRUE; } /* *---------------------------------------------------------------------- * * cln_SetRegionCaches: Set the geographic region occupied * by caches. * * IN * int ClientID: Identifiant of client * ecs_Region *GR: Geographic region in the * * OUT * char **error_message: Pointer to a string with a error message * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_SetRegionCaches(ClientID, GR,error_message) int ClientID; ecs_Region *GR; char **error_message; { register ecs_Client *cln; *error_message = NULL; cln = soc[ClientID]; if (cln == NULL) { *error_message = cln_messages[2]; return FALSE; } cln->cacheRegion.north = GR->north; cln->cacheRegion.south = GR->south; cln->cacheRegion.east = GR->east; cln->cacheRegion.west = GR->west; cln->cacheRegion.ns_res = GR->ns_res; cln->cacheRegion.ew_res = GR->ew_res; return TRUE; } /* *---------------------------------------------------------------------- * * cln_LoadCache: Create a new cache and assign to it the * objects requested in a layer selection, in the region * given by cln->cacheRegion. * * IN * int ClientID: Identifiant of client * ecs_LayerSelection *ls: Layer selection to assign * to this server * * OUT * char **error_message: Error message to return to client. * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_LoadCache(ClientID, ls, error_message) int ClientID; ecs_LayerSelection *ls; char **error_message; { ecs_Cache *NewCache; ecs_Cache *CachePtr; ecs_Result *obj; register ecs_Client *cln; ecs_Result *res; int code; int n; *error_message = NULL; cln = soc[ClientID]; if (cln == NULL) { *error_message = cln_messages[2]; return FALSE; } /* * Check if the type is vectorial. If not, return an error message. */ if (ls->F != Area && ls->F != Line && ls->F != Point && ls->F != Text) { *error_message = cln_messages[12]; return FALSE; } /* * Check if the cache already exist in the cache. */ CachePtr = cln->cache; while(CachePtr!=NULL) { if ((strcmp(CachePtr->coverage.Select,ls->Select) == 0) && (CachePtr->coverage.F == ls->F)) { return TRUE; } CachePtr = CachePtr->next; } /* * If the cache don't exist, create a new one. First start a selection * with a certain layer. */ res = cln_SelectLayer(ClientID, ls); if (res->error != 0) { *error_message = res->message; return FALSE; } res = cln_SelectRegion(ClientID, &(cln->cacheRegion)); if (res->error != 0) { *error_message = res->message; return FALSE; } NewCache = cln_NewCache(CACHEINITSIZE); if (NewCache==NULL) { *error_message = cln_messages[1]; return FALSE; } /* * Allocate coverage */ NewCache->coverage.Select = (char *) malloc(strlen(ls->Select)+1); if (NewCache->coverage.Select == NULL) { cln_FreeCache(NewCache); *error_message = cln_messages[1]; return FALSE; } strcpy(NewCache->coverage.Select,ls->Select); NewCache->coverage.F = ls->F; /* * Add to object cache table all the selected objects. * MultiResult responses have to be dealt with a little differently. * Only a single error is returned for a MultiResult, and that error * pertains only to the a request after the last object in the MultiResult * array. All objects in the array were retrieved without an error. * When the server encounters an error, it sends all accumulated results * so far and sets the error condition. */ res = svr_GetNextObject(&(cln->s)); while((res->error == 0) || (res->res.type == MultiResult && res->res.ecs_ResultUnion_u.results.results_len > 0)) { n = (res->res.type == MultiResult) ? res->res.ecs_ResultUnion_u.results.results_len : 1; if (NewCache->size+n >= NewCache->allocatedSize) { NewCache->allocatedSize += (CACHEINITSIZE >= n) ? CACHEINITSIZE : n; NewCache->o = (ecs_Result **) realloc(NewCache->o,sizeof(ecs_Result *)*(NewCache->allocatedSize)); if(NewCache == NULL) { *error_message = cln_messages[1]; return FALSE; } } if (res->res.type != MultiResult) { /* * Make a copy of the object */ code = ecs_CopyResult(res,&obj); if (code == FALSE) { cln_FreeCache(NewCache); return FALSE; } NewCache->o[NewCache->size++] = obj; } else { /* * Break MultiResult object apart */ for (n = 0; n < (int) res->res.ecs_ResultUnion_u.results.results_len; n++) { code = ecs_CopyResultFromUnion(&res->res,&obj); if (code == FALSE) { cln_FreeCache(NewCache); return FALSE; } NewCache->o[NewCache->size++] = obj; } if (res->error) { break; } } res = svr_GetNextObject(&(cln->s)); } /* Ajouter la nouvelle cache dans la liste */ if (cln->cache != NULL) { cln->cache->previous = NewCache; NewCache->next = cln->cache; cln->cache = NewCache; } else { cln->cache = NewCache; } return TRUE; } /* *---------------------------------------------------------------------- * * cln_ReleaseCache: Destroy the cache related to a coverage * * IN * int ClientID: Identifiant of client * ecs_LayerSelection *ls: Layer selection to assign * to this server * * OUT * char **error_message: Error message to return to client. * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_ReleaseCache(ClientID, ls, error_message) int ClientID; ecs_LayerSelection *ls; char **error_message; { ecs_Cache *CachePtr; register ecs_Client *cln; *error_message = NULL; cln = soc[ClientID]; if (cln == NULL) { *error_message = cln_messages[2]; return FALSE; } cln->selectCache = NULL; CachePtr = cln->cache; while(CachePtr!=NULL) { if ((strcmp(CachePtr->coverage.Select,ls->Select) == 0) && CachePtr->coverage.F == ls->F) { if (cln->cache == CachePtr) { cln->cache = CachePtr->next; if (cln->cache != NULL) cln->cache->previous = NULL; } else { if(CachePtr->next!=NULL) CachePtr->next->previous = CachePtr->previous; if(CachePtr->previous!=NULL) CachePtr->previous->next = CachePtr->next; } cln_FreeCache(CachePtr); return TRUE; } CachePtr = CachePtr->next; } *error_message = cln_messages[6]; return FALSE; } /* *---------------------------------------------------------------------- * * cln_NewCache: Allocate a new cache structure * * OUT * return : NULL if no memory available, a cache otherwise * *---------------------------------------------------------------------- */ ecs_Cache * cln_NewCache(int size) { ecs_Cache *cache; cache = (ecs_Cache *) malloc(sizeof(ecs_Cache)); if (cache==NULL) { return NULL; } cache->coverage.Select = NULL; cache->o = NULL; cache->startpos = 0; cache->currentpos = 0; cache->size = 0; cache->next = NULL; cache->previous = NULL; /* * Allocate object cache table */ cache->allocatedSize = size; cache->o = (ecs_Result **) malloc(sizeof(ecs_Result *) * size); if (cache->o == NULL) { free(cache); return NULL; } return cache; } /* *---------------------------------------------------------------------- * * cln_FreeCache: Free the cache memory * * IN * ecs_Cache *Cache: Cache to be free * *---------------------------------------------------------------------- */ void cln_FreeCache(Cache) ecs_Cache *Cache; { int i; if (Cache != NULL) { if (Cache->coverage.Select != NULL) free(Cache->coverage.Select); if (Cache->o != NULL) { for(i=0;isize;i++) { if (Cache->o[i] != NULL) { if (Cache->o[i]->res.type == Object) { ecs_FreeObject(&(Cache->o[i]->res.ecs_ResultUnion_u.dob)); } free(Cache->o[i]); Cache->o[i] = NULL; } } free(Cache->o); } free(Cache); } return; } /* *---------------------------------------------------------------------- * * cln_FoundCache: Search the cache list for a cache who correspond to * a layer. * * IN * int ClientID: Identifiant of client * ecs_LayerSelection *ls: Layer information structure * * OUT * return ecs_Cache *: A pointer to a cache. If NULL, the cache was * not found. * *---------------------------------------------------------------------- */ ecs_Cache *cln_FoundCache(ClientID, ls) int ClientID; ecs_LayerSelection *ls; { ecs_Cache *CachePtr,*FoundCache; register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) return NULL; FoundCache = NULL; CachePtr = cln->cache; while(CachePtr!=NULL) { if ((strcmp(CachePtr->coverage.Select,ls->Select) == 0) && (CachePtr->coverage.F == ls->F)) { FoundCache = CachePtr; break; } CachePtr = CachePtr->next; } return FoundCache; } /* *---------------------------------------------------------------------- * * cln_CalcCtlPoint: For a given point in the client region, * calculate the corresponding point in the server region. * * IN * int ClientID: Identifiant of client * ecs_Region *server_region: Server region * int SI, SJ: Control point in T matrix * * OUT * ecs_CtlPoint *pt: Control point * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_CalcCtlPoint(ClientID,server_region,SI,SJ,pt) int ClientID; ecs_Region *server_region; int SI; int SJ; ecs_CtlPoint *pt; { double X,Y; register ecs_Client *cln; cln = soc[ClientID]; if (cln == NULL) { return FALSE; } /* Found the geographic position of SI,SJ in source */ X = cln->currentRegion.west + SI * cln->currentRegion.ew_res; Y = cln->currentRegion.north - SJ * cln->currentRegion.ns_res; /* Found the corresponding position of this point in server region */ pt->e1 = (double) SI; pt->n1 = (double) SJ; pt->e2 = (X - server_region->west) / server_region->ew_res; pt->n2 = (server_region->north - Y) / server_region->ns_res; return TRUE; } /* *---------------------------------------------------------------------- * * cln_CalcCtlPoints: For a given region, calculate control points * for matrix transformation. * * IN * int ClientID: Identifiant of client * * OUT * ecs_CalcCtlPoints **pts: new structure with control points * char **error_message: error message * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_CalcCtlPoints(ClientID,pts,error_message) int ClientID; ecs_CtlPoints **pts; char **error_message; { static ecs_CtlPoints *newpts = NULL; register ecs_Client *cln; int width, height; ecs_Region server_region; *error_message = NULL; cln = soc[ClientID]; if (cln == NULL) { *error_message = cln_messages[2]; *pts = NULL; return FALSE; } /* Prepare newpts structure */ if (newpts != NULL) { if (newpts->pts != NULL) { free(newpts->pts); newpts->pts = NULL; } free(newpts); newpts = NULL; } newpts = (ecs_CtlPoints *) malloc(sizeof(ecs_CtlPoints)); if (newpts == NULL) { *error_message = cln_messages[1]; *pts = NULL; return FALSE; } newpts->nbpts = 9; newpts->pts = (ecs_CtlPoint *) malloc(sizeof(ecs_CtlPoint)*9); if (newpts->pts == NULL) { *error_message = cln_messages[1]; free(newpts); newpts = NULL; *pts = NULL; return FALSE; } /* Calculate server region with client value */ server_region.north = cln->currentRegion.north; server_region.south = cln->currentRegion.south; server_region.east = cln->currentRegion.east; server_region.west = cln->currentRegion.west; server_region.ns_res = cln->currentRegion.ns_res; server_region.ew_res = cln->currentRegion.ew_res; /* Calculate raster width and height */ width = (int) (((cln->currentRegion.east - cln->currentRegion.west) / cln->currentRegion.ew_res) + 0.5); height = (int)(((cln->currentRegion.north - cln->currentRegion.south) / cln->currentRegion.ns_res) + 0.5); if( width < 1 ) width = 1; if( height < 1 ) height = 1; /* Assign points and return result */ if ((cln_CalcCtlPoint(ClientID, &server_region, 0, 0, &(newpts->pts[0]))) && (cln_CalcCtlPoint(ClientID, &server_region, 0, (height / 2), &(newpts->pts[1]))) && (cln_CalcCtlPoint(ClientID, &server_region, 0, height, &(newpts->pts[2]))) && (cln_CalcCtlPoint(ClientID, &server_region, (width / 2), 0, &(newpts->pts[3]))) && (cln_CalcCtlPoint(ClientID, &server_region, (width / 2), (height / 2), &(newpts->pts[4]))) && (cln_CalcCtlPoint(ClientID, &server_region, (width / 2), height, &(newpts->pts[5]))) && (cln_CalcCtlPoint(ClientID, &server_region, width, 0, &(newpts->pts[6]))) && (cln_CalcCtlPoint(ClientID, &server_region, width, (height / 2), &(newpts->pts[7]))) && (cln_CalcCtlPoint(ClientID, &server_region, width, height, &(newpts->pts[8])))) { *pts = newpts; return TRUE; } *error_message = cln_messages[8]; free(newpts->pts); free(newpts); newpts = NULL; *pts = NULL; return FALSE; } /* *---------------------------------------------------------------------- * * cln_SetRasterConversion: Set the matrix projection conversion. * * This program computes the planar projective transformation * parameters and the corresponding residuals. * * The transformation is done from system x, y (rect.in) to * system X, Y (nonrect.in) obtained from the original image. * * For the client server extension, these coordinates become: * * x : e1 Coordinates of the Client * y : n1 * * X : e2 Coordinates of the Server * Y : n2 * * IN * int ClientID: Identifiant of client * ecs_Resampling resampling: Resampling value * ecs_Transformation trans: Transformation value * * * IN/OUT * ecs_CalcCtlPoints **pts: new structure with control points. * If this structure is NULL, the procedure cln_CalcCtlPoints * will be called. In the other cases, the calculations will * be done with this argument value. It's return the same structure * with errorx and errory set. * * OUT * char **error_message: error message * return int: Error message returned. * TRUE: Success * FALSE: Failure * *---------------------------------------------------------------------- */ int cln_SetRasterConversion(ClientID,pts,resampling,trans,error_message) int ClientID; ecs_CtlPoints **pts; ecs_Resampling resampling; ecs_Transformation trans; char **error_message; { register ecs_Client *cln; ecs_CtlPoints *localpts; ecs_RasterConversion rc; ecs_Result *result; double **A, **AtA, **Atw, **w, **d, **res; int i, j, k; *error_message = NULL; cln = soc[ClientID]; if (cln == NULL) { *error_message = cln_messages[2]; *pts = NULL; return FALSE; } /* prepare the ecs_RasterConversion structure */ rc.coef.coef_len = 8; rc.coef.coef_val = (double *) malloc(sizeof(double)*8); if (rc.coef.coef_val == NULL) { *error_message = cln_messages[1]; *pts = NULL; return FALSE; } /* step 1: Calculate control points */ if (*pts == NULL) { localpts = NULL; if (!cln_CalcCtlPoints(ClientID,&localpts,error_message)) { *pts = NULL; return FALSE; } } else { localpts = *pts; } /* step 2: Generate matrix A and vector W for least-squares adjustment */ A = mat_malloc(localpts->nbpts*2, 8); AtA = mat_malloc(8, 8); Atw = mat_malloc(8, 1); w = mat_malloc(localpts->nbpts*2, 1); d = mat_malloc(8, 1); res = mat_malloc(localpts->nbpts, 2); if ((A == NULL) || (AtA == NULL) || (Atw == NULL) || (w == NULL) || (d == NULL) || (res == NULL)) { *error_message = cln_messages[1]; *pts = NULL; free(rc.coef.coef_val); return FALSE; } /* Form the design matrix A and vector w */ for(i=0, k=0; inbpts*2; i+=2, k++) { /* Matrix inxy(x,y) or e1[k], n1[k] : corrected coordinates (client) */ /* Matrix inXY(X,Y) or e2[k], n2[k] : uncorrected coordinates (server) */ j = i+1; /* Design Matrix A */ A[i][0] = localpts->pts[k].e1; A[i][1] = localpts->pts[k].n1; A[i][2] = 0; A[i][3] = 0; A[i][4] = -(localpts->pts[k].e1)*localpts->pts[k].e2; A[i][5] = -(localpts->pts[k].n1)*localpts->pts[k].e2; A[i][6] = 1; A[i][7] = 0; A[j][0] = 0; A[j][1] = 0; A[j][2] = localpts->pts[k].e1; A[j][3] = localpts->pts[k].n1; A[j][4] = -(localpts->pts[k].e1)*localpts->pts[k].n2; A[j][5] = -(localpts->pts[k].n1)*localpts->pts[k].n2; A[j][6] = 0; A[j][7] = 1; /* Vector w */ w[i][0] = localpts->pts[k].e2; w[j][0] = localpts->pts[k].n2; } /* step 3: Matrix resolution and parameters generation */ /* Compute the parameters using a least-squares adjustment */ /* d = (AtA)-1 * Atw */ mat_mul_transposed(A,localpts->nbpts*2,8,A,localpts->nbpts*2,8,AtA); mat_inverse(AtA, 8); mat_mul_transposed(A,localpts->nbpts*2,8,w,localpts->nbpts*2,1,Atw); mat_mul_direct(AtA,8,8,Atw,8,1,d); /* Compute the residuals */ for(i=0; inbpts; i++) { localpts->pts[i].errorx = ((d[0][0]*localpts->pts[i].e1+d[1][0]*localpts->pts[i].n1+d[6][0])/(d[4][0]*localpts->pts[i].e1+d[5][0]*localpts->pts[i].n1+1)) - localpts->pts[i].e2; localpts->pts[i].errory = ((d[2][0]*localpts->pts[i].e1+d[3][0]*localpts->pts[i].n1+d[7][0])/(d[4][0]*localpts->pts[i].e1+d[5][0]*localpts->pts[i].n1+1)) - localpts->pts[i].n2; } /* Puts information in ecs_RasterConversion */ rc.r_method = resampling; rc.t_method = trans; rc.coef.coef_len = 8; for (i=0; i<8; i++) { rc.coef.coef_val[i] = d[i][0]; } /* Call the server */ result = svr_SetRasterConversion(&(cln->s),&rc); if (result->error != 0) { *error_message = result->message; *pts = NULL; mat_free(A,localpts->nbpts*2); mat_free(AtA, 8); mat_free(Atw, 8); mat_free(w, localpts->nbpts*2); mat_free(d, 8); mat_free(res, localpts->nbpts); free(rc.coef.coef_val); return FALSE; } mat_free(A,localpts->nbpts*2); mat_free(AtA, 8); mat_free(Atw, 8); mat_free(w, localpts->nbpts*2); mat_free(d, 8); mat_free(res, localpts->nbpts); free(rc.coef.coef_val); *pts = localpts; return TRUE; } /* *---------------------------------------------------------------------- * * cln_SetCompression: Set the server compression parameters * * IN * int ClientID: Client identifier * ecs_Compression: Compression parameters * * OUT * return ecs_Result: Operation result * *---------------------------------------------------------------------- */ ecs_Result *cln_SetCompression(ClientID,compression) int ClientID; ecs_Compression *compression; { register ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } msg = svr_SetCompression(&(cln->s),compression); return msg; } /* *---------------------------------------------------------------------- * * cln_LoadCapabilities(): Load and parse capabilities document. * * IN * int ClientID: Client identifier * const char *arg: Either "ogdi_capabilities" or * "ogdi_server_capabilities". * * OUT * return ecs_Result: Operation result (success is ecs_Text or error) * *---------------------------------------------------------------------- */ ecs_Result *cln_LoadCapabilities(int ClientID, const char *arg, int error_if_unsupported) { ecs_Client *cln; ecs_Result *msg, *result; char *cap_doc; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } /* * Don't do anything, if these capabilities already loaded. Eventually * we should allow re-loading of capabilities document in case the * application wants to test error reports, or force a refresh. */ if( (cln->have_server_capabilities && strcmp(arg,"ogdi_server_capabilities") == 0) || (cln->have_capabilities && strcmp(arg,"ogdi_capabilities") == 0) ) { msg = &cln_dummy_result; ecs_SetText(msg,""); ecs_SetSuccess(msg); return msg; } /* * Load the requested capabilities document. */ result = cln_UpdateDictionary(ClientID, (char *) arg); if( ECSERROR(result) && error_if_unsupported ) return result; /* * Did we get an error, or is this clearly not a capabilities document? * If not, apply a default configuration for pre 3.1 compatibility. */ if( ECSERROR(result) || strncmp(ECSTEXT(result),"have_server_capabilities = TRUE; strcpy( cln->server_version_str, "4.0" ); cln->server_version = 4000; cln->have_capabilities = TRUE; return &cln_dummy_result; } /* * Make a copy of the document so nothing weird happens as our static * result object is modified during parsing. */ cap_doc = strdup(ECSTEXT(result)); if (cap_doc == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[1]); return &cln_dummy_result; } /* * Parse it. */ ecs_SetSuccess( &cln_dummy_result ); ecs_ParseCapabilities( cln, cap_doc, &cln_dummy_result ); free( cap_doc ); return &cln_dummy_result; } /* *---------------------------------------------------------------------- * * cln_GetVersion(): Return the driver version string. * * IN * int ClientID: Client identifier * * OUT * return ecs_Result: Operation result (ecs_Text with version string) * *---------------------------------------------------------------------- */ ecs_Result *cln_GetVersion(int ClientID) { ecs_Client *cln; ecs_Result *msg; if (multiblock != 0) { msg = &cln_dummy_result; ecs_SetError(msg,1,cln_messages[14]); return msg; } cln = soc[ClientID]; if (cln == NULL) { ecs_SetError(&cln_dummy_result,1,cln_messages[2]); return &cln_dummy_result; } cln_LoadCapabilities(ClientID, "ogdi_server_capabilities", 0 ); msg = &cln_dummy_result; ecs_SetText(msg,cln->server_version_str); ecs_SetSuccess(msg); return msg; } /* *---------------------------------------------------------------------- * * cln_CheckExtension(): Test if requested extension is enabled. * * IN * int ClientID: Client identifier * const char *extension: the name of the extension to test for. * const char *layer_name: the name of the layer to test on or NULL. * * OUT * return ecs_Result: Operation result (ecs_Text with version string) * *---------------------------------------------------------------------- */ int cln_CheckExtension(int ClientID, const char *extension, const char *layer_name ) { ecs_Client *cln; ecs_Result *result; char **extensions; int i, layer; if (multiblock != 0) { return FALSE; } cln = soc[ClientID]; if (cln == NULL) { return FALSE; } if( layer_name == NULL ) result = cln_LoadCapabilities(ClientID, "ogdi_server_capabilities", 0 ); else result = cln_LoadCapabilities(ClientID, "ogdi_capabilities", 0 ); if( ECSERROR(result) ) return FALSE; /* * Test in global extensions. */ extensions = cln->global_extensions; for( i = 0; extensions != NULL && extensions[i] != NULL; i++ ) { if( strcmp(extensions[i],extension) == 0 ) return TRUE; } if( layer_name == NULL ) return FALSE; /* * Test within layer. */ for( layer = 0; layer < cln->layer_cap_count; layer++ ) { if( strcmp(layer_name, cln->layer_cap[layer]->name) == 0 ) { extensions = cln->layer_cap[layer]->extensions; for( i = 0; extensions != NULL && extensions[i] != NULL; i++ ) { if( strcmp(extensions[i],extension) == 0 ) return TRUE; } return FALSE; } } return FALSE; } /* *---------------------------------------------------------------------- * * cln_GetLayerCapabilities(): Get layer definition. * * Note that there is no way to find out the number of layers explicitly. * Applications are intended to call cln_GetLayerCapabilities() repeatedly * with incrementing layer_index values till a NULL is returned. * * IN * int ClientID: Client identifier * int layer_index: The zero based index of the layer. * * OUT * return ecs_LayerCapabilities of layer or NULL if unavailable. The * returned pointer is to internal data and should not be * modified or freed. It will be invalidated when the client * is destroyed. * *---------------------------------------------------------------------- */ const ecs_LayerCapabilities * cln_GetLayerCapabilities( int ClientID, int layer_index ) { ecs_Client *cln; if (multiblock != 0) { return NULL; } cln = soc[ClientID]; if (cln == NULL) { return NULL; } if( ECSERROR(cln_LoadCapabilities(ClientID, "ogdi_capabilities", 0 )) ) return NULL; if( layer_index < 0 || layer_index >= cln->layer_cap_count ) return NULL; else return cln->layer_cap[layer_index]; } /* cln_BlockOGDI Block the ogdi */ void cln_BlockOGDI() { multiblock = 1; } /* cln_UnBlockOGDI Block the ogdi */ void cln_UnBlockOGDI() { multiblock = 0; } #ifdef _WINDOWS /* *---------------------------------------------------------------------- * DllMain -- * * When the DLL is being unloaded, make sure to destroy all of * the clients that remain open. * * OUT * return TRUE *---------------------------------------------------------------------- */ BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle of DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: { int i; for(i=0;i #include "ecs.h" #ifndef EXPAT_DISABLED #include "expat.h" ECS_CVSID("$Id$"); #define STACK_MAX 100 /* * NOTE: The following uses the Expat XML parsing library found in * devdir/external/expat. More information on Expat can be found at: * * http://expat.sourceforge.net/ * http://www.xml.com/pub/a/1999/09/expat/index.html */ /* -------------------------------------------------------------------- */ /* The capParseInfo structure is used to keep state information */ /* through the parsing process of a capabilities document. */ /* -------------------------------------------------------------------- */ typedef struct { ecs_Client *cln; char *error; char *version; char **extensions; int element_depth; char *element_stack[STACK_MAX]; int found_feature_type_list; int layer_count; ecs_LayerCapabilities **layers; ecs_LayerCapabilities *cur_layer; char cdata[5000]; } capParseInfo; /************************************************************************/ /* recordError() */ /************************************************************************/ static void recordError( capParseInfo *pi, const char *fmt, ... ) { char buffer[10000]; va_list args; va_start(args, fmt); vsprintf( buffer, fmt, args ); va_end(args); pi->error = strdup(buffer); #ifdef DEBUG fprintf( stderr, "ecs_capabilities.c recordError():\n%s\n", pi->error ); #endif } /************************************************************************/ /* startElementHandler() */ /************************************************************************/ static void startElementHandler( void *cbData, const char *element, const char **attr ) { capParseInfo *pi = (capParseInfo *) cbData; int i; if( pi->error != NULL ) return; /* -------------------------------------------------------------------- */ /* Clear the current cdata we are collecting. */ /* -------------------------------------------------------------------- */ pi->cdata[0] = '\0'; /* -------------------------------------------------------------------- */ /* Push this element onto our stack so we have a sense of context. */ /* -------------------------------------------------------------------- */ if( pi->element_depth == STACK_MAX ) { recordError( pi, "Element stack max (%d) exceeded with element <%s>.", STACK_MAX, element ); return; } else { pi->element_stack[pi->element_depth] = strdup(element); pi->element_depth++; } /* -------------------------------------------------------------------- */ /* Pull driver OGDI version off the OGDI_Capabilities tag. */ /* -------------------------------------------------------------------- */ if( strcmp(element,"OGDI_Capabilities") == 0 ) { for( i = 0; attr != NULL && attr[i] != NULL; i += 2 ) { if( strcmp(attr[i],"version") == 0 ) pi->version = strdup(attr[i+1]); } } /* -------------------------------------------------------------------- */ /* If we encounter a element, create a new layer */ /* object and initialize it. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"FeatureType") == 0 ) { pi->layers = (ecs_LayerCapabilities **) realloc(pi->layers, sizeof(void*) * (1 + ++pi->layer_count)); if( pi->layers == NULL ) { pi->layers = 0; recordError( pi, "out of memory" ); return; } pi->layers[pi->layer_count-1] = (ecs_LayerCapabilities *) calloc(1,sizeof(ecs_LayerCapabilities)); pi->layers[pi->layer_count] = NULL; /* eventually we need to capture the "parents" at this point */ pi->cur_layer = pi->layers[pi->layer_count-1]; } /* -------------------------------------------------------------------- */ /* We try to capture cdata as a query expression description, */ /* if available. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"QueryExpression") == 0 && pi->cur_layer != NULL ) { pi->cur_layer->query_expression_set = TRUE; for( i = 0; attr != NULL && attr[i] != NULL; i += 2 ) { if( strcmp(attr[i],"qe_prefix") == 0 ) pi->cur_layer->qe_prefix = strdup(attr[i+1]); else if( strcmp(attr[i],"qe_suffix") == 0 ) pi->cur_layer->qe_suffix = strdup(attr[i+1]); else if( strcmp(attr[i],"qe_format") == 0 ) pi->cur_layer->qe_format = strdup(attr[i+1]); } } /* -------------------------------------------------------------------- */ /* We can handle LatLonBoundingBox immediately since all the */ /* information is passed as attributes. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"LatLonBoundingBox") == 0 && pi->cur_layer != NULL ) { int minx_set = 0, maxx_set = 0, miny_set = 0, maxy_set = 0; for( i = 0; attr != NULL && attr[i] != NULL; i += 2 ) { if( strcmp(attr[i],"minx") == 0 ) { pi->cur_layer->ll_west = atof(attr[i+1]); minx_set = 1; } else if( strcmp(attr[i],"maxx") == 0 ) { pi->cur_layer->ll_east = atof(attr[i+1]); maxx_set = 1; } else if( strcmp(attr[i],"miny") == 0 ) { pi->cur_layer->ll_south = atof(attr[i+1]); miny_set = 1; } else if( strcmp(attr[i],"maxy") == 0 ) { pi->cur_layer->ll_north = atof(attr[i+1]); maxy_set = 1; } else { /* we deliberately don't warn about unexpected attributes */ } } if( !minx_set || !maxx_set || !miny_set || !maxy_set ) { recordError( pi, "One of minx, miny, maxx, or maxy not set for LatLonBoundingBox." ); return; } pi->cur_layer->ll_bounds_set = TRUE; } /* -------------------------------------------------------------------- */ /* We can handle BoundingBox immediately since all the */ /* information is passed as attributes. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"BoundingBox") == 0 && pi->cur_layer != NULL ) { int minx_set = 0, maxx_set = 0, miny_set = 0, maxy_set = 0; int x_res_set = 0, y_res_set = 0; for( i = 0; attr != NULL && attr[i] != NULL; i += 2 ) { if( strcmp(attr[i],"minx") == 0 ) { pi->cur_layer->srs_west = atof(attr[i+1]); minx_set = 1; } else if( strcmp(attr[i],"maxx") == 0 ) { pi->cur_layer->srs_east = atof(attr[i+1]); maxx_set = 1; } else if( strcmp(attr[i],"miny") == 0 ) { pi->cur_layer->srs_south = atof(attr[i+1]); miny_set = 1; } else if( strcmp(attr[i],"maxy") == 0 ) { pi->cur_layer->srs_north = atof(attr[i+1]); maxy_set = 1; } else if( strcmp(attr[i],"resy") == 0 ) { pi->cur_layer->srs_nsres = atof(attr[i+1]); y_res_set = 1; } else if( strcmp(attr[i],"resx") == 0 ) { pi->cur_layer->srs_ewres = atof(attr[i+1]); x_res_set = 1; } else { /* we deliberately don't warn about unexpected attributes */ } } if( !minx_set || !maxx_set || !miny_set || !maxy_set || !x_res_set || !y_res_set ) { recordError( pi, "One of resx, resy, minx, miny, maxx, or maxy not set for BoundingBox" ); return; } } } /************************************************************************/ /* endElementHandler() */ /************************************************************************/ static void endElementHandler( void *cbData, const char *element ) { capParseInfo *pi = (capParseInfo *) cbData; if( pi->error != NULL ) return; /* -------------------------------------------------------------------- */ /* On the end of a layer definition we check that we have */ /* required fields. */ /* -------------------------------------------------------------------- */ if( strcmp( element, "FeatureType" ) == 0 && pi->cur_layer != NULL ) { if( pi->cur_layer->name == NULL ) { recordError( pi, "Didn't get a for a layer." ); return; } else if( pi->cur_layer->srs_ewres == 0.0 ) { recordError( pi, "Didn't get valid BoundingBox for layer %s.", pi->cur_layer->name ); } pi->cur_layer = NULL; } /* -------------------------------------------------------------------- */ /* If we are processing a layer and encounter a name, apply to */ /* the layer. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"Name") == 0 && pi->cur_layer != NULL ) { pi->cur_layer->name = strdup(pi->cdata); } /* -------------------------------------------------------------------- */ /* If we are processing a layer and encounter a title, apply to */ /* the layer. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"Title") == 0 && pi->cur_layer != NULL ) { pi->cur_layer->title = strdup(pi->cdata); } /* -------------------------------------------------------------------- */ /* If we are processing a layer and encounter an SRS, apply to */ /* the layer. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"SRS") == 0 && pi->cur_layer != NULL ) { if( strncmp(pi->cdata,"PROJ4:",6) == 0 ) pi->cur_layer->srs = strdup(pi->cdata+6); else pi->cur_layer->srs = strdup(pi->cdata); } /* -------------------------------------------------------------------- */ /* We try to capture cdata as a query expression description, */ /* if available. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"QueryExpression") == 0 && pi->cur_layer != NULL && strlen(pi->cdata) > 0 ) { pi->cur_layer->qe_description = strdup(pi->cdata); } /* -------------------------------------------------------------------- */ /* If we are processing a layer and encounter a family, add to */ /* the layer. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"Family") == 0 && pi->cur_layer != NULL ) { if( strcmp(pi->cdata,"Matrix") == 0 ) pi->cur_layer->families[Matrix] = 1; else if( strcmp(pi->cdata,"Image") == 0 ) pi->cur_layer->families[Image] = 1; else if( strcmp(pi->cdata,"Area") == 0 ) pi->cur_layer->families[Area] = 1; else if( strcmp(pi->cdata,"Line") == 0 ) pi->cur_layer->families[Line] = 1; else if( strcmp(pi->cdata,"Point") == 0 ) pi->cur_layer->families[Point] = 1; else if( strcmp(pi->cdata,"Text") == 0 ) pi->cur_layer->families[Text] = 1; else if( strcmp(pi->cdata,"Edge") == 0 ) pi->cur_layer->families[Edge] = 1; else if( strcmp(pi->cdata,"Face") == 0 ) pi->cur_layer->families[Face] = 1; else if( strcmp(pi->cdata,"Node") == 0 ) pi->cur_layer->families[Node] = 1; else if( strcmp(pi->cdata,"Ring") == 0 ) pi->cur_layer->families[Ring] = 1; } /* -------------------------------------------------------------------- */ /* We keep track of whether we got through to the end of a */ /* FeatureTypeList to know if this is really a full capabilities */ /* document, rather than just a server capabilities document. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"FeatureTypeList") == 0 ) { pi->found_feature_type_list = TRUE; } /* -------------------------------------------------------------------- */ /* Append extensions to the global, or layer list as appropriate. */ /* -------------------------------------------------------------------- */ else if( strcmp(element,"Extension") == 0 ) { char ***list; int count; if( pi->cur_layer != NULL ) list = &(pi->cur_layer->extensions); else list = &(pi->extensions); for( count = 0; *list != NULL && (*list)[count] != NULL; count++ ) {} if( *list == NULL ) *list = (char **) calloc(2,sizeof(char*)); else *list = (char **) realloc(*list,(count+2) * sizeof(char*)); (*list)[count++] = strdup( pi->cdata ); (*list)[count] = NULL; } /* -------------------------------------------------------------------- */ /* Pop the element off the stack. */ /* -------------------------------------------------------------------- */ if( pi->element_depth > 0 && strcmp(element,pi->element_stack[pi->element_depth-1]) == 0 ) { pi->element_depth--; free( pi->element_stack[pi->element_depth] ); } else { recordError( pi, "endElement(): unbalanced tag %s\n", element ); return; } } /************************************************************************/ /* charDataHandler() */ /************************************************************************/ static void charDataHandler( void *cbData, const char *text, int len ) { capParseInfo *pi = (capParseInfo *) cbData; if( pi->error != NULL ) return; if( strlen(pi->cdata) + len < sizeof(pi->cdata)-1 ) { int cdata_len = strlen(pi->cdata); strncpy( pi->cdata + cdata_len, text, len ); pi->cdata[cdata_len + len] = '\0'; } else { recordError( pi, "CDATA buffer overrun in charDataHandler()." ); return; } } #endif /* ndef EXPAT_DISABLED */ /************************************************************************/ /* _ecs_ParseCapabilities() */ /************************************************************************/ void ecs_ParseCapabilities( ecs_Client *cln, const char *cap_doc, ecs_Result *result ) { #ifdef EXPAT_DISABLED ecs_SetError( result, 1, "XML capabilities parsing disabled during compilation, parse fails." ); #else capParseInfo pi; XML_Parser parser; int i; memset( &pi, 0, sizeof(pi) ); pi.cln = cln; pi.layers = (ecs_LayerCapabilities **) calloc(1,sizeof(void*)); /* -------------------------------------------------------------------- */ /* Setup parser. */ /* -------------------------------------------------------------------- */ parser = XML_ParserCreate(NULL); XML_SetUserData( parser, &pi ); XML_SetElementHandler(parser, startElementHandler, endElementHandler); XML_SetCharacterDataHandler(parser, charDataHandler); /* -------------------------------------------------------------------- */ /* Parse whole document. */ /* -------------------------------------------------------------------- */ XML_Parse( parser, cap_doc, strlen(cap_doc), TRUE ); /* -------------------------------------------------------------------- */ /* Report error. This will need to be substantially improved. */ /* -------------------------------------------------------------------- */ if( pi.error != NULL ) { ecs_SetError( result, 1, pi.error ); } /* -------------------------------------------------------------------- */ /* Apply captured information to the ecs_Client object. */ /* -------------------------------------------------------------------- */ else { ecs_SetSuccess( result ); ecs_SetText( result, "" ); cln->have_server_capabilities = TRUE; if( pi.version != NULL ) strcpy( cln->server_version_str, pi.version ); else strcpy( cln->server_version_str, "4.0" ); cln->server_version = (int) (atof(cln->server_version_str)*1000 + 0.5); if( cln->global_extensions != NULL ) { for( i = 0; cln->global_extensions[i] != NULL; i++ ) free( cln->global_extensions[i] ); free( cln->global_extensions ); } cln->global_extensions = pi.extensions; pi.extensions = NULL; cln->have_capabilities = pi.found_feature_type_list; cln->layer_cap_count = pi.layer_count; cln->layer_cap = pi.layers; pi.layer_count = 0; pi.layers = NULL; } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ XML_ParserFree( parser ); if( pi.version ) free( pi.version ); if( pi.error ) free( pi.error ); if( pi.extensions ) { for( i = 0; pi.extensions[i] != NULL; i++ ) free( pi.extensions[i] ); free( pi.extensions ); } for( i = 0; i < pi.element_depth; i++ ) free( pi.element_stack[i] ); /* * We should likely free layers in case of error, but that's complicated, * so we will add this later perhaps with on centralized ecs_FreeLayerCap. */ #endif } ogdi-ogdi_4_1_0/ogdi/c-api/ecs_dyna.c000066400000000000000000000122001345660466700174620ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Functions for loading functions from DLLs / .so files. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.6 2016-07-11 09:15:53 erouault * fix ecs_OpenDynamicLib on 64 bit Windows (OGDI #72) * * Revision 1.5 2007/02/12 18:06:31 cbalint * Hide plugins from system libs path. * Release versioning using sonames. * * Revision 1.4 2004/02/18 21:50:21 warmerda * Added debug statement #ifdefed out. * * Revision 1.3 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); #if !defined(MISSING_DLFCN_H) #include #endif /* ------------------------------------------------- ecs_OpenDynamicLib: Open a dynamic link in a system IN: libname: A string with the dynamic library file name. The dynamic library file could be without file extension. OUT: void *: A handle to a new link to a dynamic link. If NULL, the dynamic link failed. ------------------------------------------------- */ void *ecs_OpenDynamicLib(libname) char *libname; { char *temp; #ifdef _WINDOWS static HINSTANCE handle; handle = LoadLibrary(libname); if (handle == NULL) { /* Try with the .dll extension */ if ((temp = (char *) malloc(strlen(libname)+5)) == NULL) return NULL; strcpy(temp,libname); strcat(temp,".dll"); handle = LoadLibrary(temp); free(temp); if (handle == NULL) { return NULL; } else { return (void *) handle; } } else { return (void *) handle; } #else #if !defined(MODULES_PATH) #define MODULES_PATH "/usr/lib/ogdi/" #endif void *handle; handle = dlopen(libname,RTLD_LAZY); if (handle != NULL) return handle; if ((temp = (char *) malloc(strlen(MODULES_PATH)+strlen(libname)+1)) == NULL) return NULL; sprintf(temp,MODULES_PATH "%s",libname); handle = dlopen(temp,RTLD_LAZY); free(temp); if (handle != NULL) return handle; if ((temp = (char *) malloc(strlen(MODULES_PATH)+strlen(libname)+7)) == NULL) return NULL; sprintf(temp,MODULES_PATH "lib%s.so",libname); handle = dlopen(temp,RTLD_LAZY); free(temp); if (handle == NULL) { /* Try with the .so extension */ if ((temp = (char *) malloc(strlen(libname)+7)) == NULL) return NULL; strcpy(temp,"lib"); strcat(temp,libname); strcat(temp,".so"); handle = dlopen(temp,RTLD_LAZY); #ifdef notdef printf( "dlopen(%s) error: %s\n", temp, dlerror() ); #endif free(temp); } return handle; #endif } /* ------------------------------------------------- ecs_GetDynamicLibFunction: Initialise a pointer to a function in the dynamic library. IN: handle : A link to dynamic library initialized by ecs_OpenDynamicLib functionname: A string with the function name OUT: void *: A pointer to the function. If NULL, an error append during this operation. ------------------------------------------------- */ void *ecs_GetDynamicLibFunction(handle,functionname) void *handle; char *functionname; { void *function; #ifndef _WINDOWS char *temp; #endif /* If the handle is NULL, return NULL */ if (handle == NULL) return NULL; #ifdef _WINDOWS function = (void *) GetProcAddress((HINSTANCE) handle, functionname); #else function = (void *) dlsym(handle, functionname); if (function == NULL) { /* try with an underscore before the function name */ temp = (char *) malloc(strlen(functionname)+2); if (temp == NULL) return NULL; strcpy(temp,"_"); strcat(temp,functionname); function = (void *) dlsym(handle, functionname); free(temp); } #endif return (void *) function; } /* ------------------------------------------------- ecs_CloseDynamicLib: Open a dynamic link IN: handle : A link to dynamic library initialized by ecs_OpenDynamicLib ------------------------------------------------- */ void ecs_CloseDynamicLib(handle) void *handle; { /* If the handle is NULL, end this operation */ if (handle == NULL) return; #ifdef _WINDOWS FreeLibrary((HINSTANCE) handle); #else dlclose(handle); #endif handle = NULL; return; } ogdi-ogdi_4_1_0/ogdi/c-api/ecs_xdr.c000066400000000000000000000351161345660466700173370ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" #include bool_t xdr_ecs_Family(register XDR *xdrs, ecs_Family *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Region(register XDR *xdrs, ecs_Region *objp) { // register long *buf; if (!xdr_double(xdrs, &objp->north)) return (FALSE); if (!xdr_double(xdrs, &objp->south)) return (FALSE); if (!xdr_double(xdrs, &objp->east)) return (FALSE); if (!xdr_double(xdrs, &objp->west)) return (FALSE); if (!xdr_double(xdrs, &objp->ns_res)) return (FALSE); if (!xdr_double(xdrs, &objp->ew_res)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Resampling(register XDR *xdrs, ecs_Resampling *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Transformation(register XDR *xdrs, ecs_Transformation *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_RasterConversion(register XDR *xdrs, ecs_RasterConversion *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->coef.coef_val, (u_int *) &objp->coef.coef_len, ~0, sizeof (double), (xdrproc_t) xdr_double)) return (FALSE); if (!xdr_ecs_Resampling(xdrs, &objp->r_method)) return (FALSE); if (!xdr_ecs_Transformation(xdrs, &objp->t_method)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Coordinate(register XDR *xdrs, ecs_Coordinate *objp) { // register long *buf; if (!xdr_double(xdrs, &objp->x)) return (FALSE); if (!xdr_double(xdrs, &objp->y)) return (FALSE); return (TRUE); } bool_t xdr_ecs_FeatureRing(register XDR *xdrs, ecs_FeatureRing *objp) { // register long *buf; if (!xdr_ecs_Coordinate(xdrs, &objp->centroid)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Area(register XDR *xdrs, ecs_Area *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->ring.ring_val, (u_int *) &objp->ring.ring_len, ~0, sizeof (ecs_FeatureRing), (xdrproc_t) xdr_ecs_FeatureRing)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Line(register XDR *xdrs, ecs_Line *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Point(register XDR *xdrs, ecs_Point *objp) { // register long *buf; if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Matrix(register XDR *xdrs, ecs_Matrix *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->x.x_val, (u_int *) &objp->x.x_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Image(register XDR *xdrs, ecs_Image *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->x.x_val, (u_int *) &objp->x.x_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Text(register XDR *xdrs, ecs_Text *objp) { // register long *buf; if (!xdr_string(xdrs, &objp->desc, ~0)) return (FALSE); if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Node(register XDR *xdrs, ecs_Node *objp) { // register long *buf; if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->containfaceid)) return (FALSE); if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Edge(register XDR *xdrs, ecs_Edge *objp) { register int *buf; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); } else { ogdi_IXDR_PUT_LONG(buf, objp->id); ogdi_IXDR_PUT_LONG(buf, objp->startnodeid); ogdi_IXDR_PUT_LONG(buf, objp->endnodeid); ogdi_IXDR_PUT_LONG(buf, objp->rightfaceid); ogdi_IXDR_PUT_LONG(buf, objp->leftfaceid); ogdi_IXDR_PUT_LONG(buf, objp->rightfedgeid); ogdi_IXDR_PUT_LONG(buf, objp->leftfedgeid); } if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); } else { objp->id = IXDR_GET_LONG(buf); objp->startnodeid = IXDR_GET_LONG(buf); objp->endnodeid = IXDR_GET_LONG(buf); objp->rightfaceid = IXDR_GET_LONG(buf); objp->leftfaceid = IXDR_GET_LONG(buf); objp->rightfedgeid = IXDR_GET_LONG(buf); objp->leftfedgeid = IXDR_GET_LONG(buf); } if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_TopoLevel(register XDR *xdrs, ecs_TopoLevel *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Face(register XDR *xdrs, ecs_Face *objp) { // register long *buf; if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->edgeid.edgeid_val, (u_int *) &objp->edgeid.edgeid_len, ~0, sizeof (int), (xdrproc_t) xdr_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_AreaPrim(register XDR *xdrs, ecs_AreaPrim *objp) { // register long *buf; if (!xdr_ecs_TopoLevel(xdrs, &objp->level)) return (FALSE); switch (objp->level) { case Level012: if (!xdr_array(xdrs, (char **)&objp->ecs_AreaPrim_u.edgeid.edgeid_val, (u_int *) &objp->ecs_AreaPrim_u.edgeid.edgeid_len, ~0, sizeof (int), (xdrproc_t) xdr_int)) return (FALSE); break; case Level3: if (!xdr_array(xdrs, (char **)&objp->ecs_AreaPrim_u.fedgeid.fedgeid_val, (u_int *) &objp->ecs_AreaPrim_u.fedgeid.fedgeid_len, ~0, sizeof (ecs_Face), (xdrproc_t) xdr_ecs_Face)) return (FALSE); break; } return (TRUE); } bool_t xdr_ecs_Geometry(register XDR *xdrs, ecs_Geometry *objp) { // register long *buf; if (!xdr_ecs_Family(xdrs, &objp->family)) return (FALSE); switch (objp->family) { case Area: if (!xdr_ecs_Area(xdrs, &objp->ecs_Geometry_u.area)) return (FALSE); break; case Line: if (!xdr_ecs_Line(xdrs, &objp->ecs_Geometry_u.line)) return (FALSE); break; case Point: if (!xdr_ecs_Point(xdrs, &objp->ecs_Geometry_u.point)) return (FALSE); break; case Matrix: if (!xdr_ecs_Matrix(xdrs, &objp->ecs_Geometry_u.matrix)) return (FALSE); break; case Image: if (!xdr_ecs_Image(xdrs, &objp->ecs_Geometry_u.image)) return (FALSE); break; case Text: if (!xdr_ecs_Text(xdrs, &objp->ecs_Geometry_u.text)) return (FALSE); break; case Node: if (!xdr_ecs_Node(xdrs, &objp->ecs_Geometry_u.node)) return (FALSE); break; case Edge: if (!xdr_ecs_Edge(xdrs, &objp->ecs_Geometry_u.edge)) return (FALSE); break; case Ring: if (!xdr_ecs_AreaPrim(xdrs, &objp->ecs_Geometry_u.ring)) return (FALSE); break; case Face: break; } return (TRUE); } bool_t xdr_ecs_Object(register XDR *xdrs, ecs_Object *objp) { // register long *buf; if (!xdr_string(xdrs, &objp->Id, ~0)) return (FALSE); if (!xdr_ecs_Geometry(xdrs, &objp->geom)) return (FALSE); if (!xdr_string(xdrs, &objp->attr, ~0)) return (FALSE); if (!xdr_double(xdrs, &objp->xmin)) return (FALSE); if (!xdr_double(xdrs, &objp->ymin)) return (FALSE); if (!xdr_double(xdrs, &objp->xmax)) return (FALSE); if (!xdr_double(xdrs, &objp->ymax)) return (FALSE); return (TRUE); } bool_t xdr_ecs_AttributeFormat(register XDR *xdrs, ecs_AttributeFormat *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ObjAttribute(register XDR *xdrs, ecs_ObjAttribute *objp) { // register long *buf; if (!xdr_string(xdrs, &objp->name, ~0)) return (FALSE); if (!xdr_ecs_AttributeFormat(xdrs, &objp->type)) return (FALSE); if (!xdr_int(xdrs, &objp->lenght)) return (FALSE); if (!xdr_int(xdrs, &objp->precision)) return (FALSE); if (!xdr_int(xdrs, &objp->nullable)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ObjAttributeFormat(register XDR *xdrs, ecs_ObjAttributeFormat *objp) { // register long *buf; if (!xdr_array(xdrs, (char **)&objp->oa.oa_val, (u_int *) &objp->oa.oa_len, ~0, sizeof (ecs_ObjAttribute), (xdrproc_t) xdr_ecs_ObjAttribute)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Category(register XDR *xdrs, ecs_Category *objp) { // register long *buf; if (!xdr_long(xdrs, &objp->no_cat)) return (FALSE); if (!xdr_u_int(xdrs, &objp->r)) return (FALSE); if (!xdr_u_int(xdrs, &objp->g)) return (FALSE); if (!xdr_u_int(xdrs, &objp->b)) return (FALSE); if (!xdr_string(xdrs, &objp->label, ~0)) return (FALSE); if (!xdr_u_long(xdrs, &objp->qty)) return (FALSE); return (TRUE); } bool_t xdr_ecs_RasterInfo(register XDR *xdrs, ecs_RasterInfo *objp) { // register long *buf; if (!xdr_long(xdrs, &objp->mincat)) return (FALSE); if (!xdr_long(xdrs, &objp->maxcat)) return (FALSE); if (!xdr_int(xdrs, &objp->width)) return (FALSE); if (!xdr_int(xdrs, &objp->height)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->cat.cat_val, (u_int *) &objp->cat.cat_len, ~0, sizeof (ecs_Category), (xdrproc_t) xdr_ecs_Category)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Compression(register XDR *xdrs, ecs_Compression *objp) { register int *buf; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int(xdrs, &objp->cachesize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->ctype)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cversion)) return (FALSE); if (!xdr_u_int(xdrs, &objp->clevel)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cblksize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cfullsize)) return (FALSE); } else { ogdi_IXDR_PUT_U_LONG(buf, objp->cachesize); ogdi_IXDR_PUT_U_LONG(buf, objp->ctype); ogdi_IXDR_PUT_U_LONG(buf, objp->cversion); ogdi_IXDR_PUT_U_LONG(buf, objp->clevel); ogdi_IXDR_PUT_U_LONG(buf, objp->cblksize); ogdi_IXDR_PUT_U_LONG(buf, objp->cfullsize); } return (TRUE); } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_u_int(xdrs, &objp->cachesize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->ctype)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cversion)) return (FALSE); if (!xdr_u_int(xdrs, &objp->clevel)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cblksize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cfullsize)) return (FALSE); } else { objp->cachesize = IXDR_GET_U_LONG(buf); objp->ctype = IXDR_GET_U_LONG(buf); objp->cversion = IXDR_GET_U_LONG(buf); objp->clevel = IXDR_GET_U_LONG(buf); objp->cblksize = IXDR_GET_U_LONG(buf); objp->cfullsize = IXDR_GET_U_LONG(buf); } return (TRUE); } if (!xdr_u_int(xdrs, &objp->cachesize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->ctype)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cversion)) return (FALSE); if (!xdr_u_int(xdrs, &objp->clevel)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cblksize)) return (FALSE); if (!xdr_u_int(xdrs, &objp->cfullsize)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ResultType(register XDR *xdrs, ecs_ResultType *objp) { // register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ResultUnion(register XDR *xdrs, ecs_ResultUnion *objp) { // register long *buf; if (!xdr_ecs_ResultType(xdrs, &objp->type)) return (FALSE); switch (objp->type) { case Object: if (!xdr_ecs_Object(xdrs, &objp->ecs_ResultUnion_u.dob)) return (FALSE); break; case GeoRegion: if (!xdr_ecs_Region(xdrs, &objp->ecs_ResultUnion_u.gr)) return (FALSE); break; case objAttributeFormat: if (!xdr_ecs_ObjAttributeFormat(xdrs, &objp->ecs_ResultUnion_u.oaf)) return (FALSE); break; case RasterInfo: if (!xdr_ecs_RasterInfo(xdrs, &objp->ecs_ResultUnion_u.ri)) return (FALSE); break; case AText: if (!xdr_string(xdrs, &objp->ecs_ResultUnion_u.s, ~0)) return (FALSE); break; case MultiResult: if (!xdr_array(xdrs, (char **)&objp->ecs_ResultUnion_u.results.results_val, (u_int *) &objp->ecs_ResultUnion_u.results.results_len, ~0, sizeof (ecs_ResultUnion), (xdrproc_t) xdr_ecs_ResultUnion)) return (FALSE); break; case SimpleError: break; } return (TRUE); } bool_t xdr_ecs_Result_Work(register XDR *xdrs, ecs_Result *objp) { // register long *buf; if (!xdr_int(xdrs, &objp->error)) return (FALSE); if (!xdr_string(xdrs, &objp->message, ~0)) return (FALSE); if (!xdr_ecs_ResultUnion(xdrs, &objp->res)) return (FALSE); return (TRUE); } bool_t xdr_ecs_LayerSelection(register XDR *xdrs, ecs_LayerSelection *objp) { // register long *buf; if (!xdr_string(xdrs, &objp->Select, ~0)) return (FALSE); if (!xdr_ecs_Family(xdrs, &objp->F)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ProxyCreateServer(register XDR *xdrs, ecs_ProxyCreateServer *objp) { // register long *buf; if (!xdr_string(xdrs, &objp->server_name, ~0)) return (FALSE); if (!xdr_string(xdrs, &objp->server_url, ~0)) return (FALSE); return (TRUE); } ogdi-ogdi_4_1_0/ogdi/c-api/ecs_xdrz.c000066400000000000000000000165541345660466700175360ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: RPC/XDR support code for handling result values. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.4 2007-02-12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.3 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include #include #include "ecs.h" #include "zlib.h" ECS_CVSID("$Id$"); /* Variables used for compression/decompression routines */ static void *obuf = NULL; static unsigned int obufsize = 0; static int enough = 0; extern bool_t xdr_ecs_Result_Work(XDR *xdrs, ecs_Result *objp); bool_t xdr_ecs_Result_Free(XDR *xdrs, ecs_Result *objp) { if (objp->compression.ctype == ECS_COMPRESS_NONE) { return xdr_ecs_Result_Work(xdrs, objp); } if (objp->compression.ctype != ECS_COMPRESS_ZLIB) { return (FALSE); } if (objp->compression.cblksize != 0) { return xdr_ecs_Result_Work(xdrs, objp); } return (TRUE); } bool_t xdr_ecs_Result_Decode(XDR *xdrs, ecs_Result *objp) { XDR mem_xdrs; void *zbuf; z_stream z; int status; unsigned int size; if (!xdr_u_int(xdrs, &objp->compression.cfullsize)) { return FALSE; } if (objp->compression.ctype == ECS_COMPRESS_NONE) { return xdr_ecs_Result_Work(xdrs, objp); } if (objp->compression.ctype != ECS_COMPRESS_ZLIB) { return (FALSE); } if (objp->compression.cblksize == 0) { return xdr_ecs_Result_Work(xdrs, objp); } if (obufsize < objp->compression.cfullsize) { free(obuf); obuf = malloc(objp->compression.cfullsize); if (obuf == NULL) { obufsize = 0; return (FALSE); } obufsize = objp->compression.cfullsize; } zbuf = malloc(objp->compression.cblksize); if (zbuf == NULL) { return (FALSE); } /* * First, read in the compressed data and decompress into obuf */ xdrmem_create(&mem_xdrs, obuf, objp->compression.cfullsize, XDR_DECODE); z.zalloc = NULL; z.zfree = NULL; z.opaque = NULL; if (inflateInit(&z) != Z_OK) { free(zbuf); return (FALSE); } z.next_out = obuf; z.avail_out = objp->compression.cfullsize; do { if (! xdr_bytes(xdrs, (char **) &zbuf, &size, objp->compression.cblksize)) { xdr_destroy(&mem_xdrs); return (FALSE); } z.next_in = zbuf; z.avail_in = objp->compression.cblksize; status = inflate(&z, Z_NO_FLUSH); xdrs->x_op = XDR_FREE; xdr_bytes(xdrs, (char **) &zbuf, &size, objp->compression.cblksize); xdrs->x_op = XDR_DECODE; if (status != Z_OK) { break; } } while (size == (int) objp->compression.cblksize); do { status = inflate(&z, Z_FINISH); } while (status == Z_OK); /* * Now, there should be a decompressed data stream in obuf. * Run the standard xdr routines using a memory xdr now. */ inflateEnd(&z); free(zbuf); xdr_destroy(&mem_xdrs); xdrmem_create(&mem_xdrs, obuf, objp->compression.cfullsize, XDR_DECODE); status = xdr_ecs_Result_Work(&mem_xdrs, objp); xdr_destroy(&mem_xdrs); return status; } bool_t xdr_ecs_Result_Encode(XDR *xdrs, ecs_Result *objp) { XDR mem_xdrs; int attempts; void *zbuf; z_stream z; unsigned int count; int status; if (objp->compression.ctype == ECS_COMPRESS_NONE) { if (!xdr_u_int(xdrs, &objp->compression.cfullsize)) { return FALSE; } return xdr_ecs_Result_Work(xdrs, objp); } if (objp->compression.ctype != ECS_COMPRESS_ZLIB) { return (FALSE); } if (objp->compression.cblksize == 0) { if (!xdr_u_int(xdrs, &objp->compression.cfullsize)) { return FALSE; } return xdr_ecs_Result_Work(xdrs, objp); } attempts = 0; while (attempts < 7) { if (enough == 0) { obufsize = obufsize * 2 + 200000; if (obuf) free(obuf); obuf = malloc(obufsize); if (obuf == NULL) { obufsize = 0; return (FALSE); } } if (attempts > 0) { xdr_destroy(&mem_xdrs); } xdrmem_create(&mem_xdrs, obuf, obufsize, XDR_ENCODE); enough = xdr_ecs_Result_Work(&mem_xdrs, objp); if (enough) { break; } attempts++; } if (! enough) { xdr_destroy(&mem_xdrs); free(obuf); obuf = NULL; return (FALSE); } zbuf = malloc(objp->compression.cblksize); if (zbuf == NULL) { xdr_destroy(&mem_xdrs); return (FALSE); } objp->compression.cfullsize = XDR_GETPOS(&mem_xdrs); if (!xdr_u_int(xdrs, &objp->compression.cfullsize)) { xdr_destroy(&mem_xdrs); return FALSE; } /* * Basic algorithm is this: call the compress routine until * the output buffer has filled up with compression.cblksize * bytes. Then write these bytes out with XDR_PUT_BYTES(). * Continue doing this until there are no more bytes left. * The final block must be less than compression.cblksize bytes. * If it is exactly equal to compression.cblksize bytes, then * a final 0 length block needs to be sent with XDR_PUT_BYTES(). */ z.zalloc = NULL; z.zfree = NULL; z.opaque = NULL; if (deflateInit(&z, objp->compression.clevel) != Z_OK) { xdr_destroy(&mem_xdrs); free(zbuf); return (FALSE); } z.next_in = obuf; z.avail_in = objp->compression.cfullsize; while (1) { z.next_out = zbuf; z.avail_out = objp->compression.cblksize; status = deflate(&z, Z_NO_FLUSH); count = objp->compression.cblksize - z.avail_out; if ((status != Z_OK) || (count < (int)objp->compression.cblksize)) { break; } xdr_bytes(xdrs, (char **) &zbuf, &count, objp->compression.cblksize); } while (1) { status = deflate(&z, Z_FINISH); count = objp->compression.cblksize - z.avail_out; if ((status != Z_OK) || (count < (int) objp->compression.cblksize)) { xdr_bytes(xdrs, (char **) &zbuf, &count, objp->compression.cblksize); if (count == (int) objp->compression.cblksize) { count = 0; xdr_bytes(xdrs, (char **) &zbuf, &count, objp->compression.cblksize); } break; } xdr_bytes(xdrs, (char **) &zbuf, &count, objp->compression.cblksize); z.next_out = zbuf; z.avail_out = objp->compression.cblksize; } deflateEnd(&z); free(zbuf); xdr_destroy(&mem_xdrs); return (TRUE); } bool_t xdr_ecs_Result(XDR *xdrs, ecs_Result *objp) { if (!xdr_u_int(xdrs, &objp->compression.cachesize)) { return FALSE; } if (!xdr_u_int(xdrs, &objp->compression.ctype)) { return FALSE; } if (!xdr_u_int(xdrs, &objp->compression.cversion)) { return FALSE; } if (!xdr_u_int(xdrs, &objp->compression.cblksize)) { return FALSE; } if (xdrs->x_op == XDR_ENCODE) { return xdr_ecs_Result_Encode(xdrs, objp); } else if (xdrs->x_op == XDR_DECODE) { return xdr_ecs_Result_Decode(xdrs, objp); } else { return xdr_ecs_Result_Free(xdrs, objp); } } ogdi-ogdi_4_1_0/ogdi/c-api/ecsassoc.c000066400000000000000000001627671345660466700175300ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Code encapsulating memory allocation, and association of the * structure ecs_Result. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.6 2016-07-06 08:59:46 erouault * ecs_SetError(): display error message on stderr if memory allocation fails * * Revision 1.5 2016/07/04 17:33:49 erouault * Also export ecs_ShouldStopOnError and ecs_SetErrorShouldStop on Windows * * Revision 1.4 2016/07/04 17:03:12 erouault * Error handling: Add a ecs_SetErrorShouldStop() function that can be * used internally when the code is able to recover from an error. The user * may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO * as environment variable (the default being YES: stop on error). * Add a ecs_SetReportErrorFunction() method to install a custom callback that * will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still * aware of errors that occured. If not defined, the error will be logged in stderr. * * Revision 1.3 2016/06/28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.2 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); char memory_error[] = "not enough memory"; #define ALLOCNULLSTRING(p) \ if (p==NULL) { \ if ((p = malloc(1)) != NULL) { \ p[0] = '\0'; \ } \ } /* ---------------------------------------------------------------------- ecs_assoc: The ecsassoc library encapsulate memory allocation and association of the structure ecs_Result. This structure is use to send complex information to client without major concern from the server. Each of these method work exactly the same way. They receive an information to add in the ecs_Result and the information is add in ecs_Result. If an error occur during this operation, the functions will return an error code (FALSE). Otherwise, the function end the operation and return TRUE. It is important to handle the error code in the calling code, a quick return must be done in these cases. There is no need from the calling function to call SetError if an error append during association, an error code is automatically set and ready to be sent to client. ---------------------------------------------------------------------- */ /*************************************************/ /* ---------------------------------------------------------------------- ecs_SetError Set an error code and a message into ecs_Result. This function will not reinitialize the ecs_Result structure. IN int errorcode: Error code to assign to ecs_Result. Usually 1. 0 mean a success message. char *error_message: The error message to assign to ecs_Result. Could be a null value. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetError (r,errorcode,error_message) ecs_Result *r; int errorcode; char *error_message; { r->error = errorcode; r->res.type = SimpleError; if (r->message != NULL) free(r->message); if (error_message == NULL) { r->message = NULL; } else { r->message = (char *) malloc(strlen(error_message)+1); if (r->message == NULL) { fprintf(stderr, "Not enough memory in ecs_SetError(): %s\n", error_message); return FALSE; } strcpy(r->message,error_message); } ecs_AdjustResult(r); return TRUE; } /************************************************************************/ /* ecs_ShouldStopOnError() */ /************************************************************************/ int ecs_ShouldStopOnError() { const char* pszStopOnError = getenv("OGDI_STOP_ON_ERROR"); if( pszStopOnError == NULL ) return TRUE; if( strcmp(pszStopOnError, "yes") == 0 || strcmp(pszStopOnError, "YES") == 0 ) { return TRUE; } else if( strcmp(pszStopOnError, "no") == 0 || strcmp(pszStopOnError, "NO") == 0 ) { return FALSE; } else { fprintf(stderr, "Unhandled value for OGDI_STOP_ON_ERROR = %s. " "Considering it is YES\n", pszStopOnError); return TRUE; } } /************************************************************************/ /* ecs_ShouldStopOnError() */ /************************************************************************/ static int ecs_DefaultReportError(int errorcode, const char *error_message) { fprintf(stderr, "Error %d: %s\n", errorcode, error_message); return FALSE; /* go on */ } /************************************************************************/ /* ecs_SetReportErrorFunction() */ /************************************************************************/ static ReportErrorType pfnReportError = ecs_DefaultReportError; /* Installs a custom error handler and returns the previous one */ ReportErrorType ecs_SetReportErrorFunction(ReportErrorType pfn) { ReportErrorType oldErrorFunc = pfnReportError; pfnReportError = pfn; return oldErrorFunc; } /************************************************************************/ /* ecs_SetErrorShouldStop() */ /************************************************************************/ /* ecs_SetErrorShouldStop() is a variant of ecs_SetError() that can be used */ /* when the error can be recovered. By default it will be considered as non */ /* recoverable, and thus return TRUE, and regular ecs_SetError() will be used. */ /* But the user may have installed its own error handler with */ /* ecs_SetReportErrorFunction() and decide of the appropriate behaviour */ int ecs_SetErrorShouldStop (r,errorcode,error_message) ecs_Result *r; int errorcode; char *error_message; { if( ecs_ShouldStopOnError() ) { ecs_SetError(r,errorcode,error_message); return TRUE; } else { return pfnReportError(errorcode,error_message); } } /* ---------------------------------------------------------------------- ecs_Success Set an success code and flush the error message previously set. This function will not reinitialize the ecs_Result structure. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetSuccess (r) ecs_Result *r; { r->error = 0; if (r->message != NULL) free(r->message); r->message = NULL; ecs_AdjustResult(r); return TRUE; } /* ---------------------------------------------------------------------- ecs_AdjustResult This function is there to correct a deficiency of RPC about data strings. If a string in ecs_Result is NULL, the software will crash. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_AdjustResult (r) ecs_Result *r; { int val,i; ALLOCNULLSTRING(r->message); switch(r->res.type) { case Object: { ALLOCNULLSTRING(ECSRESULT(r).dob.Id); ALLOCNULLSTRING(ECSRESULT(r).dob.attr); if (ECSGEOMTYPE(r) == Text) { ALLOCNULLSTRING(ECSGEOM(r).text.desc); } }; break; case objAttributeFormat: { val = ECSRESULT(r).oaf.oa.oa_len; if (ECSRESULT(r).oaf.oa.oa_val != NULL) { for(i=0;ires.type == Object) { if (r->res.ecs_ResultUnion_u.dob.Id != NULL) free(r->res.ecs_ResultUnion_u.dob.Id); r->res.ecs_ResultUnion_u.dob.Id = (char *) malloc(strlen(id)+1); if (r->res.ecs_ResultUnion_u.dob.Id == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(r->res.ecs_ResultUnion_u.dob.Id,id); } return TRUE; } /* ---------------------------------------------------------------------- ecs_SetObjectAttr Set the attribute attr in object. Before calling this function, the caller must call ecs_SetGeomText, ecs_SetGeomPoint, ecs_SetGeomLine, ecs_SetGeomArea, ecs_SetGeomMatrix or ecs_SetGeomImage to initialize the geographic object. IN char *attr: This string contain the attribute to set. This argument must be different than NULL. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetObjectAttr (r,attr) ecs_Result *r; char *attr; { if (r->res.type == Object) { if (r->res.ecs_ResultUnion_u.dob.attr != NULL) free(r->res.ecs_ResultUnion_u.dob.attr); r->res.ecs_ResultUnion_u.dob.attr = (char *) malloc(strlen(attr)+1); if (r->res.ecs_ResultUnion_u.dob.attr == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(r->res.ecs_ResultUnion_u.dob.attr,attr); } return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeoRegion Set the geographic region. This function will make a clean up of ecs_Result and perform his operation. IN double north, south, east, west, ns_res, ew_res: Geographic region to set. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeoRegion (r,north,south,east,west,ns_res,ew_res) ecs_Result *r; double north; double south; double east; double west; double ns_res; double ew_res; { ecs_CleanUp(r); ECSRESULTTYPE(r) = GeoRegion; ECSRESULT(r).gr.north = north; ECSRESULT(r).gr.south = south; ECSRESULT(r).gr.east = east; ECSRESULT(r).gr.west = west; ECSRESULT(r).gr.ns_res = ns_res; ECSRESULT(r).gr.ew_res = ew_res; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetText Set the Atext item with a string. This function will make a clean up of ecs_Result and perform his operation. IN char *text: Text to set in the structure IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetText (r,text) ecs_Result *r; char *text; { ecs_CleanUp(r); ECSRESULTTYPE(r) = AText; ECSRESULT(r).s = (char *) malloc(strlen(text)+1); if (ECSRESULT(r).s == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(ECSRESULT(r).s, text); return TRUE; } /* ---------------------------------------------------------------------- ecs_AddText Concatenate a text to Atext item. The function ecs_SetText must be call before. IN char *text: Text to concatanate IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_AddText (r,text) ecs_Result *r; char *text; { char *temp; int code; temp = ECSRESULT(r).s; code = TRUE; if ((ECSRESULTTYPE(r) == AText) && (temp != NULL)) { ECSRESULT(r).s = NULL; ECSRESULT(r).s = (char *) malloc(strlen(text)+strlen(temp)+1); if (ECSRESULT(r).s == NULL) { ECSRESULT(r).s = temp; ecs_SetError(r,1,memory_error); return FALSE; } strcpy(ECSRESULT(r).s, temp); strcat(ECSRESULT(r).s, text); free(temp); } else { code = ecs_SetText(r,text); } return code; } /* ---------------------------------------------------------------------- Set the RasterInfo attribute. This function will make a clean up of ecs_Result and perform his operation. IN int width, height: Width and height of the raster IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetRasterInfo (r,width,height) ecs_Result *r; int width; int height; { ecs_CleanUp(r); ECSRESULTTYPE(r) = RasterInfo; /* It is impossible to have maxcat < mincat. In this case, ecs_AddRasterInfoCategory will set both values with the first value. */ ECSRESULT(r).ri.mincat = 1; ECSRESULT(r).ri.maxcat = 0; ECSRESULT(r).ri.width = width; ECSRESULT(r).ri.height = height; ECSRESULT(r).ri.cat.cat_len = 0; ECSRESULT(r).ri.cat.cat_val = NULL; return TRUE; } /*************************************************/ /* ---------------------------------------------------------------------- ecs_AddRasterInfoCategory Add a raster info category. Must be called after ecs_SetRasterInfo IN long no_cat: Category number unsigned int red,green,blue: Color of the category char *label: Label of the category unsigned long qty: Statistical informations about the raster. (How many points) IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_AddRasterInfoCategory (r,no_cat,red,green,blue,label,qty) ecs_Result *r; long no_cat; unsigned int red; unsigned int green; unsigned int blue; char *label; unsigned long qty; { ecs_Category *ptr; /* Allocate a new category */ ECSRESULT(r).ri.cat.cat_val = (ecs_Category *) realloc(ECSRESULT(r).ri.cat.cat_val, sizeof(ecs_Category)*(ECSRESULT(r).ri.cat.cat_len + 1)); if (ECSRESULT(r).ri.cat.cat_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } ECSRESULT(r).ri.cat.cat_len++; ptr = &(ECSRESULT(r).ri.cat.cat_val[ECSRESULT(r).ri.cat.cat_len - 1]); /* Update mincat and maxcat with no_cat */ if (ECSRESULT(r).ri.mincat > ECSRESULT(r).ri.maxcat) { ECSRESULT(r).ri.mincat = no_cat; ECSRESULT(r).ri.maxcat = no_cat; } else { if (ECSRESULT(r).ri.mincat > no_cat) ECSRESULT(r).ri.mincat = no_cat; if (ECSRESULT(r).ri.maxcat < no_cat) ECSRESULT(r).ri.maxcat = no_cat; } ptr->no_cat = no_cat; ptr->r = red; ptr->g = green; ptr->b = blue; ptr->label = (char *) malloc(strlen(label)+1); if (ptr->label == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(ptr->label,label); ptr->qty = qty; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetObjAttributeFormat Set the objAttributeFormat attribute. This function will make a clean up of ecs_Result and perform his operation. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetObjAttributeFormat (r) ecs_Result *r; { ecs_CleanUp(r); ECSRESULTTYPE(r) = objAttributeFormat; ECSRESULT(r).oaf.oa.oa_len = 0; ECSRESULT(r).oaf.oa.oa_val = NULL; return TRUE; } /* ---------------------------------------------------------------------- ecs_AddAttributeFormat Add an attribute format to objAttributeFormat attribute IN char *name: Name of the attribute ecs_AttributeFormat type: int lenght : Attribute format info int precision : (ODBC) int nullable : IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_AddAttributeFormat (r,name,type,lenght,precision,nullable) ecs_Result *r; char *name; ecs_AttributeFormat type; int lenght; int precision; int nullable; { ecs_ObjAttribute *ptr; /* Allocate a new attribute */ ECSRESULT(r).oaf.oa.oa_val = (ecs_ObjAttribute *) realloc(ECSRESULT(r).oaf.oa.oa_val, sizeof(ecs_ObjAttribute)*(ECSRESULT(r).oaf.oa.oa_len + 1)); if (ECSRESULT(r).oaf.oa.oa_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } ECSRESULT(r).oaf.oa.oa_len++; ptr = &(ECSRESULT(r).oaf.oa.oa_val[ECSRESULT(r).oaf.oa.oa_len - 1]); ptr->name = (char *) malloc(strlen(name)+1); if (ptr->name == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(ptr->name,name); ptr->type = type; ptr->lenght = lenght; ptr->precision = precision; ptr->nullable = nullable; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomPoint Set a point geographical object. This function will make a clean up of ecs_Result and perform his operation. IN double x,y : Point to assign IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomPoint (r,x,y) ecs_Result *r; double x; double y; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Point; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).point.c.x = x; ECSGEOM(r).point.c.y = y; r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomText Set a text geographical object. This function will make a clean up of ecs_Result and perform his operation. IN double x,y : Position of the text char *desc: Description string IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomText (r,x,y,desc) ecs_Result *r; double x; double y; char *desc; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Text; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).text.c.x = x; ECSGEOM(r).text.c.y = y; r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; if (desc != NULL) { ECSGEOM(r).text.desc = (char *) malloc(strlen(desc)+1); if (ECSGEOM(r).text.desc == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } strcpy(ECSGEOM(r).text.desc,desc); } else { ECSGEOM(r).text.desc = NULL; } return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomLine Set a line geographical object. This function will make a clean up of ecs_Result and perform his operation. IN unsigned int lenght : Number of points in Polyline IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomLine (r,lenght) ecs_Result *r; unsigned int lenght; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Line; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; ECSGEOM(r).line.c.c_len = lenght; ECSGEOM(r).line.c.c_val = (ecs_Coordinate *) malloc(sizeof(ecs_Coordinate)*lenght); if (ECSGEOM(r).line.c.c_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomArea Set a area geographical object. This function will make a clean up of ecs_Result and perform his operation. IN unsigned int lenght : Number of rings in this area IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomArea (r,lenght) ecs_Result *r; unsigned int lenght; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Area; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; ECSGEOM(r).area.ring.ring_len = lenght; ECSGEOM(r).area.ring.ring_val = (ecs_FeatureRing *) malloc(sizeof(ecs_FeatureRing)*lenght); if (ECSGEOM(r).line.c.c_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } return TRUE; } /*************************************************/ /* ---------------------------------------------------------------------- ecs_SetGeomAreaRing Set a ring into an area object. IN int position: Position in ring table unsigned int lenght: Number of points in the ring double centroid_x: double centroid_y: Centroid of the ring IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomAreaRing (r,position,lenght,centroid_x,centroid_y) ecs_Result *r; int position; unsigned int lenght; double centroid_x; double centroid_y; { ecs_FeatureRing *ptr; ptr = &(ECSGEOM(r).area.ring.ring_val[position]); ptr->centroid.x = centroid_x; ptr->centroid.y = centroid_y; ptr->c.c_len = lenght; ptr->c.c_val = (ecs_Coordinate *) malloc(sizeof(ecs_Coordinate)*lenght); if (ptr->c.c_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomMatrixWithArray Set a matrix geographical object with a array of unsigned int already allocated. This function will make a clean up of ecs_Result and perform his operation. IN int size: Size of array unsigned int *array: Table of values IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomMatrixWithArray (r, size, array) ecs_Result *r; int size; unsigned int *array; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Matrix; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).matrix.x.x_len = size; ECSGEOM(r).matrix.x.x_val = (u_int *) malloc(sizeof(u_int)*size); if (ECSGEOM(r).matrix.x.x_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } memcpy(ECSGEOM(r).matrix.x.x_val,array,sizeof(u_int)*size); r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomMatrix Set a matrix geographical object. This function will make a clean up of ecs_Result and perform his operation. IN int size: Number of colums in this raster row IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomMatrix (r, size) ecs_Result *r; int size; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Matrix; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).matrix.x.x_len = size; ECSGEOM(r).matrix.x.x_val = (u_int *) malloc(sizeof(u_int)*size); if (ECSGEOM(r).matrix.x.x_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomImageWithArray Set a image geographical object with a array of unsigned int already allocated. This function will make a clean up of ecs_Result and perform his operation. IN int size: Size of array unsigned int *array: Table of values IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomImageWithArray (r, size, array) ecs_Result *r; int size; unsigned int *array; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Image; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).image.x.x_len = size; ECSGEOM(r).image.x.x_val = (u_int *) malloc(sizeof(u_int)*size); if (ECSGEOM(r).image.x.x_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } memcpy(ECSGEOM(r).image.x.x_val,array,sizeof(u_int)*size); r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; return TRUE; } /* ---------------------------------------------------------------------- ecs_SetGeomImage Set a image geographical object. This function will make a clean up of ecs_Result and perform his operation. IN int size: Number of colums in this raster row IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_SetGeomImage(r, size) ecs_Result *r; int size; { ecs_CleanUp(r); ECSRESULTTYPE(r) = Object; ECSGEOMTYPE(r) = Image; r->res.ecs_ResultUnion_u.dob.Id = NULL; r->res.ecs_ResultUnion_u.dob.attr = NULL; ECSGEOM(r).image.x.x_len = size; ECSGEOM(r).image.x.x_val = (u_int *) malloc(sizeof(u_int)*size); if (ECSGEOM(r).image.x.x_val == NULL) { ecs_SetError(r,1,memory_error); return FALSE; } r->res.ecs_ResultUnion_u.dob.xmin = 0.0; r->res.ecs_ResultUnion_u.dob.ymin = 0.0; r->res.ecs_ResultUnion_u.dob.xmax = 0.0; r->res.ecs_ResultUnion_u.dob.ymax = 0.0; return TRUE; } /* ---------------------------------------------------------------------- ecs_CleanUp Will make a complete clean up and reinitialisation of ecs_Result. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_CleanUp (r) ecs_Result *r; { r->error = 0; if (r->message != NULL) free(r->message); r->message = NULL; return ecs_CleanUpResultUnion (&r->res); } /* ---------------------------------------------------------------------- ecs_CleanUpResultUnion Will make a complete clean up of the ResultUnion. IN/OUT ecs_ResultUnion *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_CleanUpResultUnion (r) ecs_ResultUnion *r; { int val,i; switch (r->type) { case Object: { ecs_CleanUpObject(&r->ecs_ResultUnion_u.dob); }; break; case objAttributeFormat: { val = r->ecs_ResultUnion_u.oaf.oa.oa_len; if (r->ecs_ResultUnion_u.oaf.oa.oa_val != NULL) { for(i=0;iecs_ResultUnion_u.oaf.oa.oa_val[i].name != NULL) free(r->ecs_ResultUnion_u.oaf.oa.oa_val[i].name); r->ecs_ResultUnion_u.oaf.oa.oa_val[i].name = NULL; } free(r->ecs_ResultUnion_u.oaf.oa.oa_val); } r->ecs_ResultUnion_u.oaf.oa.oa_val = NULL; }; break; case RasterInfo: { val = r->ecs_ResultUnion_u.ri.cat.cat_len; if (r->ecs_ResultUnion_u.ri.cat.cat_val != NULL) { for(i=0;iecs_ResultUnion_u.ri.cat.cat_val[i].label != NULL) free(r->ecs_ResultUnion_u.ri.cat.cat_val[i].label); r->ecs_ResultUnion_u.ri.cat.cat_val[i].label = NULL; } free(r->ecs_ResultUnion_u.ri.cat.cat_val); } r->ecs_ResultUnion_u.ri.cat.cat_val = NULL; }; break; case AText: { if (r->ecs_ResultUnion_u.s != NULL) free(r->ecs_ResultUnion_u.s); r->ecs_ResultUnion_u.s = NULL; }; break; case MultiResult: for (i = 0; i < (int) r->ecs_ResultUnion_u.results.results_len; i++) { ecs_CleanUpResultUnion(&r->ecs_ResultUnion_u.results.results_val[i]); } free(r->ecs_ResultUnion_u.results.results_val); break; default: break; }; r->type = 0; return TRUE; } /* ---------------------------------------------------------------------- ecs_CleanUpObject Will make a complete clean up and reinitialisation of ecs_Object in ecs_Result. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will clean up the structure and put his information into it. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_CleanUpObject (obj) ecs_Object *obj; { int val,i; if (obj->Id != NULL) free(obj->Id); obj->Id = NULL; if (obj->attr != NULL) free(obj->attr); obj->attr = NULL; switch (obj->geom.family) { case Area: { val = obj->geom.ecs_Geometry_u.area.ring.ring_len; if (obj->geom.ecs_Geometry_u.area.ring.ring_val != NULL) { for(i=0;igeom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val != NULL) free(obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val); obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val = NULL; } free(obj->geom.ecs_Geometry_u.area.ring.ring_val); } obj->geom.ecs_Geometry_u.area.ring.ring_val = NULL; }; break; case Line: { if (obj->geom.ecs_Geometry_u.line.c.c_val != NULL) free(obj->geom.ecs_Geometry_u.line.c.c_val); obj->geom.ecs_Geometry_u.line.c.c_val = NULL; }; break; case Matrix: { if (obj->geom.ecs_Geometry_u.matrix.x.x_val != NULL) free(obj->geom.ecs_Geometry_u.matrix.x.x_val); obj->geom.ecs_Geometry_u.matrix.x.x_val = NULL; }; break; case Image: { if (obj->geom.ecs_Geometry_u.image.x.x_val != NULL) free(obj->geom.ecs_Geometry_u.image.x.x_val); obj->geom.ecs_Geometry_u.image.x.x_val = NULL; }; break; case Text: { if (obj->geom.ecs_Geometry_u.text.desc != NULL) free(obj->geom.ecs_Geometry_u.text.desc); obj->geom.ecs_Geometry_u.text.desc = NULL; }; break; default: break; }; return TRUE; } /*************************************************/ /* ---------------------------------------------------------------------- ecs_ResultInit First initialisation of ecs_Result. Perform when the structure is create to initialise it. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_ResultInit (r) ecs_Result *r; { r->error = 0; r->message = NULL; r->res.type = 0; return TRUE; } /* ---------------------------------------------------------------------- ecs_CalcObjectMBR Given a ecs_Result with a ecs_Object already define. Found the bounding rectangle of this object and assign it in ecs_Result. IN ecs_Server *s: Server structure contain some complement information about region. IN/OUT ecs_Result *r: A pointer to a structure already defined. This method will only update the contain of this structure. OUT return int: A error code. If a problem occur in the method, "r" will be update to infor the user about the problem and will return a FALSE value. The default return value is TRUE. ---------------------------------------------------------------------- */ int ecs_CalcObjectMBR (s,obj) ecs_Server *s; ecs_Object *obj; { register unsigned int i,j,len; register ecs_Coordinate *coord; switch(obj->geom.family) { case Point: obj->xmin = obj->geom.ecs_Geometry_u.point.c.x; obj->ymin = obj->geom.ecs_Geometry_u.point.c.y; obj->xmax = obj->geom.ecs_Geometry_u.point.c.x; obj->ymax = obj->geom.ecs_Geometry_u.point.c.y; break; case Text: obj->xmin = obj->geom.ecs_Geometry_u.text.c.x; obj->ymin = obj->geom.ecs_Geometry_u.text.c.y; obj->xmax = obj->geom.ecs_Geometry_u.text.c.x; obj->ymax = obj->geom.ecs_Geometry_u.text.c.y; break; case Line: len = obj->geom.ecs_Geometry_u.line.c.c_len; if (len > 0) { obj->xmin = obj->geom.ecs_Geometry_u.line.c.c_val[0].x; obj->ymin = obj->geom.ecs_Geometry_u.line.c.c_val[0].y; obj->xmax = obj->geom.ecs_Geometry_u.line.c.c_val[0].x; obj->ymax = obj->geom.ecs_Geometry_u.line.c.c_val[0].y; } for(i=1;igeom.ecs_Geometry_u.line.c.c_val[i]); if (obj->xmin > coord->x) obj->xmin = coord->x; if (obj->ymin > coord->y) obj->ymin = coord->y; if (obj->xmax < coord->x) obj->xmax = coord->x; if (obj->ymax < coord->y) obj->ymax = coord->y; } break; case Area: if ((obj->geom.ecs_Geometry_u.area.ring.ring_len > 0) && (obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_len > 0)) { obj->xmin = obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_val[0].x; obj->ymin = obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_val[0].y; obj->xmax = obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_val[0].x; obj->ymax = obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_val[0].y; } for(i=0;igeom.ecs_Geometry_u.area.ring.ring_len;i++) { for(j=0;jgeom.ecs_Geometry_u.area.ring.ring_val[i].c.c_len;j++) { coord = &(obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val[j]); if (obj->xmin > coord->x) obj->xmin = coord->x; if (obj->ymin > coord->y) obj->ymin = coord->y; if (obj->xmax < coord->x) obj->xmax = coord->x; if (obj->ymax < coord->y) obj->ymax = coord->y; } } break; case Matrix: case Image: obj->xmin = s->currentRegion.west; obj->ymin = s->currentRegion.south; obj->xmax = s->currentRegion.east; obj->ymax = s->currentRegion.north; break; default: break; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyResult: Copy an object contain in a ecs_Result structure. IN ecs_Result *source: Original object OUT ecs_Result *copy: Copied object return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyResult(source,copy) ecs_Result *source; ecs_Result **copy; { return ecs_CopyResultFromUnion(&source->res,copy); } /* *---------------------------------------------------------------------- * ecs_CopyResultFromUnion -- * * Creates an ecs_Result structure from an ecs_ResultUnion * structure. * * IN * ecs_ResultUnion *source: Original object piece * OUT * ecs_Result **copy: Copied object piece with wrapping header * * Results: * TRUE if successful. * FALSE if unsuccessful. *---------------------------------------------------------------------- */ int ecs_CopyResultFromUnion(source,copy) ecs_ResultUnion *source; ecs_Result **copy; { int returncode; ecs_Result *result; returncode = TRUE; if (source->type == Object) { /* Allocate the new object */ if ((result = (ecs_Result *) malloc(sizeof(ecs_Result))) == NULL) { returncode = FALSE; } /* Prepare the object structure */ result->error = 0; result->message = NULL; returncode = ecs_CopyResultUnionWork(source,&result->res); if (returncode == FALSE) { free(result); result = NULL; } } else { returncode = FALSE; result = NULL; } *copy = result; return returncode; } /* *---------------------------------------------------------------------- * ecs_CopyResultUnion -- * * Creates an ecs_Result structure from an ecs_ResultUnion * structure. * * IN * ecs_ResultUnion *source: Original object piece * OUT * ecs_Result **copy: Copied object piece with wrapping header * * Results: * TRUE if successful. * FALSE if unsuccessful. *---------------------------------------------------------------------- */ int ecs_CopyResultUnion(source,copy) ecs_ResultUnion *source; ecs_ResultUnion **copy; { int returncode; ecs_ResultUnion *result; returncode = TRUE; if (source->type == Object) { /* Allocate the new object */ result = (ecs_ResultUnion *) malloc(sizeof(ecs_ResultUnion)); if (result == NULL) { returncode = FALSE; } else { returncode = ecs_CopyResultUnionWork(source, result); if (returncode == FALSE) { free(result); result = NULL; } } } else { returncode = FALSE; result = NULL; } *copy = result; return returncode; } /* *---------------------------------------------------------------------- * ecs_CopyResultUnionWork -- * * Sets one ecs_ResultUnion to be exactly like the other. * Allocates any substructure that are needed. * * IN * ecs_ResultUnion *source: Original object piece * OUT * ecs_ResultUnion *dest: Copied object piece * * Results: * TRUE if successful. * FALSE if unsuccessful. *---------------------------------------------------------------------- */ int ecs_CopyResultUnionWork(source,copy) ecs_ResultUnion *source; ecs_ResultUnion *copy; { int returncode; ecs_Object *obj; ecs_Object *newobj; returncode = TRUE; if (source->type == Object) { copy->type = Object; obj = &(source->ecs_ResultUnion_u.dob); newobj = ©->ecs_ResultUnion_u.dob; /* Allocate in the new object Id and attr */ if ((returncode == TRUE) && (obj->Id != NULL) && ((newobj->Id = (char *) malloc(strlen(obj->Id)+1)) == NULL)) { returncode = 1; } if ((returncode == TRUE) && (obj->attr != NULL) && ((newobj->attr = (char *) malloc(strlen(obj->attr)+1)) == NULL)) { returncode = FALSE; } /* Fill the new ecs_Object structure with obj values */ if (obj->Id != NULL) { strcpy(newobj->Id,obj->Id); } else { newobj->Id = NULL; } if (obj->attr != NULL) { strcpy(newobj->attr,obj->attr); } else { newobj->attr = NULL; } newobj->xmin = obj->xmin; newobj->ymin = obj->ymin; newobj->xmax = obj->xmax; newobj->ymax = obj->ymax; /* Call ecs_CopyGeometry to fill the geom argument */ returncode = ecs_CopyGeometry(obj,newobj); if (returncode == FALSE) { ecs_FreeObject(newobj); } } else { returncode = FALSE; } return returncode; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyObject: Copy an object contain in a ecs_Result structure. IN ecs_Object *obj: Original object OUT ecs_Object *copy: Copied object preallocated return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyObject(obj,newobj) ecs_Object *obj; ecs_Object *newobj; { int returncode; returncode = TRUE; /* Allocate in the new object Id and attr */ if ((returncode == TRUE) && (obj->Id != NULL) && ((newobj->Id = (char *) malloc(strlen(obj->Id)+1)) == NULL)) { returncode = FALSE; } if ((returncode == TRUE) && (obj->attr != NULL) && ((newobj->attr = (char *) malloc(strlen(obj->attr)+1)) == NULL)) { returncode = FALSE; } /* Fill the new ecs_Object structure with obj values */ if (obj->Id != NULL) { strcpy(newobj->Id,obj->Id); } else { newobj->Id = NULL; } if (obj->attr != NULL) { strcpy(newobj->attr,obj->attr); } else { newobj->attr = NULL; } newobj->xmin = obj->xmin; newobj->ymin = obj->ymin; newobj->xmax = obj->xmax; newobj->ymax = obj->ymax; /* Call ecs_CopyGeometry to fill the geom argument */ returncode = ecs_CopyGeometry(obj,newobj); if (returncode == FALSE) { ecs_FreeObject(newobj); } return returncode; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyGeometry: Copy an object geometry into a new object IN ecs_Object *source: Original object IN/OUT ecs_Object *copy: Copied object OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyGeometry(source,copy) ecs_Object *source; ecs_Object *copy; { int returncode; returncode = TRUE; copy->geom.family = source->geom.family; switch(copy->geom.family) { case Area: returncode = ecs_CopyArea(&(source->geom.ecs_Geometry_u.area), &(copy->geom.ecs_Geometry_u.area)); break; case Line: returncode = ecs_CopyLine(&(source->geom.ecs_Geometry_u.line), &(copy->geom.ecs_Geometry_u.line)); break; case Point: returncode = ecs_CopyPoint(&(source->geom.ecs_Geometry_u.point), &(copy->geom.ecs_Geometry_u.point)); break; case Text: returncode = ecs_CopyText(&(source->geom.ecs_Geometry_u.text), &(copy->geom.ecs_Geometry_u.text)); break; case Matrix: returncode = ecs_CopyMatrix(&(source->geom.ecs_Geometry_u.matrix), &(copy->geom.ecs_Geometry_u.matrix)); break; case Image: returncode = ecs_CopyImage(&(source->geom.ecs_Geometry_u.image), &(copy->geom.ecs_Geometry_u.image)); break; default: break; } return returncode; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyArea: Copy the area from an original object to a copy IN ecs_Area *source: Pointer to the source area IN/OUT ecs_Area *copy: Pointer to the copy area OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyArea(source,copy) ecs_Area *source; ecs_Area *copy; { int i,j; copy->ring.ring_len = source->ring.ring_len; if (source->ring.ring_val != NULL) { /* Allocate ring table */ copy->ring.ring_val = (ecs_FeatureRing *) malloc(sizeof(ecs_FeatureRing)*source->ring.ring_len); if (copy->ring.ring_val == NULL) { return FALSE; } /* Copy ring table containt */ for(i=0;i<(int) source->ring.ring_len;i++) { copy->ring.ring_val[i].centroid.x = source->ring.ring_val[i].centroid.x; copy->ring.ring_val[i].centroid.y = source->ring.ring_val[i].centroid.y; copy->ring.ring_val[i].c.c_len = source->ring.ring_val[i].c.c_len; if (source->ring.ring_val[i].c.c_val != NULL) { /* Allocate c table */ copy->ring.ring_val[i].c.c_val = (ecs_Coordinate *) malloc(sizeof(ecs_Coordinate)*source->ring.ring_val[i].c.c_len); if (copy->ring.ring_val[i].c.c_val == NULL) { return FALSE; } /* Copy the c table contain */ for(j=0;j<(int) source->ring.ring_val[i].c.c_len;j++) { copy->ring.ring_val[i].c.c_val[j].x = source->ring.ring_val[i].c.c_val[j].x; copy->ring.ring_val[i].c.c_val[j].y = source->ring.ring_val[i].c.c_val[j].y; } } else { copy->ring.ring_val[i].c.c_val = NULL; } } } else { copy->ring.ring_val = NULL; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyLine: Copy the Line from an original object to a copy IN ecs_Line *source: Pointer to the source Line IN/OUT ecs_Line *copy: Pointer to the copy Line OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyLine(source,copy) ecs_Line *source; ecs_Line *copy; { int i; copy->c.c_len = source->c.c_len; if (source->c.c_val != NULL) { /* Allocate c table */ copy->c.c_val = (ecs_Coordinate *) malloc(sizeof(ecs_Coordinate)*source->c.c_len); if (copy->c.c_val == NULL) { return FALSE; } /* Copy c table containt */ for(i=0;i<(int) source->c.c_len;i++) { copy->c.c_val[i].x = source->c.c_val[i].x; copy->c.c_val[i].y = source->c.c_val[i].y; } } else { copy->c.c_val = NULL; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyPoint: Copy the point from an original object to a copy IN ecs_Point *source: Pointer to the source point IN/OUT ecs_Point *copy: Pointer to the copy point OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyPoint(source,copy) ecs_Point *source; ecs_Point *copy; { copy->c.x = source->c.x; copy->c.y = source->c.y; return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyText: Copy the text from an original object to a copy IN ecs_Text *source: Pointer to the source text IN/OUT ecs_Text *copy: Pointer to the copy text OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyText(source,copy) ecs_Text *source; ecs_Text *copy; { copy->c.x = source->c.x; copy->c.y = source->c.y; if (source->desc != NULL) { copy->desc = (char *) malloc(strlen(source->desc)+1); if (copy->desc == NULL) { return FALSE; } strcpy(copy->desc,source->desc); } else { copy->desc = NULL; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyMatrix: Copy the matrix from an original object to a copy IN ecs_Matrix *source: Pointer to the source matrix IN/OUT ecs_Matrix *copy: Pointer to the copy matrix OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyMatrix(source,copy) ecs_Matrix *source; ecs_Matrix *copy; { int i; copy->x.x_len = source->x.x_len; if (source->x.x_val != NULL) { /* Allocate x table */ copy->x.x_val = (u_int *) malloc(sizeof(ecs_Coordinate)*source->x.x_len); if (copy->x.x_val == NULL) { return FALSE; } /* Copy x table containt */ for(i=0;i<(int) source->x.x_len;i++) { copy->x.x_val[i] = source->x.x_val[i]; } } else { copy->x.x_val = NULL; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_CopyImage: Copy the image from an original object to a copy IN ecs_Image *source: Pointer to the source image IN/OUT ecs_Image *copy: Pointer to the copy image OUT return int: Error message returned. TRUE: Success FALSE: Failure @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ int ecs_CopyImage(source,copy) ecs_Image *source; ecs_Image *copy; { int i; copy->x.x_len = source->x.x_len; if (source->x.x_val != NULL) { /* Allocate x table */ copy->x.x_val = (u_int *) malloc(sizeof(ecs_Coordinate)*source->x.x_len); if (copy->x.x_val == NULL) { return FALSE; } /* Copy x table containt */ for(i=0;i<(int) source->x.x_len;i++) { copy->x.x_val[i] = source->x.x_val[i]; } } else { copy->x.x_val = NULL; } return TRUE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_FreeObject: Free an object IN ecs_Object *obj: object to be free @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ void ecs_FreeObject(obj) ecs_Object *obj; { int i; if (obj != NULL) { if (obj->Id != NULL) free(obj->Id); if (obj->attr != NULL) free(obj->attr); switch(obj->geom.family) { case Area: if (obj->geom.ecs_Geometry_u.area.ring.ring_val != NULL) { for(i=0;i<(int) obj->geom.ecs_Geometry_u.area.ring.ring_len;i++) { if (obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val != NULL) free(obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val); } free(obj->geom.ecs_Geometry_u.area.ring.ring_val); } break; case Line: if (obj->geom.ecs_Geometry_u.line.c.c_val != NULL) free(obj->geom.ecs_Geometry_u.line.c.c_val); break; case Text: if (obj->geom.ecs_Geometry_u.text.desc != NULL) free(obj->geom.ecs_Geometry_u.text.desc); break; case Matrix: if (obj->geom.ecs_Geometry_u.matrix.x.x_val != NULL) free(obj->geom.ecs_Geometry_u.matrix.x.x_val); break; case Image: if (obj->geom.ecs_Geometry_u.image.x.x_val != NULL) free(obj->geom.ecs_Geometry_u.image.x.x_val); break; default: break; } } return; } ogdi-ogdi_4_1_0/ogdi/c-api/ecsdist.c000066400000000000000000000353001345660466700173410ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Functions for computing distances, centroids, and point-in-polygon. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.5 2001-04-12 19:25:27 warmerda * added RGB<->Pixel functions * * Revision 1.4 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include #include #include "ecs.h" ECS_CVSID("$Id$"); double currenttolerance = 0.0; /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_DistanceSegment: Calculate the distance between a point (posx,posy) and a line segment (xl,yl), (xu,yu). IN xl,y1 : First point of segment xu,yu : Second point of segment posx,posy : Point position OUT return double : Calculated distance. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ double ecs_DistanceSegment(xl,yl,xu,yu,posx,posy) double xl; double yl; double xu; double yu; double posx; double posy; { double angle1; double angle2; double firstat; double secondat; double thirdat; double quad1,quad2; double distance; if ((xu-xl)==0.0) { if (yu>yl) firstat = 1.5707963; else firstat = -1.5707963; } else { firstat = atan((yu-yl)/(xu-xl)); if (xuyl) secondat = 1.5707963; else secondat = -1.5707963; } else { secondat = atan((posy-yl)/(posx-xl)); if (posxyu) thirdat = 1.5707963; else thirdat = -1.5707963; } else { thirdat = atan((posy-yu)/(posx-xu)); if (posx 1.5707963) || (angle1 < -1.5707963)) quad1 = 2; quad2 = 1; if ((angle2 > 1.5707963) || (angle2 < -1.5707963)) quad2 = 2; /* Check if the distance to the segment is a distance to point1, a distance to point 2 or the distance between the coordinate and the segment itself */ if (quad1 == 2 && quad2 == 2) { /* Calculate the distance to point (xl,yl) */ distance = sqrt(((posx-xl)*(posx-xl))+((posy-yl)*(posy-yl))); } else if (quad1 == 1 && quad2 == 1) { /* Calculate the distance to point (xu,yu) */ distance = sqrt(((posx-xu)*(posx-xu))+((posy-yu)*(posy-yu))); } else { /* Calculate the distance between the segment (xl,yl),(xu,yu) and the point (posx,posy) */ distance = sin(angle1)*sqrt(((posx-xl)*(posx-xl))+((posy-yl)*(posy-yl))); if (distance<0.0) distance = -distance; } return distance; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_DistanceObject: Calculate the distance between a point (posx,posy) and a ecs_Object IN ecs_Object *obj: Geographic object posx,posy : Point position OUT return double : Calculated distance. If an error occur, the function return a negative value. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ double ecs_DistanceObject(obj,X,Y) ecs_Object *obj; double X; double Y; { int i,j; double d1,d2; if (obj==NULL) return -1.0; switch(obj->geom.family) { case Area: d2 = HUGE_VAL; for(i=0;(int) i<(int) (obj->geom.ecs_Geometry_u.area.ring.ring_len); i++) { for(j=0;(int) j<(int) (obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_len - 1); j++) { d1 = ecs_DistanceSegment(obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val[j].x, obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val[j].y, obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val[j+1].x, obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val[j+1].y, X,Y); if (d1geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_len, obj->geom.ecs_Geometry_u.area.ring.ring_val[0].c.c_val,X,Y) == TRUE) { if (obj->geom.ecs_Geometry_u.area.ring.ring_len > 1) { for(i=0;(int) i<(int) (obj->geom.ecs_Geometry_u.area.ring.ring_len); i++) { if (ecs_IsPointInPolygon(obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_len, obj->geom.ecs_Geometry_u.area.ring.ring_val[i].c.c_val,X,Y) == TRUE) { return d2; } } } return (d2/2.0); } return d2; break; case Line: d2 = HUGE_VAL; for(i=0;(int) i<(int) (obj->geom.ecs_Geometry_u.line.c.c_len - 1);i++) { d1 = ecs_DistanceSegment(obj->geom.ecs_Geometry_u.line.c.c_val[i].x, obj->geom.ecs_Geometry_u.line.c.c_val[i].y, obj->geom.ecs_Geometry_u.line.c.c_val[i+1].x, obj->geom.ecs_Geometry_u.line.c.c_val[i+1].y, X,Y); if (d1geom.ecs_Geometry_u.point.c.x)*(X-obj->geom.ecs_Geometry_u.point.c.x)+ (Y-obj->geom.ecs_Geometry_u.point.c.y)*(Y-obj->geom.ecs_Geometry_u.point.c.y)); break; case Text: return sqrt((X-obj->geom.ecs_Geometry_u.text.c.x)*(X-obj->geom.ecs_Geometry_u.text.c.x)+ (Y-obj->geom.ecs_Geometry_u.text.c.y)*(Y-obj->geom.ecs_Geometry_u.text.c.y)); break; case Matrix: return -1; break; case Image: return -1; break; default: return -1; break; } return -1; } /* ---------------------------------------------------------------------- FUNCTION_INFORMATION NAME ecs_DistanceObjectWithTolerance DESCRIPTION Calculate the distance between an object and a point with a tolerance factor. The tolerance factor was previously calculated in ecs_SetTolerance END_DESCRIPTION PARAMETERS ecs_Object *obj: The geographic object double *X: Pointer to X, the x coordinate of the geographic point to convert double *Y: Pointer to Y, the y coordinate of the geographic point to convert END_PARAMETERS RETURN_VALUE double: The result distance END_FUNCTION_INFORMATION ---------------------------------------------------------------------- */ double ecs_DistanceObjectWithTolerance(obj,X,Y) ecs_Object *obj; double X; double Y; { double res; res = ecs_DistanceObject(obj,X,Y); if (res > currenttolerance && obj->geom.family != Area) { res = HUGE_VAL; } return res; } /* ---------------------------------------------------------------------- FUNCTION_INFORMATION NAME ecs_SetTolerance DESCRIPTION Calculate the tolerance of a given region. END_DESCRIPTION PARAMETERS ecs_Region *reg: The geographic region END_PARAMETERS RETURN_VALUE double: The result tolerance END_FUNCTION_INFORMATION ---------------------------------------------------------------------- */ double ecs_SetTolerance(reg) ecs_Region *reg; { currenttolerance = ((reg->north - reg->south)*ECSTOLERANCE); return currenttolerance; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_DistanceMBR: Calculate the distance between a point (posx,posy) and a MBR IN xl,y1 : First corner of MBR xu,yu : Second corner of MBR posx,posy : Point position OUT return double : Calculated distance. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ double ecs_DistanceMBR(xl,yl,xu,yu,posx,posy) double xl; double yl; double xu; double yu; double posx; double posy; { double d1,d2; d2 = HUGE_VAL; if ((posx > xl) && (posx < xu) && (posy > yl) && (posy < yu)) return 0.0; d1 = ecs_DistanceSegment(xl,yl,xl,yu,posx,posy); if (d1 maxx) { maxx= coord[i].x; } if (coord[i].y > maxy) { maxy= coord[i].y; } /* minx = min( minx, coord[i].x ); miny = min( miny, coord[i].y );*/ /* maxx = max( maxx, coord[i].x ); maxy = max( maxy, coord[i].y );*/ } xcent = (minx + maxx) / 2.0; intersect = (double *) malloc(sizeof(double)*(nb_segment+1)); if (intersect == NULL) { centroid->x = 0.0; centroid->y = 0.0; return TRUE; } /* rechercher tous les segments dont les coord en x sont tel que x1 < xcent < x2 ou x1 > xcent > x2 */ for (i = 0,j= 0; i < nb_segment - 1; ++i) { if(((double) coord[i].x < xcent && (double) coord[i+1].x >= xcent) || ((double) coord[i].x > xcent && (double) coord[i+1].x <= xcent)) { m = (double) (coord[i+1].y - coord[i].y) / (double) (coord[i+1].x - coord[i].x); b = (double) coord[i].y - m * (double) coord[i].x; intersect[j++] = (double)(b + m * xcent); } } /* Last segment */ if(((double) coord[nb_segment-1].x < xcent && (double) coord[0].x >= xcent) || ((double) coord[nb_segment-1].x > xcent && (double) coord[0].x <= xcent)) { m = (double) (coord[nb_segment-1].y - coord[0].y) / (double) (coord[nb_segment-1].x - coord[0].x); b = (double) coord[0].y - m * (double) coord[0].x; intersect[j++] = (double)(b + m * xcent); } /* tri les intersections en y */ qsort(intersect,j,sizeof(double),(*compar)); centroid->x = xcent; centroid->y = (intersect[0] + intersect[1]) / 2.0; free(intersect); return TRUE; } int compar(s1,s2) double *s1,*s2; { if (*s1 > *s2) return 1; else if (*s1 == *s2) return 0; return -1; } /* ---------------------------------------------------------------------- cln_IsPointInPolygon Check if a point is in a polygon. PARAMETERS INPUT int npoints: Indicate the point quantity in poly ecs_Coordinate *poly: Polygon double x: X coordinate of the point to check double y: Y coordinate of the point to check RETURN_VALUE int : The boolean indication if the point is outside or inside the polygon ---------------------------------------------------------------------- */ int ecs_IsPointInPolygon(npoints,poly,x,y) int npoints; ecs_Coordinate *poly; double x; double y; { int inside = 0; double xnew,ynew; double xold,yold; double x1,y1; double x2,y2; int i; if (npoints < 3) return FALSE; xold = poly[npoints-1].x; yold = poly[npoints-1].y; for(i=0;i xold) { x1 = xold; y1 = yold; x2 = xnew; y2 = ynew; } else { x2 = xold; y2 = yold; x1 = xnew; y1 = ynew; } if ((xnew < x) == (x <= xold) && ((y-y1)*(x2-x1) < (y2-y1)*(x-x1))) inside = !inside; xold = xnew; yold = ynew; } if (inside == 1) return TRUE; return FALSE; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_GetRGBFromPixel: Fetch RGB/t components from 32bit pixel value. IN unsigned int pixel: the source 32bit value. unsigned char *t: location to set with transparency flag (1=opaque) unsigned char *r: location to set with red component. unsigned char *g: location to set with green component. unsigned char *b: location to set with blue component. OUT @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ void ecs_GetRGBFromPixel( unsigned int pixel, unsigned char *transparent, unsigned char *r, unsigned char *g, unsigned char *b ) { unsigned char *byte_pixel = (unsigned char *) &pixel; if( transparent != NULL ) *transparent = byte_pixel[3]; *r = byte_pixel[0]; *g = byte_pixel[1]; *b = byte_pixel[2]; } /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ecs_GetPixelFromRGB: Fetch 32bit pixel value from RGB components. IN int t: transparency flag (1=opaque,0=transparent) int r: red component (0-255). int g: green component (0-255). int b: blue component (0-255). OUT 32bit pixel value. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ unsigned int ecs_GetPixelFromRGB( int t, int r, int g, int b ) { unsigned int pixel; unsigned char *byte_pixel = (unsigned char *) &pixel; byte_pixel[0] = r; byte_pixel[1] = g; byte_pixel[2] = b; byte_pixel[3] = t; return pixel; } ogdi-ogdi_4_1_0/ogdi/c-api/ecsgeo.c000066400000000000000000000154231345660466700171540ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Computing distances and areas related to feature objects. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.3 2001-04-09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); static double ecs_QA, ecs_QB, ecs_QC; static double ecs_QbarA, ecs_QbarB, ecs_QbarC, ecs_QbarD; static double ecs_AE; /* a^2(1-e^2) */ static double ecs_Qp; /* Q at the north pole */ static double ecs_E; /* area of the earth */ static double ecs_TwoPI; /**************************************************************************/ void ecs_begin_ellipsoid_polygon_area (a, e2) double a, e2; { double e4, e6; /* Put default values if a and e2 are 0 */ if ((a==0.0) && (e2==0.0)) { a = 6378206.4000000004; e2 = 0.0067686580; } ecs_TwoPI = PI+PI; e4 = e2 * e2; e6 = e4 * e2; ecs_AE = a * a * (1 - e2); ecs_QA = (2.0/3.0)*e2; ecs_QB = (3.0/5.0)*e4; ecs_QC = (4.0/7.0)*e6; ecs_QbarA = -1.0 - (2.0/3.0)*e2 - (3.0/5.0)*e4 - (4.0/7.0)*e6; ecs_QbarB = (2.0/9.0)*e2 + (2.0/5.0)*e4 + (4.0/7.0)*e6; ecs_QbarC = - (3.0/25.0)*e4 - (12.0/35.0)*e6; ecs_QbarD = (4.0/49.0)*e6; ecs_Qp = ecs_Q(PI/2); ecs_E = 4 * PI * ecs_Qp * ecs_AE; if (ecs_E < 0.0) ecs_E = -ecs_E; } /**************************************************************************/ double ecs_Q(x) double x; { double sinx, sinx2; sinx = sin(x); sinx2 = sinx * sinx; return sinx * (1 + sinx2 * (ecs_QA + sinx2 * (ecs_QB + sinx2 * ecs_QC))); } /**************************************************************************/ double ecs_Qbar(x) double x; { double cosx, cosx2; cosx = cos(x); cosx2 = cosx * cosx; return cosx * (ecs_QbarA + cosx2 * (ecs_QbarB + cosx2 * (ecs_QbarC + cosx2 * ecs_QbarD))); } /**************************************************************************/ double ecs_planimetric_polygon_area(n,coord) int n; ecs_Coordinate *coord; { double x1,y1,x2,y2; double area; int pos; x2 = coord[n-1].x; y2 = coord[n-1].y; pos = 0; area = 0; while (--n >= 0) { x1 = x2; y1 = y2; x2 = coord[pos].x; y2 = coord[pos].y; pos++; area += (y2+y1)*(x2-x1); } if((area /= 2.0) < 0.0) area = -area; return area; } #define RAD_TO_DEG 57.295779513082321 #define DEG_TO_RAD .017453292519943296 /**************************************************************************/ double ecs_ellipsoid_polygon_area (n, coord) int n; ecs_Coordinate *coord; { double x1,y1,x2,y2,dx,dy; double Qbar1, Qbar2; double area; int pos; x2 = coord[n-1].x * DEG_TO_RAD; y2 = coord[n-1].y * DEG_TO_RAD; Qbar2 = ecs_Qbar(y2); area = 0.0; pos = 0; while (--n >= 0) { x1 = x2; y1 = y2; Qbar1 = Qbar2; x2 = coord[pos].x * DEG_TO_RAD; y2 = coord[pos].y * DEG_TO_RAD; pos++; Qbar2 = ecs_Qbar(y2); if (x1 > x2) while (x1 - x2 > PI) x2 += ecs_TwoPI; else if (x2 > x1) while (x2 - x1 > PI) x1 += ecs_TwoPI; dx = x2 - x1; area += dx * (ecs_Qp - ecs_Q(y2)); if ((dy = y2 - y1) != 0.0) area += dx * ecs_Q(y2) - (dx/dy)*(Qbar2-Qbar1); } if((area *= ecs_AE) < 0.0) area = -area; /* kludge - if polygon circles the south pole the area will be * computed as if it cirlced the north pole. The correction is * the difference between total surface area of the earth and * the "north pole" area. */ if (area > ecs_E) area = ecs_E; if (area > ecs_E/2) area = ecs_E - area; return area; } /**************************************************************************/ /* ------------------------------------------------------------ ecs_geodesic_distance -- Cette fonction calcule la distance en metres de deux points en projection longitude/lattitude. ------------------------------------------------------------ */ double ecs_geodesic_distance (lon1, lat1, lon2, lat2) double lon1, lat1, lon2, lat2; { static double boa = 0.99660992469; static double f = 0.003390075305; static double ff64 = 0.0000001795720402425; static double al = 6378206.4; double result,newresult,pente,bo,nlat1,nlat2; double a, cd, cdtm, ctm, d, dl, dtm, e,kk, kl, l; double sd, sdlmr, sdtm, stm, t, t1r, t2r, tm, u, v, x, y; while (lon1 > 180.0) lon1 -= 360.0; while (lon1 < -180.0) lon1 += 360.0; while (lon2 > 180.0) lon2 -= 360.0; while (lon2 < -180.0) lon2 += 360.0; if (lon1 > lon2) { t = lon1; lon1 = lon2; lon2 = t; t = lat1; lat1 = lat2; lat2 = t; } /* Calculer la pente et l'origine de la droite passant a travers les deux points. */ if (fmod((lon2-lon1),180.0) == 0.0) { lon1 += 0.01; } pente = (lat2-lat1)/(lon2-lon1); bo = lat1-pente*lon1; lat1=lat1*DEG_TO_RAD; lon1=lon1*DEG_TO_RAD; lat2=lat2*DEG_TO_RAD; lon2=lon2*DEG_TO_RAD; t1r=atan(boa*tan(lat1)); t2r=atan(boa*tan(lat2)); tm = (t1r+t2r)/2.0; dtm = (t2r-t1r)/2.0; stm = sin(tm); ctm = cos(tm); sdtm = sin(dtm); cdtm = cos(dtm); kl = stm*cdtm; kk = sdtm*ctm; sdlmr=sin((lon2-lon1)/2.0); l=sdtm*sdtm+sdlmr*sdlmr*(cdtm*cdtm-stm*stm); /* Si l = 0 ou l = 1, l'algorithme va necessairement donner un resultat infini. */ if (l==1.0) l -= 0.01; if (l==0.0) l+=0.01; cd=1.0-2.0*l; dl=acos(cd); sd=sin(dl); t=dl/sd; u=2.0*kl*kl/(1.0-l); v=2.0*kk*kk/l; d=4.0*t*t; x=u+v; e=-2.0*cd; y=u-v; a=-d*e; result = (al*sd*(t-f/4.0*(t*x-y)+ff64*(x*(a+(t-(a+e)/2.0)*x)+y*(-2.0*d+e*y)+d*x*y))); /* Compensation si angle obtu */ if ((lon2-lon1) > PI) { nlat1=-90.0*pente+bo; nlat2=90.0*pente+bo; newresult = ecs_geodesic_distance(-90.0,nlat1,90.0,nlat2); result = 2*newresult-result; } return result; } ogdi-ogdi_4_1_0/ogdi/c-api/ecsinfo.c000066400000000000000000000352601345660466700173360ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Implements reading and use of "default info" files. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.4 2007-02-12 21:01:48 cbalint * Fix win32 target. It build and works now. (tested with VC6) * * Revision 1.3 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.2 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" #include ECS_CVSID("$Id$"); #ifdef _WINDOWS #define strcasecmp(a,b) stricmp(a,b) #define strncasecmp(a,b,c) strnicmp(a,b,c) #endif int ecs_DefReadIndex(char *directory, char *url, char* urlfile, char *key, char** result); int ecs_DefReadFile(char* directory, char *filename, char *key, char **result); int ecs_DefGetDirectoryFromURL(char *directory, char *url, char *file); int ecs_DefReadALine(char *buf, char **key, char **value); char * ecs_strtrim(char * string, const char * set, size_t *index); /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_GetDefaultInfo DESCRIPTION access the default information database based on a url and a key value. END_DESCRIPTION PARAMETERS INPUT char* url string containing url char* key string containing key value (e.g. NORTH) OUTPUT char** result string containing result. Mallocked by the function; freed by calling routine. Left as NULL if no key is found. END_PARAMETERS PRE_CONDITIONS -none END_PRE_CONDITIONS POST_CONDITIONS -none END_POST_CONDITIONS RETURN_VALUE int: 0 if unsuccessful, 1 otherwise. result: a mallocked char * if successful, NULL otherwise. calling routine must free the memory. END_RETURN_VALUE PSEUDO_CODE 2) verify if there is a DEFAULT_INFO user variable set a) if yes, read the index file and search for key value b) if value found, stop and return it. 3) verify if there is a index file in the USRHOME a) if yes, read the index file and search for key value b) if value found, stop and return it. 4) verify if there is a index file in the last directory of the URL. a) if yes, read the index file and search for key value b) if value found, stop and return it. END_PSEUDO_CODE END_FUNCTION_INFORMATION ******************************************************************** */ int ecs_GetDefaultInfo(char* url, char* key, char** result) { char *env; char directory[512]; char *value; char urlfile[256]; /* process the index if any from DEFAULT_INFO and set it up */ /* if this is remote, don't ignore the first two methods */ /* if (strncasecmp("gltp://",url, 7) != 0) { */ env=getenv("DEFAULT_INFO"); if (env) { if (ecs_DefReadIndex(env, url, NULL, key, &value)) { *result=value; return TRUE; } } /* process the index if any from USRHOME */ env=getenv("USRHOME"); #ifdef INFO_DEBUG fprintf(stderr,"looking at usrhome\n"); #endif if (env) { if (ecs_DefReadIndex(env, url, NULL, key, &value)) { *result=value; return TRUE; } } /* } */ /* get the directory from the url */ #ifdef INFO_DEBUG fprintf(stderr,"looking for directory in url\n"); #endif if (!ecs_DefGetDirectoryFromURL(directory, url, urlfile)) { return FALSE; } #ifdef INFO_DEBUG fprintf(stderr,"looking in %s\n", directory); #endif if (ecs_DefReadIndex(directory, url, urlfile, key, &value)) { *result=value; return TRUE; } return FALSE; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_DefGetDirectoryFromURL DESCRIPTION private function: return the directory name based on the url END_DESCRIPTION PARAMETERS OUTPUT char* directory directory of where to look for index INPUT char* url string containing url END_PARAMETERS PRE_CONDITIONS -directory is pre-allocated, and is long enough to store the name of the directory. END_PRE_CONDITIONS POST_CONDITIONS -none END_POST_CONDITIONS RETURN_VALUE int: 0 if unsuccessful, 1 otherwise. result: directory name is placed in pre-allocated string "directory". filename if url points to a file (or NULL if none) is placed in file END_RETURN_VALUE PSEUDO_CODE END_PSEUDO_CODE END_FUNCTION_INFORMATION ******************************************************************** */ int ecs_DefGetDirectoryFromURL(char *directory, char *url, char *file) { char* dir; char* tmp; struct stat buf; tmp=(char*) malloc (strlen(url)+1); if (!tmp) return FALSE; strcpy(tmp,url); if (strncasecmp("gltp://",tmp, 7) == 0) { dir=&tmp[7]; dir=strchr(dir,'/')+1; /* check for double slash */ if (dir[0]=='/') { dir++; } dir=strchr(dir,'/'); } else { dir=&tmp[6]; dir=strchr(dir,'/'); } /* check for extra slash */ if (dir[1]=='/' || dir[2]==':') dir++; /* check if this is a file */ if (stat(dir, &buf)!= 0) { free(tmp); return FALSE; } #ifdef _WINDOWS if (_S_IFREG & (buf.st_mode)) #else if (S_ISREG(buf.st_mode)) #endif { /* strip off the filename */ int i= strlen(dir)-1; while (dir[i]!='/' && i>0) i--; /* return the filename in file */ strcpy(file, &dir[i+1]); dir[i]='\0'; } else { file[0]='\0'; } strcpy(directory,dir); #ifdef INFO_DEBUG printf("Directory calculated from the URL : %s\n", directory); #endif free(tmp); return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_DefReadIndex DESCRIPTION private function: read the index file, look for a match to the url, then call the END_DESCRIPTION PARAMETERS INPUT char* directory directory of where to look for index char* url string containing url char* key string containing key value (e.g. NORTH) OUTPUT char** result string containing result. Mallocked by the function; freed by calling routine. Left as NULL if no key is found. END_PARAMETERS PRE_CONDITIONS -none END_PRE_CONDITIONS POST_CONDITIONS -result mallocked if successful, else NULL. END_POST_CONDITIONS RETURN_VALUE int: 0 if unsuccessful, 1 otherwise. result: a mallocked char * if successful, NULL otherwise. calling routine must free the memory. END_RETURN_VALUE PSEUDO_CODE END_PSEUDO_CODE END_FUNCTION_INFORMATION ******************************************************************** */ int ecs_DefReadIndex(char *directory, char *url, char *urlfile, char *key, char** result) { FILE *fptr; char *indexfile; /* the index file */ char *filename; /* name of database file to search */ char *tmpkey; char buf[1024]; int found; /* open the index file in the directory */ indexfile=(char *) malloc (strlen(directory) + 14); if (!indexfile) { return FALSE; } strcpy(indexfile, directory); if (indexfile[strlen(indexfile)-1]!='/') strcat(indexfile,"/"); strcat(indexfile, DEFAULTS_INDEX_FILE); #ifdef INFO_DEBUG printf ("The index file is %s \n", indexfile); #endif fptr=fopen(indexfile, "r"); free(indexfile); if (!fptr) { #ifdef INFO_DEBUG printf ("Could not open the index file \n"); #endif return FALSE; } /* read until we find a match for this url */ filename=NULL; found=FALSE; while (!feof(fptr)) { ogdi_fgets(buf, MAX_DEF_LINE_LENGTH, fptr); if (ecs_DefReadALine(buf,&tmpkey,&filename)) { #ifdef INFO_DEBUG printf("read KEY=>%s< FILENAME=>%s<\n", tmpkey, filename); #endif if (urlfile==NULL) { /* this is a full url */ if (strcasecmp(url,tmpkey)== 0) { found=TRUE; #ifdef INFO_DEBUG printf("FOUND URL MATCH %s\n",tmpkey); printf("value=%s\n", filename); #endif break; } } else { #ifdef INFO_DEBUG printf("comparing urlfile=%s to filename=%s\n",urlfile, tmpkey); #endif if (strcasecmp(urlfile,tmpkey)== 0 || (strcmp(urlfile,"") == 0 && strcmp(tmpkey,"*")== 0)) { found=TRUE; #ifdef INFO_DEBUG printf("FOUND KEY %s\n",tmpkey); printf("value=%s\n", filename); #endif /* check the file */ break; } } } } fclose(fptr); if (!found) { return FALSE; } /* if match found, read the file */ if (ecs_DefReadFile(directory, filename, key, result)) { return TRUE; } else { *result=NULL; return FALSE; } /* if no match found, return false */ return FALSE; } /* take the line in "buf", return a pointer to "key" and a pointer to the value". place a NULL after each string, so they can be copied out. PRECONDITION: destination must be writeable */ int ecs_DefReadALine(char *buf, char **key, char **value) { int i=0; /* ignore comments */ if (buf[0]=='#') return FALSE; if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0'; /* remove \n */ /* find key */ while(buf[i]==' ' || buf[i]=='\t') { i++; } if (buf[i] == '\0') return FALSE; *key=&buf[i]; /* find end of key */ while(buf[i]!=' ' && buf[i] != '\t' && buf[i] !='\0') i++; if (buf[i] == '\0') { *value=&buf[i]; return TRUE; } buf[i++]='\0'; /* find end of whitespace */ while(buf[i]==' ' || buf[i]=='\t') i++; *value=&buf[i]; return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_DefReadFile DESCRIPTION private function: read the data file, look for a match for the key, return the value (if any). END_DESCRIPTION PARAMETERS INPUT char* directory the directory of the file to read char* filename the filename to look in char* key string containing key value (e.g. NORTH) OUTPUT char** result string containing result. Mallocked by the function; freed by calling routine. Left as NULL if no key is found. END_PARAMETERS PRE_CONDITIONS -none END_PRE_CONDITIONS POST_CONDITIONS -result mallocked if successful, else NULL. END_POST_CONDITIONS RETURN_VALUE int: 0 if unsuccessful, 1 otherwise. result: a mallocked char * if successful, NULL otherwise. calling routine must free the memory. END_RETURN_VALUE PSEUDO_CODE END_PSEUDO_CODE END_FUNCTION_INFORMATION ******************************************************************** */ int ecs_DefReadFile(char *directory, char *filename, char *key, char **result) { FILE *fptr; char *indexfile; char buf[1024]; char *tmpkey, *value, *tmpfile; size_t len; indexfile=(char *) malloc (strlen(directory) +strlen(filename)+3); if (!indexfile) { return FALSE; } strcpy(indexfile, directory); if (indexfile[strlen(indexfile)-1]!='/') strcat(indexfile,"/"); tmpfile=ecs_strtrim(filename," \t",&len); strncat(indexfile, tmpfile, len); fptr=fopen(indexfile, "r"); free(indexfile); if (!fptr) { return FALSE; } /* read until we find a match for this url */ filename=NULL; while (!feof(fptr)) { ogdi_fgets(buf, MAX_DEF_LINE_LENGTH, fptr); if (ecs_DefReadALine(buf,&tmpkey,&value)) { #ifdef INFO_DEBUG printf("read KEY=>%s< VALUE=>%s<\n", tmpkey, value); printf("comparing tmpkey=%s to key=%s\n",tmpkey, key); #endif if (strcmp(tmpkey,key)== 0) { #ifdef INFO_DEBUG printf("FOUND KEY %s\n",tmpkey); printf("value=%s\n", value); #endif *result=(char *) malloc (strlen(value)+1); if (!*result) { fclose(fptr); return FALSE; } strcpy(*result, value); fclose(fptr); return TRUE; break; } } } fclose(fptr); *result=NULL; return FALSE; } /* ******************************************************************** FUNCTION_INFORMATION NAME strtrim DESCRIPTION trim a list of characters off both ends of a string END_DESCRIPTION PARAMETERS INPUT char * string: the string to be trimmed const char * set: a string consisting of characters to be trimmed OUTPUT size_t *index: the length of the trimmed string. this is 0 if all the elements were stripped; it is strlen(string) if nothing was stripped. END_PARAMETERS RETURN_VALUE a pointer to the start of the string. END_FUNCTION_INFORMATION ******************************************************************** */ char * ecs_strtrim(char * string, const char * set, size_t *index) { int begin, end, length; char ok, *tmp; begin=strspn(string,set); if (begin==(int) strlen(string)) { *index=0; return string; } length=strlen(set); end=strlen(string)-1; while(1) { ok=string[end]; if ((int)strcspn(set,&ok)==length) break; end--; if (end == 0) break; } *index=end-begin+1; tmp=&string[begin]; return tmp; } ogdi-ogdi_4_1_0/ogdi/c-api/ecslist.c000066400000000000000000000265351345660466700173630ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Handling of feature attribute list parsing. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.2 2001-04-09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); #define UCHAR(c) ((unsigned char) (c)) /* *---------------------------------------------------------------------- * * ecs_Backslash -- * * Figure out how to handle a backslash sequence. * * Results: * The return value is the character that should be substituted * in place of the backslash sequence that starts at src. If * readPtr isn't NULL then it is filled in with a count of the * number of characters in the backslash sequence. * * Side effects: * None. * *---------------------------------------------------------------------- */ char ecs_Backslash(src, readPtr) char *src; /* Points to the backslash character of * a backslash sequence. */ int *readPtr; /* Fill in with number of characters read * from src, unless NULL. */ { register char *p = src+1; char result; int count; count = 2; switch (*p) { case 'a': result = 0x7; /* Don't say '\a' here, since some compilers */ break; /* don't support it. */ case 'b': result = '\b'; break; case 'f': result = '\f'; break; case 'n': result = '\n'; break; case 'r': result = '\r'; break; case 't': result = '\t'; break; case 'v': result = '\v'; break; case 'x': if (isxdigit(UCHAR(p[1]))) { char *end; result = strtoul(p+1, &end, 16); count = end - src; } else { count = 2; result = 'x'; } break; case '\n': do { p++; } while (isspace(UCHAR(*p))); result = ' '; count = p - src; break; case 0: result = '\\'; count = 1; break; default: if (isdigit(UCHAR(*p))) { result = *p - '0'; p++; if (!isdigit(UCHAR(*p))) { break; } count = 3; result = (result << 3) + (*p - '0'); p++; if (!isdigit(UCHAR(*p))) { break; } count = 4; result = (result << 3) + (*p - '0'); break; } result = *p; count = 2; break; } if (readPtr != NULL) { *readPtr = count; } return result; } /* *---------------------------------------------------------------------- * * ecs_FindElement -- * * Given a pointer into a list, locate the first (or next) * element in the list. * * Results: * The return value is normally TRUE, which means that the * element was successfully located. If FALSE is returned * it means that list didn't have proper list structure; * * If TRUE is returned, then *elementPtr will be set to point * to the first element of list, and *nextPtr will be set to point * to the character just after any white space following the last * character that's part of the element. If this is the last argument * in the list, then *nextPtr will point to the NULL character at the * end of list. If sizePtr is non-NULL, *sizePtr is filled in with * the number of characters in the element. If the element is in * braces, then *elementPtr will point to the character after the * opening brace and *sizePtr will not include either of the braces. * If there isn't an element in the list, *sizePtr will be zero, and * both *elementPtr and *termPtr will refer to the null character at * the end of list. Note: this procedure does NOT collapse backslash * sequences. * * Side effects: * None. * *---------------------------------------------------------------------- */ int ecs_FindElement(list, elementPtr, nextPtr, sizePtr, bracePtr) char *list; /* String containing Tcl list with zero * or more elements (possibly in braces). */ char **elementPtr; /* Fill in with location of first significant * character in first element of list. */ char **nextPtr; /* Fill in with location of character just * after all white space following end of * argument (i.e. next argument or end of * list). */ int *sizePtr; /* If non-zero, fill in with size of * element. */ int *bracePtr; /* If non-zero fill in with non-zero/zero * to indicate that arg was/wasn't * in braces. */ { register char *p; int openBraces = 0; int inQuotes = 0; int size; /* * Skim off leading white space and check for an opening brace or * quote. Note: use of "isascii" below and elsewhere in this * procedure is a temporary hack (7/27/90) because Mx uses characters * with the high-order bit set for some things. This should probably * be changed back eventually, or all of Tcl should call isascii. */ while (isspace(UCHAR(*list))) { list++; } if (*list == '{') { openBraces = 1; list++; } else if (*list == '"') { inQuotes = 1; list++; } if (bracePtr != 0) { *bracePtr = openBraces; } p = list; /* * Find the end of the element (either a space or a close brace or * the end of the string). */ while (1) { switch (*p) { /* * Open brace: don't treat specially unless the element is * in braces. In this case, keep a nesting count. */ case '{': if (openBraces != 0) { openBraces++; } break; /* * Close brace: if element is in braces, keep nesting * count and quit when the last close brace is seen. */ case '}': if (openBraces == 1) { char *p2; size = p - list; p++; if (isspace(UCHAR(*p)) || (*p == 0)) { goto done; } for (p2 = p; (*p2 != 0) && (!isspace(UCHAR(*p2))) && (p2 < p+20); p2++) { /* null body */ } return FALSE; } else if (openBraces != 0) { openBraces--; } break; /* * Backslash: skip over everything up to the end of the * backslash sequence. */ case '\\': { int size; (void) ecs_Backslash(p, &size); p += size - 1; break; } /* * Space: ignore if element is in braces or quotes; otherwise * terminate element. */ case ' ': case '\f': case '\n': case '\r': case '\t': case '\v': if ((openBraces == 0) && !inQuotes) { size = p - list; goto done; } break; /* * Double-quote: if element is in quotes then terminate it. */ case '"': if (inQuotes) { char *p2; size = p-list; p++; if (isspace(UCHAR(*p)) || (*p == 0)) { goto done; } for (p2 = p; (*p2 != 0) && (!isspace(UCHAR(*p2))) && (p2 < p+20); p2++) { /* null body */ } return FALSE; } break; /* * End of list: terminate element. */ case 0: /* return FALSE;*/ size = p - list; goto done; } p++; } done: while (isspace(UCHAR(*p))) { p++; } *elementPtr = list; *nextPtr = p; if (sizePtr != 0) { *sizePtr = size; } return TRUE; } /* *---------------------------------------------------------------------- * * ecs_CopyAndCollapse -- * * Copy a string and eliminate any backslashes that aren't in braces. * * Results: * There is no return value. Count chars. get copied from src * to dst. Along the way, if backslash sequences are found outside * braces, the backslashes are eliminated in the copy. * After scanning count chars. from source, a null character is * placed at the end of dst. * * Side effects: * None. * *---------------------------------------------------------------------- */ void ecs_CopyAndCollapse(count, src, dst) int count; /* Total number of characters to copy * from src. */ char *src; /* Copy from here... */ char *dst; /* ... to here. */ { register char c; int numRead; for (c = *src; count > 0; src++, c = *src, count--) { if (c == '\\') { *dst = ecs_Backslash(src, &numRead); dst++; src += numRead-1; count -= numRead-1; } else { *dst = c; dst++; } } *dst = 0; } /* *---------------------------------------------------------------------- * * ecs_SplitList -- * * Splits a list up into its constituent fields. * * Results * The return value is normally TRUE, which means that * the list was successfully split up. If FALSE is * returned, it means that "list" didn't have proper list * structure; interp->result will contain a more detailed * error message. * * *argvPtr will be filled in with the address of an array * whose elements point to the elements of list, in order. * *argcPtr will get filled in with the number of valid elements * in the array. A single block of memory is dynamically allocated * to hold both the argv array and a copy of the list (with * backslashes and braces removed in the standard way). * The caller must eventually free this memory by calling free() * on *argvPtr. Note: *argvPtr and *argcPtr are only modified * if the procedure returns normally. * * Side effects: * Memory is allocated. * *---------------------------------------------------------------------- */ int ecs_SplitList(list, argcPtr, argvPtr) char *list; /* Pointer to string with list structure. */ int *argcPtr; /* Pointer to location to fill in with * the number of elements in the list. */ char ***argvPtr; /* Pointer to place to store pointer to array * of pointers to list elements. */ { char **argv; register char *p; int size, i, result, elSize, brace; char *element; /* * Figure out how much space to allocate. There must be enough * space for both the array of pointers and also for a copy of * the list. To estimate the number of pointers needed, count * the number of space characters in the list. */ for (size = 1, p = list; *p != 0; p++) { if (isspace(UCHAR(*p))) { size++; } } size++; /* Leave space for final NULL pointer. */ argv = (char **) malloc((unsigned) ((size * sizeof(char *)) + (p - list) + 1)); for (i = 0, p = ((char *) argv) + size*sizeof(char *); *list != 0; i++) { result = ecs_FindElement(list, &element, &list, &elSize, &brace); if (result != TRUE) { free((char *) argv); return result; } if (*element == 0) { break; } if (i >= size) { free((char *) argv); return FALSE; } argv[i] = p; if (brace) { strncpy(p, element, (size_t) elSize); p += elSize; *p = 0; p++; } else { ecs_CopyAndCollapse(elSize, element, p); p += elSize+1; } } argv[i] = NULL; *argvPtr = argv; *argcPtr = i; return TRUE; } ogdi-ogdi_4_1_0/ogdi/c-api/ecssplit.c000066400000000000000000000075571345660466700175460ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: High level URL splitting functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.3 2003-08-27 05:27:21 warmerda * Modified ecs_SplitURL() so that calling with a NULL url indicates it * should free the resources associated with the static regular expressions. * This makes memory leak debugging with OGDI more convenient. * * Revision 1.2 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" #include ECS_CVSID("$Id$"); /* ------------------------------------------------- ecs_freeSplitURL: deallocate all the string used in SplitURL operation. IN/OUT: type: machine: path: the three string to deallocate ------------------------------------------------- */ void ecs_freeSplitURL(type,machine,path) char **type; char **machine; char **path; { if (*type != NULL) { free(*type); *type = NULL; } if (*machine != NULL) { free(*machine); *machine = NULL; } if (*path != NULL) { free(*path); *path = NULL; } } static int parse_server_path(const char* url, char **server, char **path) { int i; for( i = 0; url[i]; i++ ) { if ( !( (url[i] >= '0' && url[i] <= '9') || (url[i] >= 'a' && url[i] <= 'z') || (url[i] >= 'A' && url[i] <= 'Z') || url[i] == '.' ) ) { break; } } if( i == 0 ) return FALSE; *server = malloc( i + 1 ); memcpy(*server, url, i ); (*server)[i] = 0; *path = malloc( strlen(url + i) + 1 ); strcpy(*path, url + i); return TRUE; } /* ------------------------------------------------- ecs_SplitURL: Extract information from the URL and return it in the arguments. IN: char *url: This string contain the URL OUT: machine: Machine addresses contain in the URL. If NULL, the server is local server: The server type of the DLL to load path: The string used by the dynamic database library to set the database server. Specific to each kind of server. return int: A error message TRUE: success FALSE: failure ------------------------------------------------- */ int ecs_SplitURL(url,machine,server,path) const char *url; char **machine; char **server; char **path; { if( url == NULL ) { /* Cleanup */ return FALSE; } *machine = NULL; *server = NULL; *path = NULL; if(strncmp(url,"gltp://",7) == 0) { const char* slash; url += 7; slash = strchr(url, '/'); if( !slash ) { return FALSE; } *machine = malloc(slash - url + 1); memcpy(*machine, url, slash - url); (*machine)[slash - url] = 0; return parse_server_path(slash + 1, server, path); } else if (strncmp(url,"gltp:/",6) == 0) { return parse_server_path(url + 6, server, path); } else { return FALSE; } } ogdi-ogdi_4_1_0/ogdi/c-api/ecstile.c000066400000000000000000000606341345660466700173430ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Raster tile caching implementation. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.5 2007-02-12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.4 2001/04/19 05:09:17 warmerda * fixed round off errors in calculation of t->linelength, and placed * coord.x/y at center of pixel instead of the corner. * * Revision 1.3 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileInitialize DESCRIPTION -allows driver to describe the tile structure END_DESCRIPTION POSTCONDITIONS -tile structure allocated in ecs_Server, or error -t->index == -1 END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *server: the server structure. ecs_Region *region: the region of the database int xtiles: the number of tiles along x axis int ytiles: the number of tiles along y axis int callbackFunc(): the callback for i,j values int tileDimFunc(): the callback for tile dimension. (pass NULL if none) END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE 1) initialize the tile layout. 2) ecs_TileStructure allocated, added to ecs_Result. 3) callback, closeTile procedures are registered. END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileInitialize DESCRIPTION allows driver to describe the tile structure END_DESCRIPTION POSTCONDITIONS -tile structure allocated in ecs_Server, or error -t->index == -1 END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: the server structure. ecs_TileStructure *t: The pointer to tile information. ecs_Region *region: the region of the database int xtiles: the number of tiles along x axis int ytiles: the number of tiles along y axis int tilewidth: The tile width int tileheight: The tile height int callbackFunc(): the callback for i,j values int tileDimFunc(): the callback for tile dimension. (pass NULL if none) END_PARAMETERS RETURN_VALUE returns TRUE or FALSE if successful or not END_FUNCTION_INFORMATION PSEUDOCODE 1) initialize the tile layout. 2) ecs_TileStructure allocated, added to ecs_Result. 3) callback, closeTile procedures are registered. END_PSEUDOCODE ******************************************************************* */ int ecs_TileInitialize (s, t, region, xtiles, ytiles, tilewidth, tileheight, callbackFunc, tileDimFunc) ecs_Server *s; ecs_TileStructure *t; ecs_Region *region; int xtiles; int ytiles; int tilewidth; int tileheight; tile_func *callbackFunc; tile_func *tileDimFunc; { /* static dirty=0; if (dirty) { ecs_TileDeleteAllLines(t); } dirty=1; */ (void) s; t->width=tilewidth; t->height=tileheight; t->nb_lines=0; t->index = -1; t->offValue=0; t->uninitializedValue=-1; t->currentTile.none=1; t->callback=callbackFunc; t->tileDimCallback=tileDimFunc; t->linelength= -1; t->region.north=region->north; t->region.south=region->south; t->region.east=region->east; t->region.west=region->west; t->region.ew_res=region->ew_res; t->region.ns_res=region->ns_res; t->regionwidth = (int) ((t->region.east - t->region.west) / t->region.ew_res); t->regionheight = (int) ((t->region.north - t->region.south) / t->region.ns_res); t->linebuffer=NULL; t->xtiles=xtiles; t->ytiles=ytiles; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileGetLine DESCRIPTION -allows driver to retrieve a line. END_DESCRIPTION PRECONDITIONS: -callback must have been registered -the length of a line must have been put into TileData POSTCONDITIONS tile structure allocated in ecs_Server, or error END_POSTCONDITIONS PARAMETERS INPUT ecs_TileStructure *server: the tile structure. ecs_Coordinate *start; the start geog coordinate ecs_Coordinate *end; the ending geog coordinate END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE 1) determines the last point (if any) that has been set by previous calls to ecs_TileGetLine (the part which is sitting in the buffer) 2) examines remainder of the line to determine the tiles it crosses. 2a) for each point in the matrix, 2a1) if it is outside the tiles, add the "no_data" value. 2a2) else call the callback for each point in the line for each of these tiles, 2a3) read the rest of the tile into the buffer for future lines. 3) goto (2) for each tile that intersects with the line until the easternmost point is reached. 4) pad extra values with offValue 5) return an ecs_Result with a line (or error) END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileGetLine(s,t,start,end) ecs_Server *s; ecs_TileStructure *t; ecs_Coordinate *start; ecs_Coordinate *end; { int count, tmp, cat; register int y, i, j, firsttime, pix_x, pix_y; ecs_TileBufferLine *tbuf; ecs_Coordinate coord; ecs_TileID tile_id; ecs_Layer *l; double ew_res, ns_res; register int offsetx,offsety; register double ratio_x,ratio_y; int posidres; offsetx = (int) ((s->currentRegion.west - t->region.west)/t->region.ew_res); offsety = (int) ((t->region.north - s->currentRegion.north)/t->region.ns_res); ratio_x = s->currentRegion.ew_res/t->region.ew_res; ratio_y = s->currentRegion.ns_res/t->region.ns_res; l=&(s->layer[s->currentLayer]); /* get the id of this line */ if (start->x >= end->x) { ecs_SetError(&(s->result), 1, "Coordinates are invalid"); ecs_TileDeleteAllLines(t); return FALSE; } /* calculate linelength */ if (t->linelength<0) { t->linelength = (int) (((end->x-start->x) / s->currentRegion.ew_res)+0.5); } else { tmp=(int) (((end->x - start->x) / s->currentRegion.ew_res)+0.5); /* check if resolution has changed */ if (tmp!=t->linelength) { ecs_TileDeleteAllLines(t); }; t->linelength=tmp; } /* initialize the ecs_result */ ecs_SetGeomMatrix(&(s->result), t->linelength); /* if the line is not the first in the buffer, it isn't there, so it must be created. */ /* the y value of this point */ /* y=(int) ((s->currentRegion.north- start->y) / s->currentRegion.ns_res); */ y=l->index; /* if the first line of the buffer isn't the current line, add it to the buffer */ if (t->index != y) { ecs_TileAddLine(t,t->linelength, y, &tbuf); } firsttime=1; /* scan the first line of the buffer for uninitialized pixels. */ for (count=0; count< t->linelength; count++) { if (t->linebuffer->linebuffer[count]==t->uninitializedValue) { i=y; j=count; if (t->tileDimCallback!=NULL) { coord.x=s->currentRegion.west+(j+0.5)*s->currentRegion.ew_res; coord.y=s->currentRegion.north-(i+0.5)*s->currentRegion.ns_res; t->tileDimCallback(s, t, coord.x, coord.y, &(t->width), &(t->height)); ew_res=1.0 / (double) t->width; ns_res=1.0 / (double) t->height; pix_x = (int) ((coord.x - t->region.west) / ew_res); pix_y = (int) ((t->region.north-coord.y) / ns_res); posidres = ecs_GetTileId(s, t, &coord, &tile_id); } else { pix_x = ((int) (j*ratio_x))+offsetx; pix_y = ((int) (i*ratio_y))+offsety; posidres = ecs_GetTileIdFromPos(s, t, pix_x, pix_y, &tile_id); } if (posidres) { if (!firsttime) { /* if the tile_id changes, try to read the next line in the old tile */ if (! ecs_TileCompare(&(t->currentTile),&tile_id)) { /* read the rest of the tile */ ecs_TileFill(s, t, y, &(t->currentTile)); } } firsttime=0; ecs_SetTile(&(t->currentTile), &tile_id); if (tile_id.x < 0 || tile_id.x >= t->xtiles || tile_id.y < 0 || tile_id.y >= t->ytiles) { ECS_SETGEOMMATRIXVALUE((&(s->result)),count,t->offValue); } else { if (t->callback(s, t, tile_id.x, tile_id.y, pix_x % t->width, pix_y % t->height, &cat)) { ECS_SETGEOMMATRIXVALUE((&(s->result)),count,cat); } else { ecs_TileDeleteAllLines(t); printf("can't read pixel (%d,%d) in tile (%d,%d)\n", pix_x, pix_y, tile_id.x, tile_id.y); ecs_SetError(&(s->result),1,"Unable to read matrix value"); return FALSE; } } } else { /* out of bounds */ ECS_SETGEOMMATRIXVALUE((&(s->result)),count,t->offValue); } } else { ECS_SETGEOMMATRIXVALUE((&(s->result)),count,t->linebuffer->linebuffer[count]); } } ecs_TileDeleteLine(t); ecs_SetSuccess(&(s->result)); return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_ClearTileBuffer DESCRIPTION Public function called by the driver during Select Layer END_DESCRIPTION PRECONDITIONS ecs_TileInitialize must have been called first. END_PRECONDITIONS PARAMETERS INPUT ecs_TileStructure *t; END_PARAMETERS RETURN_VALUE none END_FUNCTION_INFORMATION PSEUDOCODE 1) call the destroyalllines procedure END_PSEUDOCODE ******************************************************************* */ void ecs_TileClearBuffer(ecs_TileStructure *t) { ecs_TileDeleteAllLines(t); return; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileFill DESCRIPTION fill the buffer with data from a single tile. END_DESCRIPTION PRECONDITIONS -there is at least one line in the buffer already. -the "index" position in the matrix has already been filled. END_PRECONDITIONS PARAMETERS INPUT ecs_TileStructure *s: the server structure. ecs_TileID *tile_id: the tile_id of the tile to fill. int index: the y position in the matrix END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE 1) start at line index+2, position "last" (i.e. start from the first unfilled pixel on the next line) 2) If the first pixel is in another tile, return. (This means that either the tile border has a negative slope (\) and the left tile hasn't been filled, or that the tile has been completed). 3) Read the line until the end of the tile, then recurse. END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileFill(ecs_Server *s, ecs_TileStructure *t, int index, ecs_TileID *current_tile_id) { register int i,j, bufptr, pix_x, pix_y; int cat,count; short firsttime=1; ecs_Coordinate coord; ecs_TileBufferLine *tbuf; ecs_TileID tile_id; double ew_res, ns_res; register int offsetx,offsety; register double ratio_x,ratio_y; int posidres; bufptr=index+1; /* the number of the next line in the buffer */ offsetx = (int) ((s->currentRegion.west - t->region.west)/t->region.ew_res); offsety = (int) ((t->region.north - s->currentRegion.north)/t->region.ns_res); ratio_x = s->currentRegion.ew_res/t->region.ew_res; ratio_y = s->currentRegion.ns_res/t->region.ns_res; /* if the line isn't in the buffer, add it. */ if (! ecs_TileFindBuffer(t, bufptr, &tbuf)) { if (! ecs_TileAddLine(t,t->linelength, bufptr, &tbuf)) { return FALSE; } } /* return 1; */ for (count=tbuf->last+1; count< t->linelength; count++) { if (tbuf->linebuffer[count]==t->uninitializedValue) { j = count; i = bufptr; if (t->tileDimCallback!=NULL) { coord.x=s->currentRegion.west+j*s->currentRegion.ew_res; coord.y=s->currentRegion.north-i*s->currentRegion.ns_res; t->tileDimCallback(s, t, coord.x, coord.y, &(t->width), &(t->height)); ew_res=1.0 / (double) t->width; ns_res=1.0 / (double) t->height; pix_x = (int) ((coord.x - t->region.west) / ew_res); pix_y = (int) ((t->region.north-coord.y) / ns_res); posidres = ecs_GetTileId(s, t, &coord, &tile_id); } else { pix_x = ((int) (j*ratio_x))+offsetx; pix_y = ((int) (i*ratio_y))+offsety; posidres = ecs_GetTileIdFromPos(s, t, pix_x, pix_y, &tile_id); } if (posidres) { /* if the tile_id changes, try to read the next line in the same tile, unless this is the first pixel in the line. */ if (! ecs_TileCompare(current_tile_id,&tile_id)) { if (firsttime) { /* the first value is not in the tile, so return. */ return TRUE; } /* we're done this line, so read the rest of the tile recursively */ return (ecs_TileFill(s, t, bufptr, current_tile_id)); } /* ecs_TileCompare */ firsttime=0; /* i.e. we've found a valid pixel */ /* ecs_SetTile(&(t->currentTile), &tile_id); */ /* i and j are BOGUS values for testing */ if (tile_id.x < 0 || tile_id.x >= t->xtiles || tile_id.y < 0 || tile_id.y >= t->ytiles) { tbuf->linebuffer[++(tbuf->last)]=t->offValue; } else { if (t->callback(s, t, tile_id.x, tile_id.y, pix_x % t->width, pix_y %t->height, &cat)) { tbuf->linebuffer[++(tbuf->last)]=cat; } else { ecs_TileDeleteAllLines(t); ecs_SetError(&(s->result),1,"Unable to read matrix value"); return FALSE; } } } else { /* out of bounds */ tbuf->linebuffer[++(tbuf->last)]=t->offValue; } } else { /* t->linebuffer... is uninitialized */ #if TILE_DEBUG printf("**** point redone. ***********\n"); #endif } } return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_GetTileId DESCRIPTION Determine which tile a pair of matrix coords fit in. END_DESCRIPTION PRECONDITIONS: ecs_TileStructure is initialized END_PRECONDITIONS PARAMETERS INPUT ecs_TileStructure *s: the server structure. int x_pixel: the pixel values of the point int y_pixel: END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_GetTileId(ecs_Server *s, ecs_TileStructure *t, ecs_Coordinate *coord, ecs_TileID *tile_id) { (void) s; if (coord->x < t->region.west || coord->x > t->region.east || coord->y < t->region.south || coord->y > t->region.north) { tile_id->none=1; return FALSE; } tile_id->x=(int) ((coord->x-t->region.west) / (t->region.east - t->region.west) * t->xtiles); tile_id->y=(int) ((t->region.north - coord->y) / (t->region.north - t->region.south) * t->ytiles); tile_id->none=0; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_GetTileIdFromPos DESCRIPTION Determine which tile a pair of matrix coords fit in. END_DESCRIPTION PRECONDITIONS: ecs_TileStructure is initialized END_PRECONDITIONS PARAMETERS INPUT ecs_TileStructure *s: the server structure. int x_pixel: the pixel values of the point int y_pixel: END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_GetTileIdFromPos(ecs_Server *s, ecs_TileStructure *t, int x, int y, ecs_TileID *tile_id) { (void) s; if (x < 0 || x > t->regionwidth || y < 0 || y > t->regionheight) { tile_id->none=1; return FALSE; } tile_id->x=(int) ((x * t->xtiles) / t->regionwidth); tile_id->y=(int) ((y * t->ytiles) / t->regionheight); tile_id->none=0; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileFindBuffer DESCRIPTION private function which finds a line in the buffer if it exists, and returns a pointer to it. END_DESCRIPTION PRECONDITIONS: ecs_TileStructure structure has been initialized. END_PRECONDITIONS POSTCONDITIONS END_POSTCONDITIONS PARAMETERS INPUT ecs_TileStructure *tile: the server structure. int bufptr the index of the line in the buffer OUTPUT tbuf pointer to the new line buffer. END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE 1) determine if the line is in the list. 2) if no, return FALSE. 3) set tbuf to point to the buffer line, return TRUE END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileFindBuffer(ecs_TileStructure *t, int bufptr, ecs_TileBufferLine **tbuf) { ecs_TileBufferLine *tptr; if ( t->nb_lines <= 0) { tbuf=NULL; return FALSE; } if (bufptr < t->index || bufptr > t->index + t->nb_lines -1) { tbuf=NULL; return FALSE; } tptr=t->linebuffer; while (tptr!=NULL) { if (tptr->index==bufptr) { *tbuf=tptr; return TRUE; } tptr=tptr->next; } #ifdef TILE_DEBUG printf(" can't find buffer line %d; it's supposed to be there.\n",bufptr); #endif tbuf=NULL; return FALSE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileAddLine DESCRIPTION private function which adds a buffered line to the ecs_TileStructure structure END_DESCRIPTION PRECONDITIONS: ecs_TileStructure structure has been initialized. END_PRECONDITIONS POSTCONDITIONS extra line has been mallocked. All values are set to the "uninitialized" value. END_POSTCONDITIONS PARAMETERS INPUT ecs_TileStructure *tile: the server structure. int length the length of the buffer. int index the index of the line. OUTPUT tbuf pointer to the new line buffer. END_PARAMETERS RETURN_VALUE < returns TRUE or FALSE if successful or not > PSEUDOCODE 1) malloc a line; set next pointers accordingly. 2) place line in ecs_tile 3) set last=-1, index to the y matrix (map pixel) value. 4) set all values to "uninitialized" END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileAddLine(ecs_TileStructure *t, int length, int index, ecs_TileBufferLine **tbuf) { /* malloc buffer */ register int i; ecs_TileBufferLine *tmp, *last=NULL; #if 0 printf("+++adding a line %d to buffer\n",index); #endif /* insert new line at tail of list (FIFO)*/ tmp=t->linebuffer; /* find the last buffer line */ while (tmp != NULL) { last=tmp; tmp=tmp->next; } /* allocate the buffer */ tmp=(ecs_TileBufferLine *) malloc (sizeof (ecs_TileBufferLine)); if (!tmp) { return FALSE; } if (t->linebuffer==NULL) { t->linebuffer=tmp; t->index=index; } else { last->next=tmp; } /* allocate the space for the pixels */ tmp->linebuffer=(int *) malloc (sizeof (int) * length); if (!tmp->linebuffer) { return FALSE; } tmp->next=NULL; tmp->index=index; tmp->last=-1; t->nb_lines++; /* set all values to "uninitialized" */ for (i=0; ilinebuffer[i]=t->uninitializedValue; } *tbuf=tmp; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileDeleteLine DESCRIPTION removes a line from the buffer END_DESCRIPTION PRECONDITIONS: The t->linebuffer *must* have been initialized before, at least so it points to NULL. END_PRECONDITIONS POSTCONDITIONS deletes top line from the buffer. decreases t->nb_lines by 1 END_POSTCONDITIONS PARAMETERS INPUT ecs_TileStructure *tile: the server structure. int length the length of the buffer. END_PARAMETERS RETURN_VALUE returns TRUE if a line was deleted. Else return FALSE. PSEUDOCODE 1) remove the top line from the buffer and free memory. If none, return "FALSE" END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileDeleteLine(ecs_TileStructure *t) { ecs_TileBufferLine *tmp; /* free buffer if any */ if (t->nb_lines==0) { return FALSE; } #if 0 fprintf(stdout, "---deleting line %d from buffer\n", t->index); #endif t->nb_lines--; tmp=t->linebuffer->next; if (tmp != NULL) { t->index=tmp->index; } else { t->index = -1; } free(t->linebuffer->linebuffer); free(t->linebuffer); t->linebuffer=tmp; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileDeleteAllLines DESCRIPTION removes all lines from the buffer END_DESCRIPTION PRECONDITIONS: none END_PRECONDITIONS POSTCONDITIONS: t->nb_lines is 0 END_POSTCONDITIONS PARAMETERS INPUT ecs_TileStructure *tile: the tile structure. END_PARAMETERS RETURN_VALUE none PSEUDOCODE 1) Keep calling ecs_TileDeleteLine until it returns FALSE. END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ void ecs_TileDeleteAllLines (ecs_TileStructure *t) { /* fprintf(stdout, "removing buffer\n"); */ while (ecs_TileDeleteLine(t)) {}; t->nb_lines=0; return; } /* ******************************************************************* FUNCTION_INFORMATION NAME ecs_TileFind DESCRIPTION returns true if within current tiles END_DESCRIPTION PRECONDITIONS: none END_PRECONDITIONS PARAMETERS INPUT ecs_Server *s: the server structure ecs_Coordinate *coord: the coordinate to locate OUTPUT ecs_TileId *tile: the tiling structure. END_PARAMETERS RETURN_VALUE none PSEUDOCODE 1) Keep calling ecs_TileDeleteLine until it returns FALSE. END_PSEUDOCODE END_FUNCTION_INFORMATION ******************************************************************* */ int ecs_TileCompare (ecs_TileID *id1, ecs_TileID *id2) { if (id1->none || id2->none) return FALSE; if (id1->x==id2->x && id1->y==id2->y) return TRUE; return FALSE; } int ecs_SetTile (ecs_TileID *destination, ecs_TileID *source) { /* determine which tile x and y are in */ destination->none=source->none; destination->x=source->x; destination->y=source->y; return TRUE; } ogdi-ogdi_4_1_0/ogdi/c-api/makefile000066400000000000000000000036231345660466700172420ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = ogdi ifeq ($(TARGET),Linux) TARGETGEN=$(SHRDGEN) else TARGETGEN=$(DYNAGEN) endif SOURCES = ecs_dyna.c ecssplit.c \ ecsassoc.c ecstile.c server.c ecsdist.c \ ecslist.c ecsinfo.c ecsgeo.c ecs_xdr.c ecs_xdrz.c\ matrix.c client.c ecs_capabilities.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) \ $(GRASS_INCLUDE) $(ZLIB_INCLUDE) \ $(EXPAT_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) -DMODULES_PATH="\"$(INST_LIB)/ogdi/\"" LINK_LIBS= $(RPC_LINKLIB) $(ZLIB_LINKLIB) $(EXPAT_LINKLIB) $(WIN_LINKLIB) \ $(MATH_LINKLIB) EXTRA_INSTALL_TARGETS = install-so-link include $(TOPDIR)/config/common.mak all: MKOBJECTDIR ecs_xdr.c $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) $(COPY_LOCAL) # # Because the RPCGEN process doesn't work too well on many # platforms we disable it by default, and make people do a "make rpcgen" # to regenerate ecs_xdr.c explicitly. # #ecs_xdr.c: ../include/ecs.x rpcgen: -$(RM) -f ecs.x -$(RM) -f $@.raw -$(RM) -f $@ $(FILECOPY) ../include/ecs.x ecs.x rpcgen -C -c -o $@.raw ecs.x perl ../scripts/xdr_clean.pl -o $@ $@.raw $(RM) -f ecs.x clean: default-clean ogdi-ogdi_4_1_0/ogdi/c-api/matrix.c000066400000000000000000000145301345660466700172110ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Double precision matrix inverse, allocation, multiplication, * and print routines. * ****************************************************************************** */ #include #include #include "ecs.h" #include "matrix.h" #define EPSILON 1.0e-16 /* * initialize values within a matrix. */ void mat_init(double **matrix, int height, int width) { int i=0, j=0; for (i=0; i < height; i++) { for (j=0; j < width; j++) { matrix[i][j]=0; } } } /** * mat_mult_direct - multiply directly two 2D matrixes * */ void mat_mul_direct (matrix_a, height_a, width_a, matrix_b, height_b, width_b, matrix_result) double **matrix_a; int height_a; int width_a; double **matrix_b; int height_b; int width_b; double **matrix_result; { /* initialize loop iterators */ int i=0, j=0, k=0; /* initialise result matrix */ mat_init( matrix_result, width_a, width_b ); /* compute multiply of each elements into destination matrix */ for ( i = 0 ; i< height_a; i++ ) for ( j = 0 ; j< width_b; j++ ) for ( k = 0 ; k< width_a; k++ ) matrix_result[i][j] += matrix_a[i][k]*matrix_b[k][j]; return; } /** * mat_mult_traspose - multiply traspose of first 2D matrix * transposed with second 2D matrix */ void mat_mul_transposed (matrix_a, height_a, width_a, matrix_b, height_b, width_b, matrix_result) double **matrix_a; int height_a; int width_a; double **matrix_b; int height_b; int width_b; double **matrix_result; { /* initialize loop iterators */ int i=0, j=0, k=0; /* initialise result matrix */ mat_init( matrix_result, width_a, width_b ); /* compute multiply of each elements into destination matrix */ for( i=0; i 1) /* check for dependency */ { ret = -1; goto end; } /* interchange rows to put pivot element on diagonal */ if (ir != ic) for (l = 0; l < n; l++) { t = matrix[ir][l]; matrix[ir][l] = matrix[ic][l]; matrix[ic][l] = t; } itemp_0[i] = ir; itemp_1[i] = ic; pivot[i] = matrix[ic][ic]; /* check for zero pivot */ if (fabs (pivot[i]) < EPSILON) { ret = -1; goto end; } /* divide pivot row by pivot element */ matrix[ic][ic] = 1.0; for (j = 0; j < n; j++) matrix[ic][j] /= pivot[i]; /* reduce nonpivot rows */ for (k = 0; k < n; k++) if (k != ic) { t = matrix[k][ic]; matrix[k][ic] = 0.0; for (l = 0; l < n; l++) matrix[k][l] -= (matrix[ic][l] * t); } } /* interchange columns */ for (i = 0; i < n; i++) { l = n - i - 1; if (itemp_0[l] == itemp_1[l]) continue; ir = itemp_0[l]; ic = itemp_1[l]; for (k = 0; k < n; k++) { t = matrix[k][ir]; matrix[k][ir] = matrix[k][ic]; matrix[k][ic] = t; } } end: free(ipivot); free(itemp_0); free(itemp_1); free(pivot); return ret; } /* * allocate memory for a 2D matrix with type of double elements. * returns NULL on failure. */ double **mat_malloc(int height,int width) { int i=0; double **matrix=NULL; matrix = (double **)malloc(height*sizeof(double *)); if(matrix == NULL) { printf("Allocating memory for matrix computation pointers failed. \n"); free(matrix); exit(1); } for (i=0;i < height;i++) { matrix[i] = (double *)malloc(width*sizeof(double)); if(matrix == NULL) { printf("Allocating memory for matrix data failed. \n"); free(matrix); exit(1); } } /* initialize values in matrix */ mat_init(matrix,height,width); /* matrix created, return it */ return matrix; } /* * unallocate memory for a 2D matrix. */ void mat_free(double **matrix, int height) { int i=0; for (i=0; i 1 type matrix only.*/ if (matrix) free(matrix); } ogdi-ogdi_4_1_0/ogdi/c-api/matrix.h000066400000000000000000000014621345660466700172160ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Double precision matrix inverse, allocation, multiplication, * and print routines. * ****************************************************************************** */ /* linear algebra matrix routines */ int mat_inverse(double **matrix, int n); void mat_mul_direct (double **matrix_a,int height_a,int width_a, double **matrix_b,int height_b,int width_b, double **matrix_result); void mat_mul_transposed (double **matrix_a,int height_a,int width_a, double **matrix_b,int height_b,int width_b, double **matrix_result); /* matrix memory allocation routine */ double **mat_malloc(int heigth, int width); void mat_free(double **matrix, int height); ogdi-ogdi_4_1_0/ogdi/c-api/ogdi.def000066400000000000000000000053011345660466700171370ustar00rootroot00000000000000EXPORTS cln_CreateClient cln_DestroyClient cln_SelectLayer cln_ReleaseLayer cln_BroadCloseLayers cln_SelectRegion cln_SelectMask cln_UnSelectMask cln_GetDictionary cln_GetAttributesFormat cln_GetNextObject cln_GetRasterInfo cln_GetObject cln_GetObjectIdFromCoord cln_UpdateDictionary cln_GetGlobalBound cln_SetServerLanguage cln_GetServerProjection cln_SetTclProc cln_GetTclProc cln_GetClientIdFromURL cln_GetURLList cln_SetRegionCaches cln_LoadCache cln_ReleaseCache cln_SetCompression ecs_DistanceObject ecs_DistanceObjectWithTolerance ecs_SetTolerance ecs_DistanceMBR ecs_DistanceSegment ecs_SetError ecs_SetSuccess ecs_AdjustResult ecs_SetGeoRegion ecs_SetText ecs_AddText ecs_SetRasterInfo ecs_AddRasterInfoCategory ecs_SetObjAttributeFormat ecs_AddAttributeFormat ecs_SetGeomPoint ecs_SetGeomText ecs_SetGeomLine ecs_SetGeomArea ecs_SetGeomAreaRing ecs_SetGeomMatrix ecs_SetGeomMatrixWithArray ecs_SetGeomImage ecs_SetGeomImageWithArray ecs_SetObjectId ecs_SetObjectAttr ecs_CleanUp ecs_CleanUpObject ecs_ResultInit ecs_CalcObjectMBR ecs_freeSplitURL ecs_SplitURL ecs_Backslash ecs_FindElement ecs_CopyAndCollapse ecs_SplitList svr_CreateServer svr_DestroyServer svr_SelectLayer svr_ReleaseLayer svr_SelectRegion svr_GetDictionary svr_GetAttributesFormat svr_GetNextObject svr_GetRasterInfo svr_GetObject svr_GetObjectIdFromCoord svr_UpdateDictionary svr_GetServerProjection svr_GetGlobalBound svr_SetServerLanguage svr_SetRasterConversion svr_CloseLayer svr_BroadCloseLayers ecs_SetLayer ecs_GetLayer ecs_FreeLayer ecs_RemoveDir ecs_GetDefaultInfo xdr_ecs_Family xdr_ecs_Region xdr_ecs_Coordinate xdr_ecs_FeatureRing xdr_ecs_Area xdr_ecs_Line xdr_ecs_Point xdr_ecs_Matrix xdr_ecs_Image xdr_ecs_Text xdr_ecs_Node xdr_ecs_Edge xdr_ecs_TopoLevel xdr_ecs_Face xdr_ecs_AreaPrim xdr_ecs_Geometry xdr_ecs_Object xdr_ecs_AttributeFormat xdr_ecs_ObjAttribute xdr_ecs_ObjAttributeFormat xdr_ecs_Category xdr_ecs_RasterInfo xdr_ecs_ResultType xdr_ecs_ResultUnion xdr_ecs_Result xdr_ecs_LayerSelection xdr_ecs_RasterConversion xdr_ecs_Compression xdr_ecs_ProxyCreateServer ecs_begin_ellipsoid_polygon_area ecs_planimetric_polygon_area ecs_ellipsoid_polygon_area ecs_geodesic_distance ecs_CalculateCentroid ecs_CopyObject ecs_CopyResult ecs_FreeObject pj_free pj_init pj_inv pj_fwd rtodms set_rtodms ecs_TileInitialize ecs_TileGetLine ecs_TileClearBuffer cln_BlockOGDI cln_UnBlockOGDI cln_GetVersion cln_CheckExtension cln_GetLayerCapabilities cln_LoadCapabilities ecs_GetRGBFromPixel ecs_GetPixelFromRGB ecs_SetReportErrorFunction ecs_ShouldStopOnError ecs_SetErrorShouldStop ecs_TileDeleteAllLinesogdi-ogdi_4_1_0/ogdi/c-api/opendir.c000066400000000000000000000131201345660466700173370ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Implementation of BSD directory routines for MS-DOS. * ****************************************************************************** * @(#)dir.c 1.4 87/11/06 Public Domain. * * A public domain implementation of BSD directory routines for * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), * August 1897 * Ported to OS/2 by Kai Uwe Rommel * December 1989, February 1990 * Ported to Windows NT 22 May 91 * other mods Summer '92 brianmo@microsoft.com * opendirx() was horribly written, very inefficient, and did not take care * of all cases. It is still not too clean, but it is far more efficient. * Changes made by Gordon Chaffee (chaffee@bugs-bunny.cs.berkeley.edu) ****************************************************************************** * * $Log$ * Revision 1.2 2001-04-09 15:04:34 warmerda * applied new source headers * */ /* dir.c for MS-DOS by Samuel Lam , June/87 */ /* #ifdef WIN32 */ #ifdef _WINDOWS /*Includes: * crt */ #include #include #include #include #include #include "opendir.h" #define stat _stat /* * NT specific */ #include /* * random typedefs */ #define HDIR HANDLE #define HFILE HANDLE #define PHFILE PHANDLE /* * local functions */ static char *getdirent(char *); static void free_dircontents(struct _dircontents *); static HDIR FindHandle; static WIN32_FIND_DATA FileFindData; static struct dirent dp; DIR *opendirx(char *name, char *pattern) { struct stat statb; DIR *dirp; char c; char *s; struct _dircontents *dp; int len; int unc; char path[ OFS_MAXPATHNAME ]; register char *ip, *op; for (ip = name, op = path; ; op++, ip++) { *op = *ip; if (*ip == '\0') { break; } } len = ip - name; if (len > 0) { unc = ((path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/')); c = path[len - 1]; if (unc) { if (c != '\\' && c != '/') { path[len] = '/'; len++; path[len] ='\0'; } } else { if ((c == '\\' || c == '/') && (len > 1)) { len--; path[len] = '\0'; if (path[len - 1] == ':' ) { path[len] = '/'; len++; path[len] = '.'; len++; path[len] = '\0'; } } else if (c == ':' ) { path[len] = '.'; len++; path[len] ='\0'; } } } else { unc = 0; path[0] = '.'; path[1] = '\0'; len = 1; } if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) { return NULL; } dirp = malloc(sizeof(DIR)); if (dirp == NULL) { return dirp; } c = path[len - 1]; if (c == '.' ) { if (len == 1) { len--; } else { c = path[len - 2]; if (c == '\\' || c == ':') { len--; } else { path[len] = '/'; len++; } } } else if (!unc && ((len != 1) || (c != '\\' && c != '/'))) { path[len] = '/'; len++; } strcpy(path + len, pattern); dirp -> dd_loc = 0; dirp -> dd_contents = dirp -> dd_cp = NULL; if ((s = getdirent(path)) == NULL) { return dirp; } do { if (((dp = malloc(sizeof(struct _dircontents))) == NULL) || ((dp -> _d_entry = malloc(strlen(s) + 1)) == NULL) ) { if (dp) free(dp); free_dircontents(dirp -> dd_contents); return NULL; } if (dirp -> dd_contents) dirp -> dd_cp = dirp -> dd_cp -> _d_next = dp; else dirp -> dd_contents = dirp -> dd_cp = dp; strcpy(dp -> _d_entry, s); dp -> _d_next = NULL; } while ((s = getdirent(NULL)) != NULL); dirp -> dd_cp = dirp -> dd_contents; return dirp; } DIR *opendir(char *name) { return opendirx(name, "*"); } void closedir(DIR * dirp) { free_dircontents(dirp -> dd_contents); free(dirp); } struct dirent *readdir(DIR * dirp) { /* static struct dirent dp; */ if (dirp -> dd_cp == NULL) return NULL; /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */ dp.d_name = dirp->dd_cp->_d_entry; dp.d_namlen = dp.d_reclen = strlen(dp.d_name); dp.d_ino = dirp->dd_loc+1; /* fake the inode */ dirp -> dd_cp = dirp -> dd_cp -> _d_next; dirp -> dd_loc++; return &dp; } void seekdir(DIR * dirp, long off) { long i = off; struct _dircontents *dp; if (off >= 0) { for (dp = dirp -> dd_contents; --i >= 0 && dp; dp = dp -> _d_next); dirp -> dd_loc = off - (i + 1); dirp -> dd_cp = dp; } } long telldir(DIR * dirp) { return dirp -> dd_loc; } static void free_dircontents(struct _dircontents * dp) { struct _dircontents *odp; while (dp) { if (dp -> _d_entry) free(dp -> _d_entry); dp = (odp = dp) -> _d_next; free(odp); } } /* end of "free_dircontents" */ static char *getdirent(char *dir) { int got_dirent; if (dir != NULL) { /* get first entry */ if ((FindHandle = FindFirstFile( dir, &FileFindData )) == (HDIR)0xffffffff) { return NULL; } got_dirent = 1; } else /* get next entry */ got_dirent = FindNextFile( FindHandle, &FileFindData ); if (got_dirent) return FileFindData.cFileName; else { FindClose(FindHandle); return NULL; } } /* end of getdirent() */ struct passwd * _cdecl getpwnam(char *name) { return NULL; } struct passwd * _cdecl getpwuid(int uid) { return NULL; } int getuid() { return 0; } void _cdecl endpwent(void) { } #endif /* WINDOWS */ ogdi-ogdi_4_1_0/ogdi/c-api/opendir.h000066400000000000000000000040021345660466700173430ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Implementation of BSD directory routines for MS-DOS. * ****************************************************************************** * @(#) dirent.h 2.0 17 Jun 91 Public Domain. * * A public domain implementation of BSD directory routines for * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), * August 1987 * * Enhanced and ported to OS/2 by Kai Uwe Rommel; added scandir() prototype * December 1989, February 1990 * Change of MAXPATHLEN for HPFS, October 1990 * * Unenhanced and ported to Windows NT by Bill Gallagher * 17 Jun 91 * changed d_name to char * instead of array, removed non-std extensions * * Cleanup, other hackery, Summer '92, Brian Moran , brianmo@microsoft.com ****************************************************************************** * * $Log$ * Revision 1.2 2001-04-09 15:04:34 warmerda * applied new source headers * */ #ifndef _DIRENT #define _DIRENT #ifndef _WINDOWS #include #define dirent direct #else #include struct dirent { long d_ino; /* a bit of a farce */ short d_reclen; /* more farce */ short d_namlen; /* length of d_name */ char *d_name; }; struct _dircontents { char *_d_entry; struct _dircontents *_d_next; }; typedef struct _dirdesc { int dd_id; /* uniquely identify each open directory*/ long dd_loc; /* where we are in directory entry */ struct _dircontents *dd_contents; /* pointer to contents of dir */ struct _dircontents *dd_cp; /* pointer to current position */ } DIR; extern DIR *opendir(char *); extern struct dirent *readdir(DIR *); extern void seekdir(DIR *, long); extern long telldir(DIR *); extern void closedir(DIR *); #define rewinddir(dirp) seekdir(dirp, 0L) #endif /* _WINDOWS */ #endif /* _DIRENT */ /* end of dirent.h */ ogdi-ogdi_4_1_0/ogdi/c-api/server.c000066400000000000000000002627341345660466700172260ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Control to dynamic geographic database driver. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.12 2016-07-06 08:59:20 erouault * fix memory leaks in error code paths of svr_CreateServer() * * Revision 1.11 2016/06/28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.10 2016/06/27 20:05:12 erouault * Grow some buffers in VRF driver (patch by Craig Bruce) * * Revision 1.9 2007/02/12 21:01:48 cbalint * Fix win32 target. It build and works now. (tested with VC6) * * Revision 1.8 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.7 2001/04/09 15:04:34 warmerda * applied new source headers * */ #include "ecs.h" #ifdef _WINDOWS #include #include #include #include #else #include #endif #include ECS_CVSID("$Id$"); ecs_Result svr_dummy_result; /* MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 */ /* Description: Remove unused grass driver specific stuff. */ /* Addition of declaration of private functions used */ /* in this module to avoid some warnings. */ static ecs_Result *GetOneNextObjectAttributes(ecs_Server *s,ecs_Result *msg,int *isSelected); static ecs_Result *GetOneNextObject(ecs_Server *s); static ecs_Result *GetRasterInfoAttributes(ecs_Server *s,ecs_Result *msg); static ecs_Result *GetObjectAttributes(ecs_Server *s,ecs_Result *msg); /*#define TESTOGDIINTERFACE 1*/ #ifdef TESTOGDIINTERFACE FILE *testfile = NULL; #endif /* Error string list */ char *svr_messages[] = { /* 0 */ "", "not able to understand this URL", "not able to open more than one local server GRASS", "not able to open the dynamic library", "not able to open the function dyn_CreateServer in the dynamic library", /* 5 */ "not enough memory", "SelectLayer not present in dynamic library", "ReleaseLayer not present in dynamic library", "SelectRegion not present in dynamic library", "GetDictionary not present in dynamic library", /* 10 */ "GetAttributesFormat not present in dynamic library", "GetNextObject not present in dynamic library", "GetRasterInfo not present in dynamic library", "GetObject not present in dynamic library", "GetObjectIdFromCoord not present in dynamic library", /* 15 */ "UpdateDictionary not present in dynamic library", "GetServerProjection not present in dynamic library", "GetGlobalBound not present in dynamic library", "SetServerLanguage not present in dynamic library", "Can't use GetAttributesFormat, no layer selected", /* 20 */ "Can't use GetNextObject, no layer selected", "Can't use GetRasterInfo, no layer selected", "Can't use GetRasterInfo, the layer selected is not a raster", "Can't use GetObject, no layer selected", "Can't use GetObjectIdFromCoord, no layer selected", /* 25 */ "This point is outside the current region", "The file specified in OGDILINK don't exist", "One of the attributes specified in the list is not define", "Could not link the attribute driver", "Invalid attribute driver dll", /* 30 */ "Invalid SQL request", "SetCompression not present in dynamic library", "OGDILINK is not in the correct format" }; /* -------------------------------------------------------- Server creation. Will create a new server IN s: Pointer to ecs_Server structure (given by caller) url: This string is used to create a new server isLocal: Indicate if server is used as a remote server or a local server. OUT ecs_Result: Operation result MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: Remove unused grass driver specific stuff. Addition of an error handling message to indicate that the remote driver cannot be found instead of reporting in that case the s->servertype cannot be found. -------------------------------------------------------- */ ecs_Result *svr_CreateServer(s,url,isLocal) ecs_Server *s; char *url; int isLocal; { ecs_Result *res, *msg; char buffer[128]; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_CreateServer %s %d\n",url,isLocal); fclose(testfile); testfile = NULL; } #endif /* Initialize server arguments */ s->priv = NULL; s->nblayer = 0; s->layer = NULL; s->layer_tablesize = 0; s->currentLayer = -1; s->handle = NULL; s->projection = NULL; s->createserver = NULL; s->destroyserver = NULL; s->selectlayer = NULL; s->releaselayer = NULL; s->closelayer = NULL; s->selectregion = NULL; s->getdictionary = NULL; s->getattrformat = NULL; s->getnextobject = NULL; s->getrasterinfo = NULL; s->getobject = NULL; s->getobjectid = NULL; s->updatedictionary =NULL; s->getserverprojection = NULL; s->getglobalbound = NULL; s->setserverlanguage = NULL; s->setrasterconversion = NULL; s->isRemote = FALSE; s->localClient = isLocal; s->AttributeListQty = 0; s->AttributeList = NULL; s->compression.ctype = isLocal ? ECS_COMPRESS_NONE : ECS_COMPRESS_ZLIB; s->compression.cversion = isLocal ? 0 : ECS_ZLIB_VERSION; s->compression.clevel = isLocal ? 0 : ECS_ZLIB_LEVEL_DEFAULT; s->compression.cblksize = isLocal ? 0 : ECS_ZLIB_BLKSIZE_DEFAULT; s->compression.cfullsize = 0; s->compression.cachesize = ECS_CACHE_DEFAULT; /* initialise raster conversion */ s->rasterconversion.coef.coef_len = 0; s->rasterconversion.coef.coef_val = NULL; /* Extract information from url */ s->url = malloc(strlen(url)+1); if (s->url == NULL) { res = &svr_dummy_result; ecs_SetError(res,1,svr_messages[5]); return res; } strcpy(s->url,url); if (!ecs_SplitURL(url,&(s->hostname),&(s->server_type),&(s->pathname))) { res = &svr_dummy_result; ecs_SetError(res,1,svr_messages[1]); return res; } /* Open the dynamic library. If the server is remote, do no open the server remote again. */ if (isLocal == 0) { /* is a remote server */ s->handle = ecs_OpenDynamicLib(s->server_type); } else { /* is a local server */ if ((s->hostname) != NULL) { s->handle = ecs_OpenDynamicLib("remote"); if (s->handle == NULL) { res = &svr_dummy_result; sprintf(buffer,"Could not find the dynamic library \"remote\""); ecs_SetError(res,1,buffer); return res; } s->isRemote = TRUE; } else { s->handle = ecs_OpenDynamicLib(s->server_type); } } /* if the driver is not found, then look for the script driver */ if (s->handle == NULL) { s->handle = ecs_OpenDynamicLib("script"); } /* if the script driver is not found, then return error message */ if (s->handle == NULL) { sprintf(buffer,"Could not find the dynamic library \"%s\"",s->server_type); svr_DestroyServer(s); res = &svr_dummy_result; ecs_SetError(res,1,buffer); return res; } s->createserver = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_CreateServer"); if (s->createserver == NULL) { svr_DestroyServer(s); res = &svr_dummy_result; ecs_SetError(res,1,svr_messages[4]); return res; } s->destroyserver = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_DestroyServer"); s->selectlayer = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_SelectLayer"); s->releaselayer = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_ReleaseLayer"); s->closelayer = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_CloseLayer"); s->selectregion = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_SelectRegion"); s->getdictionary = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetDictionary"); s->getattrformat = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetAttributesFormat"); s->getnextobject = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetNextObject"); s->getrasterinfo = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetRasterInfo"); s->getobject = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetObject"); s->getobjectid = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetObjectIdFromCoord"); s->updatedictionary = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_UpdateDictionary"); s->getserverprojection = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetServerProjection"); s->getglobalbound = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_GetGlobalBound"); s->setserverlanguage = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_SetServerLanguage"); s->setrasterconversion = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_SetRasterConversion"); s->setcompression = (dynfunc *) ecs_GetDynamicLibFunction(s->handle,"dyn_SetCompression"); /* Initialise ecs_Result in "s" */ ecs_ResultInit(&(s->result)); /* Call the dynamic function dyn_CreateServer */ res = s->createserver(s,url); if (res == NULL) { res = &svr_dummy_result; sprintf(buffer,"A memory error occured when creating the server for the URL \"%s\"", url); ecs_SetError(res,1,buffer); return res; } if (res->error) { char* saved_message = res->message; res->message = NULL; svr_DestroyServer(s); msg = &svr_dummy_result; ecs_SetError(msg,1,saved_message); free(saved_message); /* if (s->isRemote || (s->hostname == NULL)) ecs_CloseDynamicLib(s->handle); */ /*ecs_freeSplitURL(&(s->hostname),&(s->server_type),&(s->pathname));*/ return msg; } ecs_GetLateralDBConnectionCtrlFile(s); return res; } /* -------------------------------------------------------- Server destruction. Will destroy the server and unlink the program with the dynamic library IN s: Pointer to ecs_Server structure (given by caller) OUT ecs_Result: Operation result MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: Remove unused grass driver specific stuff -------------------------------------------------------- */ ecs_Result *svr_DestroyServer(s) ecs_Server *s; { ecs_Result *msg; int i; ecs_CleanUp(&(s->result)); #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_DestroyServer %s\n",s->url); fclose(testfile); testfile = NULL; } #endif if (s->handle != NULL && s->destroyserver != NULL) { msg = s->destroyserver(s); ecs_CleanUp(msg); } if (s->url != NULL) free (s->url); if (s->projection != NULL) free(s->projection); if (s->hostname != NULL) free(s->hostname); if (s->server_type != NULL) free(s->server_type); if (s->pathname != NULL) free(s->pathname); msg = &svr_dummy_result; ecs_SetSuccess(msg); s->priv = NULL; s->url = NULL; s->projection = NULL; s->hostname = NULL; s->server_type = NULL; s->pathname = NULL; s->createserver = NULL; s->destroyserver = NULL; s->selectlayer = NULL; s->releaselayer = NULL; s->closelayer = NULL; s->selectregion = NULL; s->getdictionary = NULL; s->getattrformat = NULL; s->getnextobject = NULL; s->getrasterinfo = NULL; s->getobject = NULL; s->getobjectid = NULL; s->updatedictionary = NULL; s->getserverprojection = NULL; s->getglobalbound = NULL; s->setserverlanguage = NULL; s->setrasterconversion = NULL; s->setcompression = NULL; if (s->AttributeList != NULL) { for(i=0;iAttributeListQty;i++) { free(s->AttributeList[i].url); free(s->AttributeList[i].layer); free(s->AttributeList[i].DriverType); free(s->AttributeList[i].InformationSource); free(s->AttributeList[i].UserDescription); free(s->AttributeList[i].AutorizationDescription); free(s->AttributeList[i].SelectionRequest); } free(s->AttributeList); } s->AttributeListQty = 0; s->AttributeList = NULL; if (s->rasterconversion.coef.coef_val != NULL) free(s->rasterconversion.coef.coef_val); s->rasterconversion.coef.coef_val = NULL; if (s->layer != NULL) { free(s->layer); s->layer = NULL; } if (s->isRemote || (s->hostname == NULL)) /* ecs_CloseDynamicLib(s->handle);*/ s->handle = NULL; return msg; } /* *---------------------------------------------------------------------- * FUNCTION_INFORMATION * * NAME * svr_SelectLayer * * DESCRIPTION * Make the selection of a layer in a driver. * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * ecs_LayerSelection *ls: Layer selection * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure * * 2. If the handle is valid to the driver and the function selectlayer * exist. * Begin * * 2.1. Call SetAttributeLinkWithRequest with the LayerSelection * * 2.2. Call SelectLayer in the geographic driver. If an error occur, * return the error message. * * 2.3. Found the position of the layer in the layer table currentLayer * variable * * 2.4. Call SetAttributeQuery with this layer * * End * * 3. Else return a error message indicating the function don't exist. * * 4. return the message returned by SelectLayer * *---------------------------------------------------------------------- */ ecs_Result *svr_SelectLayer(s,ls) ecs_Server *s; ecs_LayerSelection *ls; { ecs_Result *msg; char *error; ecs_Region region = {0,0,0,0,0,0}; int regionset = FALSE; ecs_CleanUp(&(s->result)); #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_SelectLayer %s %s %d\n",s->url,ls->Select,ls->F); fclose(testfile); testfile = NULL; } #endif if (s->handle != NULL && s->selectlayer != NULL) { ecs_SetAttributeLinkWithRequest(s,ls->Select,ls->F); ecs_UnstackRequest(s,&(ls->Select)); msg = s->selectlayer(s,ls); if (ECSSUCCESS(msg) && s->currentLayer >= 0) { if (msg->res.type == GeoRegion) { region.north = msg->res.ecs_ResultUnion_u.gr.north; region.south = msg->res.ecs_ResultUnion_u.gr.south; region.east = msg->res.ecs_ResultUnion_u.gr.east; region.west = msg->res.ecs_ResultUnion_u.gr.west; region.ns_res = msg->res.ecs_ResultUnion_u.gr.ns_res; region.ew_res = msg->res.ecs_ResultUnion_u.gr.ew_res; regionset = TRUE; } if (ecs_SetAttributeQuery(s,&(s->layer[s->currentLayer]),&error)!=0) { msg = s->releaselayer(s,ls); msg = &svr_dummy_result; ecs_SetError(msg,1,error); } else { msg = &svr_dummy_result; if (regionset == TRUE) { ecs_SetGeoRegion(msg,region.north, region.south, region.east, region.west, region.ns_res, region.ew_res); } ecs_SetSuccess(msg); } } } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[6]); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * svr_ReleaseLayer * * DESCRIPTION * Release the link to a layer * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * ecs_LayerSelection *ls: Layer selection * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure * * 2. If the handle is valid to the driver and the function releaselayer * exist. * Begin * * 2.1. Found the position of the layer in the layer table with the * LayerSelection information. * * 2.2. Call ReleaseAttributeQuery with this layer * * 2.3. Call ReleaseLayer in the geographic driver. * * 2.2. Call ReleaseAttributeLinkWithRequest with the LayerSelection * * End * * 3. Else return a error message indicating the function don't exist. * * 4. return the message returned by ReleaseLayer * *---------------------------------------------------------------------- */ ecs_Result *svr_ReleaseLayer(s,ls) ecs_Server *s; ecs_LayerSelection *ls; { ecs_Result *msg; int i; char *error; char *temp; ecs_Family F; ecs_CleanUp(&(s->result)); #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_ReleaseLayer %s %s %d\n",s->url,ls->Select,ls->F); fclose(testfile); testfile = NULL; } #endif if (s->handle != NULL && s->releaselayer != NULL) { for(i=0;inblayer;i++) { if (strcmp(ls->Select,s->layer[i].sel.Select) == 0 && ls->F == s->layer[i].sel.F) { if (ecs_ReleaseAttributeQuery(s,&(s->layer[i]),&error)!=0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } break; } } temp = malloc(strlen(ls->Select)+1); if (temp == NULL) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[5]); return msg; } strcpy(temp,ls->Select); F = ls->F; ecs_UnstackRequest(s,&(ls->Select)); msg = s->releaselayer(s,ls); ecs_RemoveAttributeLinkWithRequest(s,temp,F); free(temp); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[7]); } return msg; } /****************************************************************/ void svr_BroadCloseLayers(s) ecs_Server *s; { void *handle; dynfunc *func; if (!(s->isRemote)) { handle = ecs_OpenDynamicLib("ecs"); if (handle!=NULL) { func = (dynfunc *) ecs_GetDynamicLibFunction(handle,"cln_BroadCloseLayers"); func(); ecs_CloseDynamicLib(func); } } else { s->closelayer(s); } } /****************************************************************/ void svr_CloseLayer(s) ecs_Server *s; { if (s->handle != NULL && s->closelayer != NULL) { s->closelayer(s); } } /****************************************************************/ ecs_Result *svr_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_SelectRegion %s %f %f %f %f %f %f\n",s->url,gr->north,gr->south,gr->east,gr->west,gr->ns_res, gr->ew_res); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->selectregion != NULL) { msg = s->selectregion(s,gr); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[8]); } return msg; } /****************************************************************/ ecs_Result *svr_GetDictionary(s) ecs_Server *s; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetDictionary %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getdictionary != NULL) { msg = s->getdictionary(s); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[9]); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * svr_GetAttributesFormat * * DESCRIPTION * Get the attribute format list of all the possibles attributes * of a geographic object. * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure * * 2. If the handle is valid to the driver and the function GetAttributeFormat * exist. * Begin * * 2.1. If it's not a remote driver and the currentlayer is selected * Begin * * 2.1.1. Call GetAttributeFormat in the geographical driver * * 2.1.2. If the AttributeDriverHandle is not null * Begin * * 2.1.2.1. Call GetColumnInfo to retreave the * attribute driver attribute info. * * 2.1.2.2. If no error append during GetColumnInfo, merge the * attribute driver attribute info with the elements in * the result of GetAttributeFormat * * End * * End * * 2.2. Else return an error indicating that the layer is not selected. * * End * * 3. Else return a error message indicating the function don't exist. * * 4. return the message returned by GetAttributeFormat *---------------------------------------------------------------------- */ ecs_Result *svr_GetAttributesFormat(s) ecs_Server *s; { int columns_qty; ecs_ObjAttribute *attr; char *error; ecs_Result *msg; int i; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetAttributesFormat %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getattrformat != NULL) { if ((!(s->isRemote)) && (s->currentLayer == -1)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[19]); } else { msg = s->getattrformat(s); if (ECSSUCCESS(msg) && s->currentLayer >= 0 && s->layer[s->currentLayer].AttributeDriverHandle != NULL) { if ((s->layer[s->currentLayer].GetColumnsInfoFuncPtr)(s,&(s->layer[s->currentLayer]),&columns_qty,&attr,&error) == 0) { for(i=0;ilayer[s->currentLayer].SelectionAttributeListQty; /* * Set the table of characters */ if (ecs_SetBindListForVector(s,&(s->layer[s->currentLayer]),msg,&attribute_list,&error) != 0) { /* The bind don't work for this object. It's usually because the object is incomplete. */ *isSelected = FALSE; return msg; } /* * Select the attributes */ if ((s->layer[s->currentLayer].SelectAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),attribute_qty,attribute_list,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } /* * Check if the object, accordingly to the selection, is selected */ if ((s->layer[s->currentLayer].IsSelectedFuncPtr)(s,&(s->layer[s->currentLayer]),&objSelected,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } if (! objSelected) { return msg; } /* * If the object is selected, get the new attributes of the object */ *isSelected = TRUE; if ((s->layer[s->currentLayer].GetSelectedAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),&attributes,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } temp = malloc(strlen(attributes)+strlen(ECSOBJECTATTR(msg))+2); if (temp != NULL) { strcpy(temp,ECSOBJECTATTR(msg)); strcat(temp," "); strcat(temp,attributes); ecs_SetObjectAttr(msg,temp); free(temp); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * GetOneNextObject * * DESCRIPTION * Extract the geographical object from the driver like from a stack * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure and set the "selected" variable to FALSE * Begin * 1.1. While selected is FALSE * Begin * 1.1.1. Call GetNextObject in the geographical driver * 1.1.2. If the AttributeDriverHandle and there is no error * in GetNextObject and the family is a vector (Area, Point, * Text or Line) * Begin * 1.1.2.1. Call GetOneNextObjectAttributes * End * 1.1.3. Else, Set the selected variable to TRUE * End * End * 2. Else return an error indicating that the layer is not selected. * 3. return the message * *---------------------------------------------------------------------- */ static ecs_Result * GetOneNextObject(s) ecs_Server *s; { ecs_Result *msg; int isSelected; ecs_CleanUp(&(s->result)); isSelected = FALSE; while (!isSelected) { msg = s->getnextobject(s); if (!ECSSUCCESS(msg)) { return msg; } if (s->currentLayer >= 0 && s->layer[s->currentLayer].AttributeDriverHandle != NULL && (s->layer[s->currentLayer].sel.F == Area || s->layer[s->currentLayer].sel.F == Line || s->layer[s->currentLayer].sel.F == Point || s->layer[s->currentLayer].sel.F == Text)) { msg = GetOneNextObjectAttributes(s, msg, &isSelected); } else { isSelected = TRUE; } } if ((!(s->isRemote)) && (msg->res.type == Object) && (msg->res.ecs_ResultUnion_u.dob.xmin == 0.0) && (msg->res.ecs_ResultUnion_u.dob.ymin == 0.0) && (msg->res.ecs_ResultUnion_u.dob.xmax == 0.0) && (msg->res.ecs_ResultUnion_u.dob.ymax == 0.0)) { ecs_CalcObjectMBR(s,&msg->res.ecs_ResultUnion_u.dob); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * svr_GetNextObject * * DESCRIPTION * Extract the geographical object from the driver like from a stack * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. If the handle to the driver is invalid or the function GetNextObject * does not exist, return an error. * 2. If it's not a remote driver and the currentlayer isn't selected, * return an error. * 3. If no caching is occurring, just return the next object. * 4. If caching is occurring, grab an object at a time to fill up * the array of objects. * *---------------------------------------------------------------------- */ ecs_Result *svr_GetNextObject(s) ecs_Server *s; { ecs_Result *msg; ecs_ResultUnion *array, *ru; int count; int result; int num; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetNextObject %s\n",s->url); fclose(testfile); testfile = NULL; } #endif if (s->handle == NULL || s->getnextobject == NULL) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[11]); return msg; } if (!s->isRemote && (s->currentLayer == -1)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[20]); return msg; } num = s->compression.cachesize; /* Do not grab multiple objects where the client is local */ if (s->localClient || num == 1) { return GetOneNextObject(s); } array = (ecs_ResultUnion *) malloc(sizeof(ecs_ResultUnion) * num); if (array == NULL) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[5]); return msg; } ru = array; count = 0; do { msg = GetOneNextObject(s); if (msg->error != 0) { break; } result = ecs_CopyResultUnionWork(&msg->res, ru); if (result == FALSE) { /* * Let ecs_Cleanup() take care of this */ s->result.res.type = MultiResult; s->result.res.ecs_ResultUnion_u.results.results_len = count; s->result.res.ecs_ResultUnion_u.results.results_val = array; msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[5]); return msg; } count++; ru++; } while (count < num && msg->error == 0); if (count > 0) { s->result.res.ecs_ResultUnion_u.results.results_len = count; s->result.res.ecs_ResultUnion_u.results.results_val = array; s->result.res.type = MultiResult; } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * GetRasterInfoAttributes -- * * DESCRIPTION * When using an AttributeDriver, fixup the results. * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * Begin * 1. For each category in the object * Begin * 1.1. Set a tables of characters containing * the id or the category number or category descriptor * to bind describe in the list of selection attribute * (SelectionAttributeList in the ecs_Layer structure) * 1.2. Call SelectAttributes with this table. * 1.3. If there is no error in SelectAttributes * Begin * 1.3.1. Call IsSelected in the attribute driver * 1.3.2. If the result of IsSelected is TRUE * Begin * 1.3.2.1. Call GetAttributes in the attribute driver * 1.3.2.2. Concatenate this string with the attributes * of the object (don't forget the space between both strings * End * 1.3.3. Else * Begin * 1.3.3.1. Remove the category from the list. * End * End * End * End * *---------------------------------------------------------------------- */ static ecs_Result * GetRasterInfoAttributes(s, msg) ecs_Server *s; ecs_Result *msg; { int attribute_qty,i; ecs_Category *ptr; char **attribute_list; char *error; char *temp; short objSelected; char *attributes; attribute_qty = s->layer[s->currentLayer].SelectionAttributeListQty; #if 0 /* XXX: Note from Gordon. This next line doesn't compile as written */ ecs_SetRasterInfo(&(svr_dummy_result),msg->res.ecs_ResultUnion_u.ri.width,msg->res.ecs_ResultUnion_u.ri.height); #endif for(i=0; i < (int) ECSRASTERINFONB(msg); i++) { ptr = &(ECSRASTERINFOCAT(msg,i)); /* * Set the table of characters */ if (ecs_SetBindListForMatrix(s,&(s->layer[s->currentLayer]),ptr,&attribute_list,&error) != 0) { ecs_SetError(&svr_dummy_result,1,error); } else { /* * Select the attributes */ if ((s->layer[s->currentLayer].SelectAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),attribute_qty,attribute_list,&error) != 0) { ecs_SetError(&svr_dummy_result,1,error); } else { /* * Check if the object, accordingly to the selection, is * selected */ if ((s->layer[s->currentLayer].IsSelectedFuncPtr)(s,&(s->layer[s->currentLayer]),&objSelected,&error) != 0) { ecs_SetError(&svr_dummy_result,1,error); } else { if (objSelected) { /* * If the category is selected, get the new attributes * of the category descriptor. Else, * the category is removed from the list. */ if ((s->layer[s->currentLayer].GetSelectedAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),&attributes,&error) != 0) { ecs_SetError(&svr_dummy_result,1,error); } else { temp = malloc(strlen(attributes)+strlen(ptr->label)+2); if (temp != NULL) { strcpy(temp,ptr->label); strcat(temp," "); strcat(temp,attributes); ecs_AddRasterInfoCategory(&(svr_dummy_result),ptr->no_cat,ptr->r,ptr->g,ptr->b,temp,ptr->qty); free(temp); } } } } } } } msg = &svr_dummy_result; return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * ecs_GetRasterInfo * * DESCRIPTION * Get the current selected raster information * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure * 2. If the handle is valid to the driver and the function GetRasterInfo * exist. * Begin * 2.1. If it's not a remote driver and the currentlayer is selected * Begin * 2.1.1. Call GetRasterInfo in the geographical driver * 2.1.2. If the AttributeDriverHandle is not null * Begin * 2.1.2.1. Call GetRasterInfoAttributes * End * End * 2.2. Else return an error indicating that the layer is not selected. * End * 3. Else return a error message indicating the function don't exist. * 4. return the message returned by GetAttributeFormat * *---------------------------------------------------------------------- */ ecs_Result *svr_GetRasterInfo(s) ecs_Server *s; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetRasterInfo %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getrasterinfo != NULL) { if ((!(s->isRemote)) && (s->currentLayer == -1)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[21]); } else { if ((s->isRemote) || (s->layer[s->currentLayer].sel.F == Matrix) || (s->layer[s->currentLayer].sel.F == Image)) { msg = s->getrasterinfo(s); if (s->currentLayer >= 0 && ECSSUCCESS(msg) && s->layer[s->currentLayer].AttributeDriverHandle != NULL) { msg = GetRasterInfoAttributes(s, msg); } } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[22]); } } } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[12]); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * GetObjectAttributes * * DESCRIPTION * When using a attribute driver, get the object attributes * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * ecs_Result *msg: The result to be used if no matching attributes * are found * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Set a tables of characters containing the attributes * to bind describe in the list of selection attribute * (SelectionAttributeList in the ecs_Layer structure) * 2. Call SelectAttributes with this table. * 3. If there is an error in SelectAttributes, return * 4. Call GetAttributes in the attribute driver * 5. Concatenate this string with the attributes * of the object (don't forget the space between both strings * *---------------------------------------------------------------------- */ static ecs_Result * GetObjectAttributes(s, msg) ecs_Server *s; ecs_Result *msg; { int attribute_qty; char **attribute_list; char *error; short objSelected; char *temp,*attributes; attribute_qty = s->layer[s->currentLayer].SelectionAttributeListQty; /* * Set the table of characters */ if (ecs_SetBindListForVector(s,&(s->layer[s->currentLayer]),msg,&attribute_list,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } /* * Select the attributes */ if ((s->layer[s->currentLayer].SelectAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),attribute_qty,attribute_list,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } /* * Check if the object, accordingly to the selection, is selected */ if ((s->layer[s->currentLayer].IsSelectedFuncPtr)(s,&(s->layer[s->currentLayer]),&objSelected,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } if (! objSelected) { return msg; } /* * If the object is selected, get the new attributes of the object */ if ((s->layer[s->currentLayer].GetSelectedAttributesFuncPtr)(s,&(s->layer[s->currentLayer]),&attributes,&error) != 0) { msg = &svr_dummy_result; ecs_SetError(msg,1,error); return msg; } temp = malloc(strlen(attributes)+strlen(ECSOBJECTATTR(msg))+2); if (temp != NULL) { strcpy(temp,ECSOBJECTATTR(msg)); strcat(temp," "); strcat(temp,attributes); ecs_SetObjectAttr(msg,temp); free(temp); } return msg; } /* *---------------------------------------------------------------------- * * FUNCTION_INFORMATION * * NAME * svr_GetObject * * DESCRIPTION * Get an geographic object knowing the * END_DESCRIPTION * * PARAMETERS * INPUT * ecs_Server *s: Server object attributes * char *Id: The id of the object wanted * END_PARAMETERS * * RETURN_VALUE * ecs_Result *: A structure with the result information * * END_FUNCTION_INFORMATION * * PSEUDO_CODE * * 1. Clean up the result structure and set the "selected" variable to FALSE * 2. If the handle is valid to the driver and the function GetObject * exist. * Begin * 2.1. If it's not a remote driver and the currentlayer is selected * Begin * 2.1.1. Call GetObject in the geographical driver with Id * 2.1.2. If the AttributeDriverHandle and there is no error * in GetObject and the family is a vector (Area, Point, Text,Line) * Begin * 2.1.2.1 Call GetObjectAttributes * End * End * 2.2. Else return an error indicating that the layer is not selected. * End * 3. Else return a error message indicating the function don't exist. * 4. return the message * *---------------------------------------------------------------------- */ ecs_Result *svr_GetObject(s,Id) ecs_Server *s; char *Id; { ecs_Result *msg; ecs_Family family; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetObject %s %s\n",s->url,Id); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getobject != NULL) { if ((!(s->isRemote)) && (s->currentLayer == -1)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[23]); } else { msg = s->getobject(s,Id); family = s->layer[s->currentLayer].sel.F; if (s->currentLayer >= 0 && ECSSUCCESS(msg) && s->layer[s->currentLayer].AttributeDriverHandle != NULL && (family == Area || family == Line || family == Point || family == Text)) { msg = GetObjectAttributes(s,msg); } } } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[13]); } if (!(s->isRemote)) { if (msg->res.type == Object) { ecs_Object *obj = &msg->res.ecs_ResultUnion_u.dob; if ((obj->xmin == 0.0) && (obj->ymin == 0.0) && (obj->xmax == 0.0) && (obj->ymax == 0.0)) { ecs_CalcObjectMBR(s,&msg->res.ecs_ResultUnion_u.dob); } } } return msg; } /****************************************************************/ ecs_Result *svr_GetObjectIdFromCoord(s,coord) ecs_Server *s; ecs_Coordinate *coord; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetObjectIdFromCoord %s %f %f\n",s->url,coord->x,coord->y); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); /* Check if the coordinate is inside the current region */ if ((s->currentRegion.north < coord->y) || (s->currentRegion.south > coord->y) || (s->currentRegion.east < coord->x) || (s->currentRegion.west > coord->x)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[25]); } else { /* Call the getobjectid of the current driver */ if (s->handle != NULL && s->getobjectid != NULL) { if ((!(s->isRemote)) && (s->currentLayer == -1)) { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[24]); } else { /* Set the tolerance accordingly to the current region */ ecs_SetTolerance(&(s->currentRegion)); msg = s->getobjectid(s,coord); } } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[14]); } } return msg; } /****************************************************************/ ecs_Result *svr_UpdateDictionary(s,info) ecs_Server *s; char *info; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_UpdateDictionary %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->updatedictionary != NULL) { msg = s->updatedictionary(s,info); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[15]); } return msg; } /****************************************************************/ ecs_Result *svr_GetServerProjection(s) ecs_Server *s; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetServerProjection %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getserverprojection != NULL) { msg = s->getserverprojection(s); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[16]); } return msg; } /****************************************************************/ ecs_Result *svr_GetGlobalBound(s) ecs_Server *s; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_GetGlobalBound %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->getglobalbound != NULL) { msg = s->getglobalbound(s); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[17]); } return msg; } /****************************************************************/ ecs_Result *svr_SetServerLanguage(s,language) ecs_Server *s; u_int language; { ecs_Result *msg; ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->setserverlanguage != NULL) { msg = s->setserverlanguage(s,language); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[18]); } return msg; } /****************************************************************/ ecs_Result *svr_SetRasterConversion(s,rc) ecs_Server *s; ecs_RasterConversion *rc; { ecs_Result *msg; int i; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_SetRasterConversion %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->setrasterconversion != NULL) { msg = s->setrasterconversion(s,rc); } else { msg = &svr_dummy_result; if (s->rasterconversion.coef.coef_val != NULL) free(s->rasterconversion.coef.coef_val); s->rasterconversion.coef.coef_val = NULL; s->rasterconversion.coef.coef_len = rc->coef.coef_len; s->rasterconversion.coef.coef_val = (double *) malloc(sizeof(double)*rc->coef.coef_len); if (s->rasterconversion.coef.coef_val == NULL) { ecs_SetError(msg,1,svr_messages[5]); return msg; } else { for (i=0;(int) i< (int) rc->coef.coef_len;i++) { s->rasterconversion.coef.coef_val[i] = rc->coef.coef_val[i]; } } s->rasterconversion.r_method = rc->r_method; s->rasterconversion.t_method = rc->t_method; } ecs_SetSuccess(msg); return msg; } /* -------------------------------------------------------- ecs_SetLayer: Add a new layer to layer list in ecs_Server. IN s: Pointer to ecs_Server structure (given by caller) sel: Layer selection structure OUT return int: Layer position in table. If an error occur during allocation, a negative value is return. -------------------------------------------------------- */ int ecs_SetLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { ecs_Layer *temp; if ((s->nblayer + 1) >= s->layer_tablesize) { temp = malloc(sizeof(ecs_Layer)*(s->layer_tablesize+OGDILAYERINC)); if (temp == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); return -1; } if (s->layer != NULL) { memcpy(temp,s->layer,(sizeof(ecs_Layer)*s->layer_tablesize)); free(s->layer); } s->layer = temp; s->layer_tablesize += OGDILAYERINC; } s->layer[s->nblayer].sel.Select = (char *) malloc(strlen(sel->Select)+1); if (s->layer[s->nblayer].sel.Select == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); return -1; } strcpy(s->layer[s->nblayer].sel.Select,sel->Select); s->layer[s->nblayer].sel.F = sel->F; s->layer[s->nblayer].index = 0; s->layer[s->nblayer].nbfeature = 0; s->layer[s->nblayer].priv = 0; s->layer[s->nblayer].AttributeDriverLinkPtr = NULL; s->layer[s->nblayer].attribute_priv = NULL; s->layer[s->nblayer].InitializeDBLinkFuncPtr = NULL; s->layer[s->nblayer].DeinitializeDBLinkFuncPtr = NULL; s->layer[s->nblayer].GetColumnsInfoFuncPtr = NULL; s->layer[s->nblayer].SelectAttributesFuncPtr = NULL; s->layer[s->nblayer].IsSelectedFuncPtr = NULL; s->layer[s->nblayer].GetSelectedAttributesFuncPtr = NULL; s->layer[s->nblayer].AttributeDriverHandle = NULL; s->layer[s->nblayer].SelectionAttributeListQty = 0; s->layer[s->nblayer].SelectionAttributeList = NULL; s->layer[s->nblayer].AttrRequest = NULL; (s->nblayer)++; return (s->nblayer)-1; } /* -------------------------------------------------------- ecs_GetLayer: Found a layer in layer attribute of ecs_Server for a certain selection. IN s: Pointer to ecs_Server structure (given by caller) sel: Layer selection structure OUT return int: Layer position in table. If the layer don't exist, this value will be negative. -------------------------------------------------------- */ int ecs_GetLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int i; for(i=0;inblayer;i++) { if ((strcmp(s->layer[i].sel.Select,sel->Select) == 0) && (s->layer[i].sel.F == sel->F)) { return i; } } return -1; } /* -------------------------------------------------------- ecs_FreeLayer: Free a certain layer IN s: Pointer to ecs_Server structure (given by caller) layer: Layer position -------------------------------------------------------- */ void ecs_FreeLayer(s,layer) ecs_Server *s; int layer; { int i; /* Check if the current layer is the one to destroy */ if (s->currentLayer == layer) s->currentLayer = -1; if (s->layer[layer].sel.Select != NULL) free(s->layer[layer].sel.Select); if (s->layer[layer].attribute_priv != NULL) free(s->layer[layer].attribute_priv); s->layer[layer].SelectionAttributeListQty = 0; if (s->layer[layer].SelectionAttributeList != NULL) free(s->layer[layer].SelectionAttributeList); if (s->layer[layer].AttrRequest != NULL) free(s->layer[layer].AttrRequest); /* repositionate all the following layers */ for(i=layer;i<(s->nblayer)-1;i++) { s->layer[i].sel.Select = s->layer[i+1].sel.Select; s->layer[i].sel.F = s->layer[i+1].sel.F; s->layer[i].index = s->layer[i+1].index; s->layer[i].nbfeature = s->layer[i+1].nbfeature; s->layer[i].priv = s->layer[i+1].priv; s->layer[i].AttributeDriverLinkPtr = s->layer[i+1].AttributeDriverLinkPtr; s->layer[i].attribute_priv = s->layer[i+1].attribute_priv; s->layer[i].InitializeDBLinkFuncPtr = s->layer[i+1].InitializeDBLinkFuncPtr; s->layer[i].DeinitializeDBLinkFuncPtr = s->layer[i+1].DeinitializeDBLinkFuncPtr; s->layer[i].GetColumnsInfoFuncPtr = s->layer[i+1].GetColumnsInfoFuncPtr; s->layer[i].SelectAttributesFuncPtr = s->layer[i+1].SelectAttributesFuncPtr; s->layer[i].IsSelectedFuncPtr = s->layer[i+1].IsSelectedFuncPtr; s->layer[i].GetSelectedAttributesFuncPtr = s->layer[i+1].GetSelectedAttributesFuncPtr; s->layer[i].AttributeDriverHandle = s->layer[i+1].AttributeDriverHandle; s->layer[i].SelectionAttributeListQty = s->layer[i+1].SelectionAttributeListQty; s->layer[i].SelectionAttributeList = s->layer[i+1].SelectionAttributeList; s->layer[i].AttrRequest = s->layer[i+1].AttrRequest; } (s->nblayer)--; if (s->nblayer < (s->layer_tablesize - OGDILAYERINC)) { s->layer_tablesize -= OGDILAYERINC; if (s->nblayer <= 0) { free(s->layer); s->layer = NULL; } else { ecs_Layer* newlayer = realloc(s->layer,sizeof(ecs_Layer)*s->layer_tablesize); if( newlayer != NULL ) { s->layer = newlayer; } } } return; } /****************************************************************/ ecs_Result *svr_SetCompression(s,compression) ecs_Server *s; ecs_Compression *compression; { ecs_Result *msg; #ifdef TESTOGDIINTERFACE if (testfile == NULL) { testfile = fopen("testinterface.txt","a"); } if (testfile != NULL) { fprintf(testfile,"svr_SetCompression %s\n",s->url); fclose(testfile); testfile = NULL; } #endif ecs_CleanUp(&(s->result)); if (s->handle != NULL && s->setcompression != NULL) { msg = s->setcompression(s,compression); } else { msg = &svr_dummy_result; ecs_SetError(msg,1,svr_messages[31]); } return msg; } /* *---------------------------------------------------------------------- * ecs_RemoveDir * * Empty a directory (delete all *.* files) and remove the directory * * Results: * A int (1 = done, 0 = error * *---------------------------------------------------------------------- */ int ecs_RemoveDir(path) char *path; { #ifdef _WINDOWS struct _finddata_t c_file; long hfile; char current_dir[_MAX_PATH]; if (_getcwd(current_dir,_MAX_PATH) == NULL) { return 0; } if (_chdir(path)) { return 0; } if ((hfile = _findfirst("*.*", &c_file)) == -1L) { return 0; } else { do { unlink(c_file.name); } while(_findnext(hfile, &c_file) == 0); _findclose(hfile); } _chdir(current_dir); return (int) RemoveDirectory(path); #else char buffer[256]; sprintf(buffer,"rm -r %s",path); ogdi_system(buffer); return 1; #endif } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_GetLateralDBConnection DESCRIPTION Put the contain of the Attribute Connection file in the Attribute List. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Get the value of the environment variable OGDILINK with the command getenv. If it's don't exist, return 0, no file is found but no error encounter. 2. Open the file specified in OGDILINK. If the file don't open, return an error code indicating the OGDILINK is not a valid file (code 26). 3. While we are not in the end of the file Begin 3.1. Read the nine next line and set with each of them the following structure attributes: url, layer, family, DriverType, InformationSource, UserDescription, AutorizationDescription, and SelectionRequest. The last line don't contain usefull information. 3.2. Call AddAttributeLink End 4. close the file ******************************************************************** */ int ecs_GetLateralDBConnectionCtrlFile(s) ecs_Server *s; { char *gl = NULL; FILE *attr; char *url = NULL; char *layer = NULL; ecs_Family family = 0; char *drivertype = NULL; char *informationSource = NULL; char *user = NULL; char *passwrd = NULL; char *request = NULL; int count; int code = 0; char chaine[200]; int size,i; gl = getenv("OGDILINK"); if (gl == NULL) return 0; attr = fopen(gl,"rb"); if (attr == NULL) { return 26; } count = 0; while ( fgets(chaine,200,attr) != NULL ) { size = strlen(chaine)+1; for(i=0;iurl,ExtractRequest,family,DriverType, InformationSource,UserDescription,AutorizationDescription,SelectionRequest); free(ExtractRequest); free(DriverType); free(InformationSource); free(UserDescription); free(AutorizationDescription); free(SelectionRequest); } return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_RemoveAttributeLinkWithRequest DESCRIPTION Remove the item specified in the request from the AttributeLink list. All the link to this attribute link must be remove before. If more than one link is define in the request, use the fist one. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes char *request: The request to use in creation ecs_Family family: The family of the geographic object END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Extract from the request the link information (if it there are some) with ecs_ExtractRequestInformation. If there is no request information about a attribute driver link, return 0. 2. Search in the list to found a position with the same information. If you found none, return 0. 3. Destroy this position and shift the list in a way to fill the gap. 4. Return 0 ******************************************************************** */ int ecs_RemoveAttributeLinkWithRequest(s,request,family) ecs_Server *s; char *request; ecs_Family family; { char *ExtractRequest; char *DriverType; char *InformationSource; char *UserDescription; char *AutorizationDescription; char *SelectionRequest; int i,j; if (ecs_ExtractRequestInformation(request,&ExtractRequest,&DriverType,&InformationSource, &UserDescription,&AutorizationDescription,&SelectionRequest) == 0) { for(i=0;iAttributeListQty;i++) { if (strcmp(s->url,s->AttributeList[i].url) == 0 && strcmp(ExtractRequest,s->AttributeList[i].layer) == 0 && family == s->AttributeList[i].family && strcmp(DriverType,s->AttributeList[i].DriverType) == 0 && strcmp(InformationSource,s->AttributeList[i].InformationSource) == 0 && strcmp(UserDescription,s->AttributeList[i].UserDescription) == 0 && strcmp(AutorizationDescription,s->AttributeList[i].AutorizationDescription) == 0 && strcmp(SelectionRequest,s->AttributeList[i].SelectionRequest) == 0) { free(s->AttributeList[i].url); free(s->AttributeList[i].layer); free(s->AttributeList[i].DriverType); free(s->AttributeList[i].InformationSource); free(s->AttributeList[i].UserDescription); free(s->AttributeList[i].AutorizationDescription); free(s->AttributeList[i].SelectionRequest); for(j=i;jAttributeListQty-1;j++) { s->AttributeList[j].url = s->AttributeList[j+1].url; s->AttributeList[j].layer = s->AttributeList[j+1].layer; s->AttributeList[j].family = s->AttributeList[j+1].family; s->AttributeList[j].DriverType = s->AttributeList[j+1].DriverType; s->AttributeList[j].InformationSource = s->AttributeList[j+1].InformationSource; s->AttributeList[j].UserDescription = s->AttributeList[j+1].UserDescription; s->AttributeList[j].AutorizationDescription = s->AttributeList[j+1].AutorizationDescription; s->AttributeList[j].SelectionRequest = s->AttributeList[j+1].SelectionRequest; } (s->AttributeListQty)--; break; } } } free(ExtractRequest); free(DriverType); free(InformationSource); free(UserDescription); free(AutorizationDescription); free(SelectionRequest); return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_AddAttributeLink DESCRIPTION Add in the attribute link list an attribute link. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes char *url: URL char *layer: Layer Family family: Family char *drivertype: Driver type char *infosource: Information source char *userdesc: User description char *autorization: Autorization description char *request: Selection request END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Initialize and add to the last position of attribute list a link 2. Return 0 ******************************************************************** */ int ecs_AddAttributeLink(s,url,layer,family,drivertype,infosource,userdesc,autorization,request) ecs_Server *s; char *url; char *layer; ecs_Family family; char *drivertype; char *infosource; char *userdesc; char *autorization; char *request; { ecs_AttributeLink *ptr; s->AttributeList = realloc(s->AttributeList,(s->AttributeListQty+1)*sizeof(ecs_AttributeLink)); if (s->AttributeList == NULL) { return 5; } ptr = &(s->AttributeList[s->AttributeListQty]); ptr->url = NULL; ptr->layer = NULL; ptr->DriverType = NULL; ptr->InformationSource = NULL; ptr->UserDescription = NULL; ptr->AutorizationDescription = NULL; ptr->SelectionRequest = NULL; if ((ptr->url = malloc(strlen(url)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->layer = malloc(strlen(layer)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->DriverType = malloc(strlen(drivertype)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->InformationSource = malloc(strlen(infosource)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->UserDescription = malloc(strlen(userdesc)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->AutorizationDescription = malloc(strlen(autorization)+1)) == NULL) goto AddAttributeLinkError; if ((ptr->SelectionRequest = malloc(strlen(request)+1)) == NULL) goto AddAttributeLinkError; strcpy(ptr->url,url); strcpy(ptr->layer,layer); ptr->family = family; strcpy(ptr->DriverType,drivertype); strcpy(ptr->InformationSource,infosource); strcpy(ptr->UserDescription,userdesc); strcpy(ptr->AutorizationDescription,autorization); strcpy(ptr->SelectionRequest,request); (s->AttributeListQty)++; return 0; AddAttributeLinkError: if (ptr->url != NULL) free(ptr->url); if (ptr->layer != NULL) free(ptr->layer); if (ptr->DriverType != NULL) free(ptr->DriverType); if (ptr->InformationSource != NULL) free(ptr->InformationSource); if (ptr->UserDescription != NULL) free(ptr->UserDescription); if (ptr->AutorizationDescription != NULL) free(ptr->AutorizationDescription); if (ptr->SelectionRequest != NULL) free(ptr->SelectionRequest); return 5; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_ExtractRequestInformation DESCRIPTION Extract the attribute link information if this information exist. END_DESCRIPTION PARAMETERS INPUT char *request: Request string OUTPUT char **ExtractRequest: Substring of the request without the request information char **DriverType: Driver type char **InformationSource: Information source char **UserDescription: User description char **AutorizationDescription: Autorization description char **SelectionRequest: Selection Request (usually a SQL request) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Check for the '&' character. If it's it's not in the string, then there is no link define. Set all the output to null and return 1. 2. Replace all the /SPACE/ string in the request by a real space 3. Positionnate a cursor to the sixth last '&' in request 4. Extract the string between this '&' and the next one. Put the string in DriverType. Set the cursor to the next '&'. 5. Extract the string between this '&' and the next one. Put the string in UserDescription. Set the cursor to the next '&'. 6. Extract the string between this '&' and the next one. Put the string in AutorizationDescription. Set the cursor to the next '&'. 7. Extract the string between this '&' and the next one. Put the string in SelectionRequest. 8. Return 0 ******************************************************************** */ int ecs_ExtractRequestInformation(request,ExtractRequest,DriverType,InformationSource,UserDescription,AutorizationDescription,SelectionRequest) char *request; char **ExtractRequest; char **DriverType; char **InformationSource; char **UserDescription; char **AutorizationDescription; char **SelectionRequest; { int count,i; char *temp,*ptr; char character[2]; int candlist[13]; *ExtractRequest = NULL; *DriverType = NULL; *InformationSource = NULL; *UserDescription = NULL; *AutorizationDescription = NULL; *SelectionRequest = NULL; /* Convert /SPACE/ to ' ' */ temp = malloc(strlen(request)+4); if (temp == NULL) return 5; strcpy(temp,""); for(i=0,ptr = request;i<(int) strlen(request);i++,ptr++) { if(strncmp(ptr,"/SPACE/",7) == 0) { strcat(temp," "); ptr+=6; i+=6; } else { character[0] = ptr[0]; character[1] = '\0'; strcat(temp,character); } } /* Count the quantity of & in request and keep the position of each of it */ count = 0; for(i=0;i<(int) strlen(temp);i++) { if (temp[i] == '&') { candlist[count] = i; count++; } } if ( !(count == 6 || count == 11) ) { free(temp); return 1; } /* Extract the string between the fifth lastest '&' and the next one. Put the string in DriverType. */ *ExtractRequest = malloc(candlist[count-6]+2); *DriverType = malloc(candlist[count-5]-candlist[count-6]+1); *InformationSource = malloc(candlist[count-4]-candlist[count-5]+1); *UserDescription = malloc(candlist[count-3]-candlist[count-4]+1); *AutorizationDescription = malloc(candlist[count-2]-candlist[count-3]+1); *SelectionRequest = malloc(candlist[count-1]-candlist[count-2]+1); if (*ExtractRequest == NULL || *DriverType == NULL || *InformationSource == NULL || *UserDescription == NULL || *AutorizationDescription == NULL || *SelectionRequest == NULL) { if (*ExtractRequest != NULL) free(*ExtractRequest); if (*DriverType != NULL) free(*DriverType); if (*InformationSource != NULL) free(*InformationSource); if (*UserDescription != NULL) free(*UserDescription); if (*AutorizationDescription != NULL) free(*AutorizationDescription); if (*SelectionRequest != NULL) free(*SelectionRequest); if (temp != NULL) free(temp); return 5; } if (count == 6) { strncpy(*ExtractRequest,temp,candlist[count-6]); (*ExtractRequest)[candlist[count-6]] = '\0'; ptr = &(temp[candlist[count-6]+1]); } else { strncpy(*ExtractRequest,temp,candlist[count-6]+1); (*ExtractRequest)[candlist[count-6]+1] = '\0'; ptr = &(temp[candlist[count-6]+1]); } strncpy(*DriverType,ptr,candlist[count-5]-candlist[count-6]-1); (*DriverType)[candlist[count-5]-candlist[count-6]-1] = '\0'; ptr = &(temp[candlist[count-5]+1]); strncpy(*InformationSource,ptr,candlist[count-4]-candlist[count-5]-1); (*InformationSource)[candlist[count-4]-candlist[count-5]-1] = '\0'; ptr = &(temp[candlist[count-4]+1]); strncpy(*UserDescription,ptr,candlist[count-3]-candlist[count-4]-1); (*UserDescription)[candlist[count-3]-candlist[count-4]-1] = '\0'; ptr = &(temp[candlist[count-3]+1]); strncpy(*AutorizationDescription,ptr,candlist[count-2]-candlist[count-3]-1); (*AutorizationDescription)[candlist[count-2]-candlist[count-3]-1] = '\0'; ptr = &(temp[candlist[count-2]+1]); strncpy(*SelectionRequest,ptr,candlist[count-1]-candlist[count-2]-1); (*SelectionRequest)[candlist[count-1]-candlist[count-2]-1] = '\0'; return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_SetAttributeQuery DESCRIPTION Scan the attribute link list to see if a link is possible with an attribute driver. If it found one, it link it to the layer and initialize the link to the attribute driver. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Search in the AttributeLink list a link for with the url, layer and family of this query. If there is none, return 0. 2. Load the dll specified in DriverType and put the handle in AttributeDriverHandle. If it's not possible, return the code to indicate an error in the connection of the dll. 3. Create the links to the functions of the attribute driver and put it in the pointers in the layer information. If one of the links is not possible, return the code to indicate this is impossible to open a link. 4. Replace the elements of the SQL request between interrogation marks with only one interrogation marks. These elements are attributes to be replaced during selection. Check if these attributes exist really with GetAttributesFormat and simply set a list of the attributes positions in the layer for later retreaval. The positions simply indicate the position in the attributes string of the attributes to be sent in SelectAttributes in the attribute driver. 5. Call InitializeDBLink to initialize the attribute link. If it's not possible, return the error code from this command. 6. Return 0 MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: The result of ecs_GetDynamicLibFunction() has been cast to type (attrfunc *). The original cast to (void *) seems incorrect. ******************************************************************** */ int ecs_SetAttributeQuery(s,l,error) ecs_Server *s; ecs_Layer *l; char **error; { int i,j,count,k,pos; ecs_AttributeLink *link; char **ptr,*request; ecs_Result *res = NULL; char buffer[100]; int isAttributes; char *temp,*ptr1; char character[2]; int code; if (l->AttributeDriverHandle != NULL) return 0; temp = malloc(strlen(l->sel.Select)+1); if (temp == NULL) { *error = svr_messages[5]; return 1; } j=0; strcpy(temp,""); for(i=0,ptr1 = l->sel.Select;i<(int) strlen(l->sel.Select);i++,ptr1++) { if(strncmp(ptr1,"/SPACE/",7) == 0) { strcat(temp," "); ptr1+=6; i+=6; } else { character[0] = ptr1[0]; character[1] = '\0'; strcat(temp,character); } } /* 1. Search in the AttributeLink list a link for with the url, layer and family of this query. If there is none, return 0. */ link = NULL; for(i=(s->AttributeListQty-1);i>=0;i--) { if (strcmp(s->url,s->AttributeList[i].url) == 0 && strcmp(temp,s->AttributeList[i].layer) == 0 && l->sel.F == s->AttributeList[i].family) { link = &(s->AttributeList[i]); break; } } free(temp); if (link == NULL) { return 0; } l->AttributeDriverLinkPtr = link; /* 2. Load the dll specified in DriverType and put the handle in AttributeDriverHandle. If it's not possible, return the code to indicate an error in the connection of the dll. */ l->AttributeDriverHandle = ecs_OpenDynamicLib(link->DriverType); if (l->AttributeDriverHandle == NULL) { *error = svr_messages[28]; return 1; } /* 3. Create the links to the functions of the attribute driver and put it in the pointers in the layer information. If one of the links is not possible, return the code to indicate this is impossible to open a link. */ /**MOD START**/ l->InitializeDBLinkFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_InitializeDBLink"); l->DeinitializeDBLinkFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_DeinitializeDBLink"); l->GetColumnsInfoFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_GetColumnsInfo"); l->SelectAttributesFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_SelectAttributes"); l->IsSelectedFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_IsSelected"); l->GetSelectedAttributesFuncPtr = (attrfunc *) ecs_GetDynamicLibFunction(l->AttributeDriverHandle,"dyn_GetSelectedAttributes"); /**MOD END**/ if (l->InitializeDBLinkFuncPtr == NULL || l->DeinitializeDBLinkFuncPtr == NULL || l->GetColumnsInfoFuncPtr == NULL || l->SelectAttributesFuncPtr == NULL || l->IsSelectedFuncPtr == NULL || l->GetSelectedAttributesFuncPtr == NULL) { ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[28]; return 1; } /* 4. Replace the elements of the SQL request between interrogation marks with only one interrogation marks. These elements are attributes to be replaced during selection. Check if these attributes exist really with GetAttributesFormat and simply set a list of the attributes positions in the layer for later retreaval. The positions simply indicate the position in the attributes string of the attributes to be sent in SelectAttributes in the attribute driver. */ request = l->AttributeDriverLinkPtr->SelectionRequest; count = 0; for(i=0;i<(int) strlen(request);i++) { if (request[i] == '?') count++; } ptr = malloc((count+1)*sizeof(char *)); if (ptr == NULL) { ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[28]; return 1; } k=0; for(i=0;i<(int) strlen(request);i++) { if (request[i] == '?') { ptr[k] = &(request[i]); k++; } } if (count%2 == 1) { ecs_CloseDynamicLib(l->AttributeDriverHandle); free(ptr); *error = svr_messages[29]; return 1; } l->SelectionAttributeListQty = count/2; l->SelectionAttributeList = malloc(sizeof(int)*l->SelectionAttributeListQty); if (l->SelectionAttributeList == NULL) { free(ptr); ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[5]; return 1; } l->AttrRequest = malloc(strlen(request)+2); if (l->AttrRequest == NULL) { free(ptr); ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[5]; return 1; } /* Fill the selection attribute list */ isAttributes = FALSE; if (s->handle != NULL && s->getattrformat != NULL) { if (!((!(s->isRemote)) && (s->currentLayer == -1))) { res = s->getattrformat(s); if (ECSSUCCESS(res)) { isAttributes=TRUE; } } } if (count > 0) { pos = (int) (ptr[0]-request); strncpy(l->AttrRequest,request,pos); l->AttrRequest[pos]='\0'; for(i=0;iSelectionAttributeList[i/2] = OGDIID; else if (strncmp(buffer,"OGDI.DESC",9) == 0) l->SelectionAttributeList[i/2] = OGDIDESC; else if (strncmp(buffer,"OGDI.CAT",8) == 0) l->SelectionAttributeList[i/2] = OGDICAT; else if (!isAttributes) { free(ptr); ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[29]; return 1; } else { l->SelectionAttributeList[i/2] = -1; for(j=0;j<(int) ECSRESULT(res).oaf.oa.oa_len;j++) { if(strcmp(buffer,ECSRESULT(res).oaf.oa.oa_val[j].name) == 0) { l->SelectionAttributeList[i/2] = j; break; } } if (l->SelectionAttributeList[i/2] == -1) { free(ptr); ecs_CloseDynamicLib(l->AttributeDriverHandle); *error = svr_messages[27]; return 1; } } strcat(l->AttrRequest,"?"); if(i+2AttrRequest,ptr[i+1],ptr[i+2]-ptr[i+1]); } } strcat(l->AttrRequest,ptr[count-1]+1); /* 5. Call InitializeDBLink to initialize the attribute link. If it's not possible, return the error code from this command. */ free(ptr); } else { strcpy(l->AttrRequest,request); } code = (l->InitializeDBLinkFuncPtr)(s,l,error); return code; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_ReleaseAttributeQuery DESCRIPTION Release the link to the attribute driver. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer object attributes OUTPUT char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Call DeinitializeDBLink to deinitialize the attribute link. 2. Unload the attribute driver dll. 3. Set AttributeDriverHandle to NULL. ******************************************************************** */ int ecs_ReleaseAttributeQuery(s,l,error) ecs_Server *s; ecs_Layer *l; char **error; { if (l->AttributeDriverHandle != NULL) { (l->DeinitializeDBLinkFuncPtr)(s,l,error); ecs_CloseDynamicLib(l->AttributeDriverHandle); l->AttributeDriverHandle = NULL; } return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_UnstackRequest DESCRIPTION Remove the attribute link information from the request string (if it's the case). If there is more than one of these links, remove the last one. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes IN/OUT char **request: Request END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Check if there is a '&' in the request. If not, return 0. 2. Found the position of the sixth last position of & in request and put a end of string there. 3. Return 0 ******************************************************************** */ int ecs_UnstackRequest(s,request) ecs_Server *s; char **request; { int count,i; int candlist[13]; (void) s; /* Count the quantity of & in request and keep the position of each of it */ count = 0; for(i=0;i<(int) strlen(*request);i++) { if ((*request)[i] == '&') { candlist[count] = i; count++; } } if ( !(count == 6 || count == 11) ) { return 1; } if (count == 6) { (*request)[candlist[count-6]] = '\0'; } else { (*request)[candlist[count-6]+1] = '\0'; } return 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_SetBindListForVector DESCRIPTION With the information retrieved from the geographic object vector, initialize a list of bind. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer info ecs_Result *msg: The geographic object OUTPUT char **BindList: The result bind list char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Allocate the attribute list with the bind information 2. If the allocation in 1. is a success Begin 2.1. Initialize the attribute list table with nulls 2.2. Split the list of attributes in the object 2.3. If the split work correctly Begin 2.3.1. For each attribute i in the attribute list Begin 2.3.1.1. If the attribute is suppose to be the object id Begin 2.3.1.1.1. Initialize the position i in the attribute list with the id. If an error occur, the code is 5 (not enough memory) and go to 99. End 2.3.1.2. Else Begin 2.3.1.2.1. Check if the attribute is in a impossible position (less then 0 or greater than the quantity of attributes in the list). If it's the case, the code is 27 (One of the attributes specified in the list is not define) and go to 99. 2.3.1.2.2. Initialize the position i in the attribute list with the attribute index. If an error occur, the code is 5 (not enough memory) and go to 99. End End End 2.4. Else Begin The code is 5 and go to 99. End End 3. Else Begin The code is 5 and go to 99. End 99. ErrorCase, Free all the memory and return the error message related to a code. ******************************************************************** */ int ecs_SetBindListForVector(s,l,msg,BindList,error) ecs_Server *s; ecs_Layer *l; ecs_Result *msg; char ***BindList; char **error; { int attribute_qty,i; int code; char **attribute_list; int argc; char **argv; (void) s; attribute_qty = l->SelectionAttributeListQty; code = 0; attribute_list = (char **) malloc(sizeof(char **)*(attribute_qty+1)); if (attribute_list != NULL) { for(i=0;i>attribute_qty;i++) attribute_list[i] = NULL; if (ecs_SplitList(ECSOBJECT(msg).attr,&argc,&argv)) { for(i=0;iSelectionAttributeList[i] == OGDIID) { attribute_list[i] = malloc(strlen(ECSOBJECT(msg).Id)+1); if (attribute_list[i] == NULL) { code = 5; goto SetBindListForVectorError; } strcpy(attribute_list[i],ECSOBJECT(msg).Id); } else { if (l->SelectionAttributeList[i] > argc || l->SelectionAttributeList[i] < 0 || argc <= 0) { code = 27; goto SetBindListForVectorError; } attribute_list[i] = malloc(strlen(argv[l->SelectionAttributeList[i]])+1); if (attribute_list[i] == NULL) { code = 5; goto SetBindListForVectorError; } strcpy(attribute_list[i],argv[l->SelectionAttributeList[i]]); } } } else { code = 5; goto SetBindListForVectorError; } } else { code = 5; goto SetBindListForVectorError; } *BindList = attribute_list; *error = NULL; free(argv); return 0; SetBindListForVectorError: for(i=0;i>attribute_qty;i++) if (attribute_list[i] != NULL) free(attribute_list[i]); free(argv); free(attribute_list); *error = svr_messages[code]; return 1; } /* ******************************************************************** FUNCTION_INFORMATION NAME ecs_SetBindListForMatrix DESCRIPTION With the information retrieved from a category, contruct the bind list information for a matrix. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server object attributes ecs_Layer *l: Layer info ecs_Category *ptr: The geographic object OUTPUT char **BindList: The result bind list char **error: Error message (if it's the case) END_PARAMETERS RETURN_VALUE int : An boolean code. 0 if the operation is a success. a code if the operation failed. END_FUNCTION_INFORMATION PSEUDO_CODE 1. Allocate the attribute list with the bind information 2. If the allocation in 1. is a success Begin 2.1. Initialize the attribute list table with nulls 2.2. For each attribute i in the attribute list Begin 2.2.1. If the attribute is suppose to be the category number Begin 2.2.1.1. Initialize the position i in the attribute list with the category number. If an error occur, the code is 5 (not enough memory) and go to 99. End 2.2.2. Else Begin 2.2.2.1. If the attribute is suppose to be the category description Begin 2.2.2.1.1. Initialize the position i in the attribute list with the category description. If an error occur, the code is 5 (not enough memory) and go to 99. End 2.2.2.2. Else Begin The code is 27 and go to 99. End End End End 3. Else Begin The code is 5 and go to 99. End 99. ErrorCase, Free all the memory and return the error message related to a code. ******************************************************************** */ int ecs_SetBindListForMatrix(s,l,ptr,BindList,error) ecs_Server *s; ecs_Layer *l; ecs_Category *ptr; char ***BindList; char **error; { int attribute_qty,i; int code; char temp[100]; char **attribute_list; (void) s; attribute_qty = l->SelectionAttributeListQty; code = 0; attribute_list = (char **) malloc(sizeof(char **)*(attribute_qty+1)); if (attribute_list != NULL) { for(i=0;i>attribute_qty;i++) attribute_list[i] = NULL; for(i=0;iSelectionAttributeList[i]) { case OGDICAT: sprintf(temp,"%ld",ptr->no_cat); attribute_list[i] = malloc(strlen(temp)+1); if (attribute_list[i] == NULL) { code = 5; goto SetBindListForMatrixError; } strcpy(attribute_list[i],temp); break; case OGDIDESC: attribute_list[i] = malloc(strlen(ptr->label)+1); if (attribute_list[i] == NULL) { code = 5; goto SetBindListForMatrixError; } strcpy(attribute_list[i],ptr->label); break; default: code = 27; goto SetBindListForMatrixError; } } } else { code = 5; goto SetBindListForMatrixError; } *BindList = attribute_list; *error = NULL; return 0; SetBindListForMatrixError: for(i=0;i>attribute_qty;i++) if (attribute_list[i] != NULL) free(attribute_list[i]); free(attribute_list); *error = svr_messages[5]; return code; } ogdi-ogdi_4_1_0/ogdi/driver/000077500000000000000000000000001345660466700160405ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/adrg/000077500000000000000000000000001345660466700167555ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/adrg/.cvsignore000066400000000000000000000000061345660466700207510ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/driver/adrg/adrg.c000066400000000000000000000616011345660466700200420ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI ADRG Driver * Purpose: External (dyn_*) entry points for ADRG driver. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.10 2016-06-27 22:01:46 erouault * Fix memory leak in ADRG driver * * Revision 1.9 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.8 2003/08/27 04:50:01 warmerda * Fixed _releaseAllLayers() to release the layers starting with the * last till the first since it appears that ecs_FreeLayer() is unexpectedly * reducing the layer count, and shuffling layers down in the ecs_Server * layer list. Found while investigating leaking described in bug 795612. * * Revision 1.7 2001/06/25 19:46:10 warmerda * Made cleanup safer if verifyLocation() fails. * * Revision 1.6 2001/06/23 14:06:31 warmerda * added capabilities support, cache layer list when opening datastore * * Revision 1.5 2001/06/22 16:37:50 warmerda * added Image support, upgraded headers * */ #include "adrg.h" #include "datadict.h" #include ECS_CVSID("$Id$"); static void _releaseAllLayers _ANSI_ARGS_((ecs_Server *s)); int colorintensity[6] = {0,63,105,147,189,255}; /* layer oriented functions are keeped in data structure to simplify code */ LayerMethod adrg_layerMethod[11] = { /* 0 */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Area */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Line */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Point */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Matrix */ { NULL, NULL, _rewindRasterLayer, _getNextObjectRaster, _getObjectRaster, _getObjectIdRaster }, /* Image */ { NULL, NULL, _rewindImageLayer, _getNextObjectImage, _getObjectImage, _getObjectIdImage }, /* Text */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Edge */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Face */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Node */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Ring */ { NULL, NULL, NULL, NULL, NULL, NULL } }; /* ---------------------------------------------------------------------- * _dyn_CreateServer: * * Creation of a new ADRG server * ---------------------------------------------------------------------- */ ecs_Result *dyn_CreateServer(s,Request) ecs_Server *s; char *Request; { register ServerPrivateData *spriv = s->priv = (void *) calloc(sizeof(ServerPrivateData),1); struct dirent *structure; DIR *dirlist; char *c; char buffer[125]; char cc,sc[3]; if (spriv == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate server private data"); return &(s->result); } spriv->imgdir = (char *) malloc(strlen(s->pathname)+1); if (spriv->imgdir == NULL) { free(s->priv); ecs_SetError(&(s->result),1,"Not enough memory"); return &(s->result); } spriv->layer_count = 0; spriv->layer_list = (char **) malloc(sizeof(char *) * 1); if (s->pathname[2] == ':') { strcpy(spriv->imgdir,s->pathname+1); } else { strcpy(spriv->imgdir,s->pathname); } /* Search for the .GEN file and set spriv->genfilename with this value. */ dirlist = opendir(spriv->imgdir); if (dirlist==NULL) { free(spriv->imgdir); free(s->priv); ecs_SetError(&(s->result),1,"Unable to see the ADRG directory"); return &(s->result); } structure = (struct dirent *) readdir(dirlist); while (structure != NULL) { if (!((strcmp(structure->d_name,".") == 0) || (strcmp(structure->d_name,"..") == 0))) { c = structure->d_name; while((c[0]!='.') && (c[0]!='\0')) c++; if ((strcmp(".GEN",c) == 0) || (strcmp(".gen",c) == 0)) { spriv->genfilename = (char *) malloc(strlen(spriv->imgdir)+ strlen(structure->d_name)+2); if (spriv->genfilename==NULL) { free(spriv->imgdir); free(s->priv); ecs_SetError(&(s->result),1,"Not enough memory"); return &(s->result); } strcpy(spriv->genfilename,spriv->imgdir); strcat(spriv->genfilename,"/"); strcat(spriv->genfilename,structure->d_name); } else if( (strcmp(".IMG",c) == 0) || (strcmp(".img",c) == 0)) { spriv->layer_list = (char **) realloc(spriv->layer_list, sizeof(char *)*(spriv->layer_count+1)); if( spriv->layer_list == NULL ) { ecs_SetError(&(s->result),1,"Not enough memory"); return &(s->result); } spriv->layer_list[spriv->layer_count++] = strdup( structure->d_name ); } } structure = (struct dirent *) readdir(dirlist); } closedir(dirlist); /* check the .GEN file and see if the location is valid */ if (!_verifyLocation(s)) { if( spriv->imgdir ) free(spriv->imgdir); if( spriv->genfilename ) free(spriv->genfilename); free(s->priv); return &(s->result); } /* initialize the driver globalRegion */ if (!_initRegionWithDefault(s)) { free(spriv->imgdir); free(spriv->genfilename); free(s->priv); return &(s->result); } /* Read overview and open the corresponding file */ if (!_read_overview(s)) { free(spriv->imgdir); free(spriv->genfilename); free(s->priv); return &(s->result); } /* Open the adrg IMG file */ strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); strcat(buffer,spriv->overview.imgfilename); spriv->overview.imgfile = fopen(buffer,"rb"); if (spriv->overview.imgfile == NULL) { strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); loc_strlwr(spriv->overview.imgfilename); strcat(buffer,spriv->overview.imgfilename); spriv->overview.imgfile = fopen(buffer,"rb"); if (spriv->overview.imgfile == NULL) { strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); loc_strupr(spriv->overview.imgfilename); strcat(buffer,spriv->overview.imgfilename); spriv->overview.imgfile = fopen(buffer,"rb"); if (spriv->overview.imgfile == NULL) { ecs_SetError(&(s->result),1,"Unable to open the adrg .IMG file "); if (spriv->overview.tilelist != NULL) { free(spriv->overview.tilelist); } free(spriv->imgdir); free(spriv->genfilename); free(s->priv); return &(s->result); } } } spriv->overview.firstposition = 1; cc = getc(spriv->overview.imgfile); while(!feof(spriv->overview.imgfile)) { if (cc==(char) 30) { ogdi_fread(sc,3,1,spriv->overview.imgfile); spriv->overview.firstposition+=3; if (strncmp(sc,"IMG",3) == 0) { spriv->overview.firstposition+=4; fseek(spriv->overview.imgfile,3,SEEK_CUR); cc = getc(spriv->overview.imgfile); while(cc==' ') { spriv->overview.firstposition++; cc = getc(spriv->overview.imgfile); } spriv->overview.firstposition++; break; } } spriv->overview.firstposition++; cc = getc(spriv->overview.imgfile); } /* initialize layer private data */ s->nblayer = 0; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_DestroyServer: * * Destruction of this ADRG server * ---------------------------------------------------------------------- */ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; /* Release all layer */ _releaseAllLayers(s); if(spriv != NULL) { int i; if (spriv->imgdir != NULL) { free(spriv->imgdir); } if (spriv->genfilename != NULL) { free(spriv->genfilename); } if (spriv->overview.tilelist != NULL) { free(spriv->overview.tilelist); } if (spriv->overview.imgfile != NULL) { fclose(spriv->overview.imgfile); } for( i = 0; i < spriv->layer_count; i++ ) free( spriv->layer_list[i] ); if( spriv->layer_list != NULL ) free( spriv->layer_list ); free(spriv); } ecs_SetSuccess(&(s->result)); return &(s->result); } void _freelayerpriv(lpriv) LayerPrivateData *lpriv; { if (lpriv != NULL) { if (lpriv->tilelist != NULL) free(lpriv->tilelist); if (lpriv->buffertile != NULL) free(lpriv->buffertile); if (lpriv->imgfile != NULL) fclose(lpriv->imgfile); free(lpriv); } lpriv = NULL; } /* ---------------------------------------------------------------------- * _dyn_SelectLayer: * * Select or reselect a layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_SelectLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; register LayerPrivateData *lpriv; register ServerPrivateData *spriv = s->priv; char c,sc[3]; char buffer[128]; /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) != -1) { /* if it already exists than assign currentLayer and set index to 0 to force rewind */ s->currentLayer = layer; s->layer[layer].index = 0; lpriv = (LayerPrivateData *) s->layer[layer].priv; ecs_SetGeoRegion(&(s->result),lpriv->region.north, lpriv->region.south, lpriv->region.east, lpriv->region.west, lpriv->region.ns_res, lpriv->region.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* it did not exists so we are going to try to create it */ if ((layer = ecs_SetLayer(s,sel)) == -1) { return &(s->result); } /* allocate memory to hold private info about this new layer */ if ((s->layer[layer].priv = (void *) malloc(sizeof(LayerPrivateData))) == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); ecs_FreeLayer(s,layer); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; lpriv->tilelist = NULL; lpriv->buffertile = NULL; strcpy(lpriv->imgfilename,sel->Select); /* Extract the layer information from the GEN file */ if (!_read_adrg(s,&(s->layer[layer]))) { _freelayerpriv(lpriv); ecs_FreeLayer(s,layer); return &(s->result); } /* Open the adrg IMG file */ strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); strcat(buffer,lpriv->imgfilename); lpriv->imgfile = fopen(buffer,"rb"); if (lpriv->imgfile == NULL) { strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); loc_strlwr(lpriv->imgfilename); strcat(buffer,lpriv->imgfilename); lpriv->imgfile = fopen(buffer,"rb"); if (lpriv->imgfile == NULL) { strcpy(buffer,spriv->imgdir); strcat(buffer,"/"); loc_strupr(lpriv->imgfilename); strcat(buffer,lpriv->imgfilename); lpriv->imgfile = fopen(buffer,"rb"); if (lpriv->imgfile == NULL) { _freelayerpriv(lpriv); ecs_FreeLayer(s,layer); ecs_SetError(&(s->result),1,"Unable to open the adrg .IMG file "); return &(s->result); } } } lpriv->firstposition = 1; c = getc(lpriv->imgfile); while(!feof(lpriv->imgfile)) { if (c==(char) 30) { ogdi_fread(sc,3,1,lpriv->imgfile); lpriv->firstposition+=3; if (strncmp(sc,"IMG",3) == 0) { lpriv->firstposition+=4; fseek(lpriv->imgfile,3,SEEK_CUR); c = getc(lpriv->imgfile); while(c==' ') { lpriv->firstposition++; c = getc(lpriv->imgfile); } lpriv->firstposition++; break; } } lpriv->firstposition++; c = getc(lpriv->imgfile); } s->currentLayer = layer; s->layer[layer].nbfeature = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res); ecs_SetGeoRegion(&(s->result),lpriv->region.north, lpriv->region.south, lpriv->region.east, lpriv->region.west, lpriv->region.ns_res, lpriv->region.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_ReleaseLayer: * * deselect a layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_ReleaseLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; char buffer[128]; register LayerPrivateData *lpriv; /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) == -1) { sprintf(buffer,"Invalid layer %s",sel->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; if (lpriv != NULL) { _freelayerpriv(lpriv); ecs_FreeLayer(s,layer); if (s->currentLayer == layer) { s->currentLayer = -1; /* just in case released layer was selected */ } } ecs_SetSuccess(&(s->result)); return &(s->result); } /* deselect all layer */ static void _releaseAllLayers(s) ecs_Server *s; { int i; for (i = s->nblayer-1; i >= 0; i-- ) dyn_ReleaseLayer(s,&(s->layer[i].sel)); } /* ---------------------------------------------------------------------- * dyn_SelectRegion: * * selection current geographic region. * ---------------------------------------------------------------------- */ ecs_Result *dyn_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; s->currentRegion.east = gr->east; s->currentRegion.west = gr->west; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; /* reset currentLayer index to 0 to force rewind */ if (s->currentLayer != -1) { s->layer[s->currentLayer].index = 0; s->layer[s->currentLayer].nbfeature = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetDictionary: * * return the itcl_class object * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetDictionary(s) ecs_Server *s; { ecs_SetText(&(s->result),datadict); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetAttributesFormat: * * return the attribute format of the currently selected layer * ---------------------------------------------------------------------- */ ecs_Result * dyn_GetAttributesFormat(s) ecs_Server *s; { ecs_SetObjAttributeFormat(&(s->result)); ecs_AddAttributeFormat(&(s->result),"category",Integer,5,0,0); ecs_AddAttributeFormat(&(s->result),"label",Char,80,0,0); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetNextObject: * * return the next object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetNextObject(s) ecs_Server *s; { if (s->layer[s->currentLayer].index == 0) { (adrg_layerMethod[s->layer[s->currentLayer].sel.F].rewind)(s,&(s->layer[s->currentLayer])); } (adrg_layerMethod[s->layer[s->currentLayer].sel.F].getNextObject)(s,&(s->layer[s->currentLayer])); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetRasterInfo: * * return raster layer meta information * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetRasterInfo(s) ecs_Server *s; { register unsigned int i,j,k; char buffer[2]; register LayerPrivateData *lpriv; int count; strcpy(buffer,""); lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; /* Put table contain in RasterInfo here */ if (s->layer[s->currentLayer].sel.F == Matrix) { ecs_SetRasterInfo(&(s->result),lpriv->columns,lpriv->rows); count = 1; for(i=0;i<6;i++) { for(j=0;j<6;j++) { for(k=0;k<6;k++) { ecs_AddRasterInfoCategory(&(s->result),count, colorintensity[i], colorintensity[j], colorintensity[k],buffer,0); count++; } } } } else { ecs_SetRasterInfo(&(s->result),1,0); ecs_AddRasterInfoCategory(&(s->result),1, 255, 255, 255,"No data",0); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetObject: * * return an object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObject(s,Id) ecs_Server *s; char *Id; { if (adrg_layerMethod[s->layer[s->currentLayer].sel.F].getObject != NULL) (adrg_layerMethod[s->layer[s->currentLayer].sel.F].getObject)(s,&(s->layer[s->currentLayer]),Id); else { ecs_SetError(&(s->result),1,"Can't get object for this type of layer"); } return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetObjectIdFromCoord: * * return the object id sitting at (or near) to a coordinate * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObjectIdFromCoord(s,coord) ecs_Server *s; ecs_Coordinate *coord; { if (adrg_layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord != NULL) (adrg_layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord)(s,&(s->layer[s->currentLayer]),coord); else { ecs_SetError(&(s->result),1,"Can't get objectid from coordinate for this type of layer"); } return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_UpdateDictionary: * * Return the content of this location data dictionary in a Tcl List * ---------------------------------------------------------------------- */ ecs_Result *dyn_UpdateDictionary(s,info) ecs_Server *s; char *info; { register ServerPrivateData *spriv = s->priv; int i; /* -------------------------------------------------------------------- */ /* Reduced capabilities without layers. */ /* -------------------------------------------------------------------- */ if( strcmp(info,"ogdi_server_capabilities") == 0 ) { ecs_AddText(&(s->result), "\n" "\n" "\n" ); ecs_SetSuccess(&(s->result)); } /* -------------------------------------------------------------------- */ /* Full capabilities. */ /* -------------------------------------------------------------------- */ else if( strcmp(info,"ogdi_capabilities") == 0 ) { char line[256]; ecs_AddText(&(s->result), "\n" "\n" ); ecs_AddText(&(s->result), " \n" " \n" " \n" " \n" ); for (i=0; i < spriv->layer_count; i++ ) { ecs_Layer dummy_layer; LayerPrivateData *lpriv; dummy_layer.priv = (void *) calloc(sizeof(LayerPrivateData),1); lpriv = (LayerPrivateData *) dummy_layer.priv; lpriv->tilelist = NULL; lpriv->buffertile = NULL; strcpy(lpriv->imgfilename,spriv->layer_list[i]); /* Extract the layer information from the GEN file */ if (!_read_adrg(s,&dummy_layer)) { _freelayerpriv(lpriv); continue; } /* Format the XML info */ ecs_AddText(&(s->result), " \n" ); sprintf( line, " %s\n", spriv->layer_list[i] ); ecs_AddText(&(s->result), line ); sprintf( line, " PROJ4:%s\n", PROJ_LONGLAT ); ecs_AddText(&(s->result),line); sprintf(line, " \n", lpriv->region.west, lpriv->region.south, lpriv->region.east, lpriv->region.north ); ecs_AddText(&(s->result),line); sprintf(line, " \n", lpriv->region.west, lpriv->region.south, lpriv->region.east, lpriv->region.north, lpriv->region.ew_res, lpriv->region.ns_res ); ecs_AddText(&(s->result),line); ecs_AddText(&(s->result), " Matrix\n" " Image\n" " \n" ); _freelayerpriv(lpriv); } ecs_AddText(&(s->result), " \n" "\n" ); ecs_SetSuccess(&(s->result)); } /* -------------------------------------------------------------------- */ /* Old style return result. */ /* -------------------------------------------------------------------- */ else { ecs_SetText(&(s->result)," "); for( i = 0; i < spriv->layer_count; i++ ) { ecs_AddText( &(s->result), spriv->layer_list[i] ); ecs_AddText( &(s->result), " " ); } } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetServerProjection: * * Return this server cartographic projection * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetServerProjection(s) ecs_Server *s; { ecs_SetText(&(s->result), PROJ_LONGLAT); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetGlobalBound: * * Return this server global bounding region * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetGlobalBound(s) ecs_Server *s; { ecs_SetGeoRegion(&(s->result),s->globalRegion.north, s->globalRegion.south, s->globalRegion.east, s->globalRegion.west, s->globalRegion.ns_res, s->globalRegion.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_SetServerLanguage: * * Set this server lnaguage for error message; not yet implemented * ---------------------------------------------------------------------- */ ecs_Result *dyn_SetServerLanguage(s,language) ecs_Server *s; u_int language; { ecs_SetSuccess(&(s->result)); return &(s->result); } char *loc_strlwr (string) char *string; { size_t i; if (!string) return string; for (i=0; i #ifdef _WINDOWS #include #include "compat/dirent.h" #include #else #include #include #include #endif #include #include #define MAXADRGTILES 26 #ifndef max #define max(x,y) ((x > y) ? x : y) #endif typedef struct { int isActive; unsigned char data[49152]; } tile_mem; /* private data general to all Grass layer */ typedef struct { char imgname[10]; /* IMG name */ char imgfilename[14]; /* IMG file name */ int zonenumber; /* ARC zone number */ int rows; /* Number of rows */ int columns; /* Number of columns */ int rowtiles; /* Number of 128x128 tiles in a row */ int coltiles; /* Number of 128x128 tiles in a column */ ecs_Region region; /* Bounding rectangle of the matrix */ int *tilelist; /* Tile list of all the tiles positions. This list is (rowtiles*coltiles) long. */ FILE *imgfile; /* IMG file itself */ int ARV,BRV; double LSO,PSO; int firstposition; /* First pixel position in file */ tile_mem *buffertile; /* buffer table */ int firsttile; /* Position of the first tile in the buffer table */ } LayerPrivateData; typedef struct { char *genfilename; char *imgdir; LayerPrivateData overview; int layer_count; char **layer_list; } ServerPrivateData; /* layer oriented method definition */ void _openRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closeRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getNextObjectRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getObjectRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectIdRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); int _calcPosValue _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int i,int j,int UseOverview)); void _openImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closeImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getNextObjectImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getObjectImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectIdImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); int _calcImagePosValue _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int i,int j,int UseOverview)); void _LoadADRGTiles _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int *UseOverview)); /* layer oriented method are keeped into a single data structure to simplify the code */ typedef void layerfunc(); typedef void layerobfunc(); typedef void layercoordfunc(); typedef struct { layerfunc *open; layerfunc *close; layerfunc *rewind; layerfunc *getNextObject; layerobfunc *getObject; layercoordfunc *getObjectIdFromCoord; } LayerMethod; void _calPosWithCoord _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,double pos_x,double pos_y,int *i,int *j,int UseOverview)); int _IsOutsideRegion _ANSI_ARGS_((double n, double s, double e,double w, ecs_Region *x)); int _read_adrg _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); int _read_overview _ANSI_ARGS_((ecs_Server *s)); char *subfield _ANSI_ARGS_((char *buffer, int index, int length)); double parse_coord_x _ANSI_ARGS_((char *buffer)); double parse_coord_y _ANSI_ARGS_((char *buffer)); int _verifyLocation _ANSI_ARGS_((ecs_Server *s)); int _initRegionWithDefault _ANSI_ARGS_((ecs_Server *s)); char *loc_strupr _ANSI_ARGS_((char *string)); char *loc_strlwr _ANSI_ARGS_((char *string)); ogdi-ogdi_4_1_0/ogdi/driver/adrg/datadict.h000066400000000000000000000076121345660466700207110ustar00rootroot00000000000000static char datadict[] = {'\n' ,'i','t','c','l','_','c','l','a','s','s',' ','W','K','B','_','D','a','t','a','D','i','c','t','i','o','n','a','r','y',' ','{' ,'\n' ,'\t','i','n','h','e','r','i','t',' ','d','d' ,'\n' ,'\n' ,'c','o','n','s','t','r','u','c','t','o','r',' ','{','w','p','a','t','h',' ','l','o','c','a','t','i','o','n','}',' ','{' ,'\n' ,'#','\t','d','d',':',':','c','o','n','s','t','r','u','c','t','o','r',' ','$','w','i','n','d','o','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,' ',' ',' ',' ','d','d',' ','$','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','l','a','y','o','u','t',' ','{','}',' ','{' ,'\n' ,' ',' ',' ',' ','f','r','a','m','e',' ','$','w','i','n','d','o','w','.','c','e','n','t','e','r' ,'\n' ,'\t','m','a','p','L','i','s','t','b','o','x' ,'\n' ,'\t','b','u','t','t','o','n','s' ,'\n' ,'\t','u','p','d','a','t','e','d','i','c','t' ,'\n' ,'\t',':',':','u','p','d','a','t','e',' ','i','d','l','e','t','a','s','k','s','\t' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','b','u','t','t','o','n','s',' ','{','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','L','i','s','t','E','n','t','r','y',' ','{','i','n','d','e','x','}',' ','{' ,'\n' ,'\t','r','e','g','s','u','b',' ','{','\\','(','[','A','-','Z',']','+','\\',')','$','}',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','g','e','t',' ','$','i','n','d','e','x',']',' ','{','}',' ','s','_','n','a','m','e',' ' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','s','_','n','a','m','e' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','u','p','d','a','t','e','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\n' ,' ',' ','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','d','e','l','e','t','e',' ','0',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','s','i','z','e',']' ,'\n' ,' ',' ','f','o','r','e','a','c','h',' ','s','_','i','t','e','m',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',']',' ','{' ,'\n' ,' ',' ','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','g','e','t','U','R','L','E','n','t','r','y',' ','$','s','_','i','t','e','m',']' ,'\n' ,' ',' ','}' ,'\n' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','U','R','L','E','n','t','r','y',' ','{','s','_','p','a','t','h','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','{','s','_','p','a','t','h','}' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',' ','{','a','r','g','s','}',' ','{' ,'\n' ,' ','\t','r','e','t','u','r','n',' ','R','a','s','t','e','r' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','P','a','t','h','n','a','m','e',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','s','e','l','e','c','t','i','o','n','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','s','e','l','e','c','t','i','o','n','\t' ,'\n' ,'}' ,'\n' ,'\n' ,'p','r','o','t','e','c','t','e','d',' ','a','_','r','a','m','d','i','s','k',' ',';','#',' ','w','h','e','t','h','e','r',' ','t','h','e',' ','c','o','v','e','r','a','g','e',' ','i','s',' ','t','o',' ','b','e',' ','l','o','a','d','e','d',' ','i','n','t','o',' ','r','a','m',' ','o','r',' ','d','i','s','k','.' ,'\n' ,'\t','\t','\t','\t','\t',';','#',' ','v','a','l','u','e','s',' ','a','r','e',' ','e','i','t','h','e','r',' ','\"','R','A','M','\"',' ','o','r',' ','\"','D','I','S','K','\"' ,'\n' ,'p','r','o','t','e','c','t','e','d',' ','s','_','d','i','s','k','D','e','f','a','u','l','t',' ','\"','D','I','S','K','\"' ,'\n' ,'\n' ,'}' ,'\n' ,'\n' ,'\0'}; ogdi-ogdi_4_1_0/ogdi/driver/adrg/ddadrg.tcl000066400000000000000000000016521345660466700207120ustar00rootroot00000000000000itcl_class WKB_DataDictionary { inherit dd constructor {wpath location} { # dd::constructor $windowpath $location dd $wpath $location } method layout {} { frame $window.center mapListbox buttons updatedict ::update idletasks } method buttons {} { return } method getListEntry {index} { regsub {\([A-Z]+\)$} [$mapList subwidget listbox get $index] {} s_name return $s_name } method updatedict {} { $mapList subwidget listbox delete 0 [$mapList subwidget listbox size] foreach s_item [ecs_UpdateDictionary $url] { $mapList subwidget listbox insert end [getURLEntry $s_item] } } method getURLEntry {s_path} { return ${s_path} } method getSelectedClass {args} { return Raster } method getPathname {coverage class selection} { return $selection } protected a_ramdisk ;# whether the coverage is to be loaded into ram or disk. ;# values are either "RAM" or "DISK" protected s_diskDefault "DISK" } ogdi-ogdi_4_1_0/ogdi/driver/adrg/makefile000066400000000000000000000022051345660466700204540ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = adrg TARGETGEN=$(DYNAGEN) SOURCES = adrg.c utils.c object.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(GLUTIL_STATICLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR datadict.h $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) datadict.h: ddadrg.tcl $(STRINGIFY) -file ddadrg.tcl datadict.h clean: default-clean ogdi-ogdi_4_1_0/ogdi/driver/adrg/object.c000066400000000000000000000426001345660466700203710ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI ADRG Driver * Purpose: Implementation of ADRG getObject* functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.7 2016-06-28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.6 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.5 2001/06/22 16:37:50 warmerda * added Image support, upgraded headers * */ #include "ecs.h" #include "adrg.h" ECS_CVSID("$Id$"); /* * -------------------------------------------------------------------------- * _LoadADRGTiles * * Load tiles in memory if it's not too big. The projection * must be longlat. These tiles is a kind of buffer for a row * of tiles. * -------------------------------------------------------------------------- */ void _LoadADRGTiles(s,l,UseOverview) ecs_Server *s; ecs_Layer *l; int *UseOverview; { register ServerPrivateData *spriv = s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int i1,j1,i2,j2,prev_i,prev_j,i,count,tile,tile_physique; double y,prev_y; /* Found the first and the last request point in adrg matrix */ y = s->currentRegion.north - l->index*s->currentRegion.ns_res; prev_y = s->currentRegion.north - (l->index-1)*s->currentRegion.ns_res; _calPosWithCoord(s,l,s->currentRegion.west,y,&i1,&j1,FALSE); _calPosWithCoord(s,l,s->currentRegion.east,y,&i2,&j2,FALSE); _calPosWithCoord(s,l,s->currentRegion.east,prev_y,&prev_i,&prev_j,FALSE); /* Found the first and last tile */ i1 = i1/128; i2 = i2/128; j1 = j1/128; j2 = j2/128; prev_j = prev_j/128; /* Update the tile database */ count = 0; if ((lpriv->buffertile == NULL) || (prev_j != j1) || (l->index == 0)) { if ((i2-i1) > MAXADRGTILES) { *UseOverview = TRUE; _calPosWithCoord(s,l,s->currentRegion.west,y,&i1,&j1,TRUE); _calPosWithCoord(s,l,s->currentRegion.east,y,&i2,&j2,TRUE); _calPosWithCoord(s,l,s->currentRegion.east,prev_y,&prev_i,&prev_j,TRUE); /* Found the first and last tile */ i1 = i1/128; i2 = i2/128; j1 = j1/128; j2 = j2/128; prev_j = prev_j/128; if ((spriv->overview.buffertile == NULL) || (prev_j != j1) || (l->index == 0)) { if (spriv->overview.buffertile != NULL) { free(spriv->overview.buffertile); spriv->overview.buffertile = NULL; } if ((i2-i1) > MAXADRGTILES) { return; } spriv->overview.firsttile = i1; spriv->overview.buffertile = malloc((i2-i1+1)*sizeof(tile_mem)); for(i=i1;i<=i2;i++) { tile = (j1 * spriv->overview.coltiles) + i; if ((tile < 0) || (tile > (spriv->overview.coltiles*spriv->overview.rowtiles))) tile_physique = 0; else tile_physique = spriv->overview.tilelist[tile]; if (tile_physique != 0) { fseek(spriv->overview.imgfile,(spriv->overview.firstposition + (tile_physique-1)*49152) - 1,SEEK_SET); ogdi_fread(spriv->overview.buffertile[count].data,49152,1,spriv->overview.imgfile); spriv->overview.buffertile[count].isActive = TRUE; } else { spriv->overview.buffertile[count].isActive = FALSE; } count++; } } return; } if (lpriv->buffertile != NULL) { free(lpriv->buffertile); lpriv->buffertile = NULL; } *UseOverview = FALSE; if ((lpriv->zonenumber == 9) || (lpriv->zonenumber == 18)) { return; } lpriv->firsttile = i1; lpriv->buffertile = malloc((i2-i1+1)*sizeof(tile_mem)); for(i=i1;i<=i2;i++) { tile = (j1 * lpriv->coltiles) + i; if ((tile < 0) || (tile > (lpriv->coltiles*lpriv->rowtiles))) tile_physique = 0; else tile_physique = lpriv->tilelist[tile]; if (tile_physique != 0) { fseek(lpriv->imgfile,(lpriv->firstposition + (tile_physique-1)*49152) - 1,SEEK_SET); ogdi_fread(lpriv->buffertile[count].data,49152,1,lpriv->imgfile); lpriv->buffertile[count].isActive = TRUE; } else { lpriv->buffertile[count].isActive = FALSE; } count++; } } } /* * -------------------------------------------------------------------------- * _get*Object*Raster: * * a set of functions to acheive Line objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectRaster(s,l) ecs_Server *s; ecs_Layer *l; { int i; char buffer[128]; static int UseOverview; int totalcol; /*int totalrow;*/ int value; double pos; if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } _LoadADRGTiles(s,l,&UseOverview); totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); /*totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res);*/ ecs_SetGeomMatrix(&(s->result),totalcol); for (i=0; iindex,UseOverview); ECS_SETGEOMMATRIXVALUE((&(s->result)),i,value); } sprintf(buffer,"%d",l->index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - l->index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) l->index++; ecs_SetSuccess(&(s->result)); } void _getObjectRaster(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int i; char buffer[128]; int totalcol; /*int totalrow;*/ int value; int index; double pos; index = atoi(id); if (index >= l->nbfeature) { ecs_SetError(&(s->result),2,"Bad index value"); return; } totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); /*totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res);*/ ecs_SetGeomMatrix(&(s->result),totalcol); for (i=0; iresult)),i,value); } sprintf(buffer,"%d",index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) ecs_SetSuccess(&(s->result)); } void _getObjectIdRaster(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { ecs_SetSuccess(&(s->result)); } void _rewindRasterLayer(s,l) ecs_Server *s; ecs_Layer *l; { } int _calcPosValue(s,l,i,j,UseOverview) ecs_Server *s; ecs_Layer *l; int i; int j; int UseOverview; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register LayerPrivateData *ptrlpriv; register ServerPrivateData *spriv = s->priv; double pos_x, pos_y; int pix_c,pix_r; register int value,tile,tile_physique,tile_x,tile_y; register int tile_r,tile_c; register unsigned int Red,Green,Blue,PosRed; if (UseOverview == TRUE) { ptrlpriv = &(spriv->overview); } else { ptrlpriv = lpriv; } pos_x = s->currentRegion.west + i*s->currentRegion.ew_res; pos_y = s->currentRegion.north - j*s->currentRegion.ns_res; _calPosWithCoord(s,l,pos_x,pos_y,&pix_c,&pix_r,UseOverview); if ((pix_c>=0) && (pix_ccolumns) && (pix_r>=0) && (pix_rrows)) { /* Trouver la tile correspondante a pix_c,pix_r */ tile_x = pix_c/128; tile_y = pix_r/128; tile = (tile_y * ptrlpriv->coltiles) + tile_x; /* Trouver a quel numero de tile correspond cette tile */ if ((tile < 0) || (tile > (ptrlpriv->coltiles*ptrlpriv->rowtiles))) tile_physique = 0; else tile_physique = ptrlpriv->tilelist[tile]; /* Si cette tile physique est 0, c'est une tile vide */ if (tile_physique == 0) { value = 0; } else { tile_r = pix_r - tile_y * 128; tile_c = pix_c - tile_x * 128; if (ptrlpriv->buffertile != NULL) { tile_physique = tile_x - ptrlpriv->firsttile; if (ptrlpriv->buffertile[tile_physique].isActive == TRUE) { PosRed = tile_r*128 + tile_c; Red = (ptrlpriv->buffertile[tile_physique].data[PosRed]) / 43; Green = (ptrlpriv->buffertile[tile_physique].data[PosRed+16384]) / 43; Blue = (ptrlpriv->buffertile[tile_physique].data[PosRed+32768]) / 43; } else { value = 0; return value; } } else { if ((tile_physique--) < 0) tile_physique = 0; PosRed = ptrlpriv->firstposition + tile_physique*49152 + tile_r*128 + tile_c; fseek(ptrlpriv->imgfile,PosRed-1,SEEK_SET); Red = ((unsigned int) getc(ptrlpriv->imgfile)) / 43; fseek(ptrlpriv->imgfile,16383,SEEK_CUR); Green = ((unsigned int) getc(ptrlpriv->imgfile)) / 43; fseek(ptrlpriv->imgfile,16383,SEEK_CUR); Blue = ((unsigned int) getc(ptrlpriv->imgfile)) / 43; } value = Red*36 + Green*6 + Blue + 1; } } else { value = 0; } return value; } /* -------------------------------------------------------------------- Given an equilateral coordinate, calculate the position in the raster -------------------------------------------------------------------- */ void _calPosWithCoord(s,l,pos_x,pos_y,i,j,UseOverview) ecs_Server *s; ecs_Layer *l; double pos_x; double pos_y; int *i; int *j; int UseOverview; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register LayerPrivateData *ptrlpriv; register ServerPrivateData *spriv = s->priv; register long pix_c,pix_r; double x,y,x0,y0; double diff; if (UseOverview == TRUE) { ptrlpriv = &(spriv->overview); } else { ptrlpriv = lpriv; } /* The ARC zone is important in the x,y calculation. */ if (lpriv->zonenumber == 9) { /* North pole case */ x0 = (((double) ptrlpriv->BRV)/360.0) * (90.0 - ptrlpriv->PSO) * sin(ptrlpriv->LSO * PI / 180.0); y0 = (-1.0 * ((double) ptrlpriv->BRV)/360.0) * (90.0 - ptrlpriv->PSO) * cos(ptrlpriv->LSO * PI / 180.0); x = (((double) ptrlpriv->BRV)/360.0) * (90.0 - pos_x) * sin(pos_y * PI / 180.0); y = (-1.0 * ((double) ptrlpriv->BRV)/360.0) * (90.0 - pos_x) * cos(pos_y * PI / 180.0); pix_r = (int) (y0 - y); pix_c = (int) (x - x0); } else if (lpriv->zonenumber == 18) { /* South pole case */ x0 = (((double) ptrlpriv->BRV)/360.0) * (90.0 + ptrlpriv->PSO) * sin(ptrlpriv->LSO * PI / 180.0); y0 = (((double) ptrlpriv->BRV)/360.0) * (90.0 + ptrlpriv->PSO) * cos(ptrlpriv->LSO * PI / 180.0); x = (((double) ptrlpriv->BRV)/360.0) * (90.0 + pos_x) * sin(pos_y * PI / 180.0); y = (((double) ptrlpriv->BRV)/360.0) * (90.0 + pos_x) * cos(pos_y * PI / 180.0); pix_r = (int) (y0 - y); pix_c = (int) (x - x0); } else { /* Non-polar zones */ diff = pos_x - ptrlpriv->LSO; pix_r = (int) ((ptrlpriv->PSO - pos_y) * (ptrlpriv->BRV/360)); pix_c = (int) (diff * (ptrlpriv->ARV/360)); } *i = pix_c; *j = pix_r; return; } /* * -------------------------------------------------------------------------- * _get*Object*Image: * * a set of functions to acheive Line objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectImage(s,l) ecs_Server *s; ecs_Layer *l; { int i; char buffer[128]; static int UseOverview; int totalcol; /*int totalrow;*/ int value; double pos; if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } _LoadADRGTiles(s,l,&UseOverview); totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); /*totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res);*/ ecs_SetGeomImage(&(s->result),totalcol); for (i=0; iindex,UseOverview); ECS_SETGEOMIMAGEVALUE(&(s->result),i,value); } sprintf(buffer,"%d",l->index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - l->index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) l->index++; ecs_SetSuccess(&(s->result)); } void _getObjectImage(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int i; char buffer[128]; int totalcol; /*int totalrow;*/ int value; int index; double pos; index = atoi(id); if (index >= l->nbfeature) { ecs_SetError(&(s->result),2,"Bad index value"); return; } totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); /*totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res);*/ ecs_SetGeomImage(&(s->result),totalcol); for (i=0; iresult)),i,value); } sprintf(buffer,"%d",index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) ecs_SetSuccess(&(s->result)); } void _getObjectIdImage(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { ecs_SetSuccess(&(s->result)); } void _rewindImageLayer(s,l) ecs_Server *s; ecs_Layer *l; { } int _calcImagePosValue(s,l,i,j,UseOverview) ecs_Server *s; ecs_Layer *l; int i; int j; int UseOverview; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register LayerPrivateData *ptrlpriv; register ServerPrivateData *spriv = s->priv; double pos_x, pos_y; int pix_c,pix_r; register int value,tile,tile_physique,tile_x,tile_y; register int tile_r,tile_c; register unsigned int Red,Green,Blue,PosRed; if (UseOverview == TRUE) { ptrlpriv = &(spriv->overview); } else { ptrlpriv = lpriv; } pos_x = s->currentRegion.west + i*s->currentRegion.ew_res; pos_y = s->currentRegion.north - j*s->currentRegion.ns_res; _calPosWithCoord(s,l,pos_x,pos_y,&pix_c,&pix_r,UseOverview); if ((pix_c>=0) && (pix_ccolumns) && (pix_r>=0) && (pix_rrows)) { /* Trouver la tile correspondante a pix_c,pix_r */ tile_x = pix_c/128; tile_y = pix_r/128; tile = (tile_y * ptrlpriv->coltiles) + tile_x; /* Trouver a quel numero de tile correspond cette tile */ if ((tile < 0) || (tile > (ptrlpriv->coltiles*ptrlpriv->rowtiles))) tile_physique = 0; else tile_physique = ptrlpriv->tilelist[tile]; /* Si cette tile physique est 0, c'est une tile vide */ if (tile_physique == 0) { value = ecs_GetPixelFromRGB(0,0,0,0); } else { tile_r = pix_r - tile_y * 128; tile_c = pix_c - tile_x * 128; if (ptrlpriv->buffertile != NULL) { tile_physique = tile_x - ptrlpriv->firsttile; if (ptrlpriv->buffertile[tile_physique].isActive == TRUE) { PosRed = tile_r*128 + tile_c; Red = (ptrlpriv->buffertile[tile_physique].data[PosRed]); Green = (ptrlpriv->buffertile[tile_physique].data[PosRed+16384]); Blue = (ptrlpriv->buffertile[tile_physique].data[PosRed+32768]); } else { value = ecs_GetPixelFromRGB(0,0,0,0); return value; } } else { if ((tile_physique--) < 0) tile_physique = 0; PosRed = ptrlpriv->firstposition + tile_physique*49152 + tile_r*128 + tile_c; fseek(ptrlpriv->imgfile,PosRed-1,SEEK_SET); Red = ((unsigned int) getc(ptrlpriv->imgfile)); fseek(ptrlpriv->imgfile,16383,SEEK_CUR); Green = ((unsigned int) getc(ptrlpriv->imgfile)); fseek(ptrlpriv->imgfile,16383,SEEK_CUR); Blue = ((unsigned int) getc(ptrlpriv->imgfile)); } value = ecs_GetPixelFromRGB(1,Red,Green,Blue); } } else { value = ecs_GetPixelFromRGB(0,0,0,0); } return value; } ogdi-ogdi_4_1_0/ogdi/driver/adrg/utils.c000066400000000000000000000326721345660466700202730ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI ADRG Driver * Purpose: Supporting ADRG functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.8 2016-06-28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.7 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.6 2003/08/27 05:00:06 warmerda * Fixed problems with _read_adrg(), _read_overview() and _initRegionWithDefault * so that the files are actually closed after use. As per bug 795612. * * Revision 1.5 2001/06/22 16:37:50 warmerda * added Image support, upgraded headers * */ #include "adrg.h" ECS_CVSID("$Id$"); /* ---------------------------------------------------------- _read_adrg extract the information from the .GEN file and put them into lpriv. ---------------------------------------------------------- */ int _read_adrg(s,l) ecs_Server *s; ecs_Layer *l; { register ServerPrivateData *spriv = s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; FILE *fichier; int first; char c,sc[4]; char buffer[20]; double x,y; int i,j,count; int isTiled; fichier = fopen(spriv->genfilename,"r"); if (fichier == NULL) { ecs_SetError(&(s->result),1,"Unable to open the .GEN file"); return FALSE; } c = getc(fichier); while(!feof(fichier)) { if (c==(char) 30) { ogdi_fread(sc,3,1,fichier); if(strncmp("GIN",sc,3) == 0) { first = TRUE; /* Jump ^^ et PRT */ fseek(fichier,7,SEEK_CUR); /* Read NAM */ ogdi_fread(buffer,8,1,fichier); strncpy(lpriv->imgname,buffer,8); lpriv->imgname[8] = '\0'; /* Jump ^^ STR LOD LAD UNIloa */ fseek(fichier,17,SEEK_CUR); /* Read SWO SWA NWO NWA NEO NEA SEO SEA */ for(i=0;i<4;i++) { ogdi_fread(buffer,11,1,fichier); buffer[11] = '\0'; x = parse_coord_x(buffer); ogdi_fread(buffer,10,1,fichier); buffer[10] = '\0'; y = parse_coord_y(buffer); if (first) { lpriv->region.east = x; lpriv->region.west = x; lpriv->region.north = y; lpriv->region.south = y; first = FALSE; } else { if (x<(lpriv->region.west)) lpriv->region.west = x; if (x>(lpriv->region.east)) lpriv->region.east = x; if (y<(lpriv->region.south)) lpriv->region.south = y; if (y>(lpriv->region.north)) lpriv->region.north = y; } } /* Jump SCA */ fseek(fichier,9,SEEK_CUR); /* Read ZNA */ ogdi_fread(buffer,2,1,fichier); buffer[2] = '\0'; lpriv->zonenumber = atoi(buffer); /* Jump PSP IMR */ fseek(fichier,6,SEEK_CUR); /* Read ARV */ ogdi_fread(buffer,8,1,fichier); buffer[8] = '\0'; lpriv->ARV = atoi(buffer); /* Read BRV */ ogdi_fread(buffer,8,1,fichier); buffer[8] = '\0'; lpriv->BRV = atoi(buffer); /* Read LSO PSO */ ogdi_fread(buffer,11,1,fichier); buffer[11] = '\0'; lpriv->LSO = parse_coord_x(buffer); ogdi_fread(buffer,10,1,fichier); buffer[10] = '\0'; lpriv->PSO = parse_coord_y(buffer); /* Jump TXT ^^ NUL NUS NLL NLS */ fseek(fichier,89,SEEK_CUR); /* Read NFL */ ogdi_fread(buffer,3,1,fichier); buffer[3] = '\0'; lpriv->rowtiles = atoi(buffer); lpriv->rows = lpriv->rowtiles * 128; lpriv->region.ns_res = (lpriv->region.north - lpriv->region.south) / (double) lpriv->rows; /* Read NFC */ ogdi_fread(buffer,3,1,fichier); buffer[3] = '\0'; lpriv->coltiles = atoi(buffer); lpriv->columns = lpriv->coltiles * 128; lpriv->region.ew_res = (lpriv->region.east - lpriv->region.west) / (double) lpriv->columns; /* Jump PNC PNL COD ROD POR PCB PVB */ fseek(fichier,17,SEEK_CUR); /* Read BAD and check if it valid. If not, search another GIN */ ogdi_fread(buffer,12,1,fichier); #ifdef _WINDOWS if (strnicmp(buffer,lpriv->imgfilename,12) != 0) { #else if (strncasecmp(buffer,lpriv->imgfilename,12) != 0) { #endif c = getc(fichier); continue; } lpriv->imgfilename[12] = '\0'; /* Read the TIF */ ogdi_fread(buffer,1,1,fichier); if (buffer[0] == 'N') isTiled = FALSE; else isTiled = TRUE; /* If is tiled, get the TSI. */ if (isTiled) { /* Jump ^^ BID WS1 WS2 ^^ */ fseek(fichier,47,SEEK_CUR); } lpriv->tilelist = (int *) malloc(sizeof(int)*lpriv->rowtiles*lpriv->coltiles); if (lpriv->tilelist == NULL) { ecs_SetError(&(s->result),1,"Not enough memory"); fclose( fichier ); return FALSE; } count = 0; for(i=0;irowtiles;i++) { for(j=0;jcoltiles;j++) { if (isTiled) { ogdi_fread(buffer,5,1,fichier); buffer[5] = '\0'; lpriv->tilelist[count] = atoi(buffer); } else { lpriv->tilelist[count] = count+1; } count++; } } fclose( fichier ); return TRUE; } } c = getc(fichier); } ecs_SetError(&(s->result),1,"ADRG image not found"); fclose( fichier ); return FALSE; } /* ---------------------------------------------------------- _read_overview extract the information from the .GEN file and put them into the overview attribute of spriv. ---------------------------------------------------------- */ int _read_overview(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) &(spriv->overview); FILE *fichier; /*int first;*/ char c,sc[4]; char buffer[20]; int i,j,count; int isTiled; lpriv->tilelist = NULL; lpriv->buffertile = NULL; fichier = fopen(spriv->genfilename,"r"); if (fichier == NULL) { ecs_SetError(&(s->result),1,"Unable to open the .GEN file"); return FALSE; } c = getc(fichier); while(!feof(fichier)) { if (c==(char) 30) { ogdi_fread(sc,3,1,fichier); if(strncmp("OVV",sc,3) == 0) { /*first = TRUE;*/ /* Jump ^^ et PRT */ fseek(fichier,7,SEEK_CUR); /* Read NAM */ ogdi_fread(buffer,8,1,fichier); strncpy(lpriv->imgname,buffer,8); lpriv->imgname[8] = '\0'; /* Jump STR */ fseek(fichier,2,SEEK_CUR); /* Read ARV */ ogdi_fread(buffer,8,1,fichier); buffer[8] = '\0'; lpriv->ARV = atoi(buffer); /* Read BRV */ ogdi_fread(buffer,8,1,fichier); buffer[8] = '\0'; lpriv->BRV = atoi(buffer); /* Read LSO PSO */ ogdi_fread(buffer,11,1,fichier); buffer[11] = '\0'; lpriv->LSO = parse_coord_x(buffer); ogdi_fread(buffer,10,1,fichier); buffer[10] = '\0'; lpriv->PSO = parse_coord_y(buffer); /* Jump ^^ NUL NUS NLL NLS */ fseek(fichier,25,SEEK_CUR); /* Read NFL */ ogdi_fread(buffer,3,1,fichier); buffer[3] = '\0'; lpriv->rowtiles = atoi(buffer); lpriv->rows = lpriv->rowtiles * 128; /* Read NFC */ ogdi_fread(buffer,3,1,fichier); buffer[3] = '\0'; lpriv->coltiles = atoi(buffer); lpriv->columns = lpriv->coltiles * 128; /* Jump PNC PNL COD ROD POR PCB PVB */ fseek(fichier,17,SEEK_CUR); /* Read BAD and check if it valid. If not, search another GIN */ ogdi_fread(buffer,12,1,fichier); strncpy(lpriv->imgfilename,buffer,12); lpriv->imgfilename[12] = '\0'; /* Read the TIF */ ogdi_fread(buffer,1,1,fichier); if (buffer[0] == 'N') isTiled = FALSE; else isTiled = TRUE; /* If is tiled, get the TSI. */ if (isTiled) { /* Jump ^^ BID WS1 WS2 ^^ */ fseek(fichier,47,SEEK_CUR); } lpriv->tilelist = (int *) malloc(sizeof(int)*lpriv->rowtiles*lpriv->coltiles); if (lpriv->tilelist == NULL) { ecs_SetError(&(s->result),1,"Not enough memory"); fclose( fichier ); return FALSE; } count = 0; for(i=0;irowtiles;i++) { for(j=0;jcoltiles;j++) { if (isTiled) { ogdi_fread(buffer,5,1,fichier); buffer[5] = '\0'; lpriv->tilelist[count] = atoi(buffer); } else { lpriv->tilelist[count] = count+1; } count++; } } /* Set the bounding rectangle of the matrix with the global region (no region set for the overview, only data convertion). */ fclose( fichier ); return TRUE; } } c = getc(fichier); } ecs_SetError(&(s->result),1,"ADRG overview not found"); fclose( fichier ); return FALSE; } char *subfield(buffer,index,length) char *buffer; int index; int length; { static char sub[20]; int k; for (k=0;kpriv; returnvalue = FALSE; test = fopen(spriv->genfilename,"r"); if (test != NULL) { fclose(test); returnvalue = TRUE; } if (!returnvalue) ecs_SetError(&(s->result),1,"Invalid ADRG URL. The .GEN file is invalid"); return returnvalue; } /* ------------------------------------------------------------------------- _initRegionWithDefault: Prepare the global region of this driver Extracting the global bounding box imply a search of all images MBR in the .GEN file. Each image start with ^^GIN and the first coordinate of this image is kept 32 spaces after. At this location, we got two coordinate for each corner of the MBR. SWO 11 char South-West corner longitude SWA 10 char South-West corner latitude NWO 11 char North-West corner longitude NWA 10 char North-West corner latitude NEO 11 char North-East corner longitude NEA 10 char North-East corner latitude SEO 11 char South-East corner longitude SEA 10 char South-East corner latitude -------------------------------------------------------------------------- */ int _initRegionWithDefault(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; int first = TRUE; FILE *fichier; char c,sc[4]; char buffer[12]; double x,y; int i; fichier = fopen(spriv->genfilename,"r"); if (fichier == NULL) { ecs_SetError(&(s->result),1,"Unable to open the .GEN file"); return FALSE; } c = getc(fichier); while(!feof(fichier)) { if (c==(char) 30) { ogdi_fread(sc,3,1,fichier); if(strncmp("GIN",sc,3) == 0) { fseek(fichier,32,SEEK_CUR); for(i=0;i<4;i++) { ogdi_fread(buffer,11,1,fichier); x = parse_coord_x(buffer); ogdi_fread(buffer,10,1,fichier); y = parse_coord_y(buffer); if (first) { s->globalRegion.east = x; s->globalRegion.west = x; s->globalRegion.north = y; s->globalRegion.south = y; first = FALSE; } else { if (x<(s->globalRegion.west)) s->globalRegion.west = x; if (x>(s->globalRegion.east)) s->globalRegion.east = x; if (y<(s->globalRegion.south)) s->globalRegion.south = y; if (y>(s->globalRegion.north)) s->globalRegion.north = y; } } } } c = getc(fichier); } s->globalRegion.ns_res = (s->globalRegion.north - s->globalRegion.south)/1000.0; s->globalRegion.ew_res = (s->globalRegion.east - s->globalRegion.west)/1000.0; fclose( fichier ); return 1; } int _IsOutsideRegion(n,s,e,w,region) double n,s,e,w; ecs_Region *region; { if ((n < region->south) || (s > region->north) || (e < region->west) || (w > region->east)) { return 1; } return 0; } ogdi-ogdi_4_1_0/ogdi/driver/makefile000066400000000000000000000026121345660466700175410ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # # MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 # Description: Addition of skeleton in the build subdirs list. include $(TOPDIR)/config/common.mak # # Sub-directories that need to be built # # MOD START subdirs = adrg network rpf vrf skeleton # MOD END # # Default target to build everything in all sub-directories # all: $(subdirs) # # Target to allow individual sub-directories to be built # (e.g. make cgmmod) # .PHONY: $(subdirs) $(subdirs): cd $@; $(MAKE) # # Pass specialized targets into the sub-directories # .PHONY: $(STANDARD_TARGETS) $(STANDARD_TARGETS): @for i in $(subdirs); do \ $(MAKE) --directory $$i $@; \ done ogdi-ogdi_4_1_0/ogdi/driver/network/000077500000000000000000000000001345660466700175315ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/network/.cvsignore000066400000000000000000000000061345660466700215250ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/driver/network/ecs_clnt.c000066400000000000000000000146321345660466700214750ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include /* for memset */ #include "ecs.h" /* Default timeout can be changed using clnt_control() */ static struct timeval TIMEOUT = { 25, 0 }; ecs_Result * createserver_1(char **argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, CREATESERVER, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * destroyserver_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, DESTROYSERVER, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectlayer_1(ecs_LayerSelection *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTLAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * releaselayer_1(ecs_LayerSelection *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, RELEASELAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectregion_1(ecs_Region *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTREGION, (xdrproc_t) xdr_ecs_Region, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getdictionnary_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETDICTIONNARY, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getattributeformat_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETATTRIBUTEFORMAT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getnextobject_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETNEXTOBJECT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getrasterinfo_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETRASTERINFO, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobject_1(char **argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECT, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobjectidfromcoord_1(ecs_Coordinate *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECTIDFROMCOORD, (xdrproc_t) xdr_ecs_Coordinate, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * updatedictionary_1(char **argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, UPDATEDICTIONARY, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getserverprojection_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETSERVERPROJECTION, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getglobalbound_1(void *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETGLOBALBOUND, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setserverlanguage_1(u_int *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETSERVERLANGUAGE, (xdrproc_t) xdr_u_int, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setrasterconversion_1(ecs_RasterConversion *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETRASTERCONVERSION, (xdrproc_t) xdr_ecs_RasterConversion, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * createproxyserver_1(ecs_ProxyCreateServer *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, CREATEPROXYSERVER, (xdrproc_t) xdr_ecs_ProxyCreateServer, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setcompression_1(ecs_Compression *argp, CLIENT *clnt) { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETCOMPRESSION, (xdrproc_t) xdr_ecs_Compression, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ogdi-ogdi_4_1_0/ogdi/driver/network/makefile000066400000000000000000000021231345660466700212270ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = remote TARGETGEN=$(DYNAGEN) SOURCES = remote.c ecs_clnt.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) $(GRASS_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(RPC_LINKLIB) $(WIN_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/ogdi/driver/network/remote.c000066400000000000000000000377751345660466700212130ustar00rootroot00000000000000#include "ecs.h" #ifdef _SCO #include #include #endif #ifndef _WINDOWS # include #endif struct ecs_Remote { CLIENT *handle; ecs_Result *result; }; typedef struct ecs_Remote ecs_Remote; #define CONTIMEOUT 60 #define DEFTIMEOUT 900 #define MAXCONRETRY 1 #define DISPATCHER 1 #ifdef _WINDOWS int rpc_IsInit = 0; #endif /* ------------------------------------------------------------------------ */ static struct timeval DISPATCH_TIMEOUT = { 20, 0 }; u_long dispatch_1(clnt) CLIENT *clnt; { static u_long clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, DISPATCHER, (xdrproc_t) xdr_void, (caddr_t) NULL, (xdrproc_t) xdr_u_long, (caddr_t) &clnt_res, DISPATCH_TIMEOUT) != RPC_SUCCESS) { clnt_res = 0; } return clnt_res; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_CreateServer(s,Request) ecs_Server *s; char *Request; { ecs_Remote *rc; u_long csid; struct timeval timeOut; int counter; ecs_ProxyCreateServer proxy_req; char *proxyhost = getenv("GLTPPROXYHOST"); #ifdef _WINDOWS if (!rpc_IsInit) { rpc_nt_init(); rpc_IsInit = 1; } #endif /* Initialisation of ecs_Remote in s->priv */ s->priv = (void *) malloc(sizeof(ecs_Remote)); if (s->priv == NULL) { ecs_SetError(&(s->result),1,"No enough memory"); return &(s->result); } rc = (ecs_Remote *) s->priv; rc->handle = NULL; rc->result = NULL; /* Ask to dispatcher what is the number of the new server */ /* Try to open the dispatcher */ for(counter = 0; counter < MAXCONRETRY; counter++) { rc->handle = clnt_create(proxyhost ? proxyhost : s->hostname, proxyhost ? ECSPROXYPROG : ECSPROG, ECSVERS, "tcp"); if (rc->handle != 0) { break; } } if (rc->handle == 0) { ecs_SetError(&(s->result),1,"Unable to connect to dispatcher gltpd"); return &(s->result); } #ifdef _WINDOWS Sleep(1000); #else sleep(1); #endif /* Request to dispatcher */ csid = dispatch_1(rc->handle); if (csid == 0) { ecs_SetError(&(s->result),1,"Not answer from the dispatcher"); return &(s->result); } clnt_destroy(rc->handle); #ifdef _WINDOWS Sleep(1000); #else sleep(1); #endif /* Try to connect to server with the number returned by dispatch_1 */ for(counter = 0; counter < MAXCONRETRY; counter++) { rc->handle = clnt_create(proxyhost ? proxyhost : s->hostname, csid, ECSVERS, "tcp"); if (rc->handle != 0) { break; } } #ifdef _WINDOWS Sleep(1000); #else sleep(1); #endif if (rc->handle == 0) { ecs_SetError(&(s->result),1,"Unable to connect to server number given by dispatcher"); return &(s->result); } /* Initialize the timeout of the create client */ timeOut.tv_sec = CONTIMEOUT; timeOut.tv_usec = 0; clnt_control(rc->handle, CLSET_TIMEOUT, (char *) &timeOut); /* Call the server creation method */ if (proxyhost) { proxy_req.server_name = s->hostname; proxy_req.server_url = Request; rc->result = (ecs_Result *) (createproxyserver_1(&proxy_req,rc->handle)); } else { rc->result = (ecs_Result *) (createserver_1(&Request,rc->handle)); } /* Initialize default timeout */ timeOut.tv_sec = DEFTIMEOUT; timeOut.tv_usec = 0; clnt_control(rc->handle, CLSET_TIMEOUT, (char *) &timeOut); if (rc->result == NULL) { ecs_SetError(&(s->result),1,"No answer from server when CreateServer is called"); return &(s->result); } else { return rc->result; } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { ecs_Remote *rc; struct timeval timeOut; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } /* Initialize the timeout of the create client */ timeOut.tv_sec = CONTIMEOUT; timeOut.tv_usec = 0; clnt_control(rc->handle, CLSET_TIMEOUT, (char *) &timeOut); rc->result = (ecs_Result *) (destroyserver_1(NULL,rc->handle)); clnt_destroy(rc->handle); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when DestroyServer is called. The server is possibly orphan."); } else { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); ecs_SetSuccess(&(s->result)); } free(rc); rc = NULL; return &(s->result); } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_SelectLayer(s,ls) ecs_Server *s; ecs_LayerSelection *ls; { ecs_Remote *rc; int layer; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } if ((layer = ecs_GetLayer(s,ls)) == -1) { /* it did not exists so we are going to try to create it */ if ((layer = ecs_SetLayer(s,ls)) == -1) { return &(s->result); } } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (selectlayer_1(ls,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when selectlayer is called."); return &(s->result); } s->currentLayer = layer; s->layer[layer].index = 0; return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_ReleaseLayer(s,ls) ecs_Server *s; ecs_LayerSelection *ls; { ecs_Remote *rc; int layer; char buffer[128]; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } if ((layer = ecs_GetLayer(s,ls)) == -1) { sprintf(buffer,"Invalid layer %s",ls->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } ecs_FreeLayer(s,layer); /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (releaselayer_1(ls,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when releaselayer is called."); return &(s->result); } if (s->currentLayer == layer) { s->currentLayer = -1; } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; s->currentRegion.east = gr->east; s->currentRegion.west = gr->west; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; rc->result = (ecs_Result *) (selectregion_1(gr,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when selectregion is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetDictionary(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getdictionnary_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getdictionary is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetNextObject(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getnextobject_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getnextobject is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetObject(s,Id) ecs_Server *s; char *Id; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getobject_1(&Id,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getobject is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_UpdateDictionary(s,info) ecs_Server *s; char *info; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (updatedictionary_1(&info,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when updatedictionary is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetServerProjection(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getserverprojection_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getserverprojection is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_SetServerLanguage(s,language) ecs_Server *s; u_int language; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (setserverlanguage_1(&language,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when setserverlanguage is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetObjectIdFromCoord(s,c) ecs_Server *s; ecs_Coordinate *c; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getobjectidfromcoord_1(c,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when GetObjectIdFromCoord is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetAttributesFormat(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getattributeformat_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when GetAttributesFormat is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetRasterInfo(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getrasterinfo_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getrasterinfo is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_GetGlobalBound(s) ecs_Server *s; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (getglobalbound_1(NULL,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when getglobalbound is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_SetRasterConversion(s,rasterconversion) ecs_Server *s; ecs_RasterConversion *rasterconversion; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (setrasterconversion_1(rasterconversion, rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when setrasterconvertion is called."); return &(s->result); } return rc->result; } /* ------------------------------------------------------------------------ */ ecs_Result *dyn_SetCompression(s,compression) ecs_Server *s; ecs_Compression *compression; { ecs_Remote *rc; rc = (ecs_Remote *) s->priv; if (rc == NULL) { ecs_SetError(&(s->result),1,"Server not initialized"); return &(s->result); } /* Free old rc->result */ if (rc->result != NULL) { xdr_free((xdrproc_t) xdr_ecs_Result,(char *) rc->result); rc->result = NULL; } rc->result = (ecs_Result *) (setcompression_1(compression,rc->handle)); if (rc->result == NULL) { ecs_SetError(&(s->result), 1,"No answer from server when setcompression is called."); return &(s->result); } return rc->result; } ogdi-ogdi_4_1_0/ogdi/driver/network/remote.def000066400000000000000000000007161345660466700215100ustar00rootroot00000000000000LIBRARY REMOTE CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_SelectRegion dyn_GetDictionary dyn_GetNextObject dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_ReleaseLayer dyn_GetAttributesFormat dyn_GetRasterInfo dyn_GetObject dyn_GetObjectIdFromCoord dyn_SetServerLanguage dyn_SetRasterConversion dyn_SetCompression ogdi-ogdi_4_1_0/ogdi/driver/network/sun/000077500000000000000000000000001345660466700203365ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/network/sun/ecs_clnt.c000066400000000000000000000135611345660466700223020ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" /* Default timeout can be changed using clnt_control() */ static struct timeval TIMEOUT = { 25, 0 }; ecs_Result * createserver_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, CREATESERVER, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * destroyserver_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, DESTROYSERVER, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectlayer_1(argp, clnt) ecs_LayerSelection *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTLAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * releaselayer_1(argp, clnt) ecs_LayerSelection *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, RELEASELAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectregion_1(argp, clnt) ecs_Region *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTREGION, (xdrproc_t) xdr_ecs_Region, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getdictionnary_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETDICTIONNARY, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getattributeformat_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETATTRIBUTEFORMAT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getnextobject_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETNEXTOBJECT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getrasterinfo_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETRASTERINFO, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobject_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECT, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobjectidfromcoord_1(argp, clnt) ecs_Coordinate *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECTIDFROMCOORD, (xdrproc_t) xdr_ecs_Coordinate, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * updatedictionary_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, UPDATEDICTIONARY, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getserverprojection_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETSERVERPROJECTION, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getglobalbound_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETGLOBALBOUND, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setserverlanguage_1(argp, clnt) u_int *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETSERVERLANGUAGE, (xdrproc_t) xdr_u_int, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setrasterconversion_1(argp, clnt) ecs_RasterConversion *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETRASTERCONVERSION, (xdrproc_t) xdr_ecs_RasterConversion, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ogdi-ogdi_4_1_0/ogdi/driver/rpf/000077500000000000000000000000001345660466700166275ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/rpf/.cvsignore000066400000000000000000000000061345660466700206230ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/driver/rpf/datadict.h000066400000000000000000000107671345660466700205700ustar00rootroot00000000000000static char datadict[] = {'\n' ,'i','t','c','l','_','c','l','a','s','s',' ','W','K','B','_','D','a','t','a','D','i','c','t','i','o','n','a','r','y',' ','{' ,'\n' ,'\t','i','n','h','e','r','i','t',' ','d','d' ,'\n' ,'\n' ,' ',' ',' ',' ','c','o','n','s','t','r','u','c','t','o','r',' ','{','w','p','a','t','h',' ','l','o','c','a','t','i','o','n','}',' ','{' ,'\n' ,'\t','#','d','d',':',':','c','o','n','s','t','r','u','c','t','o','r',' ','$','w','i','n','d','o','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,'\t','d','d',' ','$','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','l','a','y','o','u','t',' ','{','}',' ','{' ,'\n' ,'\t','f','r','a','m','e',' ','$','w','i','n','d','o','w','.','c','e','n','t','e','r' ,'\n' ,'\t','m','a','p','L','i','s','t','b','o','x' ,'\n' ,'\t','u','p','d','a','t','e','d','i','c','t' ,'\n' ,'\t',':',':','u','p','d','a','t','e',' ','i','d','l','e','t','a','s','k','s','\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','L','i','s','t','E','n','t','r','y',' ','{','i','n','d','e','x','}',' ','{' ,'\n' ,'\t','r','e','g','s','u','b',' ','{','\\','(','[','A','-','Z',']','+','\\',')','$','}',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','g','e','t',' ','$','i','n','d','e','x',']',' ','{','}',' ','s','_','n','a','m','e',' ' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','s','_','n','a','m','e' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','u','p','d','a','t','e','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','d','e','l','e','t','e',' ','0',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','s','i','z','e',']' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','s','_','i','t','e','m',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','i','n','f','o',' ','e','x','i','s','t','s',' ','a','_','r','a','m','d','i','s','k','(','$','s','_','i','t','e','m',')',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','a','_','r','a','m','d','i','s','k','(','$','s','_','i','t','e','m',')',' ','$','s','_','d','i','s','k','D','e','f','a','u','l','t' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t',' ',' ',' ',' ','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','g','e','t','U','R','L','E','n','t','r','y',' ','$','s','_','i','t','e','m',']' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','U','R','L','E','n','t','r','y',' ','{','s','_','p','a','t','h','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','{','s','_','p','a','t','h','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',' ','{','a','r','g','s','}',' ','{' ,'\n' ,' ','\t','r','e','t','u','r','n',' ','R','a','s','t','e','r' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','P','a','t','h','n','a','m','e',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','s','e','l','e','c','t','i','o','n','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','s','e','l','e','c','t','i','o','n','\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','p','r','o','t','e','c','t','e','d',' ','a','_','r','a','m','d','i','s','k',' ',';','#',' ','w','h','e','t','h','e','r',' ','t','h','e',' ','c','o','v','e','r','a','g','e',' ','i','s',' ','t','o',' ','b','e',' ','l','o','a','d','e','d',' ','i','n','t','o',' ','r','a','m',' ','o','r',' ','d','i','s','k','.' ,'\n' ,' ',' ',' ',' ',';','#',' ','v','a','l','u','e','s',' ','a','r','e',' ','e','i','t','h','e','r',' ','\"','R','A','M','\"',' ','o','r',' ','\"','D','I','S','K','\"' ,'\n' ,' ',' ',' ',' ','p','r','o','t','e','c','t','e','d',' ','s','_','d','i','s','k','D','e','f','a','u','l','t',' ','\"','D','I','S','K','\"' ,'\n' ,'\n' ,'}' ,'\n' ,'\n' ,'\0'}; ogdi-ogdi_4_1_0/ogdi/driver/rpf/makefile000066400000000000000000000022071345660466700203300ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = rpf TARGETGEN=$(DYNAGEN) SOURCES = rpf.c utils.c object.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) \ $(GRASS_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(VPF_STATICLIB) $(GLUTIL_STATICLIB) $(WIN_LINKLIB) $(MATH_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR datadict.h $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/ogdi/driver/rpf/object.c000066400000000000000000000401751345660466700202500ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI RPF Driver * Purpose: Implementation of RPF getObject functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.3 2001-04-12 19:22:46 warmerda * applied DND support Image type support * */ #include "ecs.h" #include "rpf.h" ECS_CVSID("$Id$"); /* ******************************************************************* FUNCTION_INFORMATION NAME _getNextObjectRaster DESCRIPTION Pick a line in the line buffer and return it to the OGDI. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS l->index is incremented of 1. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer END_PARAMETERS END_FUNCTION_INFORMATION PSEUDOCODE If the line index l->index is bigger than the number of lines (l->nbfeature) Begin Return the error code 2 end of selection End Calculate the extremities of the lines in the current projection: Point1: x: s->currentRegion.west y: s->currentRegion.north - l->index * s->currentRegion.ns_res Point2: x: s->currentRegion.east y: s->currentRegion.north - l->index * s->currentRegion.ns_res Call ecs_GetTileLine with these two points. If an error occur, return the error "Unable to retreive the line". Increment l->index Set a success message END_PSEUDOCODE ******************************************************************* */ void dyn_getNextObjectRaster(s,l) ecs_Server *s; ecs_Layer *l; { LayerPrivateData *lpriv = l->priv; ecs_Coordinate start, end; double pos_y; if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* get geographic position of current region's matrix point l->index */ pos_y = s->currentRegion.north - l->index * s->currentRegion.ns_res; start.x=s->currentRegion.west; end.x=s->currentRegion.east; start.y=pos_y; end.y=pos_y; if (!ecs_TileGetLine(s, &(lpriv->tilestruct), &start, &end)) { ecs_SetError(&(s->result),1,"Unable to retrieve a line."); return; } l->index++; ecs_SetSuccess(&(s->result)); } void dyn_getObjectRaster(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { (void) l; (void) id; ecs_SetError(&(s->result),1,"The GetObject function is not implemented for this adapter"); } void dyn_getObjectIdRaster(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { (void) l; (void) coord; ecs_SetError(&(s->result),1,"The GetObjectIdFromCoord function is not implemented for this adapter"); } /* ******************************************************************* FUNCTION_INFORMATION NAME _rewindRasterLayer DESCRIPTION Prepare a new selection. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS The layer is reinitialized and ready to be used END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer END_PARAMETERS END_FUNCTION_INFORMATION PSEUDOCODE Call ecs_TileClearBuffer Set l->index to 0. END_PSEUDOCODE ******************************************************************* */ void dyn_rewindRasterLayer(s,l) ecs_Server *s; ecs_Layer *l; { LayerPrivateData *lpriv = l->priv; (void) s; ecs_TileClearBuffer(&(lpriv->tilestruct)); l->index=0; } /* ******************************************************************* FUNCTION_INFORMATION NAME _PointCallBack DESCRIPTION This callback function will return the value of a given point in a given tile. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS The tile may have change if the tile requested was not the same than the previous one. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_TileStructure *t: The tile structure int xtile: The tile column in the tile grid int ytile: The tile line in the tile grid int xpixel: The x position of the point inside the current tile int ypixel: The y position of the point inside the current tile OUTPUT int *cat: The return value. END_PARAMETERS RETURN_VALUE int: Indicate a success or an error message. END_FUNCTION_INFORMATION PSEUDOCODE Call _rpf_readtile for the tile xtile,ytile. If lpriv->isActive is FALSE, return 0 for cat. Calculate the pixel position: (xpixel,lpriv->columns-ypixel) If the point position is inside the region of the raster, Greater to 0 but smaller than the number of columns or lines Begin Calculate the subtile position in the current tile tile x = pixel position x / 256 tile y = pixel position y / 256 physical tile position = tile y * 6 + tile x Calculate the rows and column position of the pixel in this tile tile row = pixel position x - tile x * 256 tile column = pixel position y - tile y* 256 Get the value of the current point in this tile Value = (lpriv->buffertile[physical tile position].data[tile row * 256 + tile column]+13 The return value cat receive the equivalent value of Value cat = lpriv->equi_cat[Value] End Else return a 0 value for cat. END_PSEUDOCODE ******************************************************************* */ int dyn_PointCallBack(s,t,xtile,ytile,xpixel,ypixel,cat) ecs_Server *s; ecs_TileStructure *t; int xtile; int ytile; int xpixel; int ypixel; int *cat; { ecs_Layer *l = (ecs_Layer *) &(s->layer[s->currentLayer]); register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int pix_c,pix_r; register int tile,tile_x,tile_y; register int tile_r,tile_c; register unsigned int Val,PosVal; register double rapport; (void) t; rapport = s->currentRegion.ns_res/lpriv->entry->vert_interval; if (rapport > 10.0) { if (lpriv->entry->frames[ytile][xtile].exists == FALSE) *cat = 0; else { if (xpixel < 100 || xpixel > 1436 || ypixel < 100 || ypixel > 1436) *cat = ((lpriv->entry->boundary_id+1)*4)%216; else *cat = 0; } return TRUE; } if (!dyn_read_rpftile(s,l,xtile,ytile)) { *cat = 0; return TRUE; } if (lpriv->isActive == FALSE) { *cat = 0; return TRUE; } pix_c = xpixel; pix_r = ypixel; if ((pix_c>=0) && (pix_ccolumns) && (pix_r>=0) && (pix_rrows)) { /* Compute subframe numbers for pix_c,pix_r */ tile_x = pix_c/256; tile_y = pix_r/256; tile = tile_y*6+tile_x; /* Si cette tile physique est 0, c'est une tile vide */ tile_r = pix_r - tile_y * 256; tile_c = pix_c - tile_x * 256; PosVal = tile_r*256 + tile_c; Val = (lpriv->buffertile[tile].data[PosVal]); *cat = lpriv->equi_cat[Val]; } else *cat = 0; return TRUE; } /******************************************************************* FUNCTION_INFORMATION NAME _DimCallBack DESCRIPTION This callback function will return the resolution of the tile for the geographic point in it. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_TileStructure *t: The tile structure double x: The x of the geographic position double y: The y of the geographic position OUTPUT int *width: Width of the tile at the position x int *height: Height of the tile at the position y END_PARAMETERS RETURN_VALUE int: Indicate a success or an error message. END_FUNCTION_INFORMATION PSEUDOCODE Set 1536 to *width and *height return TRUE END_PSEUDOCODE ******************************************************************* */ int dyn_DimCallBack(s,t,x,y,width,height) ecs_Server *s; ecs_TileStructure *t; double x; double y; int *width; int *height; { (void) s; (void) t; (void) x; (void) y; *width = 1536; *height = 1536; return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME _getNextObjectImage DESCRIPTION Pick a line in the line buffer and return it to the OGDI. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS l->index is incremented of 1. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer END_PARAMETERS END_FUNCTION_INFORMATION PSEUDOCODE If the line index l->index is bigger than the number of lines (l->nbfeature) Begin Return the error code 2 end of selection End Calculate the extremities of the lines in the current projection: Point1: x: s->currentRegion.west y: s->currentRegion.north - l->index * s->currentRegion.ns_res Point2: x: s->currentRegion.east y: s->currentRegion.north - l->index * s->currentRegion.ns_res Call ecs_GetTileLine with these two points. If an error occur, return the error "Unable to retreive the line". Increment l->index Set a success message END_PSEUDOCODE ******************************************************************* */ void dyn_getNextObjectImage(s,l) ecs_Server *s; ecs_Layer *l; { LayerPrivateData *lpriv = l->priv; ecs_Coordinate start, end; double pos_y; if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* get geographic position of current region's matrix point l->index */ pos_y = s->currentRegion.north - l->index * s->currentRegion.ns_res; start.x=s->currentRegion.west; end.x=s->currentRegion.east; start.y=pos_y; end.y=pos_y; if (!ecs_TileGetLine(s, &(lpriv->tilestruct), &start, &end)) { ecs_SetError(&(s->result),1,"Unable to retrieve a line."); return; } s->result.res.ecs_ResultUnion_u.dob.geom.family = Image; l->index++; ecs_SetSuccess(&(s->result)); } void dyn_getObjectImage(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { ecs_SetError(&(s->result),1,"The GetObject function is not implemented for this adapter"); } void dyn_getObjectIdImage(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { ecs_SetError(&(s->result),1,"The GetObjectIdFromCoord function is not implemented for this adapter"); } /* ******************************************************************* FUNCTION_INFORMATION NAME _rewindImageLayer DESCRIPTION Prepare a new selection. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS The layer is reinitialized and ready to be used END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer END_PARAMETERS END_FUNCTION_INFORMATION PSEUDOCODE Call ecs_TileClearBuffer Set l->index to 0. END_PSEUDOCODE ******************************************************************* */ void dyn_rewindImageLayer(s,l) ecs_Server *s; ecs_Layer *l; { LayerPrivateData *lpriv = l->priv; ecs_TileClearBuffer(&(lpriv->tilestruct)); l->index=0; } /* ******************************************************************* FUNCTION_INFORMATION NAME _PointCallBack DESCRIPTION This callback function will return the value of a given point in a given tile. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS The tile may have change if the tile requested was not the same than the previous one. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_TileStructure *t: The tile structure int xtile: The tile column in the tile grid int ytile: The tile line in the tile grid int xpixel: The x position of the point inside the current tile int ypixel: The y position of the point inside the current tile OUTPUT int *cat: The return value. END_PARAMETERS RETURN_VALUE int: Indicate a success or an error message. END_FUNCTION_INFORMATION PSEUDOCODE Call _rpf_readtile for the tile xtile,ytile. If lpriv->isActive is FALSE, return 0 for cat. Calculate the pixel position: (xpixel,lpriv->columns-ypixel) If the point position is inside the region of the Image, Greater to 0 but smaller than the number of columns or lines Begin Calculate the subtile position in the current tile tile x = pixel position x / 256 tile y = pixel position y / 256 physical tile position = tile y * 6 + tile x Calculate the rows and column position of the pixel in this tile tile row = pixel position x - tile x * 256 tile column = pixel position y - tile y* 256 Get the value of the current point in this tile Value = (lpriv->buffertile[physical tile position].data[tile row * 256 + tile column]+13 The return value cat receive the equivalent value of Value cat = lpriv->equi_cat[Value] End Else return a 0 value for cat. END_PSEUDOCODE ******************************************************************* */ int dyn_ImagePointCallBack(s,t,xtile,ytile,xpixel,ypixel,cat) ecs_Server *s; ecs_TileStructure *t; int xtile; int ytile; int xpixel; int ypixel; int *cat; { ecs_Layer *l = (ecs_Layer *) &(s->layer[s->currentLayer]); register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int pix_c,pix_r; register int tile,tile_x,tile_y; register int tile_r,tile_c; register unsigned int Val,PosVal; register double rapport; rapport = s->currentRegion.ns_res/lpriv->entry->vert_interval; if (rapport > 10.0) { if (lpriv->entry->frames[ytile][xtile].exists == FALSE) { *cat = ecs_GetPixelFromRGB(0,0,0,0); } else { if (xpixel < 100 || xpixel > 1436 || ypixel < 100 || ypixel > 1436) { *cat = ecs_GetPixelFromRGB(1,0,255,0); } else { *cat = ecs_GetPixelFromRGB(0,0,0,0); } return TRUE; } } if (!dyn_read_rpftile(s,l,xtile,ytile)) { *cat = ecs_GetPixelFromRGB(0,0,0,0); return TRUE; } if (lpriv->isActive == FALSE) { *cat = ecs_GetPixelFromRGB(0,0,0,0); return TRUE; } pix_c = xpixel; pix_r = ypixel; if ((pix_c>=0) && (pix_ccolumns) && (pix_r>=0) && (pix_rrows)) { /* Compute subframe numbers for pix_c,pix_r */ tile_x = pix_c/256; tile_y = pix_r/256; tile = tile_y*6+tile_x; /* Si cette tile physique est 0, c'est une tile vide */ tile_r = pix_r - tile_y * 256; tile_c = pix_c - tile_x * 256; PosVal = tile_r*256 + tile_c; Val = (lpriv->buffertile[tile].data[PosVal]); *cat = ecs_GetPixelFromRGB(1,lpriv->rgb_pal[Val].r, lpriv->rgb_pal[Val].g, lpriv->rgb_pal[Val].b); } else { *cat = ecs_GetPixelFromRGB(0,0,0,0); } return TRUE; } ogdi-ogdi_4_1_0/ogdi/driver/rpf/rpf.c000066400000000000000000000651211345660466700175670ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI RPF Driver * Purpose: Implementation of dyn_* api for RPF driver. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.14 2016-07-08 10:22:55 erouault * Fix various compilation problems on Windows (contributed by Jerome Siot) * * Revision 1.13 2007/02/24 16:58:17 cbalint * Clear olso tilestruct while freeing memory in dyn_freelayerpriv() * glibc mtrace() reports zero malloc problems now. * Thanks to djdejohn for the report ! * Modified Files: * ChangeLog ogdi/driver/rpf/rpf.c * * Revision 1.12 2004/03/26 22:33:41 warmerda * Fixed computation of nbfeature in dyn_SelectRegion() to avoid rounding * error issues. As per Bug 924250. * * Revision 1.11 2001/08/27 14:56:29 warmerda * RPF rasterinfo width fixed * * Revision 1.10 2001/08/16 13:06:52 warmerda * ensure that only Matrix and Image are allowed by RPF SelectLayer * * Revision 1.9 2001/06/13 17:17:40 warmerda * fixed capabilities to match 6.2 spec * * Revision 1.8 2001/05/30 19:02:51 warmerda * return real per-layer bounds in capabilities * * Revision 1.7 2001/04/16 21:32:05 warmerda * added capabilities support * * Revision 1.6 2001/04/12 19:22:46 warmerda * applied DND support Image type support * */ #include "rpf.h" #include "datadict.h" ECS_CVSID("$Id$"); int colorintensity[6] = {0,63,105,147,189,255}; /* layer oriented functions are keeped in data structure to simplify code */ LayerMethod rpf_layerMethod[11] = { /* 0 */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Area */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Line */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Point */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Matrix */ { NULL, NULL, dyn_rewindRasterLayer, dyn_getNextObjectRaster, dyn_getObjectRaster, dyn_getObjectIdRaster }, /* Image */ { NULL, NULL, dyn_rewindImageLayer, dyn_getNextObjectImage, dyn_getObjectImage, dyn_getObjectIdImage }, /* Text */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Edge */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Face */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Node */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Ring */ { NULL, NULL, NULL, NULL, NULL, NULL } }; /* ---------------------------------------------------------------------- * _dyn_CreateServer: * * Creation of a new RPF server * ---------------------------------------------------------------------- */ ecs_Result *dyn_CreateServer(s,Request) ecs_Server *s; char *Request; { register ServerPrivateData *spriv = s->priv = (void *) malloc(sizeof(ServerPrivateData)); (void) Request; if (spriv == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate server private data"); return &(s->result); } spriv->pathname = (char *) malloc(strlen(s->pathname)+1); if (spriv->pathname == NULL) { free(s->priv); ecs_SetError(&(s->result),1,"Not enough memory"); return &(s->result); } if (s->pathname[2] == ':') { strcpy(spriv->pathname,s->pathname+1); } else { strcpy(spriv->pathname,s->pathname); } tprintf("dyn_CreateServer 1\n"); /* check the path and see if the location is valid */ if (!(dyn_verifyLocation(s))) { free(spriv->pathname); free(s->priv); return &(s->result); } tprintf("dyn_CreateServer 2\n"); /* initialize the driver globalRegion */ if (!(dyn_initRegionWithDefault(s))) { free(spriv->pathname); free(s->priv); return &(s->result); } tprintf("dyn_CreateServer 3\n"); /* initialize layer private data */ s->nblayer = 0; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_DestroyServer: * * Destruction of this RPF server * ---------------------------------------------------------------------- */ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; /* Release all layer */ dyn_releaseAllLayers(s); if(spriv != NULL) { if (spriv->pathname != NULL) { free(spriv->pathname); } if (spriv->toc != (Toc_file *)NULL) { free_toc(spriv->toc); } free(spriv); } ecs_SetSuccess(&(s->result)); return &(s->result); } void dyn_freelayerpriv(lpriv) LayerPrivateData *lpriv; { if (lpriv != NULL) { lpriv->entry = NULL; if (lpriv->buffertile != NULL) { free(lpriv->buffertile); lpriv->buffertile = NULL; } ecs_TileDeleteAllLines (&(lpriv->tilestruct)); if (lpriv->ff != NULL) free(lpriv->ff); if (lpriv->rgb_pal != NULL) free(lpriv->rgb_pal); if (lpriv->rpf_table != NULL) free(lpriv->rpf_table); free(lpriv); } lpriv = NULL; } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_SelectLayer DESCRIPTION Select a layer and prepare it to be read in the rpf database. END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. END_PRECONDITIONS POSTCONDITIONS The layer is selected and ready to be read with the commands dyn_GetNextObject, dyn_GetRasterInfo and dyn_GetObject. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_LayerSelection *sel: The layer selection information END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION PSEUDOCODE Check if a layer exist with ecs_GetLayer. If a layer exist Begin The current layer is now the layer returned by ecs_GetLayer The index of this layer is set to 0 Return a success message End Set a new layer in the layer structure with ecs_SetLayer. Allocate the mamory needed to hold private info about this new layer. Prepare the new allocated structure with default values. Prepare the layer for selection with _prepare_rpflayer. If an error occur, free the memory of this layer, call ecs_FreeLayer and return an error message. Set the current layer to the new layer Set the index of this layer to 0 Return a success message END_PSEUDOCODE ******************************************************************* */ ecs_Result *dyn_SelectLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; register LayerPrivateData *lpriv; ecs_Region region; /* Disallow any families but Image and Matrix */ if( sel->F != Matrix && sel->F != Image ) { ecs_SetError(&(s->result),1, "RPF driver only supports Matrix and Image in SelectLayer."); return &(s->result); } /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) != -1) { /* if it already exists than assign currentLayer and set index to 0 to force rewind */ s->currentLayer = layer; s->layer[layer].index = 0; lpriv = (LayerPrivateData *) s->layer[layer].priv; region.north = lpriv->entry->nw_lat; region.south = lpriv->entry->sw_lat; region.east = lpriv->entry->ne_long; region.west = lpriv->entry->nw_long; region.ns_res = (region.north - region.south) / (1536*lpriv->entry->vert_frames); region.ew_res = (region.east - region.west) / (1536*lpriv->entry->horiz_frames); ecs_SetGeoRegion(&(s->result),region.north, region.south, region.east, region.west, region.ns_res, region.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* it did not exists so we are going to try to create it */ if ((layer = ecs_SetLayer(s,sel)) == -1) { return &(s->result); } /* allocate memory to hold private info about this new layer */ if ((s->layer[layer].priv = (void *) malloc(sizeof(LayerPrivateData))) == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); ecs_FreeLayer(s,layer); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; lpriv->entry = NULL; lpriv->buffertile = NULL; lpriv->ff = NULL; lpriv->rgb_pal = NULL; lpriv->rpf_table = NULL; lpriv->cct = NULL; lpriv->tile_row = -1; lpriv->tile_col = -1; lpriv->isActive = FALSE; lpriv->isColor = TRUE; /* Prepare the layer for selection with _prepare_rpflayer. If an error occur, free the memory of this layer, call ecs_FreeLayer and return an error message. */ if (!(dyn_prepare_rpflayer(s,&(s->layer[layer])))) { dyn_freelayerpriv(lpriv); ecs_FreeLayer(s,layer); /* The error message is already set */ return &(s->result); } s->currentLayer = layer; s->layer[layer].nbfeature = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res); s->layer[layer].index = 0; region.north = lpriv->entry->nw_lat; region.south = lpriv->entry->sw_lat; region.east = lpriv->entry->ne_long; region.west = lpriv->entry->nw_long; region.ns_res = (region.north - region.south) / (1536*lpriv->entry->vert_frames); region.ew_res = (region.east - region.west) / (1536*lpriv->entry->horiz_frames); ecs_SetGeoRegion(&(s->result),region.north, region.south, region.east, region.west, region.ns_res, region.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_ReleaseLayer DESCRIPTION Release a given layer END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. END_PRECONDITIONS POSTCONDITIONS If a layer with the selection information sel exist. It will be remove from the memory and from the layer list. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_LayerSelection *sel: The layer selection information END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION PSEUDOCODE Check if a layer exist with ecs_GetLayer. If the layer don't exist Begin Return an error message to indicate the layer don't exist. End Free the layer private data in the layer previously selected. Call ecs_FreeLayer to free the layer from the layer list. If the currentlayer was this layer, set the currentlayer to -1. Return a success message END_PSEUDOCODE ******************************************************************* */ ecs_Result *dyn_ReleaseLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; char buffer[128]; register LayerPrivateData *lpriv; /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) == -1) { sprintf(buffer,"Invalid layer %s",sel->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; if (lpriv != NULL) { dyn_freelayerpriv(lpriv); ecs_FreeLayer(s,layer); if (s->currentLayer == layer) { s->currentLayer = -1; /* just in case released layer was selected */ } } ecs_SetSuccess(&(s->result)); return &(s->result); } /* deselect all layer */ void dyn_releaseAllLayers(s) ecs_Server *s; { int i; for (i = 0; i < s->nblayer; ++i) dyn_ReleaseLayer(s,&(s->layer[i].sel)); } /* ---------------------------------------------------------------------- * dyn_SelectRegion: * * selection current geographic region. * ---------------------------------------------------------------------- */ ecs_Result *dyn_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; s->currentRegion.east = gr->east; s->currentRegion.west = gr->west; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; /* reset currentLayer index to 0 to force rewind */ if (s->currentLayer != -1) { s->layer[s->currentLayer].index = 0; s->layer[s->currentLayer].nbfeature = (int) ((s->currentRegion.north - s->currentRegion.south) / s->currentRegion.ns_res + 0.5); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetAttributesFormat: * * return the attribute format of the currently selected layer * ---------------------------------------------------------------------- */ ecs_Result * dyn_GetAttributesFormat(s) ecs_Server *s; { ecs_SetObjAttributeFormat(&(s->result)); ecs_AddAttributeFormat(&(s->result),"category",Integer,5,0,0); ecs_AddAttributeFormat(&(s->result),"label",Char,80,0,0); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_GetDictionary DESCRIPTION Get a itcl applet to Grassland able to read dyn_UpdateDictionary results. END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. END_PRECONDITIONS POSTCONDITIONS No post conditions END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION PSEUDOCODE Return the contain of the struct in datadict.h with SetText. Return a success message END_PSEUDOCODE ******************************************************************* */ ecs_Result *dyn_GetDictionary(s) ecs_Server *s; { ecs_SetText(&(s->result),datadict); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetNextObject: * * return the next object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetNextObject(s) ecs_Server *s; { if (s->layer[s->currentLayer].index == 0) { (rpf_layerMethod[s->layer[s->currentLayer].sel.F].rewind)(s,&(s->layer[s->currentLayer])); } (rpf_layerMethod[s->layer[s->currentLayer].sel.F].getNextObject)(s,&(s->layer[s->currentLayer])); return &(s->result); } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_GetRasterInfo DESCRIPTION Return the raster information for the current layer and set a category table for a 6x6x6 color cube for matrix informations and a default category table for images. END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. A SelectLayer must have been called successfully previously. END_PRECONDITIONS POSTCONDITIONS No post conditions END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION PSEUDOCODE Get the current private layer information If the layer is matricial Begin Call ecs_SetRasterInfo with the width and the height of the layer. To calculate that, multiply the number of tiles horizontally and vertically by 1536. For each value i between 0 and 5 Begin For each value j between 0 and 5 Begin For each value k between 0 and 5 Begin Add a category with ecs_AddRasterInfoCategory with a color r=i*43, g=j*43 and b=k*43. The buffer is a empty string. End End End End Else if the layer is an image Begin Call ecs_SetRasterInfo. Set the width with 1 (RGB image) and height to 0. Add a category with ecs_AddRasterInfoCategory with a white color. The buffer is a string "No data". End Return a success message END_PSEUDOCODE ******************************************************************* */ ecs_Result *dyn_GetRasterInfo(s) ecs_Server *s; { register unsigned int i,j,k; char buffer[2]; register LayerPrivateData *lpriv; int count, rows, columns; ecs_Region region = s->currentRegion; strcpy(buffer,""); lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; /* Put table contain in RasterInfo here */ rows = (int) floor((region.north-region.south)/region.ns_res + 0.5); columns = (int) floor((region.east-region.west)/region.ew_res + 0.5); if (s->layer[s->currentLayer].sel.F == Matrix) { ecs_SetRasterInfo(&(s->result),columns,rows); count = 1; if (lpriv->isColor == TRUE) { for(i=0;i<6;i++) { for(j=0;j<6;j++) { for(k=0;k<6;k++) { ecs_AddRasterInfoCategory(&(s->result),count, colorintensity[i], colorintensity[j], colorintensity[k],buffer,0); count++; } } } } else { for(i=1;i<255;i++) { ecs_AddRasterInfoCategory(&(s->result),i,i,i,i,buffer,0); } } } else { ecs_SetRasterInfo(&(s->result),1,0); ecs_AddRasterInfoCategory(&(s->result),1, 255, 255, 255,"No data",0); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- _initCatTable Inititalize category informations ---------------------------------------------------------------------- */ int dyn_initCatTable(s,layer) ecs_Server *s; ecs_Layer *layer; { register LayerPrivateData *lpriv; (void) s; lpriv = (LayerPrivateData *) layer->priv; lpriv->mincat = 0+13; lpriv->maxcat = lpriv->n_pal_cols-1+13; return TRUE; } /* ---------------------------------------------------------------------- * dyn_GetObject: * * return an object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObject(s,Id) ecs_Server *s; char *Id; { if (rpf_layerMethod[s->layer[s->currentLayer].sel.F].getObject != NULL) (rpf_layerMethod[s->layer[s->currentLayer].sel.F].getObject)(s,&(s->layer[s->currentLayer]),Id); else { ecs_SetError(&(s->result),1,"Can't get object for this type of layer"); } return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetObjectIdFromCoord: * * return the object id sitting at (or near) to a coordinate * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObjectIdFromCoord(s,coord) ecs_Server *s; ecs_Coordinate *coord; { if (rpf_layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord != NULL) (rpf_layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord)(s,&(s->layer[s->currentLayer]),coord); else { ecs_SetError(&(s->result),1,"Can't get objectid from coordinate for this type of layer"); } return &(s->result); } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_UpdateDictionary DESCRIPTION Return a list of entries in the format of the SelectLayer request. END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. END_PRECONDITIONS POSTCONDITIONS No post conditions END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information char *info: The info structure. Not used in this structure END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION PSEUDOCODE Set an empty string with ecs_Settext For each valid entry (invalid_geographics to false) in spriv->toc Begin Construct with the strings scale, zone, type and producer in Toc_entry a selection string in the format scale@zone@type@producer. Take care to remove all the empty zones. Keep a space in the end. Add this string in ecs_Result with ecs_AddText. End END_PSEUDOCODE ******************************************************************* */ ecs_Result *dyn_UpdateDictionary(s,info) ecs_Server *s; char *info; { char buffer[50],result[50]; register ServerPrivateData *spriv = s->priv; int i,j,k; Toc_file *toc; toc = spriv->toc; if( strcmp(info,"ogdi_server_capabilities") == 0 ) { ecs_AddText(&(s->result), "\n" "\n" "\n" ); ecs_SetSuccess(&(s->result)); } else if( strcmp(info,"ogdi_capabilities") == 0 ) { char line[256]; ecs_AddText(&(s->result), "\n" "\n" ); ecs_AddText(&(s->result), " \n" " \n" " \n" " \n" ); for (i=0; i<(int)toc->num_boundaries; i++) { Toc_entry *entry = toc->entries + i; if (entry->invalid_geographics == 1L) continue; sprintf(buffer,"%s@%s@%s@%s@%d", entry->scale, entry->zone, entry->type, entry->producer, entry->boundary_id); /* Remove the spaces */ k = 0; for(j=0;j<(int) strlen(buffer);j++) { if (buffer[j] != ' ') { result[k] = buffer[j]; k++; } } result[k] = '\0'; ecs_AddText(&(s->result), " \n" ); sprintf( line, " %s\n", result ); ecs_AddText(&(s->result), line ); sprintf( line, " PROJ4:%s\n", PROJ_LONGLAT ); ecs_AddText(&(s->result),line); sprintf(line, " \n", entry->nw_long, entry->se_lat, entry->se_long, entry->nw_lat ); ecs_AddText(&(s->result),line); sprintf(line, " \n", entry->nw_long, entry->se_lat, entry->se_long, entry->nw_lat, entry->horiz_interval, entry->vert_interval ); ecs_AddText(&(s->result),line); ecs_AddText(&(s->result), " Matrix\n" " Image\n" " \n" ); } ecs_AddText(&(s->result), " \n" "\n" ); ecs_SetSuccess(&(s->result)); } else if( strcmp(info,"") == 0 ) { ecs_SetText(&(s->result)," "); for (i=0; i<(int)toc->num_boundaries; i++) { if (toc->entries[i].invalid_geographics == 1L) continue; sprintf(buffer,"%s@%s@%s@%s@%d",toc->entries[i].scale, toc->entries[i].zone,toc->entries[i].type, toc->entries[i].producer,toc->entries[i].boundary_id); /* Remove the spaces */ k = 0; for(j=0;j<(int) strlen(buffer);j++) { if (buffer[j] != ' ') { result[k] = buffer[j]; k++; } } result[k] = '\0'; if (!(ecs_AddText(&(s->result),result))) { return &(s->result); } if (!(ecs_AddText(&(s->result)," "))) { return &(s->result); } } ecs_SetSuccess(&(s->result)); } else { char emsg[129]; sprintf( emsg, "RPF driver UpdateDictionary(%s) unsupported.", info ); ecs_SetError(&(s->result), 1, emsg ); } return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetServerProjection: * * Return this server cartographic projection * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetServerProjection(s) ecs_Server *s; { ecs_SetText(&(s->result), PROJ_LONGLAT); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetGlobalBound: * * Return this server global bounding region * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetGlobalBound(s) ecs_Server *s; { ecs_SetGeoRegion(&(s->result),s->globalRegion.north, s->globalRegion.south, s->globalRegion.east, s->globalRegion.west, s->globalRegion.ns_res, s->globalRegion.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_SetServerLanguage: * * Set this server lnaguage for error message; not yet implemented * ---------------------------------------------------------------------- */ ecs_Result *dyn_SetServerLanguage(s,language) ecs_Server *s; u_int language; { (void) language; ecs_SetSuccess(&(s->result)); return &(s->result); } ogdi-ogdi_4_1_0/ogdi/driver/rpf/rpf.def000066400000000000000000000006651345660466700201050ustar00rootroot00000000000000LIBRARY RPF CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetNextObject dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_GetRasterInfo dyn_GetObject dyn_GetObjectIdFromCoord dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage dyn_GetAttributesFormat ogdi-ogdi_4_1_0/ogdi/driver/rpf/rpf.h000066400000000000000000000416641345660466700176020ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI RPF Driver * Purpose: Declarations of RPF driver structures and functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.7 2007-02-12 21:01:48 cbalint * Fix win32 target. It build and works now. (tested with VC6) * * Revision 1.6 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.5 2001/04/12 19:22:46 warmerda * applied DND support Image type support * */ #ifndef RPF_H #define RPF_H 1 #include "ecs.h" #include #ifdef _WINDOWS #include #include "compat/dirent.h" #else #include #include #include #endif #ifdef _WINDOWS #include #endif #include #include #include #ifndef max #define max(x,y) ((x > y) ? x : y) #endif #define ushort unsigned short #define uint unsigned int /* typedef's conflict with /usr/include/sys/types.h typedef unsigned short ushort; typedef unsigned long uint; */ typedef unsigned char bool; typedef unsigned char uchar; typedef unsigned char* ucharp; typedef char ascii; typedef float real4; typedef double real8; #ifndef BOOLEAN #define BOOLEAN short #endif #ifndef O_BINARY #define O_BINARY 0 #endif #define BOOL_TRUE 0xFF #define BOOL_FALSE 0 #define LOC_BOUNDARIES 3 #define LOC_FRAMES 4 #define LOC_COVERAGE 6 #define LOC_COMPRESSION 8 #define LOC_CLUT 9 #define LOC_IMAGE 10 #define LOC_HEADER_SECTION 128 #define LOC_LOCATION_SECTION 129 #define LOC_COVERAGE_SECTION 130 #define LOC_COMPRESSION_SECTION 131 #define LOC_COMPRESSION_LOOKUP_SUBSECTION 132 #define LOC_COMPRESSION_PARAMETER_SUBSECTION 133 #define LOC_COLORGRAY_SECTION_SUBHEADER 134 #define LOC_COLORMAP_SUBSECTION 135 #define LOC_IMAGE_DESCR_SUBHEADER 136 #define LOC_IMAGE_DISPLAY_PARAM_SUBHEADER 137 #define LOC_MASK_SUBSECTION 138 #define LOC_COLOR_CONVERTOR_SUBSECTION 139 #define LOC_SPATIAL_DATA_SUBSECTION 140 #define LOC_ATTRIBUTE_SECTION_SUBHEADER 141 #define LOC_ATTRIBUTE_SUBSECTION 142 #define LOC_EXPLICIT_AREAL_TABLE 143 #define LOC_RELATED_IMAGE_SECTION_SUBHEADER 144 #define LOC_RELATED_IMAGE_SUBSECTION 145 #define LOC_REPLACE_UPDATE_SECTION_SUBHEADER 146 #define LOC_REPLACE_UPDATE_TABLE 147 #define LOC_BOUNDARY_SECTION_SUBHEADER 148 #define LOC_BOUNDARY_RECTANGLE_TABLE 149 #define LOC_FRAME_FILE_INDEX_SUBHEADER 150 #define LOC_FRAME_FILE_INDEX_SUBSECTION 151 #define LOC_COLOR_TABLE_SECTION_SUBHEADER 152 #define LOC_COLOR_TABLE_INDEX_RECORD 153 typedef enum _rpf_type { RPF_CADRG, RPF_CIB, RPF_CDTED } Rpf_type; typedef struct header { bool endian; ushort hdr_sec_len; /* header section length */ ascii filename[12]; uchar new; ascii standard_num[15]; ascii standard_date[8]; ascii classification; ascii country[2]; ascii release[2]; uint loc_sec_phys_loc; /* location section physical location */ uint loc_sec_log_loc; /* location section logical location */ uint cadrg_or_cib; Rpf_type rpf_type; int NITF_hdr_len; } Header; typedef struct location { ushort id; uint length; /* section/component length */ uint phys_index; /* section/component physical location */ uint log_index; /* section/component logical location */ } Location; #define CADRG_COLORS 216 typedef struct rgb { unsigned char r, g, b, alpha; } Rgb; #define RGPF_TOC "a.toc" typedef struct boundary { ascii type[8]; ascii compression[6]; ascii scale[18]; ascii zone[2]; ascii producer[6]; real8 nw_lat, nw_long; real8 sw_lat, sw_long; real8 ne_lat, ne_long; real8 se_lat, se_long; real8 vert_interval, horiz_interval; real8 vert_resolution, horiz_resolution; uint vert_frames, horiz_frames; } Boundary; typedef struct frame_index { ushort boundary_id; ushort frame_row, frame_col; ascii dir_number[3]; ascii filename[12]; ascii location[6]; } Frame_index; typedef struct frame_entry { int exists; ushort frame_row; ushort frame_col; char *directory; char filename[16]; char georef[7]; } Frame_entry; typedef struct toc_entry { real8 nw_lat, nw_long; real8 sw_lat, sw_long; real8 ne_lat, ne_long; real8 se_lat, se_long; real8 vert_interval, horiz_interval; real8 vert_resolution, horiz_resolution; int horiz_frames, vert_frames; Frame_entry **frames; ushort boundary_id; ascii type[8]; ascii compression[6]; ascii scale[18]; ascii zone[2]; ascii producer[6]; ascii *title; int invalid_geographics; } Toc_entry; typedef struct toc_file { Header head; Toc_entry *entries; uint num_boundaries; } Toc_file; typedef struct coverage { real8 nw_lat, nw_long; real8 sw_lat, sw_long; real8 ne_lat, ne_long; real8 se_lat, se_long; real8 vert_resolution, horiz_resolution; real8 vert_interval, horiz_interval; } Coverage; typedef struct compression { ushort algorithm; ushort noff_recs; ushort nparm_off_recs; ushort tables; ushort table_length; ushort parameters; ushort para_length; } Compression; typedef struct lookup_table { ushort id; uint records; ushort values; ushort bit_length; uint phys_offset; } Lookup_table; typedef struct comp_param { ushort id; uint rec_off; } Comp_parm; typedef struct color_table { uchar colormaps; ushort color_length; uint table_index; ascii filename[12]; } Color_table; typedef struct color_offset { ushort color_id; uint records; uchar length; ushort hist_length; uint offset_color_index; uint offset_histogram_index; } Color_offset; typedef struct rpf_image { ushort spectral_groups; ushort subframe_tables; ushort spectral_tables; ushort spectral_lines; ushort horiz_subframes, vert_subframes; uint output_cols, output_rows; } RPF_image; typedef struct attribute { ascii curr_date[8]; ascii prod_date[8]; ascii sig_date[8]; ascii series_code[2]; ascii map_code[8]; ascii old_datum_code[4]; ascii edition_id[8]; ascii proj_code[2]; real4 parameters[4]; ushort vert_datum_code; ushort horiz_datum_code; uint vert_abs_acc; ushort vert_abs_units; uint horiz_abs_acc; ushort horiz_abs_units; uint vert_rel_acc; ushort vert_rel_units; uint horiz_rel_acc; ushort horiz_rel_units; ushort ellips_code; ascii sound_datum_code; ushort nav_code; short grid_code; real4 east_mag_chg; ushort east_mag_units; real4 west_mag_chg; ushort west_mag_units; real4 grid_north; ushort grid_north_units; short max_elev; ushort max_elev_units; real8 max_elev_lat; real8 max_elev_lon; } Attribute; typedef struct replace { ascii new_filename[12]; ascii old_filename[12]; ascii repupd_status; } Replace; typedef struct display1 { bool all_subframes; bool no_transparent; ushort subframe_seq_length; ushort transparent_seq_length; uint image_rows; uint image_codes; uchar code_length; uint transparent_value; } Display1; typedef struct frame_file { Frame_entry entry; Header head; Coverage cover; Compression compr; uint loc_lut_shdr; Lookup_table lut[4]; uint comp_parm_shdr; Comp_parm *comp; uint indices[6][6]; uint loc_data; RPF_image img; Attribute att; Replace repupd; bool all_subframes; int NITF_hdr_len; } Frame_file; extern void check_swap _ANSI_ARGS_((unsigned char little_endian)); extern void swap _ANSI_ARGS_((unsigned char *ptr, size_t count)); extern Toc_entry *parse_toc _ANSI_ARGS_((ecs_Server *s, char *, Header *, uint *)); extern int parse_locations _ANSI_ARGS_((ecs_Server *s, FILE *, Location *, int)); extern int parse_clut _ANSI_ARGS_((ecs_Server *s, Frame_file *, char *, Rgb *,int,uint *, int, uint *, uchar *)); extern int parse_frame _ANSI_ARGS_((ecs_Server *s, Frame_file *, char *)); extern BOOLEAN get_comp_lut _ANSI_ARGS_((ecs_Server *s, Frame_file *file, char *, uchar *table, uint *cct, int ReducedColorTable)); extern BOOLEAN get_rpf_image_tile _ANSI_ARGS_((ecs_Server *s, Frame_file *, char *, int tno, unsigned char *table, uchar *tile, int decompress, uchar blackpixel)); extern void free_toc _ANSI_ARGS_((Toc_file *toc)); /* Categories table */ typedef struct { unsigned int r, g, b; int count; } CatTable; typedef struct { int isActive; unsigned char data[65536]; /* 256*256 Sub frames */ } tile_mem; /* ******************************************************************** STRUCTURE_INFORMATION NAME LayerPrivateData DESCRIPTION structure for storing informations need by a OGDI layer in RPF END_DESCRIPTION ATTRIBUTES Toc_entry *entry: Pointer to the table of content for this layer int tile_row: Current tile row in the tile table of this layer int tile_col: Current tile col in the tile table of this layer int isActive: Indicate if the layer information contain a tile or not. int rows: Number of rows of the current tile int columns: Number of columns of the current tile unsigned int mincat: Minimum number of categories of the current tile unsigned int maxcat: Maximum number of categories of the current tile int firstcoordfilepos: First position in the file of the current tile Frame_file *ff: Header file information for the current tile Rgb *rgb_pal: Table of colors int equi_cat[255]: Table of correspondance between each value in the rgb_pal and the 6x6x6 color table. uint n_pal_cols: Number of colors in the rgb_pal table uchar *rpf_table: The rpf table uchar blackpixel: The blackpixel value uint *cct: The cct int boundary_num: Boundary number int firsttile: Number of the first tile tile_mem *buffertile: Buffer tile list (each tile contain a 6x6 subtiles) ecs_TileStructure tilestruct: The tile structure used by the tile handler library unsigned int isColor: Indicate if the table is in color or not END_ATTRIBUTES END_STRUCTURE_INFORMATION ******************************************************************** */ typedef struct { Toc_entry *entry; int tile_row; int tile_col; int isActive; int rows; int columns; unsigned int mincat; unsigned int maxcat; int firstcoordfilepos; Frame_file *ff; Rgb *rgb_pal; int equi_cat[255]; uint n_pal_cols; uchar *rpf_table; uchar blackpixel; uint *cct; int boundary_num; int firsttile; tile_mem *buffertile; ecs_TileStructure tilestruct; unsigned int isColor; } LayerPrivateData; /* ******************************************************************** STRUCTURE_INFORMATION NAME ServerPrivateData DESCRIPTION structure for storing global informations for the driver rpf END_DESCRIPTION ATTRIBUTES char *pathname: The directory path where the database is located in the hard-disk. Toc_file *toc: The table of content of the rpf database. END_ATTRIBUTES END_STRUCTURE_INFORMATION ******************************************************************** */ typedef struct { char *pathname; Toc_file *toc; } ServerPrivateData; /* private functions prototype */ int dyn_prepare_rpflayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); int dyn_read_rpftile _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int tile_row,int tile_col)); int dyn_verifyLocation _ANSI_ARGS_((ecs_Server *s)); int dyn_initRegionWithDefault _ANSI_ARGS_((ecs_Server *s)); void check_swap _ANSI_ARGS_((unsigned char little_endian)); void swap _ANSI_ARGS_((unsigned char *ptr, size_t count)); Toc_entry *parse_toc _ANSI_ARGS_((ecs_Server *s, char *dir, Header *head, uint *num_boundaries)); int parse_locations _ANSI_ARGS_((ecs_Server *s, FILE *fin, Location *locs, int count)); int parse_clut _ANSI_ARGS_((ecs_Server *s,Frame_file *frame,char *filename, Rgb *rgb,int ReducedColorTable,uint *cct,int Nitf_hdr_len, uint *n_cols,uchar *blackpixel)); int parse_frame _ANSI_ARGS_((ecs_Server *s,Frame_file *file,char *filename)); BOOLEAN get_comp_lut _ANSI_ARGS_((ecs_Server *s,Frame_file *file,char *filename, uchar *table, uint *cct,int ReducedColorTable)); BOOLEAN get_rpf_image_tile _ANSI_ARGS_((ecs_Server *s,Frame_file *file,char *filename,int tno, uchar *table,uchar *tile,int decompress,uchar blackpixel)); void free_toc _ANSI_ARGS_((Toc_file *toc)); /* objects functions */ void dyn_getNextObjectRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); void dyn_rewindRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); int dyn_PointCallBack _ANSI_ARGS_((ecs_Server *s,ecs_TileStructure *t,int xtile,int ytile, int xpixel,int ypixel,int *cat)); int dyn_ImagePointCallBack _ANSI_ARGS_((ecs_Server *s,ecs_TileStructure *t,int xtile,int ytile, int xpixel,int ypixel,int *cat)); int dyn_DimCallBack _ANSI_ARGS_((ecs_Server *s,ecs_TileStructure *t, double x,double y,int *width,int *height)); /* layer oriented method definition */ void dyn_openRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_closeRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_rewindRasterLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_getNextObjectRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_getObjectRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void dyn_getObjectIdRaster _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); int _calcPosValue _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int i,int j)); void dyn_openImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_closeImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_rewindImageLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_getNextObjectImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void dyn_getObjectImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void dyn_getObjectIdImage _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); int _calcImagePosValue _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,int i,int j)); /* layer oriented method are keeped into a single data structure to simplify the code */ typedef void layerfunc(); typedef void layerobfunc(); typedef void layercoordfunc(); typedef struct { layerfunc *open; layerfunc *close; layerfunc *rewind; layerfunc *getNextObject; layerobfunc *getObject; layercoordfunc *getObjectIdFromCoord; } LayerMethod; void dyn_calPosWithCoord _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,double pos_x,double pos_y,int *i,int *j)); int dyn_IsOutsideRegion _ANSI_ARGS_((double n, double s, double e,double w, ecs_Region *x)); void dyn_releaseAllLayers _ANSI_ARGS_((ecs_Server *s)); /* #define tprintf(A) printf(A) */ #define tprintf(A) #endif ogdi-ogdi_4_1_0/ogdi/driver/rpf/utils.c000066400000000000000000002001611345660466700201330ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI RPF Driver * Purpose: Implementation of various RPF support functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.10 2016-06-28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.9 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.8 2004/03/29 05:18:05 warmerda * Added check for FSDEVG field when reading TOC file (in parse_toc). * Apparently needed for CIB1 data, as per bug 917678. * * Revision 1.7 2001/06/26 18:14:55 warmerda * implement rpf_fopen_ci() to case insenstive file access * * Revision 1.6 2001/04/12 19:22:46 warmerda * applied DND support Image type support * */ #include "rpf.h" ECS_CVSID("$Id$"); void dyn_string_tolower(char *); #ifdef _WINDOWS #define DIR_CHAR '\\' #else #define DIR_CHAR '/' #endif /* ** rpf_fopen_ci() ** ** Cover for fopen() that can open a file with either upper ** case or lower case. Allows grabbing of a.toc or A.TOC on ** Unix regardless of how the data came off CD. */ static FILE *rpf_fopen_ci( const char *dir, const char *file, const char *access ) { char *filename = malloc(strlen(dir)+strlen(file)+3); FILE *fp; int i; if( filename == NULL ) return NULL; if( dir[strlen(dir)-1] == '/' || dir[strlen(dir)-1] == '\\' ) sprintf( filename, "%s%s", dir, file ); else sprintf( filename, "%s%c%s", dir, DIR_CHAR, file ); /* try natural */ fp = fopen( filename, access ); /* try upper case */ if( fp == NULL ) { for( i = strlen(dir); filename[i] != '\0'; i++ ) { if( filename[i] >= 'a' && filename[i] <= 'z' ) filename[i] = filename[i] - 'a' + 'A'; } fp = fopen( filename, access ); } /* try lower case */ if( fp == NULL ) { for( i = strlen(dir); filename[i] != '\0'; i++ ) { if( filename[i] >= 'A' && filename[i] <= 'Z' ) filename[i] = filename[i] - 'A' + 'a'; } fp = fopen( filename, access ); } /* printf( "fp=%p, filename=%s\n", fp, filename ); */ free( filename ); return fp; } /* ******************************************************************* FUNCTION_INFORMATION NAME _prepare_rpflayer DESCRIPTION Initialize the current layer private structure with the layer resquest information. END_DESCRIPTION PRECONDITIONS l->priv must be set in memory and with default values. END_PRECONDITIONS POSTCONDITIONS The layer structure is initialized. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer END_PARAMETERS RETURN_VALUE int: Indicate if it's a success or a error situation. END_FUNCTION_INFORMATION PSEUDOCODE Parse the selection request and try to link the information in it with the table of content. If the link is not found, return an error message. If it's found, set the entry pointer to this request. Initialize tile structure with ecs_TileInitialize. The different arguments are already in the table of content. If a problem occur, return an error message. Return a success message END_PSEUDOCODE ******************************************************************* */ int dyn_prepare_rpflayer(s,l) ecs_Server *s; ecs_Layer *l; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; char *scale; char *zone; char *type; char *producer; char *boundid; char *buffer; int i,count,stringlen,val; ecs_Region region; /* Parse the selection request and try to link the information in it with the table of content. Simply scan the selection string and put a pointer to the beginning of each substring. */ scale = NULL; zone = NULL; type = NULL; producer = NULL; boundid = NULL; buffer = malloc(strlen(l->sel.Select)+1); if (buffer == NULL) { ecs_SetError(&(s->result),1,"Not enough memory"); return FALSE; } strcpy(buffer,l->sel.Select); count = 0 ; scale = buffer; stringlen = strlen(buffer); for (i=0;iresult),1,"Bad request format. Expect scale@zone@rpf_type@producer@boundary_id"); free(buffer); return FALSE; } } } if (boundid == NULL) { ecs_SetError(&(s->result),1,"Bad request format. Expect scale@zone@rpf_type@producer@boundary_id"); free(buffer); return FALSE; } val = atoi(boundid); /* Found an entry in the toc with these four informations. If it's not there, return an error. */ for(i=0; i<(int) spriv->toc->num_boundaries; i++) { #if 0 printf("scale:%s\n",spriv->toc->entries[i].scale); printf("zone:%s\n",spriv->toc->entries[i].zone); printf("type:%s\n",spriv->toc->entries[i].type); printf("producer:%s\n",spriv->toc->entries[i].producer); printf("boundary:%d\n",spriv->toc->entries[i].boundary_id); printf("---------------------\n"); #endif if (strstr(spriv->toc->entries[i].scale,scale) != NULL) { if (strstr(spriv->toc->entries[i].zone,zone) != NULL) { if (strstr(spriv->toc->entries[i].type,type) != NULL) { if (strstr(spriv->toc->entries[i].producer,producer) != NULL) { if (val == spriv->toc->entries[i].boundary_id) { lpriv->entry = &(spriv->toc->entries[i]); break; } } } } } } if (lpriv->entry == NULL) { ecs_SetError(&(s->result),1,"This request don't exist in the table of content of RPF"); free(buffer); return FALSE; } free(buffer); /* Initialize tile structure with ecs_TileInitialize. The differents arguments are already in the table of content. */ region.north = lpriv->entry->nw_lat; region.south = lpriv->entry->sw_lat; region.east = lpriv->entry->ne_long; region.west = lpriv->entry->nw_long; region.ns_res = (region.north - region.south) / (1536*lpriv->entry->vert_frames); region.ew_res = (region.east - region.west) / (1536*lpriv->entry->horiz_frames); if (l->sel.F == Matrix) { if (!ecs_TileInitialize( s, &(lpriv->tilestruct), &(region), lpriv->entry->horiz_frames, lpriv->entry->vert_frames, 1536, 1536, dyn_PointCallBack, NULL)) { ecs_SetError(&(s->result), 1, "Unable to retrieve tile structure."); return FALSE; } } else { if (!ecs_TileInitialize( s, &(lpriv->tilestruct), &(region), lpriv->entry->horiz_frames, lpriv->entry->vert_frames, 1536, 1536, dyn_ImagePointCallBack, NULL)) { ecs_SetError(&(s->result), 1, "Unable to retrieve tile structure."); return FALSE; } } /* Check if it's a black and white image */ lpriv->isColor = TRUE; if (strstr(spriv->toc->entries[i].type,"CIB") != NULL) { lpriv->isColor = FALSE; } return TRUE; } /* ******************************************************************* FUNCTION_INFORMATION NAME _read_rpftile DESCRIPTION Initialize the current layer private structure with the layer resquest information. END_DESCRIPTION PRECONDITIONS A dyn_SelectLayer must have been call previously succesfully. END_PRECONDITIONS POSTCONDITIONS The layer structure contain a complete tile for the position tile_row and tile_col in the tile grid. END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information ecs_Layer *l: The current layer int tile_row: The requested tile row int tile_col: The requested tile column. END_PARAMETERS RETURN_VALUE int: Indicate if it's a success or a error situation. END_FUNCTION_INFORMATION PSEUDOCODE If tile_row and tile_col is the same than the one in lpriv, return a success. Free the previous tile in the layer. If isActive is true, erase all the substructures related to this layer (except entry and tilestruct). Allocate lpriv->ff. If a problem occur, set isActive to false and return an error message. Parse the frame with parse_frame. The framefile name is in the TOC. If a problem occur, set isActive to false and return an error message. With the header of ff, calculate the region of the current tile and the attributes lpriv->columns and lpriv->rows. origin_lat = lpriv->ff->cover.nw_lat - 1536.E0*lpriv->ff->cover.vert_interval; origin_lon = lpriv->ff->cover.nw_long + 1536.E0*lpriv->ff->cover.horiz_interval; lon_spacing = lpriv->ff->cover.horiz_interval; lat_spacing = lpriv->ff->cover.vert_interval; lpriv->columns = 1536L; lpriv->rows = 1536L; lpriv->region.north = origin_lat+1+lat_spacing/2; lpriv->region.south = origin_lat-lat_spacing/2; lpriv->region.west = origin_lon-lon_spacing/2; lpriv->region.east = origin_lon+1+lon_spacing/2; lpriv->region.ns_res = (lpriv->region.north - lpriv->region.south) / lpriv->rows; lpriv->region.ew_res = (lpriv->region.east - lpriv->region.west) / lpriv->columns; Allocate lpriv->rgb_pal, the color palette. If a problem occur, set isActive to false and return an error message. Allocate lpriv->cct. If a problem occur, set isActive to false and return an error message. Allocate lpriv->rpf_table. If a problem occur, set isActive to false and return an error message. Call parse_clut. Call get_comp_lut. Allocate the tile buffer. If a problem occur, set isActive to false and return an error message. For each value i between 0 and 6 Begin For each value j between 0 and 6 Begin Call get_rpf_image_tile for the tile i*6+j. Set lpriv->buffertile[i*6+j].isActive to true. End End Set equi_cat with the color category equivalence Return a success message. END_PSEUDOCODE ******************************************************************* */ int dyn_read_rpftile(s, l, tile_row, tile_col) ecs_Server *s; ecs_Layer *l; int tile_row; int tile_col; { /*double origin_lon, origin_lat;*/ /*double lat_spacing, lon_spacing;*/ register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int i,j,k; char *framefile; const char *dir; /* Check if tile_row and tile_col is the same than the one in lpriv. */ if ((tile_row == lpriv->tile_row) && (tile_col == lpriv->tile_col)) { return TRUE; } /* Free the previous tile in the layer */ if (lpriv->ff != NULL) free(lpriv->ff); if (lpriv->rgb_pal != NULL) free(lpriv->rgb_pal); if (lpriv->rpf_table != NULL) free(lpriv->rpf_table); if (lpriv->cct != NULL) free(lpriv->cct); if (lpriv->buffertile != NULL) free(lpriv->buffertile); lpriv->tile_row = tile_row; lpriv->tile_col = tile_col; lpriv->mincat = 0; lpriv->maxcat = 0; lpriv->firstcoordfilepos = 0; lpriv->ff = NULL; lpriv->rgb_pal = NULL; lpriv->n_pal_cols = 0; lpriv->rpf_table = NULL; lpriv->blackpixel = 0; lpriv->cct = NULL; lpriv->boundary_num = 0; lpriv->firsttile = 0; lpriv->buffertile = NULL; lpriv->isActive = lpriv->entry->frames[tile_col][tile_row].exists; lpriv->rows = lpriv->entry->frames[tile_col][tile_row].frame_row; lpriv->columns = lpriv->entry->frames[tile_col][tile_row].frame_col; if (lpriv->isActive == FALSE) return TRUE; lpriv->ff = (Frame_file *)malloc(sizeof(Frame_file)); if (lpriv->ff == NULL) { ecs_SetError(&(s->result),1,"not enough memory"); return FALSE; } /* Create the framefile string */ framefile = malloc(strlen(lpriv->entry->frames[tile_col][tile_row].directory)+ strlen(lpriv->entry->frames[tile_col][tile_row].filename)+3); if (framefile == NULL) { lpriv->isActive = FALSE; ecs_SetError(&(s->result),1,"Cannot parse frame file"); free(lpriv->ff); lpriv->ff = NULL; return FALSE; } dir = lpriv->entry->frames[tile_col][tile_row].directory; if( dir[strlen(dir)-1] == '\\' || dir[strlen(dir)-1] == '/' ) sprintf( framefile, "%s%s", dir, lpriv->entry->frames[tile_col][tile_row].filename); else sprintf( framefile, "%s%c%s", dir, DIR_CHAR, lpriv->entry->frames[tile_col][tile_row].filename); /* Parse the frame */ if (!parse_frame(s, lpriv->ff, framefile)) { lpriv->isActive = FALSE; free(framefile); ecs_SetError(&(s->result),1,"Cannot parse frame file"); free(lpriv->ff); lpriv->ff = NULL; return FALSE; } /*origin_lat = lpriv->ff->cover.nw_lat - 1536.E0*lpriv->ff->cover.vert_interval; origin_lon = lpriv->ff->cover.nw_long + 1536.E0*lpriv->ff->cover.horiz_interval;*/ /*lon_spacing = lpriv->ff->cover.horiz_interval; lat_spacing = lpriv->ff->cover.vert_interval;*/ lpriv->columns = 1536L; lpriv->rows = 1536L; lpriv->rgb_pal = (Rgb *) malloc(217L*sizeof(Rgb)); if (lpriv->rgb_pal == NULL) { lpriv->isActive = FALSE; free(framefile); ecs_SetError(&(s->result),1,"not enough memory to load rpf matrix in ram"); return FALSE; } lpriv->cct = (uint *)malloc(256L*sizeof(uint)); if (lpriv->cct == NULL) { lpriv->isActive = FALSE; free(framefile); ecs_SetError(&(s->result),1,"not enough memory to load rpf cct in ram"); return FALSE; } lpriv->rpf_table = (uchar *)malloc(4096L*4L*4L); if (lpriv->rpf_table == NULL) { lpriv->isActive = FALSE; free(framefile); ecs_SetError(&(s->result),1,"not enough memory to load rpf table in ram"); return FALSE; } parse_clut(s, lpriv->ff, framefile, lpriv->rgb_pal, 0L, lpriv->cct, lpriv->ff->NITF_hdr_len, &lpriv->n_pal_cols, &lpriv->blackpixel); get_comp_lut(s, lpriv->ff, framefile, lpriv->rpf_table, lpriv->cct, 0L); /* Read the data info if isInRam is true */ lpriv->buffertile = malloc(36*sizeof(tile_mem)); for (i=0; i<6L; i++) for (j=0; j<6L; j++) { k = i*6+j; get_rpf_image_tile(s, lpriv->ff, framefile, (int)lpriv->ff->indices[i][j], lpriv->rpf_table, lpriv->buffertile[k].data, 1L, lpriv->blackpixel); lpriv->buffertile[k].isActive = TRUE; } for(i=0;i<(int) lpriv->n_pal_cols;i++) { if (lpriv->isColor == TRUE) lpriv->equi_cat[i] = (lpriv->rgb_pal[i].r/43)*36 + (lpriv->rgb_pal[i].g/43)*6 + lpriv->rgb_pal[i].b/43 + 1; else lpriv->equi_cat[i] = ((lpriv->rgb_pal[i].r + lpriv->rgb_pal[i].g + lpriv->rgb_pal[i].b)/3) + 1; } free(framefile); return TRUE; } /* ---------------------------------------------------------- _VerifyLocation: check if the path is valid. Check if the directory exist and check if the parent path contain a a.toc file. ---------------------------------------------------------- */ int dyn_verifyLocation(s) ecs_Server *s; { int returnvalue; DIR *dirlist; FILE *test; register ServerPrivateData *spriv = s->priv; char *ptr,*ptr1; returnvalue = FALSE; /* Check if the path is valid */ dirlist = opendir(spriv->pathname); if (dirlist != NULL) { closedir(dirlist); /* Check the parent directory */ ptr = ptr1 = spriv->pathname; while(ptr[0]!='\0') { if ((ptr[0]=='/') && (ptr[1]!='\0')) { ptr1 = ptr; } ptr++; } ptr1++; test = rpf_fopen_ci( spriv->pathname, RGPF_TOC, "r" ); if (test != NULL) { fclose(test); returnvalue = TRUE; } } if (!returnvalue) { ecs_SetError(&(s->result),1,"Invalid URL. The rpf directory is invalid"); } return returnvalue; } /* ------------------------------------------------------------------------- _initRegionWithDefault: preparation de la fenetre globale pour le server -------------------------------------------------------------------------- */ int dyn_initRegionWithDefault(s) ecs_Server *s; { int i; register ServerPrivateData *spriv = s->priv; Toc_file *toc; Toc_entry *entry; double lat_min, lat_max, lon_min, lon_max; spriv->toc = (Toc_file *)malloc(sizeof(Toc_file)); spriv->toc->entries = parse_toc(s, spriv->pathname, &spriv->toc->head, &spriv->toc->num_boundaries); if (spriv->toc->entries == (Toc_entry *)NULL) { return 0; } toc = spriv->toc; lat_min = lon_min = 300.E0; lat_max = lon_max = -300.E0; for (i=0; i<(int)toc->num_boundaries; i++) { if (toc->entries[i].invalid_geographics == 1L) continue; entry = &toc->entries[i]; if (entry->nw_lat > lat_max) lat_max = entry->nw_lat; if (entry->se_lat < lat_min) lat_min = entry->se_lat; if (entry->se_long > lon_max) lon_max = entry->se_long; if (entry->nw_long < lon_min) lon_min = entry->nw_long; } s->globalRegion.north = lat_max; s->globalRegion.south = lat_min; s->globalRegion.east = lon_max; s->globalRegion.west = lon_min; s->globalRegion.ns_res = (s->globalRegion.north - s->globalRegion.south)/2000.0; s->globalRegion.ew_res = (s->globalRegion.east - s->globalRegion.west)/2000.0; return 1; } int dyn_IsOutsideRegion(n,s,e,w,region) double n,s,e,w; ecs_Region *region; { if ((n < region->south) || (s > region->north) || (e < region->west) || (w > region->east)) { return 1; } return 0; } /***********************************************************************\ * * Function: check_swap, swap * * Description: * * Handle endian-ness properly for this machine. * \***********************************************************************/ static int do_swap; /***** check_swap Verify whether we need to perform byte swapping. *****/ void check_swap(unsigned char little_endian) { unsigned char *c_ptr; unsigned short s; s = 1; c_ptr = (unsigned char *) &s; do_swap = 0L; if (*c_ptr == 0 && little_endian) do_swap = 1L; else if (*c_ptr == 1 && !little_endian) do_swap = 1L; } /***** swap Swap the bytes if necessary. *****/ void swap(unsigned char *ptr, size_t count) { if (do_swap) { unsigned char *end, temp; end = &ptr[count - 1]; while (end > ptr) { temp = *end; *end = *ptr; *ptr = temp; ptr++, end--; } } } /***********************************************************************\ * * Function: parse_toc * * Description: * * Read and parse the table of contents file. * \***********************************************************************/ #ifdef _WINDOWS #define FILE_SEP '\\' #else #define FILE_SEP '/' #endif Toc_entry *parse_toc(ecs_Server *s, char *dir, Header *head, uint *num_boundaries) { Toc_entry *entries, *entry; Frame_entry *frame; Location locations[4]; /* from 2 to 4 */ FILE *toc; ushort n, path_length; int i, j, k; char *directory; ushort boundary_id, frame_row, frame_col; int new_boundary_ids=0L; uint N_index_recs; /* # frame file index records */ uint path_off; /* offset of frame file pathname */ ushort Bound_rec_len; /* Boundary record length */ ushort N_pathname_recs; /* # frame file pathname records */ ushort Index_rec_len; /* frame file index record length */ uint bnd_rec_tbl_off; /* Bound. rect. table offset */ uint frm_index_tbl_off; /* Frame file index table offset */ char NITF[5]; char string[256]; /* Open input "A.TOC" */ toc = rpf_fopen_ci( dir, RGPF_TOC, "rb" ); if( toc == NULL ) { sprintf(string, "parsetoc: Can't open %s",RGPF_TOC); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } tprintf ("parsetoc: here 1\n"); /* Check for NITF header */ fseek(toc, 0, SEEK_SET); ogdi_fread(NITF, 4L, 1, toc) ; NITF[4] = '\0'; if (strcmp(NITF, "NITF") == 0) /* Match: skip NITF hdr */ { char FSDWNG[6]; head->NITF_hdr_len = 410L; /* Determine if conditional FSDEVG field exists */ /* by examining FSDWNG field */ /* Adjust hdr length by 40 characters if needed */ /* note: rpf/cib1 products need this */ fseek(toc, 280, SEEK_SET); ogdi_fread(FSDWNG, 6L, 1, toc); if( memcmp(FSDWNG, "999998", 6) == 0 ) head->NITF_hdr_len += 40L; } else /* not in NITF format */ { head->NITF_hdr_len = 0L; } /* else */ /* Skip over NITF header, if it is there. */ fseek(toc, head->NITF_hdr_len, SEEK_SET); /* Read header */ ogdi_fread(&head->endian, sizeof(head->endian), 1, toc) ; /* 1 byte */ check_swap(head->endian); ogdi_fread(&head->hdr_sec_len, sizeof(head->hdr_sec_len), 1, toc); /* 2 bytes */ swap((ucharp)&head->hdr_sec_len, sizeof(head->hdr_sec_len)) ; ogdi_fread(head->filename, sizeof(head->filename), 1, toc); /* 12 bytes */ /* Read rest of header so we can write it later */ ogdi_fread(&head->new, sizeof(head->new), 1, toc) ; ogdi_fread(head->standard_num, sizeof(head->standard_num), 1, toc) ; ogdi_fread(head->standard_date, sizeof(head->standard_date), 1, toc); ogdi_fread(&head->classification, sizeof(head->classification), 1, toc); ogdi_fread(head->country, sizeof(head->country), 1, toc); ogdi_fread(head->release, sizeof(head->release), 1, toc); ogdi_fread(&head->loc_sec_phys_loc, sizeof(head->loc_sec_phys_loc), 1, toc) ; swap((ucharp)&head->loc_sec_phys_loc,sizeof(head->loc_sec_phys_loc)); /* Fseek to start of location section */ fseek(toc, head->loc_sec_phys_loc, SEEK_SET); /* Locate the correct sections */ locations[0].id = LOC_BOUNDARY_SECTION_SUBHEADER; /* 148 */ locations[1].id = LOC_BOUNDARY_RECTANGLE_TABLE; /* 149 */ locations[2].id = LOC_FRAME_FILE_INDEX_SUBHEADER; /* 150 */ locations[3].id = LOC_FRAME_FILE_INDEX_SUBSECTION; /* 151 */ parse_locations(s, toc, locations, 4L); for (i = 0; i < 4; i++) if ((int) locations[i].phys_index == ~0) { sprintf(string, "Can't locate section %d in table of contents",locations[i].id); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } tprintf ("parsetoc: here 2\n"); /* Read boundary rectangles */ /* Number of Boundary records */ fseek(toc, locations[0].phys_index, SEEK_SET); ogdi_fread(&bnd_rec_tbl_off, sizeof(bnd_rec_tbl_off), 1, toc); swap((ucharp)&bnd_rec_tbl_off, sizeof(bnd_rec_tbl_off)); ogdi_fread(&n, sizeof(n), 1, toc); swap((ucharp)&n, sizeof(n)); *num_boundaries = (int)n; sprintf(string,"parse_toc: n = %d\n",n); tprintf(string); /* Boundary record length */ ogdi_fread(&Bound_rec_len, sizeof(Bound_rec_len), 1, toc) ; swap((ucharp)&Bound_rec_len, sizeof(Bound_rec_len)); fseek(toc, locations[1].phys_index, SEEK_SET); /* Read Boundary rectangle records */ entries = (Toc_entry *) malloc((size_t)n * sizeof(Toc_entry)); if (entries == (Toc_entry *)NULL) { ecs_SetError(&(s->result),1,"Error on malloc of entries"); return((Toc_entry *)NULL); } for (i = 0; i < (int)n; i++) { ogdi_fread(&entries[i].type, 1, 5, toc); /* e.g. "CADRG" */ entries[i].type[5] = '\0'; if (i == 0L) { if (strncmp(entries[i].type,"CADRG",5) == 0) head->rpf_type = RPF_CADRG; else if (strncmp(entries[i].type,"CIB",3) == 0) head->rpf_type = RPF_CIB; else if (strncmp(entries[i].type,"CDTED",5) == 0) head->rpf_type = RPF_CDTED; } ogdi_fread(&entries[i].compression, 1, 5, toc); ogdi_fread(&entries[i].scale, 1, 12, toc); ogdi_fread(&entries[i].zone, 1, 1, toc); ogdi_fread(&entries[i].producer, 1, 5, toc); ogdi_fread(&entries[i].nw_lat, sizeof(real8), 1, toc); ogdi_fread(&entries[i].nw_long, sizeof(real8), 1, toc); ogdi_fread(&entries[i].sw_lat, sizeof(real8), 1, toc); ogdi_fread(&entries[i].sw_long, sizeof(real8), 1, toc); ogdi_fread(&entries[i].ne_lat, sizeof(real8), 1, toc); ogdi_fread(&entries[i].ne_long, sizeof(real8), 1, toc); ogdi_fread(&entries[i].se_lat, sizeof(real8), 1, toc); ogdi_fread(&entries[i].se_long, sizeof(real8), 1, toc); ogdi_fread(&entries[i].vert_resolution, sizeof(real8), 1, toc); ogdi_fread(&entries[i].horiz_resolution, sizeof(real8), 1, toc); ogdi_fread(&entries[i].vert_interval, sizeof(real8), 1, toc); ogdi_fread(&entries[i].horiz_interval, sizeof(real8), 1, toc); ogdi_fread(&entries[i].vert_frames, sizeof(uint), 1, toc); ogdi_fread(&entries[i].horiz_frames, sizeof(uint), 1, toc); swap((ucharp)&entries[i].nw_lat, sizeof(real8)); swap((ucharp)&entries[i].nw_long, sizeof(real8)); swap((ucharp)&entries[i].sw_lat, sizeof(real8)); swap((ucharp)&entries[i].sw_long, sizeof(real8)); swap((ucharp)&entries[i].ne_lat, sizeof(real8)); swap((ucharp)&entries[i].ne_long, sizeof(real8)); swap((ucharp)&entries[i].se_lat, sizeof(real8)); swap((ucharp)&entries[i].se_long, sizeof(real8)); swap((ucharp)&entries[i].vert_resolution, sizeof(real8)); swap((ucharp)&entries[i].horiz_resolution, sizeof(real8)); swap((ucharp)&entries[i].vert_interval, sizeof(real8)); swap((ucharp)&entries[i].horiz_interval, sizeof(real8)); swap((ucharp)&entries[i].vert_frames, sizeof(uint)); swap((ucharp)&entries[i].horiz_frames, sizeof(uint)); entries[i].type[5] = '\0'; entries[i].compression[5] = '\0'; entries[i].scale[12] = '\0'; entries[i].zone[1] = '\0'; entries[i].producer[5] = '\0'; if(entries[i].nw_lat <= 150.E0 && entries[i].nw_lat >= -150.E0 && entries[i].se_lat <= 150.E0 && entries[i].se_lat >= -150.E0 && entries[i].nw_long <= 400.E0 && entries[i].nw_long >= -400.E0 && entries[i].se_long <= 400.E0 && entries[i].se_long >= -400.E0) entries[i].invalid_geographics = 0L; else { entries[i].invalid_geographics = 1L; entries[i].nw_lat = 1536.E0; entries[i].nw_long = 0.E0; entries[i].sw_lat = 0.E0; entries[i].sw_long = 0.E0; entries[i].ne_lat = 1536.E0; entries[i].ne_long = 1536.E0; entries[i].se_lat = 0.E0; entries[i].se_long = 1536.E0; entries[i].vert_resolution = 1.E0; entries[i].horiz_resolution = 1.E0; entries[i].vert_interval = 1.E0; entries[i].horiz_interval = 1.E0; } entries[i].frames = (Frame_entry **) malloc((size_t)entries[i].vert_frames * sizeof(Frame_entry *)); if (entries[i].frames == (Frame_entry **)NULL) { sprintf(string,"Error on malloc of entries[%d].frames",i); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } for (j = 0; j < entries[i].vert_frames; j++) { entries[i].frames[j] = (Frame_entry *) malloc((size_t)entries[i].horiz_frames * sizeof(Frame_entry)); if (entries[i].frames[j] == (Frame_entry *)NULL) { sprintf(string, "Error on malloc of entries[%d].frames[%d]",i,j); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } for (k = 0; k < entries[i].horiz_frames; k++) { entries[i].frames[j][k].exists = 0L; entries[i].frames[j][k].directory= (char *) NULL; } } } /* for i < n_bound_recs */ /* Read # of frame file index records */ /* Skip 1 byte security classification */ /* locations[2] is loc of frame file index section subheader */ fseek(toc, locations[2].phys_index + 1, SEEK_SET); ogdi_fread(&frm_index_tbl_off, sizeof(frm_index_tbl_off), 1, toc); swap((ucharp)&frm_index_tbl_off, sizeof(frm_index_tbl_off)); ogdi_fread(&N_index_recs, sizeof(N_index_recs), 1, toc); swap((ucharp)&N_index_recs, sizeof(N_index_recs)); ogdi_fread(&N_pathname_recs, sizeof(N_pathname_recs), 1, toc); swap((ucharp)&N_pathname_recs, sizeof(N_pathname_recs)); ogdi_fread(&Index_rec_len, sizeof(Index_rec_len), 1, toc); swap((ucharp)&Index_rec_len, sizeof(Index_rec_len)); /* Read frame file index records */ for (i = 0; i < (int)N_index_recs; i++) { /* locations[3] is frame file index table subsection */ fseek(toc, locations[3].phys_index + Index_rec_len*i, SEEK_SET); ogdi_fread(&boundary_id, sizeof(boundary_id), 1, toc); swap((ucharp)&boundary_id, sizeof(boundary_id)); if (i == 0 && boundary_id == 0) new_boundary_ids = 1L; if (new_boundary_ids == 0L) boundary_id--; if (boundary_id > (ushort)(*num_boundaries-1L)) { sprintf(string,"Bad boundary id in FF index record %d", i); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } entry = &entries[boundary_id]; entry->boundary_id = boundary_id; ogdi_fread(&frame_row, sizeof(frame_row), 1, toc); ogdi_fread(&frame_col, sizeof(frame_col), 1, toc); swap((ucharp)&frame_row, sizeof(frame_row)); swap((ucharp)&frame_col, sizeof(frame_col)); if (new_boundary_ids == 0L) { frame_row--; frame_col--; } else { /* Trick so that frames are numbered north to south */ frame_row = (entry->vert_frames-1L) - frame_row; } if ((int)frame_row > entry->vert_frames-1L) { sprintf(string,"Bad row num:%d, in FF index record %d",frame_row,i); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } if ((int)frame_col > entry->horiz_frames-1L) { sprintf(string,"Bad col number in FF index record %d", i); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } frame = &entry->frames[frame_row][frame_col]; frame->frame_row = frame_row; frame->frame_col = frame_col; if (frame->exists) { sprintf(string,"FF %d is a duplicate", i); ecs_SetError(&(s->result),1,string); return((Toc_entry *)NULL); } /* Pathname offset */ ogdi_fread(&path_off, sizeof(path_off), 1, toc); swap((ucharp)&path_off, sizeof(path_off)); /* Get filename tail */ ogdi_fread(frame->filename, 1, 12, toc); frame->filename[12] = '\0'; #ifndef _WINDOWS dyn_string_tolower((char *) frame->filename); #endif /* Check if the filename is an overview */ for (j=0;j<12;j++) { if (strcmp(&(frame->filename[j]),".OVR") == 0 || strcmp(&(frame->filename[j]),".ovr") == 0) { entry->invalid_geographics = 1L; break; } } /* Get file geo reference */ ogdi_fread(frame->georef, 1, 6, toc); frame->georef[6] = '\0'; /* Go to start of pathname record */ /* New path_off offset from start of frame file index section of TOC?? */ /* Add pathoffset wrt frame file index table subsection (loc[3]) */ fseek(toc, locations[3].phys_index + path_off, SEEK_SET); ogdi_fread(&path_length, sizeof(path_length), 1, toc); swap((ucharp)&path_length, sizeof(path_length)); frame->directory = (char *) malloc((size_t)path_length + (size_t)4L + strlen(dir)); if (frame->directory == (char *)NULL) { ecs_SetError(&(s->result),1,"Error on malloc of frame->directory"); return((Toc_entry *)NULL); } frame->directory[0] = '\0'; directory = (char *) malloc((size_t)(path_length + 1)); if (directory == (char *)NULL) { ecs_SetError(&(s->result),1,"Error on malloc of directory"); return((Toc_entry *)NULL); } /* Read directory name from toc. */ ogdi_fread(directory, 1, path_length, toc); directory[path_length] = '\0'; /* Skip 1st 2 chars: "./": */ if (directory[2] != '\0') strcat(frame->directory,&directory[2]); #ifndef _WINDOWS dyn_string_tolower((char *) frame->directory); #endif free(directory); frame->exists = 1L; } /* for i = N_index_recs */ fclose(toc); tprintf ("parsetoc: here end\n"); sprintf(string,"parse_toc: *num_boundaries = %d\n",*num_boundaries); tprintf(string); return(entries); } /***********************************************************************\ * * Function: parse_locations * * Description: * * Locate sections in file. * \***********************************************************************/ int parse_locations(ecs_Server *s, FILE *fin, Location *locs, int count) { int i, j; ushort n; ushort id; uint phys_index; ushort us; uint ui; (void) s; /* Initialize indices so we can later tell if they weren't found */ for (j = 0; j < count; j++) locs[j].phys_index = (uint)(~0); /* Skip location section length */ ogdi_fread(&us, sizeof(us), 1, fin); /* Skip component location table offset */ ogdi_fread(&ui, sizeof(ui), 1, fin); /* How many sections: # of section location records */ ogdi_fread(&n, sizeof(n), 1, fin); swap((ucharp)&n, sizeof(n)); /* Skip location record length */ ogdi_fread(&us, sizeof(us), 1, fin); /* Skip component aggregate length */ ogdi_fread(&ui, sizeof(ui), 1, fin); /* Now go find the ones we want */ for (i = 0; i < (int)n; i++) { ogdi_fread(&id, sizeof(id), 1, fin); /* Skip section length */ ogdi_fread(&ui, sizeof(ui), 1, fin); ogdi_fread(&phys_index, sizeof(phys_index), 1, fin); swap((ucharp)&id, sizeof(id)); swap((ucharp)&phys_index, sizeof(phys_index)); for (j = 0; j < count; j++) if (locs[j].id == id) locs[j].phys_index = phys_index; } /* for i */ return(1L); } /* parse_locations */ /***********************************************************************\ * * Function: parse_clut * * Description: * * Read and parse just the colortable information in a frame file. * \***********************************************************************/ #define MAXOFFSETRECS 10 /* Max # of color/gray offset records: usually 5 */ #define MAXCCRECS 5 /* Max # of color converter records: usually 2 */ int parse_clut(s, frame, filename, rgb, ReducedColorTable, cct, Nitf_hdr_len, n_cols, blackpixel) ecs_Server *s; Frame_file *frame; char *filename; Rgb *rgb; int ReducedColorTable; uint *cct; int Nitf_hdr_len; uint *n_cols; uchar *blackpixel; { FILE *fin; Location loc[3]; int i,j; uint loc_sec_phys_loc; /* location section physical location */ uchar N_offset_recs; /* # of offset records */ uchar N_cc_offset_recs; /* # of color converter offset records */ ushort Offset_rec_len = 17; /* offset record length */ Color_offset *col_off; /* color offset: array of records. */ ushort table_id[MAXOFFSETRECS]; /* Color/gray offset record fields*/ uint n_col_recs[MAXOFFSETRECS]; /* # color records */ uchar col_elem_len[MAXOFFSETRECS]; /* color element length */ ushort hist_rec_len[MAXOFFSETRECS]; /* histogram record length */ uint color_tbl_offset[MAXOFFSETRECS]; /* color table offset */ uint hist_tbl_offset[MAXOFFSETRECS]; /* histogram table offset */ uint clrmap_off_tbl_off; /* colormap offset table offset */ /* color converter subsection hdr */ uint cct_off_tbl_off; /* color convertion offset table offset */ ushort cct_off_recl; /* cc offset recl */ ushort cct_recl; /* cc recl */ /* color converter offset record fields */ ushort cct_id[MAXCCRECS]; /* color conversion table ID */ uint cct_nrec[MAXCCRECS]; /* # cc recs */ uint cct_tbl_off[MAXCCRECS]; /* cc table offset */ uint cct_src[MAXCCRECS]; /* cc src color/gray offset table offset */ uint cct_tgt[MAXCCRECS]; /* cc tgt color/gray offset table offset */ double mindistblackp; /* minimum distance for black pixel */ double dist; /* distance for black pixel */ double r,g,b; char string[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; (void) frame; fin = rpf_fopen_ci( spriv->pathname, filename, "rb" ); if (fin == NULL ) { sprintf(string,"Can't open %s",filename); ecs_SetError(&(s->result),1,string); return(0L); } /* Skip NITF header if there */ fseek(fin, Nitf_hdr_len, SEEK_SET); /* Skip header up to location of location section: 48-4=44 */ fseek(fin, 48-4, SEEK_CUR); ogdi_fread(&loc_sec_phys_loc, sizeof(loc_sec_phys_loc), 1, fin); swap((ucharp)&loc_sec_phys_loc, sizeof(loc_sec_phys_loc)); /* Go to location section */ fseek(fin, loc_sec_phys_loc, SEEK_SET); /* Locate the proper section */ loc[0].id = LOC_COLORGRAY_SECTION_SUBHEADER; /* 134 */ loc[1].id = LOC_COLORMAP_SUBSECTION; /* 135 */ loc[2].id = LOC_COLOR_CONVERTOR_SUBSECTION; /* 139 */ parse_locations(s, fin, loc, 3L); if ((int) loc[0].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find color/gray section subheader (ID=134) location"); return(0L); } /* Go find the color table: loc[0].id=LOC_CLUT */ fseek(fin, loc[0].phys_index, SEEK_SET); /* Read section subheader */ /* Number of offset records:1-5 */ ogdi_fread(&N_offset_recs, sizeof(N_offset_recs), 1, fin); /* Number of color converter offset records */ ogdi_fread(&N_cc_offset_recs, sizeof(N_cc_offset_recs), 1, fin); /* Read colormap offset table */ col_off = (Color_offset *) malloc (sizeof(Color_offset)* (size_t)N_offset_recs); if (col_off == (Color_offset *)NULL) { ecs_SetError(&(s->result),1,"Parse_clut malloc error on col_off"); return(0L) ; } /* Check for colormap subsection: id = 135 */ /* ?? can't find this section */ if ((int) loc[1].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find colormap subsection location ID=135"); free((char *)col_off); return(0L); } /* Read color/gray offset records (colormap subsection) */ fseek(fin, loc[1].phys_index, SEEK_SET); /* colormap offset table offset length:4 */ ogdi_fread(&clrmap_off_tbl_off, sizeof(clrmap_off_tbl_off), 1, fin); swap((ucharp)&clrmap_off_tbl_off, sizeof(clrmap_off_tbl_off)); /* offset record length:17 */ ogdi_fread(&Offset_rec_len, sizeof(Offset_rec_len), 1, fin); swap((ucharp)&Offset_rec_len, sizeof(Offset_rec_len)); /* Read colormap offset table */ for (i=0; ipriv; fin = rpf_fopen_ci( spriv->pathname, filename, "rb" ); if (fin == NULL) { sprintf(string,"Can't open frame file %s",filename); ecs_SetError(&(s->result),1,string); return(0L); } /* Check for NITF header */ fseek(fin, 0, SEEK_SET); ogdi_fread(NITF, 4L, 1, fin) ; NITF[4] = '\0'; if (strcmp(NITF, "NITF") == 0) /* Match: skip NITF hdr */ { fseek(fin,413, SEEK_SET) ; fseek(fin, 31, SEEK_CUR) ; /* Key off date, pos 32 in RPF header */ ogdi_fread( date, sizeof(date), 1, fin); if (strncmp(date,"199",3) == 0) /* Check for short 413 hdr */ file->NITF_hdr_len = 413L; else /* Else long 426 hdr */ file->NITF_hdr_len = 426L; } else /* not in NITF format */ { file->NITF_hdr_len = 0L; } /* else */ /* Skip Nitf header */ fseek(fin, file->NITF_hdr_len, SEEK_SET); /* Read header */ ogdi_fread(&file->head.endian, sizeof(file->head.endian), 1, fin) ; check_swap(file->head.endian); ogdi_fread(&file->head.hdr_sec_len, sizeof(file->head.hdr_sec_len), 1, fin); ogdi_fread( file->head.filename, sizeof(file->head.filename), 1, fin); ogdi_fread(&file->head.new, sizeof(file->head.new), 1, fin) ; ogdi_fread( file->head.standard_num, sizeof(file->head.standard_num), 1, fin) ; if (strncmp(&file->head.standard_num[9],"41",2) == 0) file->head.rpf_type = RPF_CIB; else if (strncmp(&file->head.standard_num[9],"38",2) == 0) file->head.rpf_type = RPF_CADRG; else if (strncmp(&file->head.standard_num[9],"44",2) == 0) file->head.rpf_type = RPF_CDTED; ogdi_fread( file->head.standard_date, sizeof(file->head.standard_date), 1, fin); ogdi_fread(&file->head.classification, sizeof(file->head.classification), 1,fin); ogdi_fread( file->head.country, sizeof(file->head.country), 1, fin); ogdi_fread( file->head.release, sizeof(file->head.release), 1, fin); ogdi_fread(&file->head.loc_sec_phys_loc, sizeof(file->head.loc_sec_phys_loc), 1, fin) ; swap((ucharp)&file->head.hdr_sec_len, sizeof(file->head.hdr_sec_len)) ; swap((ucharp)&file->head.loc_sec_phys_loc, sizeof(file->head.loc_sec_phys_loc)); /* Position to start of location section: 2 choices: */ fseek(fin, file->head.loc_sec_phys_loc, SEEK_SET) ; /* Locate the sections we need */ loc[0].id = LOC_COMPRESSION_SECTION; /* 131 */ loc[1].id = LOC_IMAGE_DESCR_SUBHEADER; /* 136 */ if (file->head.rpf_type == RPF_CDTED) loc[2].id = LOC_COMPRESSION_PARAMETER_SUBSECTION; /* 133 */ else loc[2].id = LOC_COMPRESSION_LOOKUP_SUBSECTION; /* 132 */ loc[3].id = LOC_SPATIAL_DATA_SUBSECTION; /* 140 */ loc[4].id = LOC_IMAGE_DISPLAY_PARAM_SUBHEADER; /* 137 */ loc[5].id = LOC_MASK_SUBSECTION; /* 138 */ loc[6].id = LOC_COVERAGE_SECTION; /* 130 */ loc[7].id = LOC_REPLACE_UPDATE_SECTION_SUBHEADER; /* 146 */ loc[8].id = LOC_REPLACE_UPDATE_TABLE; /* 147 */ loc[9].id = LOC_ATTRIBUTE_SECTION_SUBHEADER; /* 141 */ loc[10].id = LOC_ATTRIBUTE_SUBSECTION; /* 142 */ parse_locations(s, fin, loc, 11L); if ((int) loc[0].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find LOC_COMPRESSION section in FF"); } if ((int) loc[1].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find LOC_IMAGE section in FF"); return(0L); } /* Read the coverage section */ if ((int) loc[6].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find LOC_COVERAGE_SECTION in FF"); return(0L); } ogdi_fread(&file->cover.nw_lat, sizeof(real8), 1, fin); ogdi_fread(&file->cover.nw_long, sizeof(real8), 1, fin); ogdi_fread(&file->cover.sw_lat, sizeof(real8), 1, fin); ogdi_fread(&file->cover.sw_long, sizeof(real8), 1, fin); ogdi_fread(&file->cover.ne_lat, sizeof(real8), 1, fin); ogdi_fread(&file->cover.ne_long, sizeof(real8), 1, fin); ogdi_fread(&file->cover.se_lat, sizeof(real8), 1, fin); ogdi_fread(&file->cover.se_long, sizeof(real8), 1, fin); ogdi_fread(&file->cover.vert_resolution, sizeof(real8), 1, fin); ogdi_fread(&file->cover.horiz_resolution, sizeof(real8), 1, fin); ogdi_fread(&file->cover.vert_interval, sizeof(real8), 1, fin); ogdi_fread(&file->cover.horiz_interval, sizeof(real8), 1, fin); swap((ucharp)&file->cover.nw_lat, sizeof(real8)); swap((ucharp)&file->cover.nw_long, sizeof(real8)); swap((ucharp)&file->cover.sw_lat, sizeof(real8)); swap((ucharp)&file->cover.sw_long, sizeof(real8)); swap((ucharp)&file->cover.ne_lat, sizeof(real8)); swap((ucharp)&file->cover.ne_long, sizeof(real8)); swap((ucharp)&file->cover.se_lat, sizeof(real8)); swap((ucharp)&file->cover.se_long, sizeof(real8)); swap((ucharp)&file->cover.vert_resolution, sizeof(real8)); swap((ucharp)&file->cover.horiz_resolution, sizeof(real8)); swap((ucharp)&file->cover.vert_interval, sizeof(real8)); swap((ucharp)&file->cover.horiz_interval, sizeof(real8)); /* Read the compression tables */ if ((int) loc[0].phys_index != ~0) { fseek(fin, loc[0].phys_index, SEEK_SET); ogdi_fread(&file->compr.algorithm , sizeof(file->compr.algorithm ), 1, fin); ogdi_fread(&file->compr.noff_recs ,sizeof(file->compr.noff_recs ), 1,fin); ogdi_fread(&file->compr.nparm_off_recs,sizeof(file->compr.nparm_off_recs), 1,fin); swap((ucharp)&file->compr.algorithm ,sizeof(file->compr.algorithm )); swap((ucharp)&file->compr.noff_recs ,sizeof(file->compr.noff_recs )); swap((ucharp)&file->compr.nparm_off_recs,sizeof(file->compr.noff_recs )); } /* If not CDTED read lookup table section */ if (file->head.rpf_type != RPF_CDTED) { file->loc_lut_shdr = loc[2].phys_index; if ((int) loc[2].phys_index == ~0) { ecs_SetError(&(s->result),1,"Warning: Can't find compr. lookup subsection in FrameFile: Using alternate computation"); /* length of compr. sect. subhdr = 10 */ fseek(fin, loc[0].phys_index + 10, SEEK_SET); } else { fseek(fin, loc[2].phys_index, SEEK_SET); } /* else */ /* Read Header fields for CIB */ ogdi_fread(&lkup_off_tbl_off, sizeof(lkup_off_tbl_off), 1, fin); ogdi_fread(&lkup_tbl_off_recl, sizeof(lkup_tbl_off_recl), 1, fin); swap ((ucharp)&lkup_off_tbl_off, sizeof(lkup_off_tbl_off)) ; swap ((ucharp)&lkup_tbl_off_recl, sizeof(lkup_tbl_off_recl)) ; for (i=0; i<4; i++) { ogdi_fread(&file->lut[i].id , sizeof(file->lut[i].id ), 1,fin); ogdi_fread(&file->lut[i].records , sizeof(file->lut[i].records ), 1, fin); ogdi_fread(&file->lut[i].values , sizeof(file->lut[i].values ), 1, fin); ogdi_fread(&file->lut[i].bit_length , sizeof(file->lut[i].bit_length ), 1, fin); ogdi_fread(&file->lut[i].phys_offset, sizeof(file->lut[i].phys_offset), 1, fin); swap((ucharp)&file->lut[i].id , sizeof(file->lut[i].id )); swap((ucharp)&file->lut[i].records , sizeof(file->lut[i].records )); swap((ucharp)&file->lut[i].values , sizeof(file->lut[i].values )); swap((ucharp)&file->lut[i].bit_length , sizeof(file->lut[i].bit_length )); swap((ucharp)&file->lut[i].phys_offset, sizeof(file->lut[i].phys_offset)); if (file->lut[i].records != 4096 || file->lut[i].values != 4 || file->lut[i].bit_length != 8) { ecs_SetError(&(s->result),1,"Bad VQ info in compression record"); return(0L); } } /* For each compression table */ for (i = 0; i < 4; i++) { /* Position from compression lookup subsection: loc[2] */ fseek(fin, loc[2].phys_index + file->lut[i].phys_offset, SEEK_SET); /* Skip tables */ fseek(fin, 4096*4, SEEK_CUR); } /* for i=1 to 4 (# compression tables, 1 for each pixel row) */ } /* If CDTED read compression parameter section */ else if (file->head.rpf_type == RPF_CDTED) { uint comp_off_tbl_off; ushort comp_off_recl; int bits_off; int bitshuff_off; uchar bits[16]; int hufflen=0; file->comp_parm_shdr = loc[2].phys_index; if ((int) loc[2].phys_index == ~0) { ecs_SetError(&(s->result),1,"Warning: Can't find compr. parameter subsection in FrameFile"); return(0L); } else { fseek(fin, loc[2].phys_index, SEEK_SET); } /* else */ /* Read Header fields for CDTED */ ogdi_fread(&comp_off_tbl_off, sizeof(comp_off_tbl_off), 1, fin); ogdi_fread(&comp_off_recl, sizeof(comp_off_recl), 1, fin); swap ((ucharp)&comp_off_tbl_off, sizeof(comp_off_tbl_off)) ; swap ((ucharp)&comp_off_recl, sizeof(comp_off_recl)) ; file->comp = (Comp_parm *)malloc(sizeof(Comp_parm)* file->compr.nparm_off_recs); bitshuff_off = ~0; for (i=0; icompr.nparm_off_recs; i++) { ogdi_fread(&file->comp[i].id , sizeof(file->comp[i].id ), 1,fin); ogdi_fread(&file->comp[i].rec_off, sizeof(file->comp[i].rec_off), 1, fin); swap((ucharp)&file->comp[i].id , sizeof(file->comp[i].id )); swap((ucharp)&file->comp[i].rec_off, sizeof(file->comp[i].rec_off)); if (file->comp[i].id == 1) bitshuff_off = file->comp[i].rec_off; } /* for i */ if (bitshuff_off == ~0) { ecs_SetError(&(s->result),1,"Compression param ID 1 not found"); return(0L); } bits_off = bitshuff_off + 7 ; /* skip 4 vars in tbl: 2+2+2+1 */ /* Skip Huffman bits */ file->comp_parm_shdr = loc[2].phys_index + bits_off; fseek(fin, loc[2].phys_index + bits_off, SEEK_SET); ogdi_fread(bits, 16, 1, fin) ; /* bits array */ for (i=0; i<16; i++) hufflen += bits[i]; /* len of huffval table */ fseek(fin, hufflen, SEEK_CUR); } /* Read the image data */ fseek(fin, loc[1].phys_index, SEEK_SET); ogdi_fread(&file->img.spectral_groups, sizeof(file->img.spectral_groups), 1, fin); ogdi_fread(&file->img.subframe_tables, sizeof(file->img.subframe_tables), 1, fin); ogdi_fread(&file->img.spectral_tables, sizeof(file->img.spectral_tables), 1, fin); ogdi_fread(&file->img.spectral_lines, sizeof(file->img.spectral_lines ), 1, fin); ogdi_fread(&file->img.horiz_subframes, sizeof(file->img.horiz_subframes), 1, fin); ogdi_fread(&file->img.vert_subframes, sizeof(file->img.vert_subframes ), 1, fin); ogdi_fread(&file->img.output_cols, sizeof(file->img.output_cols ), 1, fin); ogdi_fread(&file->img.output_rows, sizeof(file->img.output_rows ), 1, fin); swap((ucharp)&file->img.spectral_groups, sizeof(file->img.spectral_groups)); swap((ucharp)&file->img.subframe_tables, sizeof(file->img.subframe_tables)); swap((ucharp)&file->img.spectral_tables, sizeof(file->img.spectral_tables)); swap((ucharp)&file->img.spectral_lines, sizeof(file->img.spectral_lines)); swap((ucharp)&file->img.horiz_subframes, sizeof(file->img.horiz_subframes)); swap((ucharp)&file->img.vert_subframes, sizeof(file->img.vert_subframes)); swap((ucharp)&file->img.output_cols, sizeof(file->img.output_cols)); swap((ucharp)&file->img.output_rows, sizeof(file->img.output_rows)); ogdi_fread(&subfr_mask_tbl_off, sizeof(subfr_mask_tbl_off), 1, fin) ; swap((ucharp)&subfr_mask_tbl_off,sizeof(subfr_mask_tbl_off)); if (subfr_mask_tbl_off == 0xFFFFFFFFL) file->all_subframes = 1; /* TRUE */ else file->all_subframes = 0 ; /* FALSE */ /* Fseek to LOC_IMAGE_DISPLAY_PARAM_SUBHEADER, ID=137 */ if ((int) loc[4].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find IMAGE_DISPLAY_PARAM_SUBHEADER section in Frame file"); return(0L); } /* Image Display Parameters Subheader */ fseek(fin, loc[4].phys_index, SEEK_SET); if (file->head.rpf_type == RPF_CDTED) nsubfr = 1; else if (file->head.rpf_type == RPF_CADRG || file->head.rpf_type == RPF_CIB) nsubfr = 6; if (file->img.vert_subframes != nsubfr || file->img.horiz_subframes != nsubfr) { ecs_SetError(&(s->result),1,"Bad number of subframes per frame"); return(0L); } /* Fseek to LOC_SPATIAL_DATA_SUBSECTION, ID=140 */ file->loc_data = loc[3].phys_index; if ((int) loc[3].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find SPATIAL_DATA_SUBSECTION section in Frame file"); return(0L); } /* Read the mask data */ if (!file->all_subframes) { /* Fseek to LOC_MASK_SUBSECTION, ID=138 */ if ((int) loc[5].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find MASK_SUBSECTION section in Frame file"); return(0L); } fseek(fin, loc[5].phys_index, SEEK_SET); fseek(fin, subfr_mask_tbl_off, SEEK_CUR); /* go to offset: skip hdr */ for (i=0; iindices[i][j], sizeof(uint), 1, fin); swap((ucharp)&file->indices[i][j], sizeof(uint)); } } else { for (i=0; iindices[i][j] = (uint)((i*6L+j)*6144L); } /* Fseek to LOC_ATTRIBUTE_SECTION_SUBHEADER, ID=141 */ #ifdef LATER if (loc[9].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find LOC_ATTRIBUTE_SUBHEADER section in Frame file"); return(0L); } fseek(fin, loc[10].phys_index, SEEK_SET); if (loc[10].phys_index == ~0) { ecs_SetError(&(s->result),1,"Can't find LOC_ATTRIBUTE_SECTION_SUBHEADER section in Frame file"); return(0L); } fseek(fin, loc[10].phys_index, SEEK_SET); ogdi_fread(&num_att_rec, sizeof(num_att_rec), 1, fin) ; swap((ucharp)&num_att_rec, sizeof(num_att_rec)); #endif fclose(fin); return(1L); } /* parse_frame */ /***********************************************************************\ * * Function: get_comp_luts * * Description: * * Get the compression lookup tables * \***********************************************************************/ BOOLEAN get_comp_lut(s, file, filename, table, cct, ReducedColorTable) ecs_Server *s; Frame_file *file; char *filename; uchar *table; uint *cct; int ReducedColorTable; { FILE *fin; uint offset; int index; int tindex; int i,j,k; char string[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; /* Open the file */ fin = rpf_fopen_ci( spriv->pathname, filename, "rb" ); if (fin == NULL) { sprintf(string,"Can't open frame file %s",filename); ecs_SetError(&(s->result),1,string); return FALSE; } /* Loop thru the compression tables */ for (i=0; i<4; i++) { /* Seek to the table postion */ offset = file->loc_lut_shdr + file->lut[i].phys_offset; fseek(fin, offset, SEEK_SET); /* Read the table */ ogdi_fread(&table[i*4096L*4L], (size_t)1, (size_t)(4096*4), fin); /* Transform the table if reduced color table */ if (ReducedColorTable) /* 1 or 2 */ { for (j=0; j<4096; j++) for (k=0; k<4; k++) { index = i*4096L*4L + j*4L + k; tindex = (unsigned char)table[index]; table[index] = (unsigned char)cct[tindex]; } } } fclose(fin); return TRUE; } /***********************************************************************\ * * Function: get_rpf_image_tile * * Description: * * Get a decompressed RPF image tile * \***********************************************************************/ BOOLEAN get_rpf_image_tile(s, file, filename, tno, table, tile, decompress, blackpixel) ecs_Server *s; Frame_file *file; char *filename; int tno; uchar *table; uchar *tile; int decompress; uchar blackpixel; { FILE *fin; uchar *ptr; uchar *subframe; int i, j, t, e; uint val; int index; int offset; char string[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; /* If blank subframe zero out tile */ if (tno == -1L && tno == ~0) { memset((uchar *)tile, (int)(uchar)blackpixel, (size_t)(256*256)); return TRUE; } /* Open the file */ fin = rpf_fopen_ci( spriv->pathname, filename, "rb" ); if (fin == NULL) { sprintf(string,"Can't open frame file %s",filename); ecs_SetError(&(s->result),1,string); return(0L); } /* Loop thru the compression tables */ /* Alloc the space for the subframe */ if ((subframe = (uchar *)malloc((size_t)6144L)) == (uchar *)NULL) { ecs_SetError(&(s->result),1,"Can't alloc space for subframe"); return FALSE; } /* Seek to start of subframe */ offset = file->loc_data + tno; fseek(fin, offset, SEEK_SET); /* Read the subframe */ if( fread(subframe, 1, 6144, fin) != 6144 ) { fclose(fin); free(subframe); return FALSE; } fclose(fin); ptr = subframe; /* Decompress the tile */ if (decompress) { for (i = 0; i < 256; i += 4) for (j = 0; j < 256; j += 8, ptr += 3) { /* Get first 12-bit value as index into VQ table */ val = (uint)((ptr[0] << 4) | (ptr[1] >> 4)); for (t = 0; t < 4; t++) for (e = 0; e < 4; e++) { index = t*4096L*4L + val*4L + e; tile[(i+t)*256L+(j+e )] = (unsigned char)table[index]; #if 0 if ( tile[(i+t)*256L+(j+e )] > 31) printf ("i,t,j,e %ld %ld %ld %ld %ld %ld %ld %ld\n",i,t,j,e, tile[(i+t)*256L+(j+e )],index,val,table[index]); #endif } /* Get second 12-bit value as index into VQ table */ val = (uint)(((ptr[1] & 0x0F) << 8) | ptr[2]); for (t = 0; t < 4; t++) for (e = 0; e < 4; e++) { index = t*4096L*4L + val*4L + e; tile[(i+t)*256L+(j+e+4L)] = (unsigned char)table[index]; #if 0 if ( tile[(i+t)*256L+(j+e+4L)] > 31) printf ("i,t,j,e+4L %ld %ld %ld %ld %ld\n",i,t,j,e+4L, tile[(i+t)*256L+(j+e+4L)]); #endif } } } else { for (i = 0; i < 6144; i++) tile[i] = subframe[i]; } free((char *)subframe); return TRUE; } #ifndef _WINDOWS void dyn_string_tolower(chaine) char *chaine; { int i; for( i=0; i< (int) strlen(chaine); i++) { if (chaine[i] >= 'A' && chaine[i] <= 'Z') chaine[i] += 32; } } #endif void free_toc(Toc_file *toc) { int i,j,k; /* Loop thru the boundaries and free the arrays */ for (i=0; i<(int)toc->num_boundaries; i++) { if(toc->entries[i].frames != (Frame_entry **)NULL) { for (j=0; jentries[i].vert_frames; j++) { if(toc->entries[i].frames[j] != (Frame_entry *)NULL) { for (k=0; kentries[i].horiz_frames; k++) if(toc->entries[i].frames[j][k].directory != (char *)NULL) free(toc->entries[i].frames[j][k].directory); free((char *)toc->entries[i].frames[j]); } } free((char *)toc->entries[i].frames); } } if(toc->entries != (Toc_entry *)NULL) free((char *)toc->entries); } ogdi-ogdi_4_1_0/ogdi/driver/skeleton/000077500000000000000000000000001345660466700176645ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/skeleton/.cvsignore000066400000000000000000000000061345660466700216600ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/driver/skeleton/datadict.h000066400000000000000000000255221345660466700216200ustar00rootroot00000000000000static char datadict[] = {'\n' ,'i','t','c','l','_','c','l','a','s','s',' ','s','k','e','l','e','t','o','n','_','D','a','t','a','D','i','c','t','i','o','n','a','r','y',' ','{' ,'\n' ,' ',' ','i','n','h','e','r','i','t',' ','d','d' ,'\n' ,'\n' ,'c','o','n','s','t','r','u','c','t','o','r',' ','{','w','i','n','d','o','w','p','a','t','h',' ','l','o','c','a','t','i','o','n','}',' ','{' ,'\n' ,' ',' ','d','d',':',':','c','o','n','s','t','r','u','c','t','o','r',' ','$','w','i','n','d','o','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','l','a','y','o','u','t',' ','{','}',' ','{' ,'\n' ,' ',' ','p','r','e','v','i','o','u','s',' ','l','a','y','o','u','t' ,'\n' ,'}' ,'\n' ,' ' ,'\n' ,'m','e','t','h','o','d',' ','b','u','t','t','o','n','s',' ','{','}',' ','{' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','n','e','w','B','i','n','d','i','n','g',' ','{','w','i','d','g','e','t',' ','y','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','n','e','w','B','i','n','d','i','n','g',' ','$','w','i','d','g','e','t',' ','$','y' ,'\n' ,'\t','s','e','t',' ','s','_','n','e','a','r','e','s','t',' ','[','$','w','i','d','g','e','t',' ','n','e','a','r','e','s','t',' ','$','y',']' ,'\n' ,'}' ,'\n' ,'\n' ,'#',' ','c','h','a','n','g','e',' ','t','h','e',' ','t','i','t','l','e',' ','o','f',' ','t','h','e',' ','l','i','s','t','b','o','x' ,'\n' ,'m','e','t','h','o','d',' ','m','a','p','L','i','s','t','b','o','x',' ','{','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','m','a','p','L','i','s','t','b','o','x' ,'\n' ,'\t','$','w','i','n','d','o','w','.','c','e','n','t','e','r','.','r','i','g','h','t','.','l','a','y','e','r','s',' ','c','o','n','f','i','g','u','r','e',' ','-','l','a','b','e','l',' ','\"','F','e','a','t','u','r','e','s','\"' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','m','e','n','u','s',' ','{','}',' ','{' ,'\n' ,' ',' ','p','r','e','v','i','o','u','s',' ','m','e','n','u','s' ,'\n' ,'\n' ,' ',' ','t','i','x','L','a','b','e','l','F','r','a','m','e',' ','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','\\' ,'\n' ,' ',' ',' ',' ','-','l','a','b','e','l',' ','\"','O','p','t','i','o','n','s','\"',' ','\\' ,'\n' ,' ',' ',' ',' ','-','l','a','b','e','l','s','i','d','e',' ','a','c','r','o','s','s','t','o','p' ,'\n' ,'\n' ,' ',' ','s','e','t',' ','p','a','t','h',' ','[','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','s','u','b','w','i','d','g','e','t',' ','f','r','a','m','e',']' ,'\n' ,'\n' ,' ',' ','s','e','t',' ','c','l','a','s','s','O','p','t','i','o','n','s',' ','$','p','a','t','h','.','c','l','a','s','s' ,'\n' ,' ',' ','t','i','x','O','p','t','i','o','n','M','e','n','u',' ','$','p','a','t','h','.','c','l','a','s','s',' ','-','l','a','b','e','l',' ','\"','F','e','a','t','u','r','e',' ','C','l','a','s','s',':',' ','\"',' ','\\' ,'\n' ,' ',' ',' ',' ','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','u','p','d','a','t','e','L','i','s','t','B','o','x','\"',' ','\\' ,'\n' ,' ',' ',' ',' ','-','o','p','t','i','o','n','s',' ','{' ,'\n' ,' ',' ',' ',' ',' ',' ','l','a','b','e','l',' ','w','i','d','t','h',' ','1','0' ,'\n' ,' ',' ',' ',' ',' ',' ','l','a','b','e','l',' ','a','n','c','h','o','r',' ','w' ,'\n' ,' ',' ',' ',' ',' ',' ','m','e','n','u','b','u','t','t','o','n','.','w','i','d','t','h',' ','1','2' ,'\n' ,' ',' ','}' ,'\n' ,'\n' ,' ',' ','p','a','c','k',' ','a','p','p','e','n','d',' ','$','p','a','t','h',' ','\\' ,'\n' ,' ',' ',' ',' ','$','p','a','t','h','.','c','l','a','s','s',' ','{',' ','l','e','f','t',' ','}' ,'\n' ,'\n' ,' ',' ','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','i','n','d','o','w','.','m','e','n','u',' ','\\' ,'\n' ,' ',' ',' ',' ','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','{','t','o','p',' ','e','x','p','a','n','d',' ','f','i','l','l','x','}' ,'\n' ,' ',' ','}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','u','p','d','a','t','e','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\n' ,' ',' ',' ','s','e','t',' ','c','o','v','e','r','a','g','e','D','a','t','a',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',']' ,'\n' ,' ',' ',' ','f','o','r','e','a','c','h',' ','c','l','a','s','s',' ','$','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','{' ,'\n' ,' ',' ',' ',' ',' ',' ','c','a','t','c','h',' ','{',' ','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','a','d','d',' ','c','o','m','m','a','n','d',' ','$','c','l','a','s','s',' ','-','l','a','b','e','l',' ','$','c','l','a','s','s',' ','}' ,'\n' ,' ',' ',' ','}' ,'\n' ,' ',' ',' ','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','c','o','n','f','i','g',' ','-','d','i','s','a','b','l','e','c','a','l','l','b','a','c','k',' ','0' ,'\n' ,' ',' ',' ','u','p','d','a','t','e','C','o','v','e','r','a','g','e','S','e','l','e','c','t','i','o','n',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','u','p','d','a','t','e','C','o','v','e','r','a','g','e','S','e','l','e','c','t','i','o','n',' ','{','a','r','g','s','}',' ','{' ,'\n' ,' ',' ','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']' ,'\n' ,'}' ,'\n' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'#',' ','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e' ,'\n' ,'#',' ',' ' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',' ','{','}',' ','{','}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',' ','{','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','[','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','c','g','e','t',' ','-','v','a','l','u','e',']' ,'\n' ,'}' ,'\n' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'#',' ','u','p','d','a','t','e','L','i','s','t','b','o','x' ,'\n' ,'#' ,'\n' ,'#',' ','u','p','d','a','t','e','s',' ','t','h','e',' ','l','i','s','t','b','o','x',' ','w','i','t','h',' ','t','h','e',' ','s','e','l','e','c','t','e','d',' ','c','o','v','e','r','a','g','e',' ','a','n','d',' ','c','l','a','s','s','.' ,'\n' ,'#',' ','p','r','e',':',' ','p','r','o','t','e','c','t','e','d',' ','v','a','r','i','a','b','l','e',' ','c','o','v','e','r','a','g','e','D','a','t','a',' ','h','a','s',' ','b','e','e','n',' ','s','e','t',' ','w','i','t','h',' ','l','i','s','t' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','{','s','e','l','e','c','t','e','d','C','l','a','s','s','}',' ','{' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','d','e','l','e','t','e',' ','0',' ','e','n','d' ,'\n' ,'\t','s','e','t',' ','m','a','p','s',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e','D','a','t','a',' ','[','l','s','e','a','r','c','h',' ','$','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','$','s','e','l','e','c','t','e','d','C','l','a','s','s',']',']' ,'\n' ,' ',' ','\t','f','o','r','e','a','c','h',' ','s','_','m','a','p',' ','$','m','a','p','s',' ','{' ,'\n' ,'\t','\t','a','p','p','e','n','d','M','a','p','I','t','e','m',' ','$','s','_','m','a','p' ,'\n' ,' ',' ','\t','}' ,'\n' ,'}' ,'\n' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'#',' ','a','p','p','e','n','d','M','a','p','I','t','e','m' ,'\n' ,'#',' ',' ',' ',' ','a','p','p','e','n','d',' ','s','o','m','e','t','h','i','n','g',' ','t','o',' ','t','h','e',' ','l','i','s','t',' ','o','f',' ','m','a','p',' ','i','t','e','m','s','.' ,'\n' ,'#' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','a','p','p','e','n','d','M','a','p','I','t','e','m',' ','{','i','t','e','m','}',' ','{' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','i','t','e','m' ,'\n' ,'}' ,'\n' ,'\n' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'#',' ','g','e','t','P','a','t','h','n','a','m','e' ,'\n' ,'#' ,'\n' ,'#',' ','c','o','n','s','t','r','u','c','t',' ','a',' ','p','a','t','h','n','a','m','e','.',' ',' ','I','f',' ','t','h','e','r','e',' ','i','s',' ','n','o',' ','e','x','p','r','e','s','s','i','o','n',',',' ','(','*',')',' ','i','s',' ' ,'\n' ,'#',' ','a','p','p','e','n','d','e','d',' ','a','s',' ','a',' ','q','u','e','r','y','.' ,'\n' ,'#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','g','e','t','P','a','t','h','n','a','m','e',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','n','a','m','e' ,'\n' ,'}' ,'\n' ,'\n' ,'m','e','t','h','o','d',' ','s','e','t','P','r','i','v','a','t','e','D','a','t','a',' ','{','l','_','l','i','s','t','}',' ','{' ,'\n' ,'\n' ,'}' ,'\n' ,'\n' ,'p','r','o','t','e','c','t','e','d',' ','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','{','R','a','s','t','e','r',' ','A','r','e','a',' ','L','i','n','e',' ','P','o','i','n','t',' ','T','e','x','t','}' ,'\n' ,'\t' ,'\n' ,'}' ,'\n' ,'\n' ,'\n' ,'\0'}; ogdi-ogdi_4_1_0/ogdi/driver/skeleton/datainfo.h000066400000000000000000000002761345660466700216270ustar00rootroot00000000000000 /* This header contain the "database" itself. It's a list of values for each available data type available in the skeleton driver. */ #ifndef DATAINFO_H #define DATAINFO_H #endif ogdi-ogdi_4_1_0/ogdi/driver/skeleton/makefile000066400000000000000000000021561345660466700213700ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = skeleton TARGETGEN=$(DYNAGEN) SOURCES = skeleton.c open.c object.c utils.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) $(GLUTIL_INCLUDE) CFLAGS = $(INCLUDES) $(MACHINE) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(GLUTIL_STATICLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR datadict.h $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/ogdi/driver/skeleton/object.c000066400000000000000000001177171345660466700213140ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME object.c DESCRIPTION& Implementation of skeleton driver getObject* functions END_DESCRIPTION END_CSOURCE_INFORMATION Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #include "skeleton.h" /* Database of area. */ int dbareaqty = 2; dbareatype dbarea[2] = {{1, 9, {{598924.242,4921629.735},{594678.030,4920190.341},{594138.258,4917851.326},{595937.500,4915224.432},{599140.152,4915692.235},{601119.318,4916987.689},{601227.273,4920082.386},{600543.561,4920946.023},{598924.242,4921629.735}}, 6, {{597736.742,4919434.659},{596369.318,4918535.038},{596441.288,4917491.477},{597772.727,4917203.598},{599140.152,4919038.826},{597736.742,4919434.659}}, 4921629.735, 4915224.432, 601227.273, 594138.258}, {2, 7, {{605653.409,4920586.174},{602918.561,4919074.811},{602486.742,4916771.780},{604142.045,4915548.295},{606517.045,4916591.856},{607956.439,4919722.538},{605653.409,4920586.174}}, 5, {{605185.606,4918499.053},{603314.394,4917635.417},{603494.318,4916843.750},{605149.621,4917023.674},{605185.606,4918499.053}}, 4920586.174, 4915548.295, 605185.606, 603314.394} }; /* ******************************************************************** FUNCTION_INFORMATION NAME _getNextObjectArea DESCRIPTION This function retrieves the Area data objects in a sequential access. In this example, areas of the spearfish database are used and each area contains two polygons, the main polygon and other as an island. In the current layer, the geographical objects are related to an index. If the current position in the index is greater than the number of objects in it, then the function will indicate that the selection is completed. The attributes will be dummy values set in the format defined in GetAttributesFormat. The objects are filtered in a way that prevents them to be returned if the object is outside the current region. A filter could also be applied in the drivers with a filter expression like VRF. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getNextObjectArea(s,l) ecs_Server *s; ecs_Layer *l; { int i; char buffer[3]; /* Go to the next valid index position. */ while (dbarea[l->index].north < s->currentRegion.south || dbarea[l->index].south > s->currentRegion.north || dbarea[l->index].east < s->currentRegion.west || dbarea[l->index].west > s->currentRegion.east) { l->index++; if (l->index >= l->nbfeature) { break; } } /* If the index is superior to the number of geographical objects in the database, the function returns an error message with an error code of "2" that will simply indicate the end of the selection. Code 1 is for a real error message. */ if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Extract the area at the position l->index. It's a valid polygon. */ /* ecs_SetGeomArea define a area in the OGDI. It indicate in the ecs_Result structure the quantity of rings presents in the area. In this case, the number of rings is 2, the main ring and the island. */ ecs_SetGeomArea(&(s->result),2); /* Define the first ring (ring number 0). When a ring is define, the number of points and the centroid must be known. In that case, the centroid is undefined (0,0). Once the ecs_SetGeomAreaRing is called, the points are added one by one in the ring with ECS_SETGEOMAREACOORD. */ ecs_SetGeomAreaRing(&(s->result),0, dbarea[l->index].arealistlength,0.0,0.0); for(i=0;iindex].arealistlength;i++) { ECS_SETGEOMAREACOORD((&(s->result)), 0, i, dbarea[l->index].arealist[i].x, dbarea[l->index].arealist[i].y); } /* Define the second ring (ring number 1). Work like the ring 0. */ ecs_SetGeomAreaRing(&(s->result),1, dbarea[l->index].islandlistlength,0.0,0.0); for(i=0;iindex].islandlistlength;i++) { ECS_SETGEOMAREACOORD((&(s->result)), 1, i, dbarea[l->index].islandlist[i].x, dbarea[l->index].islandlist[i].y); } /* Define the id of the object. Could be any value define for the object in the database but it must be unique. The dyn_GetObject and dyn_GetObjectIdFromCoord use this identifier to handle the objects. */ sprintf(buffer,"%d",l->index); ecs_SetObjectId(&(s->result),buffer); /* Define the bounding box of the object. */ ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbarea[l->index].west, dbarea[l->index].south, dbarea[l->index].east, dbarea[l->index].north); /* Set the attribute list. It's a string list with a format describe by dyn_GetAttributesFormat. */ ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); l->index++; ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectArea DESCRIPTION This function retrieves an Area data object with a dynamic access. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information char *id: A string with the object id number END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectArea(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int index; int i; char buffer[3]; index = atoi(id); if (index < 0 || index >= l->nbfeature) { ecs_SetError(&(s->result),1,"Invalid area id"); return; } /* Extract the area at the position l->index. It's a valid polygon. */ /* ecs_SetGeomArea define a area in the OGDI. It indicate in the ecs_Result structure the quantity of rings presents in the area. In this case, the number of rings is 2, the main ring and the island. */ ecs_SetGeomArea(&(s->result),2); /* Define the first ring (ring number 0). When a ring is define, the number of points and the centroid must be known. In that case, the centroid is undefined (0,0). Once the ecs_SetGeomAreaRing is called, the points are added one by one in the ring with ECS_SETGEOMAREACOORD. */ ecs_SetGeomAreaRing(&(s->result),0, dbarea[index].arealistlength,0.0,0.0); for(i=0;iresult)), 0, i, dbarea[index].arealist[i].x, dbarea[index].arealist[i].y); } /* Define the second ring (ring number 1). Work like the ring 0. */ ecs_SetGeomAreaRing(&(s->result),1, dbarea[index].islandlistlength,0.0,0.0); for(i=0;iresult)), 1, i, dbarea[index].islandlist[i].x, dbarea[index].islandlist[i].y); } /* Define the id of the object. Could be any value define for the object in the database but it must be unique. The dyn_GetObject and dyn_GetObjectIdFromCoord use this identifier to handle the objects. */ sprintf(buffer,"%d",index); ecs_SetObjectId(&(s->result),buffer); /* Define the bounding box of the object. */ ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbarea[index].west, dbarea[index].south, dbarea[index].east, dbarea[index].north); /* Set the attribute list. It's a string list with a format describe by dyn_GetAttributesFormat. */ ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectIdArea DESCRIPTION This function retrieves the object id of the nearest area from a set of coordinates. Usually, these coordinates are defined by the user of the OGDI in order to extract with it a geographical object. The way the algorithm works in this example is simply by checking which point of the area are the nearest from a set of coordinates. The identifier of the polygon where the point belong is returned. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information. ecs_Coordinate *coord: Object coordinates. END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectIdArea(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { double distance=0,calcdistance=0,pointdistance; int firstobj; int index,position; char buffer[60]; int i; firstobj = TRUE; index = 0; position = -1; while (index <= l->nbfeature) { /* Calculate the shortest distance between the selected set of coordinates and the area at the "index" position. */ for(i=0;ix)*(dbarea[index].arealist[i].x - coord->x)+ (dbarea[index].arealist[i].y - coord->y)*(dbarea[index].arealist[i].y - coord->y)); if (i==0) calcdistance = pointdistance; else if (calcdistance > pointdistance) calcdistance = pointdistance; } if (firstobj) { distance = calcdistance; position = index; firstobj = FALSE; } else { if (calcdistance < distance) { distance = calcdistance; position = index; } } index++; } if (position < 0) { ecs_SetError(&(s->result),2,"No polygons found"); } else { sprintf(buffer,"%d",position); if(ecs_SetText(&(s->result),buffer)) { ecs_SetSuccess(&(s->result)); } } } /* Database of lines */ int dblineqty = 4; dblinetype dbline[4] = {{1, 9, {{598924.242,4921629.735},{594678.030,4920190.341},{594138.258,4917851.326},{595937.500,4915224.432},{599140.152,4915692.235},{601119.318,4916987.689},{601227.273,4920082.386},{600543.561,4920946.023},{598924.242,4921629.735}}, 4921629.735, 4915224.432, 601227.273, 594138.258}, {2, 6, {{597736.742,4919434.659},{596369.318,4918535.038},{596441.288,4917491.477},{597772.727,4917203.598},{599140.152,4919038.826},{597736.742,4919434.659}}, 4919434.659, 4917203.598, 599140.152, 596369.318}, {3, 7, {{605653.409,4920586.174},{602918.561,4919074.811},{602486.742,4916771.780},{604142.045,4915548.295},{606517.045,4916591.856},{607956.439,4919722.538},{605653.409,4920586.174}}, 4920586.174, 4915548.295, 605185.606, 603314.394}, {4, 5, {{605185.606,4918499.053},{603314.394,4917635.417},{603494.318,4916843.750},{605149.621,4917023.674},{605185.606,4918499.053}}, 4920586.174, 4915548.295, 605185.606, 603314.394}}; /* ******************************************************************** FUNCTION_INFORMATION NAME _getNextObjectLine DESCRIPTION This function retrieves the Line data objects in a sequential access. In the current layer, the geographical objects are related to an index. If the current position in the index is greater than the number of objects in it, then the function will indicate that the selection is completed. The attributes will be dummy values set in the format defined in GetAttributesFormat. The objects are filtered in a way that prevents them to be returned if the object is outside the current region. A filter could also be applied in the drivers with a filter expression like VRF. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection informations. END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getNextObjectLine(s,l) ecs_Server *s; ecs_Layer *l; { int i; char buffer[3]; /* Go to the next valid index position. */ while (dbline[l->index].north < s->currentRegion.south || dbline[l->index].south > s->currentRegion.north || dbline[l->index].east < s->currentRegion.west || dbline[l->index].west > s->currentRegion.east) { l->index++; if (l->index >= l->nbfeature) { break; } } /* If the index is superior to the number of geographical objects in the database, the function returns an error message with an error code of "2" that will simply indicate the end of the selection. Code 1 is for a real error message. */ if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Extract the line at the position l->index. It's a valid polygon. */ ecs_SetGeomLine(&(s->result),dbline[l->index].linelistlength); for(i=0;iindex].linelistlength;i++) { ECS_SETGEOMLINECOORD((&(s->result)), i, dbline[l->index].linelist[i].x, dbline[l->index].linelist[i].y); } /* Define the id of the object. Could be any value define for the object in the database but it must be unique and the dyn_GetObject and dyn_GetObjectIdFromCoord use this identifier to handle the objects. */ sprintf(buffer,"%d",l->index); ecs_SetObjectId(&(s->result),buffer); /* Define the bounding box of the object. */ ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbline[l->index].west, dbline[l->index].south, dbline[l->index].east, dbline[l->index].north); /* Set the attribute list. It's a string list with a format describe by dyn_GetAttributesFormat. */ ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); l->index++; ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectLine DESCRIPTION This function retrieves the Line data objects with a dynamic access. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection informations. char *id: A string with the object id number END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectLine(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int index; int i; char buffer[3]; index = atoi(id); if (index < 0 || index >= l->nbfeature) { ecs_SetError(&(s->result),1,"Invalid line id"); return; } /* Extract the line at the position index. It's a valid polygon. */ ecs_SetGeomLine(&(s->result),dbline[index].linelistlength); for(i=0;iresult)), i, dbline[index].linelist[i].x, dbline[index].linelist[i].y); } sprintf(buffer,"%d",index); ecs_SetObjectId(&(s->result),buffer); ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbline[index].west, dbline[index].south, dbline[index].east, dbline[index].north); ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); index++; ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectIdLine DESCRIPTION This function retrieves the object id of the nearest polyline of a set of coordinates. The way the algorithm works in this example is simply by checking which points of the polyline are the nearest from of set of coordinates. The identifier of the polyline where the point belong is returned, END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information ecs_Coordinate *coord: Object coordinate END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectIdLine(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { double distance=0,calcdistance=0,pointdistance; int firstobj; int index,position; char buffer[60]; int i; firstobj = TRUE; index = 0; position = -1; while (index <= l->nbfeature) { /* Calculate the shortest distance between the set of coordinates and the area at the "index" position */ for(i=0;ix)*(dbline[index].linelist[i].x - coord->x)+ (dbline[index].linelist[i].y - coord->y)*(dbline[index].linelist[i].y - coord->y)); if (i==0) calcdistance = pointdistance; else if (calcdistance > pointdistance) calcdistance = pointdistance; } if (firstobj) { distance = calcdistance; position = index; firstobj = FALSE; } else { if (calcdistance < distance) { distance = calcdistance; position = index; } } index++; } if (position < 0) { ecs_SetError(&(s->result),2,"No line found"); } else { sprintf(buffer,"%d",position); if(ecs_SetText(&(s->result),buffer)) { ecs_SetSuccess(&(s->result)); } } } /* Database of points */ int dbpointqty = 9; dbpointtype dbpoint[9] = {{1, {598924.242,4921629.735}}, {2, {594678.030,4920190.341}}, {3, {594138.258,4917851.326}}, {4, {595937.500,4915224.432}}, {5, {599140.152,4915692.235}}, {6, {601119.318,4916987.689}}, {7, {601227.273,4920082.386}}, {8, {600543.561,4920946.023}}, {9, {598924.242,4921629.735}}}; /* ******************************************************************** FUNCTION_INFORMATION NAME _getNextObjectPoint DESCRIPTION This function retrieves the Point data objects in a sequential access. In the current layer, the geographical objects are related to an index. If the current position in the index is greater than the number of objects in it, then the function will indicate that the selection is completed. The attributes will be dummy values set in the format defined in GetAttributesFormat. An object is filtered in a way that prevents them to be returned if the object is outside the current region. A filter could also be apply in the drivers with a filter expression like VRF. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API ecs_Layer *l: Layer selection infos END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getNextObjectPoint(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[3]; /* Go to the next valid index position. */ while (dbpoint[l->index].geopoint.y < s->currentRegion.south || dbpoint[l->index].geopoint.y > s->currentRegion.north || dbpoint[l->index].geopoint.x < s->currentRegion.west || dbpoint[l->index].geopoint.x > s->currentRegion.east) { l->index++; if (l->index >= l->nbfeature) { break; } } /* If the index is superior to the number of geographical objects in the database, the function returns an error message with an error code of "2" that will simply indicate the end of the selection. Code 1 is for a real error message. */ if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Extract the line at the position l->index. It's a valid polygon. */ ecs_SetGeomPoint(&(s->result),dbpoint[l->index].geopoint.x,dbpoint[l->index].geopoint.y); sprintf(buffer,"%d",l->index); ecs_SetObjectId(&(s->result),buffer); ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbpoint[l->index].geopoint.x, dbpoint[l->index].geopoint.y, dbpoint[l->index].geopoint.x, dbpoint[l->index].geopoint.y); ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); l->index++; ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectPoint DESCRIPTION This function retrieves the Point data objects with a dynamic access. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API ecs_Layer *l: Layer selection infos char *id: A string with the object id number END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectPoint(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int index; char buffer[3]; index = atoi(id); if (index < 0 || index >= l->nbfeature) { ecs_SetError(&(s->result),1,"Invalid point id"); return; } ecs_SetGeomPoint(&(s->result),dbpoint[index].geopoint.x,dbpoint[index].geopoint.y); sprintf(buffer,"%d",index); ecs_SetObjectId(&(s->result),buffer); ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbpoint[index].geopoint.x, dbpoint[index].geopoint.y, dbpoint[index].geopoint.x, dbpoint[index].geopoint.y); ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectIdPoint DESCRIPTION This function retrieves the object id of the nearest point object from a set of coordinates END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API ecs_Layer *l: Layer selection infos ecs_Coordinate *coord: Object coordinate END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectIdPoint(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { double distance,calcdistance; int firstobj; int index,position; char buffer[60]; firstobj = TRUE; index = 0; distance = 0.0; position = -1; while (index <= l->nbfeature) { /* Calculate the shortest distance between the set of given coordinates and a point at the "index" position. */ calcdistance = ((dbpoint[index].geopoint.x - coord->x)*(dbpoint[index].geopoint.x - coord->x)+ (dbpoint[index].geopoint.y - coord->y)*(dbpoint[index].geopoint.y - coord->y)); if (firstobj) { distance = calcdistance; position = index; firstobj = FALSE; } else { if (calcdistance < distance) { distance = calcdistance; position = index; } } index++; } if (position < 0) { ecs_SetError(&(s->result),2,"No point found"); } else { sprintf(buffer,"%d",position); if(ecs_SetText(&(s->result),buffer)) { ecs_SetSuccess(&(s->result)); } } } /* Text point database. */ int dbtextqty = 9; dbtexttype dbtext[9] = {{1, {598924.242,4921629.735}}, {2, {594678.030,4920190.341}}, {3, {594138.258,4917851.326}}, {4, {595937.500,4915224.432}}, {5, {599140.152,4915692.235}}, {6, {601119.318,4916987.689}}, {7, {601227.273,4920082.386}}, {8, {600543.561,4920946.023}}, {9, {598924.242,4921629.735}}}; /* ******************************************************************** FUNCTION_INFORMATION NAME _getNextObjectText DESCRIPTION This function retrieves the Text data objects in a sequential access. In the current layer, the geographical objects are related to an index. If the current position in the index is greater than the number of objects in it, then the function will indicate that the selection is completed. The attributes will be dummy values set in the format defined in GetAttributesFormat. The objects are filtered in a way that prevent them to be returned if an object is outside the current region. A filter could also be applied in the drivers with a filter expression like VRF. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getNextObjectText(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[3]; /* Go to the next valid index position. */ while (dbtext[l->index].geopoint.y < s->currentRegion.south || dbtext[l->index].geopoint.y > s->currentRegion.north || dbtext[l->index].geopoint.x < s->currentRegion.west || dbtext[l->index].geopoint.x > s->currentRegion.east) { l->index++; if (l->index >= l->nbfeature) { break; } } /* If the index is superior to the number of geographical objects in the database, the function returns an error message with an error code of "2" that will simply indicate the end of the selection. Code 1 is for a real error message. */ if (l->index >= l->nbfeature) { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Extract the line at the position l->index. It's a valid polygon. */ sprintf(buffer,"%d",l->index); ecs_SetGeomText(&(s->result),dbtext[l->index].geopoint.x,dbtext[l->index].geopoint.y,buffer); ecs_SetObjectId(&(s->result),buffer); ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbtext[l->index].geopoint.x, dbtext[l->index].geopoint.y, dbtext[l->index].geopoint.x, dbtext[l->index].geopoint.y); ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); l->index++; ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectText DESCRIPTION This function retrieves the Text data objects with a dynamic access. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information char *id: A string with the object id number END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectText(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int index; char buffer[3]; index = atoi(id); if (index < 0 || index >= l->nbfeature) { ecs_SetError(&(s->result),1,"Invalid text id"); return; } sprintf(buffer,"%d",index); ecs_SetGeomText(&(s->result),dbtext[index].geopoint.x,dbtext[index].geopoint.y,buffer); ecs_SetObjectId(&(s->result),buffer); ECS_SETGEOMBOUNDINGBOX((&(s->result)), dbtext[index].geopoint.x, dbtext[index].geopoint.y, dbtext[index].geopoint.x, dbtext[index].geopoint.y); ecs_SetObjectAttr(&(s->result),"{test d'attributs} 1 10.0"); ecs_SetSuccess((&(s->result))); return; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectIdText DESCRIPTION This function retrieves the object id of the nearest text point of a set of coordinates. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information ecs_Coordinate *coord: Object coordinate END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectIdText(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { double distance,calcdistance; int firstobj; int index,position; char buffer[60]; firstobj = TRUE; index = 0; distance = 0.0; position = -1; while (index <= l->nbfeature) { /* Calculate the shortest distance between the coordinate and the point at the position "index" */ calcdistance = ((dbtext[index].geopoint.x - coord->x)*(dbtext[index].geopoint.x - coord->x)+ (dbtext[index].geopoint.y - coord->y)*(dbtext[index].geopoint.y - coord->y)); if (firstobj) { distance = calcdistance; position = index; firstobj = FALSE; } else { if (calcdistance < distance) { distance = calcdistance; position = index; } } index++; } if (position < 0) { ecs_SetError(&(s->result),2,"No text found"); } else { sprintf(buffer,"%d",position); if(ecs_SetText(&(s->result),buffer)) { ecs_SetSuccess(&(s->result)); } } } /* The matrix extraction The matrix extraction with OGDI is different than usual. Actually, these functions do not extract a matrix but a geographic region matrix. The objective is to fit the matrix data selected in this layer into the matrix of the current region. There are two matrices to handle during this operation. The current region matrix that should be considered as a "view" of a given region and the matrix region itself. Both regions are positionned inside a geospatial view. To fill the current region matrix, the value related to each pixel is extracted point by point. With a given pixel in the current region matrix, it is easy to calculate its geographic position. Once this geographic position is found, a resampling is carried out using a nearest-neighbor algorithm to extract the value related to this position in the matrix region. We could do more, suppose your current region is actually a region where the projection was previously changed. In that case, the OGDI contain a RasterConversion module that will automatically set variables in ecs_Server. This is simply a point converter, for a given point in the current projection matrix, the module indicate which point in the projected matrix must be selected. All we need to do is to get the points returned by these functions and get the value related to it as described before. Here is another point about how a raster layer, once transformed and resampled, is returned to the OGDI. This is done row by row in the current region. The values contained in these rows must be non-negative values. In the current example, all the functionality about how to use the projections, the regions and the requests of the OGDI are encapsulated inside the _getNextObjectMatrix and _getObjectMatrix. All the driver programmer needs to do is to modify the code inside _getValueFromCoord. What this function does is to get value at the position i,j in the matrix layer (the data itself). It is important that the region of this matrix fits exactly the matrix region itself. It is also important that the matrix resolution be correctly calculated during the layer initialization. In our example, the matrix contains four rectangular zone. The first zone covers the first quarter of the total number of rows and will be of category 1. The second zone cover the second quarter of the total number of the matrix rows and will be of category 2. The third zone covers the third quarter from the 3/4 of the total matrix rows and go to the last row. There is a gap placed between the half matrix row to the 3/4 to illuatrate the value 0. The 0 value is a non-existing category, all 0 values are considered as empty pixels, and simply indicates those pixels are not members of the layer matrix. */ /* ******************************************************************** FUNCTION_INFORMATION NAME _getNextObjectMatrix DESCRIPTION Extract a row from the position of l->index and return it to OGDI. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getNextObjectMatrix(s,l) ecs_Server *s; ecs_Layer *l; { int i; char buffer[128]; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int totalcol,totalrow; int value; double pos; totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res); lpriv->offsetx = (int) ((s->currentRegion.west - lpriv->matrixregion.west)/lpriv->matrixregion.ew_res); lpriv->offsety = (int) ((lpriv->matrixregion.north - s->currentRegion.north)/lpriv->matrixregion.ns_res); if (l->index >= totalrow) { ecs_SetError(&(s->result),2,"End of selection"); return; } ecs_SetGeomMatrix(&(s->result),totalcol); for (i=0; iindex); ECS_SETGEOMMATRIXVALUE((&(s->result)),i,value); } sprintf(buffer,"%d",l->index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - l->index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) l->index++; ecs_SetSuccess(&(s->result)); } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectMatrix DESCRIPTION This function retrieves the Matrix data row for the position in "id". END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information char *id: A string with the object id number END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectMatrix(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { int index; int i; char buffer[128]; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int totalcol,totalrow; int value; double pos; index = atoi(id); totalcol = (int) ((s->currentRegion.east - s->currentRegion.west)/s->currentRegion.ew_res); totalrow = (int) ((s->currentRegion.north - s->currentRegion.south)/s->currentRegion.ns_res); lpriv->offsetx = (int) ((s->currentRegion.west - lpriv->matrixregion.west)/lpriv->matrixregion.ew_res); lpriv->offsety = (int) ((lpriv->matrixregion.north - s->currentRegion.north)/lpriv->matrixregion.ns_res); if (index < 0 || index >= totalrow) { ecs_SetError(&(s->result),1,"Invalid matrix line id"); return; } ecs_SetGeomMatrix(&(s->result),totalcol); for (i=0; iresult)),i,value); } sprintf(buffer,"%d",index); if (!ecs_SetObjectId(&(s->result),buffer)) { return; } pos = s->currentRegion.north - index*s->currentRegion.ns_res; ECS_SETGEOMBOUNDINGBOX((&(s->result)),s->currentRegion.west, pos+s->currentRegion.ns_res, s->currentRegion.east,pos) ecs_SetSuccess(&(s->result)); } /* ******************************************************************** FUNCTION_INFORMATION NAME _getObjectIdMatrix DESCRIPTION This function retrieves the pixel value from a set of coordinates. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information ecs_Coordinate *coord: Object coordinate END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _getObjectIdMatrix(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; char buffer[128]; int pix_c,pix_r; int value; pix_c = (int) ((coord->x - lpriv->matrixregion.west) / lpriv->matrixregion.ew_res); pix_r = (int) ((coord->y - lpriv->matrixregion.south) / lpriv->matrixregion.ns_res); value = 0; if (pix_c >= 0 && pix_c < lpriv->matrixwidth && pix_r >= 0 && pix_r < lpriv->matrixheight) { value = _getValueFromCoord(s,l,pix_c,pix_r); } sprintf(buffer,"%d",value); if(ecs_SetText(&(s->result),buffer)) { ecs_SetSuccess(&(s->result)); } } /* ******************************************************************** FUNCTION_INFORMATION NAME _calcPosValue DESCRIPTION Get the value of a position i,j in the current region matrix. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information int i: Row in the matrix int j: Column in the matrix END_PARAMETERS RETURN_VALUE int : The category value found by this function END_FUNCTION_INFORMATION ******************************************************************** */ int _calcPosValue(s,l,i,j) ecs_Server *s; ecs_Layer *l; int i; int j; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int pix_c,pix_r; register int value; /* Calculate the geographic position in the current region matrix for the point i,j. */ /* pos_x = s->currentRegion.west + i*s->currentRegion.ew_res; pos_y = s->currentRegion.north - j*s->currentRegion.ns_res; With geographic region calculated, found the nearest pixel position where fall this coordinate. pix_c = (int) ((pos_x - lpriv->matrixregion.west) / lpriv->matrixregion.ew_res); pix_r = (int) ((pos_y - lpriv->matrixregion.south) / lpriv->matrixregion.ns_res); */ pix_c = ((int) (i*s->currentRegion.ew_res/lpriv->matrixregion.ew_res))+lpriv->offsetx; pix_r = ((int) (j*s->currentRegion.ns_res/lpriv->matrixregion.ns_res))+lpriv->offsety; /* Get the value at this pixel position with a special care to check if the point fall inside the matrix. */ if ((pix_c>=0) && (pix_cmatrixwidth) && (pix_r>=0) && (pix_rmatrixheight)) { value = _getValueFromCoord(s,l,pix_c,pix_r); } else { value = 0; } return value; } /* ******************************************************************** FUNCTION_INFORMATION NAME _getValueFromCoord DESCRIPTION Get the value for a position pix_c,pix_r in the current layer matrix. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information int i: Row in the matrix int j: Column in the matrix END_PARAMETERS RETURN_VALUE int : The category value found by this function END_FUNCTION_INFORMATION ******************************************************************** */ int _getValueFromCoord(s,l,pix_c,pix_r) ecs_Server *s; ecs_Layer *l; int pix_c; int pix_r; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int value; (void) pix_c; if (pix_r < ((double) (lpriv->matrixheight/4.0))) value = 1; else if (pix_r < ((double) (lpriv->matrixheight/2.0))) value = 2; else if (pix_r < ((double) (3.0*lpriv->matrixheight/4.0))) value = 0; else value = 3; return value; } ogdi-ogdi_4_1_0/ogdi/driver/skeleton/open.c000066400000000000000000000260641345660466700210010ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME open.c DESCRIPTION Implementation of skeleton open, close and rewind functions END_DESCRIPTION END_CSOURCE_INFORMATION Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #include "skeleton.h" extern int dbareaqty; extern int dblineqty; extern int dbpointqty; extern int dbtextqty; /* ******************************************************************** FUNCTION_INFORMATION NAME _openAreaLayer DESCRIPTION Open and initialize an area vector layer. In our case, this function will do nothing except initializing the index to 0. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS RETURN_VALUE int : An boolean code. TRUE if the operation is a success. FALSE otherwise. END_FUNCTION_INFORMATION ******************************************************************** */ int _openAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; l->nbfeature = dbareaqty; return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME _closeAreaLayer DESCRIPTION Close a skeleton area vector layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _closeAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* ******************************************************************** FUNCTION_INFORMATION NAME _rewindAreaLayer DESCRIPTION Reset the area layer selection. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _rewindAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME _openLineLayer DESCRIPTION Open and initialize a line vector layer. In our case, this function will do nothing except setting the index to 0. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS RETURN_VALUE int : An boolean code. TRUE if the operation is a success. FALSE otherwise. END_FUNCTION_INFORMATION ******************************************************************** */ int _openLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; l->nbfeature = dblineqty; return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME _closeLineLayer DESCRIPTION Close a skeleton line vector layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _closeLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* ******************************************************************** FUNCTION_INFORMATION NAME _rewindLineLayer DESCRIPTION Reset the line layer selection. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _rewindLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME _openPointLayer DESCRIPTION Open and initialize a point vector layer. In our case, this function will do nothing except setting the index to 0. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS RETURN_VALUE int : An boolean code. TRUE if the operation is a success. FALSE otherwise. END_FUNCTION_INFORMATION ******************************************************************** */ int _openPointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; l->nbfeature = dbpointqty; return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME _closePointLayer DESCRIPTION Close a skeleton point vector layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _closePointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* ******************************************************************** FUNCTION_INFORMATION NAME _rewindPointLayer DESCRIPTION Reset the point layer selection. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _rewindPointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME _openTextLayer DESCRIPTION Open and initialize a text vector layer. In our case, this function will do nothing except setting the index to 0. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS RETURN_VALUE int : An boolean code. TRUE if the operation is a success. FALSE otherwise. END_FUNCTION_INFORMATION ******************************************************************** */ int _openTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; l->nbfeature = dbtextqty; return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME _closeTextLayer DESCRIPTION Close a skeleton text vector layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _closeTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* ******************************************************************** FUNCTION_INFORMATION NAME _rewindTextLayer DESCRIPTION Reset the text layer selection. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _rewindTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; } /* ******************************************************************** FUNCTION_INFORMATION NAME _openMatrixLayer DESCRIPTION Open and initialize a matrix vector layer. This function will initialize the matrix region that will be used by the matrix and the matrix width and height. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS RETURN_VALUE int : An boolean code. TRUE if the operation is a success. FALSE otherwise. END_FUNCTION_INFORMATION ******************************************************************** */ int _openMatrixLayer(s,l) ecs_Server *s; ecs_Layer *l; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; (void) s; l->index = 0; lpriv->matrixregion.north = 4925000.0; lpriv->matrixregion.south = 4918000.0; lpriv->matrixregion.east = 597000.0; lpriv->matrixregion.west = 592000.0; lpriv->matrixwidth = 100; lpriv->matrixheight = 100; lpriv->matrixregion.ns_res = ((lpriv->matrixregion.north - lpriv->matrixregion.south)/ ((double) lpriv->matrixwidth)); lpriv->matrixregion.ew_res = ((lpriv->matrixregion.east - lpriv->matrixregion.west)/ ((double) lpriv->matrixheight)); return TRUE; } /* ******************************************************************** FUNCTION_INFORMATION NAME _closeMatrixLayer DESCRIPTION Close a skeleton matrix vector layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _closeMatrixLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* ******************************************************************** FUNCTION_INFORMATION NAME _rewindMatrixLayer DESCRIPTION Reset the matrix layer selection. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Layer *l: Layer selection information END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ void _rewindMatrixLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; l->index = 0; } ogdi-ogdi_4_1_0/ogdi/driver/skeleton/skeleton.c000066400000000000000000001013231345660466700216540ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME skeleton.c DESCRIPTION Implementation of the skeleton driver END_DESCRIPTION MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Procedures changed: dyn_CreateServer() dyn_ReleaseLayer() END_CSOURCE_INFORMATION Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #include "skeleton.h" #include "datadict.h" /* Goal: This driver is an example that helps developers to write new OGDI drivers. Description: The driver is divided in two parts: the usual driver part described here and the "invisible part" that handles global operations (server.c). That must be seen as an object oriented relationship between the server.c and the driver. The server.c is the base class where all common operations, common checks and calls to the driver functions are done. The driver must be seen as an object that inherits from this base class. Because we are working in standard C, this is not totally "Object oriented". The functions are seen by the OGDI as pointers but the ecs_Server structure must be seen as the base class attributes. The ecs_Server structure contains many attributes the driver programmer needs to know. Here is the list of the attributes inside ecs_Server that needed to be used and initialized by the driver. void *priv: The private geographic information of the geographic driver (spriv). int currentLayer: The current layer in use in the driver ecs_Region currentRegion: The current region of the geographic driver ecs_Region globalRegion: The global region of the geographic driver char *projection: The projection string for in case the projection is undefined in the driver. ecs_Result result: Returned structure to the OGDI user The following attributes are handled by server.c. They must not be modified by the driver. char *hostname: The hostname extracted from the URL char *server_type: The server type extracted from the URL char *pathname: The path name extracted from the URL ecs_RasterConversion rasterconversion: Used to convert rasters in the driver ecs_Layer *layer: The table of the layer in use in the driver int nblayer: Quantity of layers in layer. As you notice, everything is handled by this structure. However, this is global information and most of the drivers need to keep more information. For this reason, there is a private structure in the ecs_Server (priv). This is simply a pointer of the private information for the driver. There is an example in skeleton.h (ServerPrivateData). Also, the URL is composed of three parts, the hostname, the driver type and the pathname. The pathname is probably the most important because it contains all the information a driver programmer really needs. To facilitate the operation, the URL was preprocessed and this part is already in the pathname attribute of the ecs_Server structure. The layers ---------- Each time a request is passed to the SelectLayer, a structure is created in memory which is the Layer structure. A layer contains all the necessary information to handle a set of geographic data, whatever the type. To handle a layer and its information, the OGDI provides three important functions: ecs_SetLayer: Create a layer in the driver and return its number ecs_GetLayer: Check if a layer exists and return its number ecs_FreeLayer: Remove a layer from the set of layers. The layers are contained in the "layer" attribute of the ecs_Server structure. We also know the number of layers open and the current layer number, which is the last layer called by ecs_SelectLayer. Here are the attributes available in ecs_Layer useful for the driver programmer: ecs_LayerSelection sel: Layer Selection Information int index: For GetNextObject, the current object extracted int nbfeature: The number of features in a layer. Optional. void *priv: The private geographic information of the geographic driver for a geographic layer. As you notice, there is an equivalent structure pointer to handle information specific to a driver for a particular layer. There is an example of this in the skeleton.h (LayerPrivateData). */ static void _releaseAllLayers _ANSI_ARGS_((ecs_Server *s)); /* Layer oriented functions are kept in data structure to simplify the code */ LayerMethod layerMethod[11] = { /* 0 */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Area */ { _openAreaLayer, _closeAreaLayer, _rewindAreaLayer, _getNextObjectArea, _getObjectArea, _getObjectIdArea }, /* Line */ { _openLineLayer, _closeLineLayer, _rewindLineLayer, _getNextObjectLine, _getObjectLine, _getObjectIdLine }, /* Point */ { _openPointLayer, _closePointLayer, _rewindPointLayer, _getNextObjectPoint, _getObjectPoint, _getObjectIdPoint }, /* Matrix */ { _openMatrixLayer, _closeMatrixLayer, _rewindMatrixLayer, _getNextObjectMatrix, _getObjectMatrix, _getObjectIdMatrix }, /* Image */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Text */ { _openTextLayer, _closeTextLayer, _rewindTextLayer, _getNextObjectText, _getObjectText, _getObjectIdText }, /* Edge */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Face */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Node */ { NULL, NULL, NULL, NULL, NULL, NULL }, /* Ring */ { NULL, NULL, NULL, NULL, NULL, NULL } }; /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_CreateServer DESCRIPTION This function prepares a new skeleton driver interface to a database. When this operation is completed, the user will be able to perform other operations with the other functions of this driver. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Driver info given by the OGDI API char *Request: An complete URL string END_PARAMETERS RETURN_VALUE ecs_Result* : Standard return value to OGDI. This is a very complex structure that handles all the different information that could be returned to the application. MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: Change the east bounding value from 600000 to 608000. The previous value did not enclose all the objects. END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_CreateServer(s,Request) ecs_Server *s; char *Request; { register ServerPrivateData *spriv; (void) Request; /* This code creates the driver private structure. The main purpose of this structure is to keep the global information related to specific aspects of the geographic information accessed by this driver. In this case, the only information initialized is the attribute globaldummy. This attribute will be handled like a very complex structure. */ spriv = s->priv = (ServerPrivateData *) malloc(sizeof(ServerPrivateData)); if (s->priv == NULL) { ecs_SetError(&(s->result), 1, "Could not connect to the skeleton driver, not enough memory"); return &(s->result); } spriv->globaldummy = 1; /* Extract information from Request. Each OGDI driver gets a specific URL that contains necessary information to access the geographic data. Most of the time, the URL contains the file path to a directory, a file or a database. However, this URL must be verified here in order to prevent errors. For more information about the format of the URL, please check the current OGDI documentation. In order to facilitate the operation, the specific information of this driver is already extracted from the URL and placed in the variable s->pathname. For the skeleton driver, the URL will be in the following format gltp:/skeleton/dummyinfo. That mean that s->pathname already contains "dummyinfo"; if not, the driver must return an error message. */ if (strstr(s->pathname,"dummyinfo") == NULL) { /* Don't forget to unallocate the previous priv */ free(s->priv); ecs_SetError(&(s->result), 1, "Incorrect URL format for the skeleton driver."); return &(s->result); } /* Check the database itself. The first operation a programmer should do is to check if the database is in the right format. Then, the programmer can perform the index creation to the different layers and a database connection. */ /* Extracting the bounding rectangle is a difficult process for most of the drivers. The global region could be used as the default region but usually, it outlines the full area that contains all the geographic information in the database. For the sake of the demonstration, the area of Spearfish, South Dakota, will be used in the following. This region is represented in the UTM projection zone 13. The ns_res and the ew_res parameters of the region are the north-south and east-west resolution of each pixel. They are used to calculate the width and the height of the matrix during its extraction. Here, let's take the default size of the matrix to be 100x100. */ s->globalRegion.north = 4928000; s->globalRegion.south = 4914000; /**MOD START**/ s->globalRegion.east = 608000; /**MOD END**/ s->globalRegion.west = 589000; s->globalRegion.ns_res = (s->globalRegion.north - s->globalRegion.south)/100.0; s->globalRegion.ew_res = (s->globalRegion.east - s->globalRegion.west)/100.0; /* Its very important to call ecs_SetSuccess before leaving. This operation prepares the returned function with a success message. This message simply indicates the correct completion of the operation. */ ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_DestroyServer DESCRIPTION Deallocate an existing skeleton driver interface to a database. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; /* Release all layers selection. */ _releaseAllLayers(s); /* Release spriv */ if (spriv != NULL) { spriv->globaldummy = 0; free(spriv); } /* It is very important to call ecs_SetSuccess before leaving. This operation prepares the returned function with a success message. This message simply indicates the correct completion of the operation. */ ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_SelectLayer DESCRIPTION Make a layer selection and prepare the driver to receive commands related to this layer. A layer is a set of geographic objects of a certain type (Line, Area, Matrix, Point, Text, etc.) This set could vary from one kind of database to another but the role remains the same, i.e. define and prepare a layer to perform different operations. The selection request is formed by a string and a family. The family could be Area, Line, Text, Point, Matrix, etc. The string is a description of what to select. For example, VRF contains a string of the form FEATURE_NAME@COVERAGE(REQUEST). That defines a specific feature name (ex: roads), a coverage type (ex: transportation) and a request which is the operation to perform to the feature table (ex: TYPE==double_lane). This string is different from one driver to another. Ex: roads@transportation(roadtype == doubleline) At the end of this operation, if everything goes right, the driver will have access to a new LayerPrivateData in memory. It will remain in memory until a ecs_ReleaseLayer is applied to this layer. You could open as many layers as you want. The only limit is the memory and some system specific limitations (nbr of files on DOS). For this example, the family information will be used to select from various types of selection. However, the string must contain "layername" or this operation will return an error message. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_LayerSelection *sel: Selection information END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_SelectLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; char buffer[100]; /* First, try to find an existing layer with same request and family using ecs_GetLayer. */ if ((layer = ecs_GetLayer(s,sel)) != -1) { /* If it already exists than assign currentLayer and set index to 0 to force a rewind. */ s->currentLayer = layer; s->layer[layer].index = 0; ecs_SetSuccess(&(s->result)); return &(s->result); } /* It did not exist so we try to create it with ecs_SetLayer. Don't forget to set the current layer to this new layer. */ if ((layer = ecs_SetLayer(s,sel)) == -1) { return &(s->result); } s->currentLayer = layer; /* Allocate memory to hold private information about this new layer. */ s->layer[layer].priv = (void *) malloc(sizeof(LayerPrivateData)); if (s->layer[layer].priv == NULL) { /* The operation failed, destroy the layer from the memory. */ ecs_FreeLayer(s,layer); ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); return &(s->result); } /* At this point, you could prepare the information related to the layer itself. All these operations are encapsulated in the "open" attribute function in the layerMethod structure and could vary from one family of geographic objects to another. */ if ((layerMethod[s->layer[layer].sel.F].open) == NULL) { dyn_ReleaseLayer(s,sel); ecs_SetError(&(s->result),1,"Unable to open this layer"); } else { if ((layerMethod[s->layer[layer].sel.F].open)(s,&(s->layer[layer]))) { ecs_SetSuccess(&(s->result)); } else { /* The dyn_ReleaseLayer will change the content of s->result. Don't forget to keep in a buffer the error message before the call. */ if (s->result.message != NULL) strcpy(buffer,s->result.message); dyn_ReleaseLayer(s,sel); ecs_SetError(&(s->result),1,buffer); } } return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_ReleaseLayer DESCRIPTION This command will remove all information about a previously select layer from the memory. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_LayerSelection *sel: Selection information END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: Addition of code to free the private layer structure to avoid memory leaks. Addition of information on the purpose of the "close" attribute function. END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_ReleaseLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; char buffer[200]; /* First, try to find an existing layer with same request and family. */ if ((layer = ecs_GetLayer(s,sel)) == -1) { sprintf(buffer,"Invalid layer %s",sel->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } /* Close all related things to this layer and free, if any, all allocated memory that the lpriv structure could contains. All these operations are encapsulated in the "close" attribute function in the layerMethod structure and could vary from one family of geographic objects to another. */ if ((layerMethod[s->layer[s->currentLayer].sel.F].close) != NULL) { (layerMethod[s->layer[s->currentLayer].sel.F].close)(s,&(s->layer[s->currentLayer])); } /* Free the private layer structure pointer. */ if (s->layer[layer].priv != NULL) { free( s->layer[layer].priv ); s->layer[layer].priv = NULL; } /* Free the layer. */ ecs_FreeLayer(s,layer); if (s->currentLayer == layer) { s->currentLayer = -1; /* just in case released layer was selected */ } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME _releaseAllLayers DESCRIPTION This local command will whipe out of memory all the active layers in this driver END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS END_FUNCTION_INFORMATION ******************************************************************** */ static void _releaseAllLayers(s) ecs_Server *s; { int i; for (i = 0; i < s->nblayer; ++i) dyn_ReleaseLayer(s,&(s->layer[i].sel)); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_SelectRegion DESCRIPTION This command will change the currently used geographic region. The default value of this region is the global region. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Region *gr: Geographical region END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; s->currentRegion.east = gr->east; s->currentRegion.west = gr->west; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; /* Reset currentLayer index to 0 to force a rewind. */ if (s->currentLayer != -1) { s->layer[s->currentLayer].index = 0; } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetDictionary DESCRIPTION Return the itcl_class object related to this driver. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetDictionary(s) ecs_Server *s; { if (ecs_SetText(&(s->result),datadict)) { ecs_SetSuccess(&(s->result)); } return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetAttributesFormat DESCRIPTION Return the attribute format of the currently selected layer. Each vector object contains a string attribute called attr. This string contains the list of attribute values related to the geographic object. This function indicates the complete format and description of these attributes. The format of this description is very similar to the ODBC format. In this example, the attributes format will describe various dummy information. These attributes will be described in the geographic objects. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetAttributesFormat(s) ecs_Server *s; { if (s->layer[s->currentLayer].sel.F == Matrix) { if (!ecs_SetObjAttributeFormat(&(s->result))) return &(s->result); ecs_AddAttributeFormat(&(s->result),"category",Integer,5,0,0); ecs_AddAttributeFormat(&(s->result),"label",Char,80,0,0); } else { if (!ecs_SetObjAttributeFormat(&(s->result))) return &(s->result); /* The first attribute is a string of variable length. */ if(!ecs_AddAttributeFormat(&(s->result), "Variable string name", Varchar, 0, 0, 0)) return &(s->result); /* The second attribute is an integer with a maximum length of 10. */ if(!ecs_AddAttributeFormat(&(s->result), "Integer name", Integer, 10, 0, 0)) return &(s->result); /* The third attribute is a float number with a maximum length of 15 and a precision of 6. */ if(!ecs_AddAttributeFormat(&(s->result), "Float name", Float, 15, 6, 0)) return &(s->result); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetNextObject DESCRIPTION Return the next object for the current layer. In order to do that, an increment (l->index) is used. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetNextObject(s) ecs_Server *s; { if (layerMethod[s->layer[s->currentLayer].sel.F].getNextObject != NULL) { (layerMethod[s->layer[s->currentLayer].sel.F].getNextObject)(s,&(s->layer[s->currentLayer])); } else { ecs_SetError(&(s->result), 1, "GetNextObject is not implemented for this family"); } return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetObject DESCRIPTION Return a requested object for the current layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API char *Id: This string contains the object number END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetObject(s,Id) ecs_Server *s; char *Id; { if (layerMethod[s->layer[s->currentLayer].sel.F].getObject != NULL) { (layerMethod[s->layer[s->currentLayer].sel.F].getObject)(s,&(s->layer[s->currentLayer]),Id); } else { ecs_SetError(&(s->result), 1, "GetObject is not implemented for this family"); } return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetObjectIdFromCoord DESCRIPTION Return the object id sitting at (or near) a coordinate. Each object in the database contain an Id. This function will return the id of the nearest object in the current layer to a given set of coordinates. Depending of the family type, that id could be a vector object id for vector layers or a category for matrix layers. For example, if we select a layer of polylines, this function will return to the user the nearest polyline from the set of coordinates. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API ecs_Coordinate *coord: Geographical coordinate END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetObjectIdFromCoord(s,coord) ecs_Server *s; ecs_Coordinate *coord; { if (layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord != NULL) { (layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord)(s,&(s->layer[s->currentLayer]),coord); } else { ecs_SetError(&(s->result), 1, "GetObjectIdFromCoord is not implemented for this family"); } return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_UpdateDictionary DESCRIPTION Return the content of this database data dictionary in a Tcl List. The content of the database data dictionary could be different from one driver to another. That could be a simple list of file names to a list of mapsets where each mapset is described by a list of data types that is described by a list of datasets. Theorically, each driver returns the database data dictionary in a different format than the other. However, this is the role of the applet (dyn_GetDictionary) to handle this list and to show the user the content of this database. For those who want to get specific information related to a particular part of the database, another argument is available. If this argument is empty, the dyn_UpdateDictionary should work as usual. In this example, a set of information lists will be returned. The first list will be the list of Matrix layers, the second is a list of Area layers, the third is a list of Line layers, the forth is a list of Point layers and the last is a list of Text layers. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API char *arg: A complementary information. Not used. END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_UpdateDictionary(s,arg) ecs_Server *s; char *arg; { (void) arg; /* Make sure an empty list is returned in all cases */ ecs_SetText(&(s->result),""); /* Matrix list */ ecs_AddText(&(s->result), "{ layername dummydatamatrix } "); /* Area list */ ecs_AddText(&(s->result), "{ layername dummydataarea } "); /* Line list */ ecs_AddText(&(s->result), "{ layername dummydataline } "); /* Point list */ ecs_AddText(&(s->result), "{ layername dummydatapoint } "); /* Text list */ ecs_AddText(&(s->result), "{ layername dummydatatext } "); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetServerProjection DESCRIPTION Return the driver cartographic projection. It is important to say that the content of this database remains always constant for all the geographical information of this database. That means the driver can handle one geographic projection at the time for a given database and this could not be changed during a session. It also means that database must be in a uniform projection. The format of the projection is based on the USGS PROJ.4 system. The most important information is given in the OGDI documentation. For more details, go to the following FTP site: ftp://kai.er.usgs.gov/pub/proj.4 For this example, the projection is UTM, zone 13. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetServerProjection(s) ecs_Server *s; { ecs_SetText(&(s->result), "+proj=utm +ellps=clrk66 +zone=13"); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_GetGlobalBound DESCRIPTION Return the database global bounding rectangle. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_GetGlobalBound(s) ecs_Server *s; { ecs_SetGeoRegion(&(s->result),s->globalRegion.north, s->globalRegion.south, s->globalRegion.east, s->globalRegion.west, s->globalRegion.ns_res, s->globalRegion.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_SetServerLanguage DESCRIPTION Set this server language for error message; not yet implemented. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by the OGDI API u_int language: The Microsoft language number END_PARAMETERS RETURN_VALUE ecs_Result* : Standard returned value to OGDI END_FUNCTION_INFORMATION ******************************************************************** */ ecs_Result *dyn_SetServerLanguage(s,language) ecs_Server *s; u_int language; { (void) language; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_SetCompression: * * No compression is used in local databases. * ---------------------------------------------------------------------- */ ecs_Result *dyn_SetCompression(s,compression) ecs_Server *s; ecs_Compression *compression; { (void) compression; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************* FUNCTION_INFORMATION NAME dyn_GetRasterInfo DESCRIPTION Return the raster information for the current layer and set a category table. The category table elements contain a color description, a description of the category and a category number. For this example, only three colors will be defined, and only if the current layer is a matrix. The matrix will have a size of 100x100. END_DESCRIPTION PRECONDITIONS dyn_CreateServer must have been previously called. A SelectLayer must have been successfully called previously. END_PRECONDITIONS POSTCONDITIONS No post conditions END_POSTCONDITIONS PARAMETERS INPUT ecs_Server *s: The driver information END_PARAMETERS RETURN_VALUE ecs_Result *: The result structure common to all OGDI calls. END_FUNCTION_INFORMATION ******************************************************************* */ ecs_Result *dyn_GetRasterInfo(s) ecs_Server *s; { register LayerPrivateData *lpriv; if (s->layer[s->currentLayer].sel.F != Matrix) { ecs_SetError(&(s->result), 1, "The current layer is not a Matrix"); } lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; /* Put the table content in RasterInfo here */ ecs_SetRasterInfo(&(s->result),lpriv->matrixwidth,lpriv->matrixheight); /* Add a category called red for the first category */ ecs_AddRasterInfoCategory(&(s->result),1,255,0,0,"Red",0); /* Add a category called green for the second category */ ecs_AddRasterInfoCategory(&(s->result),2,0,255,0,"Green",0); /* Add a category called blue for the third category */ ecs_AddRasterInfoCategory(&(s->result),3,0,0,255,"Blue",0); ecs_SetSuccess(&(s->result)); return &(s->result); } ogdi-ogdi_4_1_0/ogdi/driver/skeleton/skeleton.def000066400000000000000000000006711345660466700221740ustar00rootroot00000000000000LIBRARY SKELETON CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetAttributesFormat dyn_GetNextObject dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_GetObject dyn_GetObjectIdFromCoord dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage dyn_GetRasterInfo ogdi-ogdi_4_1_0/ogdi/driver/skeleton/skeleton.h000066400000000000000000000201421345660466700216600ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME skeleton.h DESCRIPTION Data structure and prototype definition for the skeleton driver END_DESCRIPTION MOD: Bruno Savard, INFOMAR INC., bsavard@infomar.com, 1998/09/21 Description: Removal of th unused include "glutil.h" END_CSOURCE_INFORMATION Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #ifndef SKELETON_H #define SKELETON_H /********************************************************************* MODULE_INFORMATION NAME Skeleton driver DESCRIPTION This driver is an example to help developers to write new OGDI drivers. It is part of the Open Geospatial Datastore Interface (OGDI). This driver communicates dummy data to the OGDI API. END_DESCRIPTION EXPORTED_FUNCTIONS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetAttributesFormat dyn_GetNextObject dyn_GetObject dyn_GetObjectIdFromCoord dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage END_EXPORTED_FUNCTIONS C_SOURCES skeleton.h skeleton.c object.c open.c utils.c END_C_SOURCES END_MODULE_INFORMATION ****************************************************************/ #include "ecs.h" /********************************************************************* STRUCTURE_INFORMATION NAME LayerPrivateData DESCRIPTION LayerPrivateData holds all the layer information private data. The main idea of this structure is to give the driver programmer a place where to keep specific driver information related to a layer selection. If the layer selection of a driver needs to open a file, this will be the ideal placeholder. END_DESCRIPTION ATTRIBUTES ecs_Region matrixregion: For matrix layers, contain the region occupied by the matrix. int matrixwidth: For matrix layers, the width of the matrix int matrixheight: For matrix layers, the height of the matrix END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { ecs_Region matrixregion; int matrixwidth; int matrixheight; int offsetx; int offsety; } LayerPrivateData; /********************************************************************* STRUCTURE_INFORMATION NAME ServerPrivateData DESCRIPTION ServerPrivateData holds all the driver private data. The idea of this structure is to have a placeholder for the driver specific information. For example, if the driver is a database interface, the database information and its location will be kept in this structure. END_DESCRIPTION ATTRIBUTES int globaldummy: Dummy information. It's here only to show the initialization of a value during dyn_CreateServer operation. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { int globaldummy; } ServerPrivateData; /* open.c prototypes */ int _openAreaLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _closeAreaLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _rewindAreaLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); int _openLineLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _closeLineLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _rewindLineLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); int _openPointLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _closePointLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _rewindPointLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); int _openMatrixLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _closeMatrixLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _rewindMatrixLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); int _openTextLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _closeTextLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _rewindTextLayer _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); /* object.c prototypes */ void _getNextObjectArea _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _getObjectArea _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char *id)); void _getObjectIdArea _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,ecs_Coordinate *coord)); void _getNextObjectLine _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _getObjectLine _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char *id)); void _getObjectIdLine _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,ecs_Coordinate *coord)); void _getNextObjectPoint _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _getObjectPoint _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char *id)); void _getObjectIdPoint _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,ecs_Coordinate *coord)); void _getNextObjectText _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _getObjectText _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char *id)); void _getObjectIdText _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,ecs_Coordinate *coord)); void _getNextObjectMatrix _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l)); void _getObjectMatrix _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char *id)); void _getObjectIdMatrix _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,ecs_Coordinate *coord)); int _calcPosValue _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,int i,int j)); int _getValueFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l,int pix_c,int pix_r)); /* utils.c prototype Usually, all the utility functions are hold here. In our case, the skeleton don't contain any specific functionnality. The utility functions are internal functions for general purpose. */ /* layer structure */ typedef int layerfunc(); typedef void layervoidfunc(); /********************************************************************* STRUCTURE_INFORMATION NAME LayerMethod DESCRIPTION LayerMethod holds all the pointers to geographical access functions. END_DESCRIPTION ATTRIBUTES layerfunc *open: Pointer to a open function layervoidfunc *close: Pointer to a close function layervoidfunc *rewind: Pointer to a rewind function layervoidfunc *getNextObject: Pointer to a GetNextObject function layervoidfunc *getObject: Pointer to a GetObject function layervoidfunc *getObjectIdFromCoord: Pointer to a GetObjectIdFromCoord function END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { layerfunc *open; layervoidfunc *close; layervoidfunc *rewind; layervoidfunc *getNextObject; layervoidfunc *getObject; layervoidfunc *getObjectIdFromCoord; } LayerMethod; /* Here is the "Database" definition itself. Skeleton holds global variables to contain data information of the database. The definitions are in object.c. */ typedef struct { double x,y; } point_data; typedef struct { int id; int arealistlength; point_data arealist[15]; int islandlistlength; point_data islandlist[15]; double north; double south; double east; double west; } dbareatype; typedef struct { int id; int linelistlength; point_data linelist[15]; double north; double south; double east; double west; } dblinetype; typedef struct { int id; point_data geopoint; } dbpointtype; typedef struct { int id; point_data geopoint; } dbtexttype; #endif ogdi-ogdi_4_1_0/ogdi/driver/skeleton/skeleton.mta000066400000000000000000000032001345660466700222060ustar00rootroot00000000000000projection { +proj=utm +ellps=clrk66 +zone=13 } region { -n 4929630 -s 4910960 -e 611611 -w 589126 -res 110} coverage {{-enable 1 -family Matrix -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatamatrix -symbology {{}} -cat {{ -type cat -from 1 -to 1 -color #ff0000 -desc "Red" } { -type cat -from 2 -to 2 -color #00ff00 -desc "Green" } { -type cat -from 3 -to 3 -color #0000ff -desc "Blue" } } -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Area -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydataarea -symbology {{-type stipple -bitmap @$env(BITMAP)/stipple1.xbm -color gray -upscale 10000000000.00 -downscale 0.00} {-type linesegment -color black -width 1 -upscale 10000000000.00 -downscale 0.00}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Line -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydataline -symbology {{-type linesegment -color #ff8040 -width 1 -upscale 10000000000.00 -downscale 0.00 -xoffset 0}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Point -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatapoint -symbology {{-type icon -color black -bitmap @$env(BITMAP)/plussign.xbm -upscale 100000000.0 -downscale 0.0}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Text -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatatext -symbology {{-type annotation -color black -font "-adobe-courier-medium-r-normal--*-120-*" -upscale 10000000000.00 -downscale 0.00}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0}} dynamic {} ogdi-ogdi_4_1_0/ogdi/driver/skeleton/skeletonb.mta000066400000000000000000000030511345660466700223540ustar00rootroot00000000000000projection { +proj=utm +ellps=clrk66 +zone=13 } region { -n 4929630 -s 4910960 -e 611611 -w 589126 -res 110} coverage {{-enable 1 -family Matrix -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatamatrix -symbology {{}} -cat {{ -type cat -from 1 -to 1 -color #ff0000 -desc "Red" } { -type cat -from 2 -to 2 -color #00ff00 -desc "Green" } { -type cat -from 3 -to 3 -color #0000ff -desc "Blue" } } -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Area -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydataarea -symbology {{-type stipple -bitmap @$env(BITMAP)/stipple1.xbm -color gray -upscale 10000000000.00 -downscale 0.00} {-type linesegment -color black -width 1 -upscale 10000000000.00 -downscale 0.00}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Line -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydataline -symbology {{-type linesegment -color #ff8040 -width 1 -upscale 10000000000.00 -downscale 0.00 -xoffset 0}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Point -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatapoint -symbologyProc symbskl -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0} {-enable 1 -family Text -url gltp:/skeleton/C:/Grassland/demo/skeleton/dummyinfo -coverage dummydatatext -symbology {{-type annotation -color black -font "-adobe-courier-medium-r-normal--*-120-*" -upscale 10000000000.00 -downscale 0.00}} -upscale 1e+009 -downscale 0.0 -opaque 0 -cached 0}} dynamic {} ogdi-ogdi_4_1_0/ogdi/driver/skeleton/utils.c000066400000000000000000000017641345660466700212000ustar00rootroot00000000000000/********************************************************************* CSOURCE_INFORMATION NAME utils.c DESCRIPTION Implementation of ARC functions END_DESCRIPTION END_CSOURCE_INFORMATION Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of L.A.S. Inc not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. L.A.S. Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. ********************************************************************/ #include "skeleton.h" ogdi-ogdi_4_1_0/ogdi/driver/vrf/000077500000000000000000000000001345660466700166355ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/driver/vrf/.cvsignore000066400000000000000000000000061345660466700206310ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/driver/vrf/datadict.h000066400000000000000000003512531345660466700205740ustar00rootroot00000000000000static char datadict[] = {'\n' ,'\n' ,'#',' ','c','r','e','a','t','i','o','n',' ','d','e',' ','l','\'','a','p','p','l','e','t',' ','V','R','f' ,'\n' ,'\n' ,'i','t','c','l','_','c','l','a','s','s',' ','V','R','F','_','D','a','t','a','D','i','c','t','i','o','n','a','r','y',' ','{' ,'\n' ,'\n' ,' ',' ',' ',' ','i','n','h','e','r','i','t',' ','d','d' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','c','o','n','s','t','r','u','c','t','o','r',' ','{','w','p','a','t','h',' ','l','o','c','a','t','i','o','n','}',' ','{' ,'\n' ,'\t','d','d',' ','$','w','p','a','t','h',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','d','e','s','t','r','u','c','t','o','r',' ','{' ,'\n' ,'\t','c','a','t','c','h',' ','{','q','u','e','r','y','_','d','e','s','t','r','o','y','}' ,'\n' ,'\t','c','a','t','c','h',' ','{','m','e','t','a','_','d','e','s','t','r','o','y','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','l','a','y','o','u','t',' ','{','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','l','a','y','o','u','t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','b','u','t','t','o','n','s',' ','{','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','b','u','t','t','o','n','s' ,'\n' ,'\t','s','e','t',' ','w','(','b','u','t','t','o','n',')',' ','[','b','u','t','t','o','n',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','d','i','s','m','e','t','a','d','a','t','a',' ','\\' ,'\n' ,'\t','\t','-','t','e','x','t',' ','\"','D','i','s','p','l','a','y',' ','m','e','t','a','d','a','t','a','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','f','_','m','e','t','a','d','a','t','a','\"',']' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','w','(','a','d','d',')',' ','[','b','u','t','t','o','n',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','a','d','d','s','e','l',' ','\\' ,'\n' ,'\t','\t','-','t','e','x','t',' ','\"','A','d','d',' ','S','e','l','e','c','t','i','o','n','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','a','d','d','S','e','l','e','c','t','i','o','n','\"',']' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','w','(','d','e','l',')',' ','[','b','u','t','t','o','n',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','d','e','l','s','e','l',' ','\\' ,'\n' ,'\t','\t','-','t','e','x','t',' ','\"','D','e','l','e','t','e',' ','S','e','l','e','c','t','i','o','n','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','d','e','l','S','e','l','e','c','t','i','o','n','\"',']' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','w','(','e','d','i','t',')',' ','[','b','u','t','t','o','n',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','e','d','i','t','s','e','l',' ','\\' ,'\n' ,'\t','\t','-','t','e','x','t',' ','\"','E','d','i','t',' ','S','e','l','e','c','t','i','o','n','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','e','d','i','t','S','e','l','e','c','t','i','o','n','\"',']' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','d','i','s','m','e','t','a','d','a','t','a',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','a','d','d','s','e','l',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','d','e','l','s','e','l',' ','$','w','i','n','d','o','w','.','b','u','t','t','o','n','s','1','.','e','d','i','t','s','e','l',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','l','e','f','t',' ','\\' ,'\n' ,'\t','\t','-','p','a','d','x',' ','1',' ','\\' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','n','e','w','B','i','n','d','i','n','g',' ','{','w','i','d','g','e','t',' ','y','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','n','e','w','B','i','n','d','i','n','g',' ','$','w','i','d','g','e','t',' ','$','y' ,'\n' ,'\t','s','e','t',' ','s','_','n','e','a','r','e','s','t',' ','[','$','w','i','d','g','e','t',' ','n','e','a','r','e','s','t',' ','$','y',']' ,'\n' ,'\t','i','f',' ','{','$','s','_','n','e','a','r','e','s','t',' ','>','=',' ','0','}',' ','{','\t' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t','b','u','t','t','o','n','s',' ','[','$','w','i','d','g','e','t',' ','g','e','t',' ','$','s','_','n','e','a','r','e','s','t',']' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','s','e','t',' ','t','h','e',' ','b','u','t','t','o','n','s',' ','o','n','/','o','f','f',' ','b','a','s','e','d',' ','o','n',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','s','e','l','e','c','t','i','o','n','\'','s',' ','v','a','l','u','e' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','s','e','t','b','u','t','t','o','n','s',' ','{','e','n','t','r','y','}',' ','{' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','e','n','t','r','y',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','d','i','s','a','b','l','e','b','u','t','t','o','n','s' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\t','i','f',' ','[','r','e','g','e','x','p',' ','\"','^','\\','\\','$','u','s','e','r','c','h','a','r','\"',' ','$','e','n','t','r','y',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','#','p','u','t','s',' ','\"','j','e',' ','s','u','i','s',' ','d','a','n','s',' ','e','n','a','b','l','e','\"' ,'\n' ,'\t',' ',' ',' ',' ','e','n','a','b','l','e','b','u','t','t','o','n','s' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','d','i','s','a','b','l','e','b','u','t','t','o','n','s' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','c','h','a','n','g','e',' ','t','h','e',' ','t','i','t','l','e',' ','o','f',' ','t','h','e',' ','l','i','s','t','b','o','x' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','a','p','L','i','s','t','b','o','x',' ','{','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','m','a','p','L','i','s','t','b','o','x' ,'\n' ,'\t','$','w','i','n','d','o','w','.','c','e','n','t','e','r','.','r','i','g','h','t','.','l','a','y','e','r','s',' ','c','o','n','f','i','g','u','r','e',' ','-','l','a','b','e','l',' ','\"','F','e','a','t','u','r','e','s','\"' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','c','o','n','f','i','g','u','r','e',' ','-','h','e','i','g','h','t',' ','5' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','e','n','a','b','l','e','b','u','t','t','o','n','s' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','e','n','a','b','l','e',' ','t','h','e',' ','\"','d','e','l','e','t','e','\"',' ','&',' ','\"','e','d','i','t','\"',' ','b','u','t','t','o','n','s',',',' ','e','n','a','b','l','e',' ','t','h','e',' ','\"','a','d','d','\"',' ','b','u','t','t','o','n','s' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','e','n','a','b','l','e','b','u','t','t','o','n','s',' ','{','}',' ','{' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',']',' ','\"','\"',']',' ','!','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','w','(','a','d','d',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','w','(','a','d','d',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','e','n','a','b','l','e','d' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','$','w','(','a','d','d',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,'\t','$','w','(','d','e','l',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','n','o','r','m','a','l' ,'\n' ,'\t','$','w','(','e','d','i','t',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','n','o','r','m','a','l' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','d','i','s','a','b','l','e','b','u','t','t','o','n','s' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','d','i','s','a','b','l','e',' ','t','h','e',' ','\"','d','e','l','e','t','e','\"',' ','a','n','d',' ','\"','e','d','i','t','\"',' ','b','u','t','t','o','n','s',',',' ','e','n','a','b','l','e',' ','t','h','e',' ','\"','a','d','d','\"' ,'\n' ,' ',' ',' ',' ','#',' ',' ','i','f',' ','t','h','e','r','e',' ','i','s',' ','s','o','m','e','t','h','i','n','g',' ','s','e','l','e','c','t','e','d','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','s','a','b','l','e','b','u','t','t','o','n','s',' ','{','}',' ','{' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',']',' ','\"','\"',']',' ','!','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','w','(','a','d','d',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','n','o','r','m','a','l' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','w','(','a','d','d',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,'\t','}' ,'\n' ,'\t','$','w','(','d','e','l',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,'\t','$','w','(','e','d','i','t',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','a','d','d','S','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','o','p','e','n',' ','t','h','e',' ','q','u','e','r','y',' ','w','i','n','d','o','w',' ','f','o','r',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','s','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','a','d','d','S','e','l','e','c','t','i','o','n',' ','{','}',' ','{' ,'\n' ,'\t','q','u','e','r','y','_','c','r','e','a','t','e',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']',' ','{','}',' ','[','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',']' ,'\n' ,'\t','#',' ','c','u','r','s','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','d','e','l','S','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','r','e','m','o','v','e',' ','t','h','e',' ','u','s','e','r','-','d','e','f','i','n','e','d',' ','e','x','p','r','e','s','s','i','o','n',' ','a','t',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','s','e','l','e','c','t','i','o','n',' ' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','e','l','S','e','l','e','c','t','i','o','n',' ','{','}',' ','{' ,'\n' ,'\t','r','e','m','o','v','e','E','x','p','r','e','s','s','i','o','n',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']',' ','[','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',']' ,'\n' ,'\t','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']' ,'\n' ,'\t','$','o','b','j','_','l','i','b','r','a','r','i','a','n',' ','i','n','f','o','r','m','B','o','o','k','m','a','r','k','s','C','h','a','n','g','e','d',' ','$','u','r','l',' ','$','t','h','i','s' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','e','d','i','t','S','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','o','p','e','n',' ','t','h','e',' ','q','u','e','r','y',' ','w','i','n','d','o','w',' ','w','i','t','h',' ','t','h','e',' ','u','s','e','r','-','d','e','f','i','n','e','d',' ','q','u','e','r','y',' ','i','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','s','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','e','d','i','t','S','e','l','e','c','t','i','o','n',' ','{','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','s','_','l','s','e','l',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','[','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',']',' ','$','u','s','e','r','c','h','a','r',']' ,'\n' ,'\t','q','u','e','r','y','_','c','r','e','a','t','e',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']',' ','$','s','_','l','s','e','l',' ','{','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','m','o','v','e','E','x','p','r','e','s','s','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','c','l','e','a','n','s',' ','u','p',' ','t','h','e',' ','p','r','i','v','a','t','e',' ','d','a','t','a',' ','a','r','r','a','y','s',' ','a','s','s','o','c','i','a','t','e','d',' ','w','i','t','h',' ','a' ,'\n' ,' ',' ',' ',' ','#',' ',' ','u','s','e','r',' ','d','e','f','i','n','e','d',' ','e','x','p','r','e','s','s','i','o','n',' ','(','c','a','l','l','e','d',' ','o','n','l','y',' ','f','r','o','m',' ','d','e','l','S','e','l','e','c','t','i','o','n',')' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','r','e','m','o','v','e','E','x','p','r','e','s','s','i','o','n',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','i',' ','0' ,'\n' ,'\t','s','e','t',' ','i','n','d','e','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','s','e','t',' ','n','a','m','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','$','n','a','m','e',' ','$','u','s','e','r','c','h','a','r',']' ,'\n' ,'\t','i','f',' ','[','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','n','a','m','e','_','e','x','p','r',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','[','g','e','t','N','a','m','e','F','r','o','m','E','x','p','r','e','s','s','i','o','n',' ','\\' ,'\n' ,'\t','\t','\t','$','n','a','m','e','_','e','x','p','r',']',' ','$','u','s','e','r','c','h','a','r',']',' ','$','n','a','m','e',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','s','e','t',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')',' ','[','l','r','e','p','l','a','c','e',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')',' ','$','i',' ','$','i',']',' ' ,'\n' ,'\t','\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')',']',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t','\t','u','n','s','e','t',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','i','n','d','e','x',')' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t',' ',' ',' ',' ' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','{','}' ,'\n' ,'\t','\t','}' ,'\n' ,'\t','\t','i','n','c','r',' ','i' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','r','e','t','u','r','n',' ','t','h','e',' ','h','i','g','h','l','i','g','h','t','e','d',' ','*','s','t','r','i','n','g','*',' ','i','n',' ','t','h','e',' ','l','i','s','t','b','o','x',' ','(','i','f',' ','a','n','y',')','.' ,'\n' ,' ',' ',' ',' ','#',' ',' ','r','e','t','u','r','n','s',' ','{','}',' ','i','f',' ','n','o','t','h','i','n','g',' ','h','i','g','h','l','i','g','h','t','e','d','.' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','L','i','s','t','S','e','l','e','c','t','i','o','n',' ','{','}',' ','{' ,'\n' ,'\t','s','e','t',' ','w','h','e','r','e',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','c','u','r','s','e','l','e','c','t','i','o','n',']' ,'\n' ,'\t','i','f',' ','{','$','w','h','e','r','e',' ','<',' ','0','}',' ','{','r','e','t','u','r','n',' ','{','}',' ','}' ,'\n' ,'\t','#','r','e','t','u','r','n',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','g','e','t',' ','$','w','h','e','r','e',']' ,'\n' ,'\t','s','e','t',' ','t','o','r','e','t',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','g','e','t',' ','$','w','h','e','r','e',']' ,'\n' ,'\t','s','e','t',' ','p','o','i','n','t','p','l','a','c','e',' ','[','l','s','e','a','r','c','h',' ','-','e','x','a','c','t',' ','$','t','o','r','e','t',' ',':',' ',']' ,'\n' ,'\t','i','f',' ','{','$','p','o','i','n','t','p','l','a','c','e',' ','>','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','n','c','r',' ','p','o','i','n','t','p','l','a','c','e',' ','-','1' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','t','o','r','e','t',' ','[','l','r','a','n','g','e',' ','$','t','o','r','e','t',' ','0',' ','$','p','o','i','n','t','p','l','a','c','e',']',' ',' ' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','t','o','r','e','t',' ','[',' ','l','i','n','d','e','x',' ','$','t','o','r','e','t',' ','0',']' ,'\n' ,'\t','}',' ' ,'\n' ,'\t','#','p','u','t','s',' ','\"','$','t','o','r','e','t','\"' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','t','o','r','e','t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','n','u','s',' ','{','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','m','e','n','u','s' ,'\n' ,'\t' ,'\n' ,'\t','t','i','x','L','a','b','e','l','F','r','a','m','e',' ','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','\\' ,'\n' ,'\t','\t','-','l','a','b','e','l',' ','\"','O','p','t','i','o','n','s','\"',' ','\\' ,'\n' ,'\t','\t','-','l','a','b','e','l','s','i','d','e',' ','a','c','r','o','s','s','t','o','p' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','p','a','t','h',' ','[','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','s','u','b','w','i','d','g','e','t',' ','f','r','a','m','e',']' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','r','e','s','e','t','T','i','x','L','a','b','e','l','F','r','a','m','e','O','p','t','i','o','n','s',' ','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e' ,'\n' ,'\n' ,'\t','s','e','t',' ','m','a','p','O','p','t','i','o','n','s',' ','$','p','a','t','h','.','c','o','v','e','r','a','g','e' ,'\n' ,'\t','t','i','x','O','p','t','i','o','n','M','e','n','u',' ','$','p','a','t','h','.','c','o','v','e','r','a','g','e',' ','-','l','a','b','e','l',' ','\"','C','o','v','e','r','a','g','e',':',' ','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','u','p','d','a','t','e','C','o','v','e','r','a','g','e','S','e','l','e','c','t','i','o','n','\"',' ','\\' ,'\n' ,'\t','\t','-','o','p','t','i','o','n','s',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','l','a','b','e','l',' ','w','i','d','t','h',' ','1','0' ,'\n' ,'\t',' ',' ',' ',' ','l','a','b','e','l',' ','a','n','c','h','o','r',' ','w' ,'\n' ,'\t',' ',' ',' ',' ','m','e','n','u','b','u','t','t','o','n','.','w','i','d','t','h',' ','1','2' ,'\n' ,'\t','}' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','r','e','s','e','t','T','i','x','O','p','t','i','o','n','M','e','n','u','O','p','t','i','o','n','s',' ','$','p','a','t','h','.','c','o','v','e','r','a','g','e' ,'\n' ,'\n' ,'\t','s','e','t',' ','c','l','a','s','s','O','p','t','i','o','n','s',' ','$','p','a','t','h','.','c','l','a','s','s' ,'\n' ,'\t','t','i','x','O','p','t','i','o','n','M','e','n','u',' ','$','p','a','t','h','.','c','l','a','s','s',' ','-','l','a','b','e','l',' ','\"','F','e','a','t','u','r','e',' ','C','l','a','s','s',':',' ','\"',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','u','p','d','a','t','e','L','i','s','t','B','o','x','\"',' ','\\' ,'\n' ,'\t','\t','-','o','p','t','i','o','n','s',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','l','a','b','e','l',' ','w','i','d','t','h',' ','1','0' ,'\n' ,'\t',' ',' ',' ',' ','l','a','b','e','l',' ','a','n','c','h','o','r',' ','w' ,'\n' ,'\t',' ',' ',' ',' ','m','e','n','u','b','u','t','t','o','n','.','w','i','d','t','h',' ','1','2' ,'\n' ,'\t','}' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','r','e','s','e','t','T','i','x','O','p','t','i','o','n','M','e','n','u','O','p','t','i','o','n','s',' ','$','p','a','t','h','.','c','l','a','s','s' ,'\n' ,'\n' ,'\t','p','a','c','k',' ','a','p','p','e','n','d',' ','$','p','a','t','h',' ','\\' ,'\n' ,'\t','\t','$','p','a','t','h','.','c','o','v','e','r','a','g','e',' ','{',' ','l','e','f','t',' ','}',' ','\\' ,'\n' ,'\t','\t','$','p','a','t','h','.','c','l','a','s','s',' ','{',' ','r','i','g','h','t',' ','}' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','i','n','d','o','w','.','m','e','n','u',' ','\\' ,'\n' ,'\t','\t','$','w','i','n','d','o','w','.','m','e','n','u','.','f','r','a','m','e',' ','{','t','o','p',' ','e','x','p','a','n','d',' ','f','i','l','l','x','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','u','p','d','a','t','e','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','o','v','e','r','a','g','e',' ','$','c','o','v','e','r','a','g','e','D','a','t','a',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','m','a','p','O','p','t','i','o','n','s',' ','d','e','l','e','t','e',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','0',']' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','c','o','v','e','r','a','g','e','D','a','t','a',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',' ','c','a','t','_','l','i','s','t',']' ,'\n' ,'\t','#','p','u','t','s',' ','\"','u','p','d','a','t','e','d','i','c','t',' ','u','r','l',':',' ','$','u','r','l','\"' ,'\n' ,'\t' ,'\n' ,'\t','$','m','a','p','O','p','t','i','o','n','s',' ','c','o','n','f','i','g',' ','-','d','i','s','a','b','l','e','c','a','l','l','b','a','c','k',' ','1' ,'\n' ,'\t','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','c','o','n','f','i','g',' ','-','d','i','s','a','b','l','e','c','a','l','l','b','a','c','k',' ','1' ,'\n' ,'\t' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','o','v','e','r','a','g','e',' ','$','c','o','v','e','r','a','g','e','D','a','t','a',' ','{',' ' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','s','_','c','o','v','l','a','b','e','l',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','1',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','c','o','v','l','a','b','e','l',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','s','_','c','o','v','l','a','b','e','l',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','0',']' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t',' ',' ',' ',' ','$','m','a','p','O','p','t','i','o','n','s',' ','a','d','d',' ','c','o','m','m','a','n','d',' ','$','s','_','c','o','v','l','a','b','e','l',' ','-','l','a','b','e','l',' ','$','s','_','c','o','v','l','a','b','e','l' ,'\n' ,'\t',' ',' ',' ',' ','#','i','n','d','e','x',' ','t','h','e',' ','c','o','v','e','r','a','g','e',' ','n','a','m','e',' ','b','y',' ','i','t','s',' ','l','a','b','e','l',' ','n','a','m','e',' ','e','.','g','.',' ','a','_','s','_','l','a','b','e','l','(','s','o','m','e','t','h','i','n','g',')','=','=','S','O' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','a','_','s','_','l','a','b','e','l','(','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','1',']',')',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','0',']' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','l','a','s','s',' ','$','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','c','a','t','c','h',' ','{',' ','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','a','d','d',' ','c','o','m','m','a','n','d',' ','$','c','l','a','s','s',' ','-','l','a','b','e','l',' ','$','c','l','a','s','s',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','c','o','n','f','i','g',' ','-','d','i','s','a','b','l','e','c','a','l','l','b','a','c','k',' ','0' ,'\n' ,'\t','$','m','a','p','O','p','t','i','o','n','s',' ','c','o','n','f','i','g',' ','-','d','i','s','a','b','l','e','c','a','l','l','b','a','c','k',' ','0' ,'\n' ,'\t' ,'\n' ,'\t','u','p','d','a','t','e','C','o','v','e','r','a','g','e','S','e','l','e','c','t','i','o','n',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','u','p','d','a','t','e','C','o','v','e','r','a','g','e','S','e','l','e','c','t','i','o','n',' ','{','a','r','g','s','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']' ,'\n' ,'\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n','s',' ','t','h','e',' ','l','a','b','e','l',' ','o','f',' ','t','h','e',' ','c','o','v','e','r','a','g','e',' ','a','s','s','o','c','i','a','t','e','d',' ','w','i','t','h',' ','t','h','e' ,'\n' ,' ',' ',' ',' ','#',' ','O','p','t','i','o','n',' ','m','e','n','u','\'','s',' ','s','e','l','e','c','t','i','o','n','.',' ',' ','e','.','g','.',' ','i','f',' ','\"','P','o','l','i','t','i','c','a','l',' ','L','i','n','e','s','\"',' ','i','s',' ','s','e','l','e','c','t','e','d',',' ,'\n' ,' ',' ',' ',' ','#',' ','t','h','i','s',' ','r','e','t','u','r','n','s',' ','e','.','g','.',' ','\"','P','O','L','I','N','E','\"' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',' ','{','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','a','_','s','_','l','a','b','e','l','(','[','$','m','a','p','O','p','t','i','o','n','s',' ','c','g','e','t',' ','-','v','a','l','u','e',']',')' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',' ','{','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','[','$','c','l','a','s','s','O','p','t','i','o','n','s',' ','c','g','e','t',' ','-','v','a','l','u','e',']' ,'\n' ,'\t' ,'\n' ,'\t','#','p','u','t','s',' ','\"','c','l','a','s','s',' ','o','p','t','i','o','n',' ',':','$','c','l','a','s','s','O','p','t','i','o','n','s','\"' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','u','p','d','a','t','e','L','i','s','t','b','o','x' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','u','p','d','a','t','e','s',' ','t','h','e',' ','l','i','s','t','b','o','x',' ','w','i','t','h',' ','t','h','e',' ','s','e','l','e','c','t','e','d',' ','c','o','v','e','r','a','g','e',' ','a','n','d',' ','c','l','a','s','s','.' ,'\n' ,' ',' ',' ',' ','#',' ','p','r','e',':',' ','p','r','o','t','e','c','t','e','d',' ','v','a','r','i','a','b','l','e',' ','c','o','v','e','r','a','g','e','D','a','t','a',' ','h','a','s',' ','b','e','e','n',' ','s','e','t',' ','w','i','t','h',' ','l','i','s','t' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','{','s','e','l','e','c','t','e','d','C','l','a','s','s','}',' ','{' ,'\n' ,'\t','#','p','u','t','s',' ','\"','s','e','l','e','c','t','e','d',' ','c','l','a','s','s',':',' ','$','s','e','l','e','c','t','e','d','C','l','a','s','s','\"' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','d','e','l','e','t','e',' ','0',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','s','i','z','e',']' ,'\n' ,'\t','#',' ','p','u','t','s',' ','\"','c','o','v','e','r','a','g','e','D','a','t','a',' ','i','s',' ','$','c','o','v','e','r','a','g','e','D','a','t','a','\"' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','o','v','e','r','a','g','e',' ','$','c','o','v','e','r','a','g','e','D','a','t','a',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','\"','A','r','e','a',' ','L','i','n','e',' ','T','e','x','t',' ','P','o','i','n','t','\"' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','0',']',' ','=','=',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','m','a','p','s',' ','[','l','i','n','d','e','x',' ','$','c','o','v','e','r','a','g','e',' ','[','e','x','p','r',' ','[','l','s','e','a','r','c','h',' ','$','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','$','s','e','l','e','c','t','e','d','C','l','a','s','s',']',' ','+',' ','2',']',']' ,'\n' ,'\t','\t','b','r','e','a','k' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','m','a','p','s',' ','[','c','o','n','c','a','t',' ','$','m','a','p','s',' ','[','g','e','t','U','s','e','r','D','e','f','i','n','e','d',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',' ','$','s','e','l','e','c','t','e','d','C','l','a','s','s',']',']' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','m','a','p',' ','[','l','s','o','r','t',' ','$','m','a','p','s',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','a','p','p','e','n','d','M','a','p','I','t','e','m',' ','$','m','a','p' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t','b','u','t','t','o','n','s',' ','{','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','a','p','p','e','n','d','M','a','p','I','t','e','m' ,'\n' ,' ',' ',' ',' ','#',' ',' ',' ',' ','a','p','p','e','n','d',' ','s','o','m','e','t','h','i','n','g',' ','t','o',' ','t','h','e',' ','l','i','s','t',' ','o','f',' ','m','a','p',' ','i','t','e','m','s','.' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','a','p','p','e','n','d','M','a','p','I','t','e','m',' ','{','i','t','e','m','}',' ','{' ,'\n' ,'\t','s','e','t',' ','m','e','t','a','t','e','x','t',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',']' ,'\n' ,'\t','s','e','t',' ','n','b',' ','[','l','l','e','n','g','t','h',' ','$','m','e','t','a','t','e','x','t',']' ,'\n' ,'\t','s','e','t',' ','d','b','l','i','b','m','e','t','a',' ','[','l','i','n','d','e','x',' ','$','m','e','t','a','t','e','x','t',' ','0',']',' ' ,'\n' ,'\t','s','e','t',' ','a','l','l','c','o','v','s','t','r','i','n','g',' ','[','l','i','n','d','e','x',' ','$','m','e','t','a','t','e','x','t',' ','1',']' ,'\n' ,'\t','s','e','t',' ','d','b','l','i','b','m','e','t','a','2',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a',' ','1',']' ,'\n' ,'\t','s','e','t',' ','d','d','b','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a','2',' ','0',']' ,'\n' ,'\t','#','e','x','t','r','a','c','t','i','o','n',' ','l','i','b','r','a','r','y',' ','m','e','t','a','d','o','n','n','e','e','s' ,'\n' ,'\t','s','e','t',' ','l','i','b','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a','2',' ','1',']' ,'\n' ,'\t','#','e','x','t','r','a','c','t','i','o','n',' ','c','o','v','e','r','a','g','e',' ','m','e','t','a','d','o','n','n','e','e','s','.' ,'\n' ,'\t','#','v','e','r','i','f','i','e',' ','s','i',' ','l','e',' ','c','o','v','e','r','a','g','e',' ','e','s','t',' ','c','e','l','u','i',' ','d','e','m','a','n','d','e',' ','p','a','r',' ','l','\'','u','t','i','l','i','s','a','t','e','u','r','.' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','o','v','s','t','r','i','n','g',' ','$','a','l','l','c','o','v','s','t','r','i','n','g',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','n','a','m','e','c','o','v',' ','[','l','i','n','d','e','x',' ','$','c','o','v','s','t','r','i','n','g',' ','1',']' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','s','e','l','e','c','t','c','o','v',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','n','a','m','e','c','o','v',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',']',' ','=','=','0','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','c','o','v','c','o','m','p','l','e','t','e',' ','[','l','i','n','d','e','x',' ','$','c','o','v','s','t','r','i','n','g',' ','4',']' ,'\n' ,'\t','\t','s','e','t',' ','c','o','v','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','c','o','v','c','o','m','p','l','e','t','e',' ','1',']',' ' ,'\n' ,'\t','\t','f','o','r','e','a','c','h',' ','f','e','a','t','u','r','e',' ','$','c','o','v','m','e','t','a','d','a','t','a',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','s','e','t',' ','f','e','a','t','u','r','e','n','a','m','e',' ','[','l','i','n','d','e','x',' ','$','f','e','a','t','u','r','e',' ','0',']' ,'\n' ,'\t','\t',' ',' ',' ',' ','s','e','t',' ','f','e','a','t','u','r','e','d','e','s','c',' ','[','l','i','n','d','e','x',' ','$','f','e','a','t','u','r','e',' ','1',']' ,'\n' ,'\t','\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','f','e','a','t','u','r','e','n','a','m','e',' ','$','i','t','e','m',']',' ','=','=','0','}',' ','{' ,'\n' ,'\t','\t','\t','s','e','t',' ','i','t','e','m',' ','[','c','o','n','c','a','t',' ','$','i','t','e','m',' ',':',' ','$','f','e','a','t','u','r','e','d','e','s','c',']' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}',' ' ,'\n' ,'\t','}' ,'\n' ,'\t','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','i','t','e','m' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','U','s','e','r','D','e','f','i','n','e','d' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n',' ','a',' ','l','i','s','t',' ','o','f',' ','t','h','e',' ','u','s','e','r','d','e','f','i','n','e','d',' ','e','x','p','r','e','s','s','i','o','n','s' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','U','s','e','r','D','e','f','i','n','e','d',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s','}',' ','{' ,'\n' ,'\t','#',' ','e','x','p','r','e','s','s','i','o','n','s',' ','a','r','e',' ','i','n',' ','t','h','e',' ','f','o','r','m',' ','{','E','X','P','R','E','S','S','I','O','N',' ','{','<','c','o','v','e','r','a','g','e','>',' ','<','c','l','a','s','s','>','}',' ','{','<','n','a','m','e','>','}',' ','{','<','o','r','i','g','i','n','a','l',' ','l','a','y','e','r',' ','n','a','m','e','>','}',' ','{','<','e','x','p','r','e','s','s','i','o','n','>','}','}' ,'\n' ,'\t','#',' ','w','h','e','r','e',' ','<','n','a','m','e','>',' ','i','s',' ','s','u','p','p','l','i','e','d',' ','b','y',' ','t','h','e',' ','u','s','e','r','.' ,'\n' ,'\t','s','e','t',' ','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','i','f',' ','[','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','t','m','p',' ','\"','\"' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','n','a','m','e','_','e','x','p','r',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',' ','{' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','t','m','p',' ','[','g','e','t','N','a','m','e','F','r','o','m','E','x','p','r','e','s','s','i','o','n',' ','$','n','a','m','e','_','e','x','p','r',']' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','$','t','m','p' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','{','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','E','x','p','r','e','s','s','i','o','n' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n',' ','a',' ','l','i','s','t',' ','o','f',' ','t','h','e',' ','u','s','e','r','d','e','f','i','n','e','d',' ','e','x','p','r','e','s','s','i','o','n','s' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','E','x','p','r','e','s','s','i','o','n',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','i','f',' ','[','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',']',' ','{','\t' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','d','a','t','a',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','0',']',' ','$','n','a','m','e',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','2',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','r','e','t','u','r','n',' ','{','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','O','r','i','g','i','n','a','l' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n',' ','t','h','e',' ','o','r','i','g','i','n','a','l',' ','e','x','p','r','e','s','s','i','o','n','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','O','r','i','g','i','n','a','l',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','i','f',' ','[','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',']',' ','{','\t' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','d','a','t','a',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','0',']',' ','$','n','a','m','e',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','1',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','r','e','t','u','r','n',' ','{','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','O','r','i','g','i','n','a','l','N','a','m','e' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n',' ','t','h','e',' ','o','r','i','g','i','n','a','l',' ','n','a','m','e',' ','f','o','r',' ','a','n',' ','e','x','p','r','e','s','s','i','o','n',' ','f','o','r',' ','w','h','e','n' ,'\n' ,' ',' ',' ',' ','#',' ','u','s','e','r',' ','e','d','i','t','s',' ','n','a','m','e',',',' ','t','h','e','n',' ','c','a','n','c','e','l','s','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','O','r','i','g','i','n','a','l','N','a','m','e',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','i','f',' ','[','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',']',' ','{','\t' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','d','a','t','a',' ','$','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','0',']',' ','$','n','a','m','e',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n',' ','[','l','i','n','d','e','x',' ','$','d','a','t','a',' ','1',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','p','o','i','n','t','p','l','a','c','e',' ','[','l','s','e','a','r','c','h',' ','-','e','x','a','c','t',' ','$','n','a','m','e',' ',':',' ',']' ,'\n' ,'\t','i','f',' ','{','$','p','o','i','n','t','p','l','a','c','e',' ','>','=','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','n','c','r',' ','p','o','i','n','t','p','l','a','c','e',' ','-','1' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','n','a','m','e',' ','[','l','r','a','n','g','e',' ','$','n','a','m','e',' ','0',' ','$','p','o','i','n','t','p','l','a','c','e',']' ,'\n' ,'\t','}' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','n','a','m','e' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','P','a','t','h','n','a','m','e' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','c','o','n','s','t','r','u','c','t',' ','a',' ','p','a','t','h','n','a','m','e','.',' ',' ','I','f',' ','t','h','e','r','e',' ','i','s',' ','n','o',' ','e','x','p','r','e','s','s','i','o','n',',',' ','(','*',')',' ','i','s',' ' ,'\n' ,' ',' ',' ',' ','#',' ','a','p','p','e','n','d','e','d',' ','a','s',' ','a',' ','q','u','e','r','y','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','P','a','t','h','n','a','m','e',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','n','a','m','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','$','n','a','m','e',' ','$','u','s','e','r','c','h','a','r',']' ,'\n' ,'\t','s','e','t',' ','e','x','p','r','e','s','s','i','o','n',' ','[','g','e','t','E','x','p','r','e','s','s','i','o','n',' ','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s',' ','$','n','a','m','e',']' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','e','x','p','r','e','s','s','i','o','n',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','e','x','p','r','e','s','s','i','o','n',' ','{','*','}' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','r','e','t','o','u','r',' ','[','g','e','t','O','r','i','g','i','n','a','l','N','a','m','e',' ','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s',' ','$','n','a','m','e',']','@','$','{','c','o','v','e','r','a','g','e','}','(','$','e','x','p','r','e','s','s','i','o','n',')' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','r','e','t','o','u','r' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','N','a','m','e','F','r','o','m','E','x','p','r','e','s','s','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ',' ','r','e','t','u','r','n','s',' ','a',' ','s','t','r','i','n','g',' ','t','h','a','t',' ','c','a','n',' ','b','e',' ','d','i','s','p','l','a','y','e','d',' ','i','n',' ','t','h','e',' ','l','i','s','t','b','o','x','.' ,'\n' ,' ',' ',' ',' ','#',' ',' ','A',' ','s','t','a','r',' ','i','s',' ','a','p','p','e','n','d','e','d','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','N','a','m','e','F','r','o','m','E','x','p','r','e','s','s','i','o','n',' ','{','e','x','p','r','e','s','s','i','o','n','}',' ','{' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','{','u','s','e','r','c','h','a','r','}','[','l','i','n','d','e','x',' ','$','e','x','p','r','e','s','s','i','o','n',' ','0',']' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','_','i','n','s','e','r','t','E','l','e','m','e','n','t',' ',' ','i','n','s','e','r','t',' ','t','h','e',' ','o','p','e','r','a','t','o','r','s',' ','i','n',' ','t','h','e',' ','c','o','m','b','o','B','o','x',' ','o','f' ,'\n' ,' ',' ',' ',' ','#',' ','t','h','e',' ' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','q','u','e','r','y','_','d','e','s','t','r','o','y',' ','{','}',' ','{' ,'\n' ,'\t','i','f',' ','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','(','q','u','e','r','y',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','r','e','l','e','a','s','e','G','r','a','b' ,'\n' ,'\t',' ',' ',' ',' ','d','e','s','t','r','o','y',' ','$','w','(','q','u','e','r','y',')' ,'\n' ,'\t','}' ,'\n' ,'\t','d','i','c','t','_','d','e','s','t','r','o','y' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','q','u','e','r','y','_','d','o','b','u','t','t','o','n','s',' ','{','s','_','c','o','v','e','r','a','g','e',' ','s','_','c','l','a','s','s',' ','s','_','o','r','i','g',' ','w','_','b','f','r','}',' ','{' ,'\n' ,'\n' ,'\t','u','p','d','a','t','e',' ','i','d','l','e','t','a','s','k','s' ,'\n' ,'\t','u','p','d','a','t','e' ,'\n' ,'\t','g','e','t','G','r','a','b',' ','$','w','(','q','u','e','r','y',')' ,'\n' ,'\t','i','f',' ','!','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','_','b','f','r','.','o','k',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','b','u','t','t','o','n',' ','$','w','_','b','f','r','.','o','k',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','t','e','x','t',' ','[','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','G','e','t','S','t','r','i','n','g',' ','M','E','S','S','A','G','E','-','O','K',']',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','w','i','d','t','h',' ','1','0' ,'\n' ,'\t',' ',' ',' ',' ' ,'\n' ,'\t',' ',' ',' ',' ','b','u','t','t','o','n',' ','$','w','_','b','f','r','.','d','a','t','a','d','i','c','t',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','t','e','x','t',' ','\"','D','i','c','t','i','o','n','a','r','y','\"','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','w','i','d','t','h',' ','1','0' ,'\n' ,'\t',' ',' ',' ',' ' ,'\n' ,'\t',' ',' ',' ',' ','b','u','t','t','o','n',' ','$','w','_','b','f','r','.','c','a','n','c','e','l',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','t','e','x','t',' ','[','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','G','e','t','S','t','r','i','n','g',' ','M','E','S','S','A','G','E','-','C','A','N','C','E','L',']',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','q','u','e','r','y','_','c','a','n','c','e','l','\"',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-','w','i','d','t','h',' ','1','0' ,'\n' ,'\t',' ',' ',' ',' ' ,'\n' ,'\t',' ',' ',' ',' ','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','_','b','f','r',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','w','_','b','f','r','.','o','k',' ','{',' ','l','e','f','t',' ','p','a','d','x',' ','1',' ','e','x','p','a','n','d',' ','}',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','w','_','b','f','r','.','d','a','t','a','d','i','c','t',' ','{',' ','l','e','f','t',' ','p','a','d','x',' ','1',' ','e','x','p','a','n','d',' ','}',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','w','_','b','f','r','.','c','a','n','c','e','l',' ','{',' ','l','e','f','t',' ','p','a','d','x',' ','1',' ','e','x','p','a','n','d',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','$','w','_','b','f','r','.','o','k',' ','c','o','n','f','i','g','u','r','e',' ','-','c','o','m','m','a','n','d',' ','[','l','i','s','t',' ','$','t','h','i','s',' ','q','u','e','r','y','_','s','a','v','e',' ','$','s','_','c','o','v','e','r','a','g','e',' ','$','s','_','c','l','a','s','s',' ','$','s','_','o','r','i','g',' ','[','$','w','(','e','n','t','r','y',')',' ','g','e','t',']',']' ,'\n' ,'\t','$','w','_','b','f','r','.','d','a','t','a','d','i','c','t',' ','c','o','n','f','i','g','u','r','e',' ','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','d','i','c','t','_','s','h','o','w','d','i','c','t',';',' ','$','t','h','i','s',' ','d','i','c','t','_','u','p','d','a','t','e',' ','$','s','_','c','o','v','e','r','a','g','e',' ','$','s','_','c','l','a','s','s',' ','$','s','_','o','r','i','g','\"','\\' ,'\n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','q','u','e','r','y','_','s','a','v','e',' ','{','s','_','c','o','v','e','r','a','g','e',' ','s','_','c','l','a','s','s',' ','s','_','o','r','i','g',' ','s','_','o','l','d','n','a','m','e','}',' ','{' ,'\n' ,'\t','s','e','t',' ','s','_','n','a','m','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m',' ','[','$','w','(','e','n','t','r','y',')',' ','g','e','t',']',']' ,'\n' ,'\t','s','e','t',' ','s','_','n','a','m','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','$','s','_','n','a','m','e',' ','$','u','s','e','r','c','h','a','r',']' ,'\n' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','n','a','m','e',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','Y','o','u',' ','m','u','s','t',' ','s','p','e','c','i','f','y',' ','a',' ','n','a','m','e',' ','f','o','r',' ','t','h','i','s',' ','e','x','p','r','e','s','s','i','o','n','.','\"' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','s','_','t','e','x','t',' ','[','s','t','r','i','n','g',' ','t','r','i','m',' ','[','$','w','(','t','e','x','t',')',' ','g','e','t',']',']',' ',';','#','y','k',' ','1','.','0' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','t','e','x','t',' ','\"','\"',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','Y','o','u',' ','m','u','s','t',' ','e','n','t','e','r',' ','a','n',' ','e','x','p','r','e','s','s','i','o','n','.','\"' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','s','_','e','x','i','s','t','i','n','g',' ','[','$','m','a','p','L','i','s','t',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',' ','g','e','t',' ','0',' ','e','n','d',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','n','a','m','e',' ','[','s','t','r','i','n','g',' ','t','r','i','m','l','e','f','t',' ','$','s','_','e','x','i','s','t','i','n','g',' ','$','u','s','e','r','c','h','a','r',']',']',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','o','l','d','n','a','m','e',' ','$','s','_','n','a','m','e',']',' ','!','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','S','o','m','e','t','h','i','n','g',' ','w','i','t','h',' ','t','h','i','s',' ','n','a','m','e',' ','a','l','r','e','a','d','y',' ','e','x','i','s','t','s','.','\"' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\n' ,'\t','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','o','l','d','n','a','m','e',' ','\"','\"',']',' ','!','=',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','r','e','m','o','v','e','E','x','p','r','e','s','s','i','o','n',' ','$','s','_','c','o','v','e','r','a','g','e',' ','$','s','_','c','l','a','s','s',' ','$','s','_','o','l','d','n','a','m','e' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','a','p','p','e','n','d','E','x','p','r','e','s','s','i','o','n',' ','$','s','_','c','o','v','e','r','a','g','e',' ','$','s','_','c','l','a','s','s',' ','[','l','i','s','t',' ','$','s','_','n','a','m','e',' ','$','s','_','o','r','i','g',' ','$','s','_','t','e','x','t',']' ,'\n' ,'\t','#',' ','i','f',' ','t','h','i','s',' ','c','o','v','e','r','a','g','e','/','c','l','a','s','s',' ','i','s',' ','s','t','i','l','l',' ','v','i','s','i','b','l','e',',',' ','s','h','o','w',' ','i','t' ,'\n' ,'\t','i','f',' ','{','(','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','c','o','v','e','r','a','g','e',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',']',' ','=','=',' ','0',')',' ','&','&' ,'\n' ,'\t','(','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','s','_','c','l','a','s','s',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']',']',' ','=','=',' ','0',')','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','#','a','p','p','e','n','d','M','a','p','I','t','e','m',' ','$','{','u','s','e','r','c','h','a','r','}','$','s','_','n','a','m','e' ,'\n' ,'\t',' ',' ',' ',' ','u','p','d','a','t','e','L','i','s','t','B','o','x',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']' ,'\n' ,'\t','}' ,'\n' ,'\t','$','o','b','j','_','l','i','b','r','a','r','i','a','n',' ','i','n','f','o','r','m','B','o','o','k','m','a','r','k','s','C','h','a','n','g','e','d',' ','$','u','r','l',' ','$','t','h','i','s' ,'\n' ,'\t','q','u','e','r','y','_','d','e','s','t','r','o','y' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','q','u','e','r','y','_','c','a','n','c','e','l',' ','{','}',' ','{' ,'\n' ,'\t','q','u','e','r','y','_','d','e','s','t','r','o','y' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','q','u','e','r','y','_','i','n','i','t','i','a','l','i','z','e',' ','{','s','_','s','t','r','}',' ','{' ,'\n' ,'\t','$','w','(','t','e','x','t',')',' ','d','e','l','e','t','e',' ','1','.','0',' ','e','n','d' ,'\n' ,'\t','$','w','(','t','e','x','t',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','s','_','s','t','r' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','t','h','e',' ','d','a','t','a',' ','d','i','c','t','i','o','n','a','r','y',' ','w','i','n','d','o','w','.','.','.','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','c','t','_','s','h','o','w','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t','s','e','t',' ','w','(','d','d',')',' ','.','d','i','c','t','_','$','{','t','h','i','s','}' ,'\n' ,'\t','i','f',' ','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','(','d','d',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','w','m',' ','d','e','i','c','o','n','i','f','y',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','r','a','i','s','e',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\t','d','i','c','t','_','l','a','y','o','u','t','d','i','c','t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','c','t','_','l','a','y','o','u','t','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t','t','o','p','l','e','v','e','l',' ','$','w','(','d','d',')' ,'\n' ,'\t','w','m',' ','t','i','t','l','e',' ','$','w','(','d','d',')',' ','\"','D','a','t','a',' ','D','i','c','t','i','o','n','a','r','y','\"' ,'\n' ,'\t','p','a','c','k',' ','[','t','i','x','L','a','b','e','l','F','r','a','m','e',' ','$','w','(','d','d',')','.','f','r',' ','-','l','a','b','e','l',' ','\"','D','a','t','a',' ','D','i','c','t','i','o','n','a','r','y','\"',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','r','e','s','e','t','T','i','x','L','a','b','e','l','F','r','a','m','e','O','p','t','i','o','n','s',' ','$','w','(','d','d',')','.','f','r' ,'\n' ,'\t','s','e','t',' ','w','(','d','d','f','r',')',' ','[','$','w','(','d','d',')','.','f','r',' ','s','u','b','w','i','d','g','e','t',' ','f','r','a','m','e',']' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','(','d','d','t','e','x','t',')',' ','[','t','e','x','t',' ','$','w','(','d','d','f','r',')','.','t','e','x','t',' ','\\' ,'\n' ,'\t','\t','-','h','e','i','g','h','t',' ','2','4',' ','\\' ,'\n' ,'\t','\t','-','w','i','d','t','h',' ','8','0','\\' ,'\n' ,'\t','\t','-','y','s','c','r','o','l','l','c','o','m','m','a','n','d',' ','\"','$','w','(','d','d','f','r',')','.','s','b','y',' ','s','e','t','\"',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','l','e','f','t',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h',' ' ,'\n' ,'\t','p','a','c','k',' ','[','s','c','r','o','l','l','b','a','r',' ','$','w','(','d','d','f','r',')','.','s','b','y',' ','\\' ,'\n' ,'\t','\t','-','o','r','i','e','n','t',' ','v','e','r','t','i','c','a','l',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','[','l','i','s','t',' ','$','w','(','d','d','t','e','x','t',')',' ','y','v','i','e','w',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','r','i','g','h','t',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','y' ,'\n' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','_','b','f','r',' ','[','f','r','a','m','e',' ','$','w','(','d','d',')','.','b','f','r',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','x',' ','\\' ,'\n' ,'\t','\t','-','p','a','d','y',' ','2',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','f','a','l','s','e' ,'\n' ,'\t','p','a','c','k',' ','[','b','u','t','t','o','n',' ','$','w','_','b','f','r','.','o','k',' ','-','t','e','x','t',' ','O','K',' ','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','d','i','c','t','_','k','i','l','l','d','i','c','t','\"',' ','-','w','i','d','t','h',' ','1','0',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','f','a','l','s','e' ,'\n' ,'\t','s','e','t',' ','x',' ','[','e','x','p','r',' ','[','w','i','n','f','o',' ','s','c','r','e','e','n','w','i','d','t','h',' ','$','w','(','d','d',')',']','/','2',' ','-',' ','[','w','i','n','f','o',' ','r','e','q','w','i','d','t','h',' ','$','w','(','d','d',')',']','/','2',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-',' ','[','w','i','n','f','o',' ','v','r','o','o','t','x',' ','[','w','i','n','f','o',' ','p','a','r','e','n','t',' ','$','w','(','q','u','e','r','y',')',']',']',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','$','x',' ','<',' ','0','}',' ','{','s','e','t',' ','x',' ','0','}' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','y',' ','[','e','x','p','r',' ','[','w','i','n','f','o',' ','s','c','r','e','e','n','h','e','i','g','h','t',' ','$','w','(','d','d',')',']','/','2',' ','-',' ','[','w','i','n','f','o',' ','r','e','q','h','e','i','g','h','t',' ','$','w','(','d','d',')',']','/','2',' ','\\' ,'\n' ,'\t','\t',' ',' ',' ',' ','-',' ','[','w','i','n','f','o',' ','v','r','o','o','t','y',' ','[','w','i','n','f','o',' ','p','a','r','e','n','t',' ','$','w','(','d','d',')',']',']',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','$','y',' ','<',' ','0','}',' ','{','s','e','t',' ','y',' ','0','}' ,'\n' ,'\t',' ',' ',' ',' ','w','m',' ','g','e','o','m',' ','$','w','(','d','d',')',' ',' ','+','$','x','+','$','y' ,'\n' ,'\n' ,'\t','u','p','d','a','t','e',' ','i','d','l','e','t','a','s','k','s' ,'\n' ,'\t','u','p','d','a','t','e' ,'\n' ,'\t','g','e','t','G','r','a','b',' ','$','w','(','d','d',')','\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','c','t','_','d','e','s','t','r','o','y',' ','{','}',' ','{' ,'\n' ,'\t','i','f',' ','[',':',':','i','n','f','o',' ','e','x','i','s','t','s',' ','w','(','d','d',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','(','d','d',')',']',' ','{' ,'\n' ,'\t','\t','r','e','l','e','a','s','e','G','r','a','b' ,'\n' ,'\t','\t','d','e','s','t','r','o','y',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','c','t','_','u','p','d','a','t','e',' ','{','s','_','c','o','v','e','r','a','g','e',' ','s','_','c','l','a','s','s',' ','s','_','o','r','i','g','}',' ','{' ,'\n' ,'\t','#','$','w','(','d','d','t','e','x','t',')',' ','d','e','l','e','t','e',' ','1','.','0',' ','e','n','d' ,'\n' ,' ',' ',' ',' ',' ',' ',' ',' ','i','f',' ','[','c','a','t','c','h',' ','{','$','w','(','d','d','t','e','x','t',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',' ','[','g','e','t','P','a','t','h','n','a','m','e',' ','$','s','_','c','o','v','e','r','a','g','e',' ','$','s','_','c','l','a','s','s',' ','$','s','_','o','r','i','g',']',']','}',' ','s','_','r','e','s','u','l','t',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','C','o','u','l','d',' ','n','o','t',' ','r','e','t','r','i','e','v','e',' ','t','h','e',' ','d','i','c','t','i','o','n','a','r','y','\"' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','d','i','c','t','_','k','i','l','l','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','r','e','l','e','a','s','e','G','r','a','b' ,'\n' ,'\t','d','e','s','t','r','o','y',' ','$','w','(','d','d',')' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','S','O','M','E',' ','O','V','E','R','R','I','D','D','E','N',' ','P','R','O','C','E','D','U','R','E','S',':' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','p','a','r','s','e','E','x','p','r','e','s','s','i','o','n',' ','{','s','_','s','t','r','i','n','g','}',' ','{' ,'\n' ,'\t','#',' ','e','x','p','r','e','s','s','i','o','n','s',' ','a','r','e',' ','i','n',' ','t','h','e',' ','f','o','r','m',' ','{','{','E','X','P','R','E','S','S','I','O','N',' ','{','{','<','c','o','v','e','r','a','g','e','>',' ','<','c','l','a','s','s','>','}',' ','{','<','n','a','m','e','>',' ','<','o','r','i','g','>',' ','<','e','x','p','r','e','s','s','i','o','n','>','}',' ','.','.','.','}',' ','\\' ,'\n' ,'\t','#','{','{','<','c','o','v','e','r','a','g','e','>',' ','<','c','l','a','s','s','>','}',' ','{','<','n','a','m','e','>',' ','<','o','r','i','g','>',' ','<','e','x','p','r','e','s','s','i','o','n','>','}',' ','.','.','.',' ','}',' ','.','.','.','}','}' ,'\n' ,'\t','#',' ','w','h','e','r','e',' ','<','n','a','m','e','>',' ','i','s',' ','s','u','p','p','l','i','e','d',' ','b','y',' ','t','h','e',' ','u','s','e','r','.' ,'\n' ,' ',' ',' ',' ',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','c','o','v','_','c','l','a','s','s',' ','[','l','i','n','d','e','x',' ','$','s','_','s','t','r','i','n','g',' ','1',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','n','a','m','e','_','e','x','p','r',' ','[','l','i','n','d','e','x',' ','$','c','o','v','_','c','l','a','s','s',' ','1',']',' ','{' ,'\n' ,'\t','\t','e','v','a','l',' ','a','p','p','e','n','d','E','x','p','r','e','s','s','i','o','n',' ','[','l','i','n','d','e','x',' ','$','c','o','v','_','c','l','a','s','s',' ','0',']',' ','{','[','l','i','s','t',' ','[','l','i','n','d','e','x',' ','$','n','a','m','e','_','e','x','p','r',' ','0',']',' ','[','l','i','n','d','e','x',' ','$','n','a','m','e','_','e','x','p','r',' ','1',']',' ','[','l','i','n','d','e','x',' ','$','n','a','m','e','_','e','x','p','r',' ','2',']',']','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','s','e','t','M','B','R',' ','{','s','_','s','t','r','i','n','g','}',' ','{' ,'\n' ,'\t','#',' ','m','a','x','i','m','u','m',' ','b','o','u','n','d','i','n','g',' ','r','e','c','t','a','n','g','l','e',' ','i','s',' ','i','n',' ','t','h','e',' ','f','o','r','m',' ','{','M','B','R',' ','N',' ','E',' ','S',' ','W','}','.' ,'\n' ,'\t','s','e','t',' ','p','r','i','v','d','a','t','a','(','m','b','r',')',' ','[','l','i','n','d','e','x',' ','$','s','_','s','t','r','i','n','g',' ','1',']' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','s','e','t','s',' ','t','h','e',' ','d','a','t','a',' ','s','t','r','u','c','t','u','r','e',' ','f','o','r',' ','t','h','e',' ','p','r','i','v','a','t','e',' ','d','a','t','a' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','s','e','t','P','r','i','v','a','t','e','D','a','t','a',' ','{','l','_','s','t','r','i','n','g','}',' ','{' ,'\n' ,'\t','p','r','e','v','i','o','u','s',' ','s','e','t','P','r','i','v','a','t','e','D','a','t','a',' ','$','l','_','s','t','r','i','n','g' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','s','_','s','t','r','i','n','g',' ','$','l','_','s','t','r','i','n','g',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','s','_','t','y','p','e',' ','[','s','t','r','i','n','g',' ','t','o','l','o','w','e','r',' ','[','l','i','n','d','e','x',' ','$','s','_','s','t','r','i','n','g',' ','0',']',']' ,'\n' ,'\t',' ',' ',' ',' ','s','w','i','t','c','h',' ','-','-',' ','$','s','_','t','y','p','e',' ','{' ,'\n' ,'\t','\t','e','x','p','r','e','s','s','i','o','n',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','p','a','r','s','e','E','x','p','r','e','s','s','i','o','n',' ','$','s','_','s','t','r','i','n','g' ,'\n' ,'\t','\t','}' ,'\n' ,'\t','\t','m','b','r',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','s','e','t','M','B','R',' ','$','s','_','s','t','r','i','n','g' ,'\n' ,'\t','\t','}' ,'\n' ,'\t','\t','d','e','f','a','u','l','t',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','#','p','u','t','s',' ','\"','c','o','u','l','d','n','\'','t',' ','u','n','d','e','r','s','t','a','n','d',' ','$','s','_','t','y','p','e','\"' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#',' ','e','x','p','r','e','s','s','i','o','n',' ','i','s',' ','i','n',' ','t','h','e',' ','f','o','r','m',' ','{','<','n','a','m','e','>',' ','<','o','r','i','g','>',' ','<','e','x','p','r','e','s','s','i','o','n','>','}' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','a','p','p','e','n','d','E','x','p','r','e','s','s','i','o','n',' ','{','c','o','v','e','r','a','g','e',' ','c','l','a','s','s',' ','e','x','p','r','e','s','s','i','o','n','}',' ','{' ,'\n' ,'\t','s','e','t',' ','x',' ','\"','$','c','o','v','e','r','a','g','e',' ','$','c','l','a','s','s','\"' ,'\n' ,'\t','l','a','p','p','e','n','d',' ','p','r','i','v','d','a','t','a','(','e','x','p','r','e','s','s','i','o','n',',','$','x',')',' ','$','e','x','p','r','e','s','s','i','o','n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','g','e','t','B','o','o','k','m','a','r','k','E','n','t','r','y' ,'\n' ,' ',' ',' ',' ','#',' ' ,'\n' ,' ',' ',' ',' ','#',' ','r','e','t','u','r','n','s',' ','t','h','e',' ','c','u','r','r','e','n','t',' ','s','t','a','t','e',' ','o','f',' ','t','h','e',' ','b','o','o','k','m','a','r','k','.',' ',' ','T','h','i','s',' ','i','s' ,'\n' ,' ',' ',' ',' ','#',' ','c','a','l','l','e','d',' ','b','y',' ','t','h','e',' ','l','i','b','r','a','r','i','a','n',' ','a','s',' ','s','o','o','n',' ','a','s',' ','t','h','e',' ','d','d',' ','i','n','f','o','r','m','s' ,'\n' ,' ',' ',' ',' ','#',' ','i','t',' ','t','h','a','t',' ','t','h','e',' ','b','o','o','k','m','a','r','k','s',' ','h','a','v','e',' ','c','h','a','n','g','e','d','.' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','B','o','o','k','m','a','r','k','E','n','t','r','y',' ','{','}',' ','{' ,'\n' ,'\t','s','e','t',' ','t','m','p',' ','\"','\"' ,'\n' ,'\t','s','e','t',' ','a','l','l','f','i','e','l','d','s',' ','\"','\"' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','p','r','i','v',' ','[','a','r','r','a','y',' ','n','a','m','e','s',' ','p','r','i','v','d','a','t','a',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','[','r','e','g','s','u','b',' ','{','e','x','p','r','e','s','s','i','o','n',',','}',' ','$','p','r','i','v',' ','{','}',' ','i','n','d','e','x',']',' ','{' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','t','m','p',' ','[','l','i','s','t',' ','$','i','n','d','e','x',' ','$','p','r','i','v','d','a','t','a','(','$','p','r','i','v',')',']' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','i','f',' ','{','[','l','l','e','n','g','t','h',' ','$','t','m','p',']',' ','>',' ','0','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','a','l','l','f','i','e','l','d','s',' ','[','l','i','s','t',' ','E','X','P','R','E','S','S','I','O','N',' ','$','t','m','p',']' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','#',' ','i','f',' ','t','h','e','r','e',' ','i','s',' ','n','o',' ','m','b','r',',',' ','f','i','g','u','r','e',' ','o','u','t',' ','w','h','a','t',' ','i','t',' ','i','s','.' ,'\n' ,'\t','i','f',' ','!','[',':',':','i','n','f','o',' ','e','x','i','s','t','s',' ','p','r','i','v','d','a','t','a','(','m','b','r',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','!','[','c','a','t','c','h',' ','{','s','e','t',' ','l','_','g','g','b',' ','[','l','r','a','n','g','e',' ','[','e','c','s','_','G','e','t','G','l','o','b','a','l','B','o','u','n','d',' ','$','u','r','l',']',' ','0',' ','3',']','}',']',' ','{' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','a','l','l','f','i','e','l','d','s',' ','[','l','i','s','t',' ','M','B','R',' ','$','l','_','g','g','b',']' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','a','l','l','f','i','e','l','d','s',' ','[','l','i','s','t',' ','M','B','R',' ','$','p','r','i','v','d','a','t','a','(','m','b','r',')',']' ,'\n' ,'\t','}' ,'\n' ,'\t','#','p','u','t','s',' ','\"','a','l','l','f','i','e','l','d','s',' ','i','s',' ','>','$','a','l','l','f','i','e','l','d','s','<','\"' ,'\n' ,'\t','r','e','t','u','r','n',' ','$','a','l','l','f','i','e','l','d','s' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','g','e','t','a','l','l',' ','{','}',' ','{' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','p','r',' ','[','a','r','r','a','y',' ','n','a','m','e','s',' ','p','r','i','v','d','a','t','a',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','p','u','t','s',' ','\"','p','r','i','v','d','a','t','a','(','$','p','r',')','=','>','$','p','r','i','v','d','a','t','a','(','$','p','r',')','\"' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','_','i','n','s','e','r','t','A','t','t','r','i','b','u','t','e','s',' ','{',' ','w','_','c','o','m','b','o','b','o','x','A','t','t','r','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','x',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',' ','[','$','t','h','i','s',' ','g','e','t','C','u','r','r','e','n','t','P','a','t','h','n','a','m','e',']',']' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','p',' ','[','$','t','h','i','s',' ','g','e','t','C','u','r','r','e','n','t','S','e','l','e','c','t','i','o','n',']' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','l',' ','[','s','p','l','i','t',' ','$','x',' ','\\','n',']' ,'\n' ,'\t','s','e','t',' ','c','l','a','s','s','e',' ','[','v','i','r','t','u','a','l',' ','g','e','t','S','e','l','e','c','t','e','d','C','l','a','s','s',']' ,'\n' ,'\t' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','x',' ','$','l',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','#','\t','s','e','t',' ','a','t','t','r','i','b','u','t','e',' ','[','s','t','r','i','n','g',' ','m','a','t','c','h',' ','$','x',' ','[','=',']',']' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','a','t','t','r','i','b','u','t','e',' ','[','r','e','g','e','x','p',' ',' ','-','n','o','c','a','s','e',' ','{','^',' ',' ','}',' ','$','x',' ','t','m','p',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','$','a','t','t','r','i','b','u','t','e',' ','=','=',' ','1',' ','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','a','t','t','r','i','b','u','t','e','2',' ','[','s','t','r','i','n','g',' ','m','a','t','c','h',' ','\"','*','=','*','\"',' ','$','x',']' ,'\n' ,'\t','\t','i','f',' ','{','$','a','t','t','r','i','b','u','t','e','2',' ','=','=',' ','0','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','w','_','c','o','m','b','o','b','o','x','A','t','t','r',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','s','t','r','i','n','g',' ','t','r','i','m',' ','$','x',' ','\"',' ','\"',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','_','i','n','s','e','r','t','V','a','l','u','e','s',' ','i','n','s','e','r','t',' ','t','h','e',' ','v','a','l','u','e','s',' ','i','n',' ','t','h','e',' ','l','i','s','t',' ','o','f',' ','v','a','l','u','e','s','.' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','_','i','n','s','e','r','t','V','a','l','u','e','s',' ','{',' ','w','_','c','o','m','b','o','b','o','x','V','a','l','u','e','s',' ','a','t','t','r','i','b','u','t','e','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','x',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',' ','[','$','t','h','i','s',' ','g','e','t','C','u','r','r','e','n','t','P','a','t','h','n','a','m','e',']',']' ,'\n' ,'\t','i','f',' ','{','$','a','t','t','r','i','b','u','t','e',' ','=','=',' ','\"','\"',' ','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','c','o','m','b','o',' ','[','$','w','_','c','o','m','b','o','b','o','x','V','a','l','u','e','s',' ','s','u','b','w','i','d','g','e','t',' ','l','i','s','t','b','o','x',']' ,'\n' ,'\t','$','c','o','m','b','o',' ','d','e','l','e','t','e',' ','0',' ','e','n','d' ,'\n' ,'\t','#','p','u','t','s',' ','\"','a','t','t','r','i','b','u','t','e',' ','$','a','t','t','r','i','b','u','t','e','\"' ,'\n' ,'\t','s','e','t',' ','p',' ','$','x' ,'\n' ,'\t','s','e','t',' ','l',' ','[','s','p','l','i','t',' ','$','x',' ','\\','n',']' ,'\n' ,'\t','s','e','t',' ','g','g',' ','[','s','t','r','i','n','g',' ','r','a','n','g','e',' ','$','l',' ','[','s','t','r','i','n','g',' ','l','a','s','t',' ','$','a','t','t','r','i','b','u','t','e',' ','$','l',']',' ','e','n','d',' ',']' ,'\n' ,'\t','i','f',' ','{',' ','$','g','g',' ','=','=',' ','\"','\"',' ','}',' ','{',' ' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','g','g','2',' ','[','s','t','r','i','n','g',' ','r','a','n','g','e',' ','$','g','g',' ','[','e','x','p','r',' ','[','s','t','r','i','n','g',' ','l','e','n','g','t','h',' ','$','a','t','t','r','i','b','u','t','e',']',' ','+',' ','2',']',' ','e','n','d',']' ,'\n' ,'\t',' ',' ',' ',' ','f','o','r','e','a','c','h',' ','y',' ','$','g','g','2',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','a','t','t','r','i','b','u','t','e','3',' ','[','s','t','r','i','n','g',' ','m','a','t','c','h',' ','\"','*','-','*','\"',' ','$','y',']' ,'\n' ,'\t','\t','i','f',' ','{',' ','$','a','t','t','r','i','b','u','t','e','3',' ','=','=',' ','1',' ','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','$','w','_','c','o','m','b','o','b','o','x','V','a','l','u','e','s',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','s','t','r','i','n','g',' ','t','r','i','m',' ','$','y',' ','\"',' ','\"',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}','\t','\t','\t' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','\t','_','u','p','d','a','t','e','Q','u','e','r','y',' ','\t','\t','a','l','l','o','w',' ','t','o',' ','m','o','d','i','f','y',' ','t','h','e',' ','f','i','e','l','d',' ','o','f',' ','t','h','e',' ','q','u','e','r','y' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','\t','R','e','t','u','r','n','e','d',' ','v','a','l','u','e','s',' ',':',' ','n','o','t','h','i','n','g' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','_','u','p','d','a','t','e','Q','u','e','r','y',' ','{','}',' ','{' ,'\n' ,'\t','g','l','o','b','a','l',' ','a','t','t','r','1',' ','o','p','1',' ','v','a','l','u','e','1' ,'\n' ,'\t','g','l','o','b','a','l',' ','a','t','t','r','2',' ','o','p','2',' ','v','a','l','u','e','2' ,'\n' ,'\t','g','l','o','b','a','l',' ','a','t','t','r','3',' ','o','p','3',' ','v','a','l','u','e','3' ,'\n' ,'\t','g','l','o','b','a','l',' ','r','e','q','u','e','t','e','1',' ','r','e','q','u','e','t','e','2',' ','r','e','q','u','e','t','e','3',' ','q','u','e','r','y','v','r','f' ,'\n' ,'\t','g','l','o','b','a','l',' ','a','n','d','o','r','1',' ','a','n','d','o','r','2' ,'\n' ,'\t','i','f',' ','{','$','v','a','l','u','e','1',' ','=','=',' ','\"','\"',' ','|','|',' ','$','a','t','t','r','1',' ','=','=',' ','\"','\"',' ','|','|',' ','$','o','p','1',' ','=','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','r','e','q','u','e','t','e','1',' ','\"','\"' ,'\n' ,'\t','}' ,'\n' ,'\t','i','f',' ','{','$','v','a','l','u','e','2',' ','=','=',' ','\"','\"',' ','|','|',' ','$','a','t','t','r','2',' ','=','=',' ','\"','\"',' ','|','|',' ','$','o','p','2',' ','=','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','r','e','q','u','e','t','e','2',' ','\"','\"' ,'\n' ,'\t','}' ,'\n' ,'\t','i','f',' ','{','$','v','a','l','u','e','3',' ','=','=',' ','\"','\"',' ','|','|',' ','$','a','t','t','r','3',' ','=','=',' ','\"','\"',' ','|','|',' ','$','o','p','3',' ','=','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','r','e','q','u','e','t','e','3',' ','\"','\"' ,'\n' ,'\t','}' ,'\n' ,'\t','s','w','i','t','c','h',' ','$','a','n','d','o','r','1',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','1',' ','{' ,'\n' ,'\t','\t','s','w','i','t','c','h',' ',' ','$','a','n','d','o','r','2',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','1',' ','{' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','1',' ','\"','A','N','D','\"' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','2',' ','\"','A','N','D','\"' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t',' ',' ',' ',' ','0',' ','{' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','1',' ','\"','A','N','D','\"' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','2',' ','\"','O','R','\"','\t','\t','\t','\t','\t','\t','\t','\t','\t' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t',' ',' ',' ',' ','d','e','f','a','u','l','t',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t',' ',' ',' ',' ','0',' ','{' ,'\n' ,'\t','\t','s','w','i','t','c','h',' ','$','a','n','d','o','r','2',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','1',' ','{' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','1',' ','\"','O','R','\"' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','2',' ','\"','A','N','D','\"' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t',' ',' ',' ',' ','0',' ','{' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','1',' ','\"','O','R','\"' ,'\n' ,'\t','\t','\t','s','e','t',' ','c','o','n','d','2',' ','\"','O','R','\"' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t',' ',' ',' ',' ','d','e','f','a','u','l','t',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','}' ,'\n' ,'\t','\t','}','\t','\t','\t','\t','\t' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t',' ',' ',' ',' ','d','e','f','a','u','l','t',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t','s','e','t',' ','q','u','e','r','y','v','r','f',' ','\"','\"' ,'\n' ,'\t','i','f',' ','{','$','r','e','q','u','e','t','e','1',' ','!','=',' ','\"','\"',' ','}',' ','{',' ' ,'\n' ,'\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','r','e','q','u','e','t','e','1',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','$','r','e','q','u','e','t','e','2',' ','!','=',' ','\"','\"',' ','}',' ','{' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','c','o','n','d','1' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','r','e','q','u','e','t','e','2',']' ,'\n' ,'\t','\t','i','f',' ','{','$','r','e','q','u','e','t','e','3',' ','!','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','c','o','n','d','2' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','r','e','q','u','e','t','e','3',']' ,'\n' ,'\t','\t','}',' ' ,'\n' ,'\t',' ',' ',' ',' ','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t','\t','i','f',' ','{','$','r','e','q','u','e','t','e','3',' ','!','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','c','o','n','d','1' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','r','e','q','u','e','t','e','3',']' ,'\n' ,'\t','\t','}',' ' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}',' ','e','l','s','e',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','$','r','e','q','u','e','t','e','2',' ','!','=',' ','\"','\"',' ','}',' ','{' ,'\n' ,'\t','\t','#','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','c','o','n','d' ,'\n' ,'\t','\t','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','r','e','q','u','e','t','e','2' ,'\n' ,'\t','\t','i','f',' ','{','$','r','e','q','u','e','t','e','3',' ','!','=',' ','\"','\"','}',' ','{' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','$','c','o','n','d','2' ,'\n' ,'\t','\t',' ',' ',' ',' ','l','a','p','p','e','n','d',' ','q','u','e','r','y','v','r','f',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','r','e','q','u','e','t','e','3',']' ,'\n' ,'\t','\t','}' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','$','w','(','t','e','x','t',')',' ','d','e','l','e','t','e',' ','0',' ','e','n','d' ,'\n' ,'\t','$','w','(','t','e','x','t',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','[','e','v','a','l',' ','c','o','n','c','a','t',' ','$','q','u','e','r','y','v','r','f',']' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','_','i','n','s','e','r','t','O','p','e','r','a','t','o','r',' ','i','n','s','e','r','t',' ','t','h','e',' ','o','p','e','r','a','t','o','r','s',' ','i','n',' ','t','h','e',' ','l','i','s','t',' ','o','f',' ','o','p','e','r','a','t','o','r','s' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','_','i','n','s','e','r','t','O','p','e','r','a','t','o','r',' ','{',' ','w','_','c','o','m','b','o','b','o','x','O','p','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','l','i','s','t','_','o','p',' ','{','=',' ','>',' ','<',' ','>','=',' ','<','=',' ','!','=','}' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','v','a','r',' ','$','l','i','s','t','_','o','p',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','w','_','c','o','m','b','o','b','o','x','O','p',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','v','a','r' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#','#','#','#','#','E','d','i','t',' ','m','e','t','a','d','a','d','a','t','a',' ','c','o','d','e',' ','a','d','d',' ','b','y',' ','p','c' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','m','e','t','a','d','a','t','a' ,'\n' ,' ',' ',' ',' ','#',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ',' ','o','p','e','n',' ','t','h','e',' ','m','e','t','a','d','a','t','a',' ','w','i','n','d','o','w' ,'\n' ,' ',' ',' ',' ','#' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','f','_','m','e','t','a','d','a','t','a',' ','{','}',' ','{' ,'\n' ,'\t','$','w','(','b','u','t','t','o','n',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','d','i','s','a','b','l','e','d' ,'\n' ,'\t','m','e','t','a','_','s','h','o','w','d','i','c','t' ,'\n' ,'\t','m','e','t','a','_','u','p','d','a','t','e' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ','#',' ','t','h','e',' ','m','e','t','a','d','a','t','a',' ','w','i','n','d','o','w','.','.','.','.' ,'\n' ,' ',' ',' ',' ','#',' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','t','a','_','s','h','o','w','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t','s','e','t',' ','w','(','d','d',')',' ','.','m','e','t','a','_','$','{','t','h','i','s','}' ,'\n' ,'\t','i','f',' ','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','(','d','d',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','w','m',' ','d','e','i','c','o','n','i','f','y',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','r','a','i','s','e',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','r','e','t','u','r','n' ,'\n' ,'\t','}' ,'\n' ,'\t','m','e','t','a','_','l','a','y','o','u','t','d','i','c','t' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','t','a','_','u','p','d','a','t','e',' ','{',' ','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','s','e','t',' ','m','e','t','a','t','e','x','t',' ','[','e','c','s','_','U','p','d','a','t','e','D','i','c','t','i','o','n','a','r','y',' ','$','u','r','l',']' ,'\n' ,'\t','s','e','t',' ','n','b',' ','[','l','l','e','n','g','t','h',' ','$','m','e','t','a','t','e','x','t',']' ,'\n' ,'\t','s','e','t',' ','d','b','l','i','b','m','e','t','a',' ','[','l','i','n','d','e','x',' ','$','m','e','t','a','t','e','x','t',' ','0',']' ,'\n' ,'\t','s','e','t',' ','a','l','l','c','o','v','s','t','r','i','n','g',' ','[','l','i','n','d','e','x',' ','$','m','e','t','a','t','e','x','t',' ','1',']' ,'\n' ,'\t','s','e','t',' ','d','b','l','i','b','m','e','t','a','2',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a',' ','1',']' ,'\n' ,'\t','#',' ','e','x','t','r','a','c','t','i','o','n',' ','d','d','b',' ','m','e','t','a','d','o','n','n','e','e','s' ,'\n' ,'\t','s','e','t',' ','d','d','b','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a','2',' ','0',']' ,'\n' ,'\t','s','e','t',' ','l','i','b','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','d','b','l','i','b','m','e','t','a','2',' ','1',']' ,'\n' ,'\t','f','o','r','e','a','c','h',' ','c','o','v','s','t','r','i','n','g',' ','$','a','l','l','c','o','v','s','t','r','i','n','g',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','n','a','m','e','c','o','v',' ','[','l','i','n','d','e','x',' ','$','c','o','v','s','t','r','i','n','g',' ','1',']' ,'\n' ,'\t',' ',' ',' ',' ','s','e','t',' ','s','e','l','e','c','t','c','o','v',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','{','[','s','t','r','i','n','g',' ','c','o','m','p','a','r','e',' ','$','n','a','m','e','c','o','v',' ','[','g','e','t','S','e','l','e','c','t','e','d','C','o','v','e','r','a','g','e',']',']',' ','=','=','0','}',' ','{' ,'\n' ,'\t','\t','s','e','t',' ','c','o','v','c','o','m','p','l','e','t','e',' ','[','l','i','n','d','e','x',' ','$','c','o','v','s','t','r','i','n','g',' ','4',']' ,'\n' ,'\t','\t','s','e','t',' ','c','o','v','m','e','t','a','d','a','t','a',' ','[','l','i','n','d','e','x',' ','$','c','o','v','c','o','m','p','l','e','t','e',' ','2',']',' ' ,'\n' ,'\t',' ',' ',' ',' ','}',' ' ,'\n' ,'\t','}' ,'\n' ,'\t','i','f',' ','[','c','a','t','c','h',' ','{','$','w','(','d','d','t','e','x','t',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','d','d','b','m','e','t','a','d','a','t','a','}',' ','s','_','r','e','s','u','l','t',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','C','o','u','l','d',' ','n','o','t',' ','r','e','t','r','i','e','v','e',' ','t','h','e',' ','m','e','t','a','d','a','t','a','\"' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','i','f',' ','[','c','a','t','c','h',' ','{','$','w','(','d','d','t','e','x','t','1',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','l','i','b','m','e','t','a','d','a','t','a','}',' ','s','_','r','e','s','u','l','t',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','C','o','u','l','d',' ','n','o','t',' ','r','e','t','r','i','e','v','e',' ','t','h','e',' ','m','e','t','a','d','a','t','a','\"' ,'\n' ,'\t','}' ,'\n' ,'\t' ,'\n' ,'\t','i','f',' ','[','c','a','t','c','h',' ','{','$','w','(','d','d','t','e','x','t','2',')',' ','i','n','s','e','r','t',' ','e','n','d',' ','$','c','o','v','m','e','t','a','d','a','t','a','}',' ','s','_','r','e','s','u','l','t',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','e','r','r','o','r','M','s','g',' ','\"','C','o','u','l','d',' ','n','o','t',' ','r','e','t','r','i','e','v','e',' ','t','h','e',' ','m','e','t','a','d','a','t','a','\"' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','t','a','_','l','a','y','o','u','t','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t','t','o','p','l','e','v','e','l',' ','$','w','(','d','d',')' ,'\n' ,'\t','w','m',' ','t','i','t','l','e',' ','$','w','(','d','d',')',' ','[','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','G','e','t','S','t','r','i','n','g',' ','M','E','S','S','A','G','E','-','M','E','T','A','D','A','T','A',']' ,'\n' ,'\t','p','a','c','k',' ','[','t','i','x','L','a','b','e','l','F','r','a','m','e',' ','$','w','(','d','d',')','.','f','r',' ','-','l','a','b','e','l',' ',' ','[','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','G','e','t','S','t','r','i','n','g',' ','M','E','S','S','A','G','E','-','M','E','T','A','D','A','T','A',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h' ,'\n' ,'\t','#','y','k' ,'\n' ,'\t','$','o','b','j','_','E','n','v','i','r','o','n','m','e','n','t',' ','r','e','s','e','t','T','i','x','L','a','b','e','l','F','r','a','m','e','O','p','t','i','o','n','s',' ','$','w','(','d','d',')','.','f','r' ,'\n' ,'\t','s','e','t',' ','w','(','d','d','f','r',')',' ','[','$','w','(','d','d',')','.','f','r',' ','s','u','b','w','i','d','g','e','t',' ','f','r','a','m','e',']' ,'\n' ,'\t','f','r','a','m','e',' ','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e',' ','\\' ,'\n' ,'\t','\t','-','b','o','r','d','e','r','w','i','d','t','h',' ','2',' ','\\' ,'\n' ,'\t','\t','-','r','e','l','i','e','f',' ','g','r','o','o','v','e' ,'\n' ,'\t' ,'\n' ,'\t','f','r','a','m','e',' ','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e','.','s','u','n','k','e','n',' ','\\' ,'\n' ,'\t','\t','-','b','o','r','d','e','r','w','i','d','t','h',' ','2',' ','\\' ,'\n' ,'\t','\t','-','r','e','l','i','e','f',' ','s','u','n','k','e','n' ,'\n' ,'\t','s','e','t',' ','m','_','n','o','t','e','b','o','o','k',' ','[','t','i','x','N','o','t','e','B','o','o','k',' ','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e','.','s','u','n','k','e','n','.','n','o','t','e','b','o','o','k',']' ,'\n' ,'\t','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e','.','s','u','n','k','e','n',' ','\\' ,'\n' ,'\t','\t','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e','.','s','u','n','k','e','n','.','n','o','t','e','b','o','o','k',' ','{','t','o','p',' ','e','x','p','a','n','d',' ','f','i','l','l','x',' ','f','i','l','l','y','}' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e',' ','\\' ,'\n' ,'\t','\t','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e','.','s','u','n','k','e','n',' ','{','t','o','p',' ','e','x','p','a','n','d',' ','f','i','l','l','x',' ','f','i','l','l','y','}' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','a','p','p','e','n','d',' ','$','w','(','d','d','f','r',')','\\' ,'\n' ,'\t','\t','$','w','(','d','d','f','r',')','.','g','r','o','o','v','e',' ','{','t','o','p',' ','e','x','p','a','n','d',' ','f','i','l','l','x',' ','f','i','l','l','y','}' ,'\n' ,'\t' ,'\n' ,'\t','$','m','_','n','o','t','e','b','o','o','k',' ','a','d','d',' ','d','d','b','t','a','b',' ','\\' ,'\n' ,'\t','\t','-','l','a','b','e','l',' ','D','a','t','a','b','a','s','e','_','t','a','b','l','e' ,'\n' ,'\t' ,'\n' ,'\t','$','m','_','n','o','t','e','b','o','o','k',' ','a','d','d',' ','l','i','b','t','a','b',' ','\\' ,'\n' ,'\t','\t','-','l','a','b','e','l',' ','L','i','b','r','a','r','y','_','t','a','b','l','e' ,'\n' ,'\t' ,'\n' ,'\t','$','m','_','n','o','t','e','b','o','o','k',' ','a','d','d',' ','c','o','v','t','a','b',' ','\\' ,'\n' ,'\t','\t','-','l','a','b','e','l',' ','C','o','v','e','r','a','g','e','_','t','a','b','l','e' ,'\n' ,'\t' ,'\n' ,'\t','#','c','r','e','e',' ','u','n','e',' ','v','a','r','i','a','b','l','e',' ','u','t','i','l','i','s','a','b','l','e',' ' ,'\n' ,'\t','s','e','t',' ','p','a','t','h','d','d','b','t','a','b',' ','[','$','m','_','n','o','t','e','b','o','o','k',' ','s','u','b','w','i','d','g','e','t',' ','d','d','b','t','a','b',']' ,'\n' ,'\t','s','e','t',' ','p','a','t','h','l','i','b','t','a','b',' ','[','$','m','_','n','o','t','e','b','o','o','k',' ','s','u','b','w','i','d','g','e','t',' ','l','i','b','t','a','b',']' ,'\n' ,'\t','s','e','t',' ','p','a','t','h','c','o','v','t','a','b',' ','[','$','m','_','n','o','t','e','b','o','o','k',' ','s','u','b','w','i','d','g','e','t',' ','c','o','v','t','a','b',']' ,'\n' ,'\t' ,'\n' ,'\t','#','c','r','e','e',' ','l','a',' ','f','e','n','e','t','r','e',' ','a',' ','l','\'','i','n','t','e','r','i','e','u','r',' ','d','e',' ','l','a',' ','c','a','r','t','e' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','(','d','d','t','e','x','t',')',' ','[','t','e','x','t',' ','$','p','a','t','h','d','d','b','t','a','b','.','t','e','x','t',' ','\\' ,'\n' ,'\t','\t','-','h','e','i','g','h','t',' ','2','0',' ','\\' ,'\n' ,'\t','\t','-','w','i','d','t','h',' ','8','0','\\' ,'\n' ,'\t','\t','-','y','s','c','r','o','l','l','c','o','m','m','a','n','d',' ','\"','$','p','a','t','h','d','d','b','t','a','b','.','s','b','y',' ','s','e','t','\"',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','l','e','f','t',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h',' ' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','[','s','c','r','o','l','l','b','a','r',' ','$','p','a','t','h','d','d','b','t','a','b','.','s','b','y',' ','\\' ,'\n' ,'\t','\t','-','o','r','i','e','n','t',' ','v','e','r','t','i','c','a','l',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','[','l','i','s','t',' ','$','w','(','d','d','t','e','x','t',')',' ','y','v','i','e','w',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','r','i','g','h','t',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','y' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','(','d','d','t','e','x','t','1',')',' ','[','t','e','x','t',' ','$','p','a','t','h','l','i','b','t','a','b','.','t','e','x','t',' ','\\' ,'\n' ,'\t','\t','-','h','e','i','g','h','t',' ','2','0',' ','\\' ,'\n' ,'\t','\t','-','w','i','d','t','h',' ','8','0','\\' ,'\n' ,'\t','\t','-','y','s','c','r','o','l','l','c','o','m','m','a','n','d',' ','\"','$','p','a','t','h','l','i','b','t','a','b','.','s','b','y',' ','s','e','t','\"',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','l','e','f','t',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h',' ' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','[','s','c','r','o','l','l','b','a','r',' ','$','p','a','t','h','l','i','b','t','a','b','.','s','b','y',' ','\\' ,'\n' ,'\t','\t','-','o','r','i','e','n','t',' ','v','e','r','t','i','c','a','l',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','[','l','i','s','t',' ','$','w','(','d','d','t','e','x','t','1',')',' ','y','v','i','e','w',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','r','i','g','h','t',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','y' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','(','d','d','t','e','x','t','2',')',' ','[','t','e','x','t',' ','$','p','a','t','h','c','o','v','t','a','b','.','t','e','x','t',' ','\\' ,'\n' ,'\t','\t','-','h','e','i','g','h','t',' ','2','0',' ','\\' ,'\n' ,'\t','\t','-','w','i','d','t','h',' ','8','0','\\' ,'\n' ,'\t','\t','-','y','s','c','r','o','l','l','c','o','m','m','a','n','d',' ','\"','$','p','a','t','h','c','o','v','t','a','b','.','s','b','y',' ','s','e','t','\"',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','l','e','f','t',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','t','r','u','e','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','b','o','t','h',' ' ,'\n' ,'\t' ,'\n' ,'\t','p','a','c','k',' ','[','s','c','r','o','l','l','b','a','r',' ','$','p','a','t','h','c','o','v','t','a','b','.','s','b','y',' ','\\' ,'\n' ,'\t','\t','-','o','r','i','e','n','t',' ','v','e','r','t','i','c','a','l',' ','\\' ,'\n' ,'\t','\t','-','c','o','m','m','a','n','d',' ','[','l','i','s','t',' ','$','w','(','d','d','t','e','x','t','2',')',' ','y','v','i','e','w',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','r','i','g','h','t',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','y','\t' ,'\n' ,'\t','#','#','#' ,'\n' ,'\t','p','a','c','k',' ','[','s','e','t',' ','w','_','b','f','r',' ','[','f','r','a','m','e',' ','$','w','(','d','d',')','.','b','f','r',']',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','f','i','l','l',' ','x',' ','\\' ,'\n' ,'\t','\t','-','p','a','d','y',' ','2',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','f','a','l','s','e' ,'\n' ,'\t','p','a','c','k',' ','[','b','u','t','t','o','n',' ','$','w','_','b','f','r','.','o','k',' ','-','t','e','x','t',' ','O','K',' ','-','c','o','m','m','a','n','d',' ','\"','$','t','h','i','s',' ','m','e','t','a','_','k','i','l','l','d','i','c','t','\"',' ','-','w','i','d','t','h',' ','1','0',']',' ','\\' ,'\n' ,'\t','\t','-','s','i','d','e',' ','t','o','p',' ','\\' ,'\n' ,'\t','\t','-','e','x','p','a','n','d',' ','f','a','l','s','e' ,'\n' ,'\t','s','e','t',' ','x',' ','[','e','x','p','r',' ','[','w','i','n','f','o',' ','s','c','r','e','e','n','w','i','d','t','h',' ','$','w','(','d','d',')',']','/','2',' ','-',' ','[','w','i','n','f','o',' ','r','e','q','w','i','d','t','h',' ','$','w','(','d','d',')',']','/','2',' ','\\' ,'\n' ,'\t','\t','-',' ','[','w','i','n','f','o',' ','v','r','o','o','t','x',' ','[','w','i','n','f','o',' ','p','a','r','e','n','t',' ','$','w','(','d','d',')',']',']',']' ,'\n' ,'\t','i','f',' ','{','$','x',' ','<',' ','0','}',' ','{','s','e','t',' ','x',' ','0','}' ,'\n' ,'\t','s','e','t',' ','y',' ','[','e','x','p','r',' ','[','w','i','n','f','o',' ','s','c','r','e','e','n','h','e','i','g','h','t',' ','$','w','(','d','d',')',']','/','2',' ','-',' ','[','w','i','n','f','o',' ','r','e','q','h','e','i','g','h','t',' ','$','w','(','d','d',')',']','/','2',' ','\\' ,'\n' ,'\t','\t','-',' ','[','w','i','n','f','o',' ','v','r','o','o','t','y',' ','[','w','i','n','f','o',' ','p','a','r','e','n','t',' ','$','w','(','d','d',')',']',']',']' ,'\n' ,'\t','i','f',' ','{','$','y',' ','<',' ','0','}',' ','{','s','e','t',' ','y',' ','0','}' ,'\n' ,'\t','w','m',' ','g','e','o','m',' ','$','w','(','d','d',')',' ',' ','+','$','x','+','$','y' ,'\n' ,'\n' ,'\t','u','p','d','a','t','e',' ','i','d','l','e','t','a','s','k','s' ,'\n' ,'\t','u','p','d','a','t','e',' ' ,'\n' ,'\t','g','e','t','G','r','a','b',' ','$','w','(','d','d',')' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','t','a','_','d','e','s','t','r','o','y',' ','{','}',' ','{' ,'\n' ,'\t','i','f',' ','[',':',':','i','n','f','o',' ','e','x','i','s','t','s',' ','w','(','d','d',')',']',' ','{' ,'\n' ,'\t',' ',' ',' ',' ','i','f',' ','[','w','i','n','f','o',' ','e','x','i','s','t','s',' ','$','w','(','d','d',')',']',' ','{' ,'\n' ,'\t','\t','r','e','l','e','a','s','e','G','r','a','b' ,'\n' ,'\t','\t','d','e','s','t','r','o','y',' ','$','w','(','d','d',')' ,'\n' ,'\t',' ',' ',' ',' ','}' ,'\n' ,'\t','}' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','m','e','t','a','_','k','i','l','l','d','i','c','t',' ','{','}',' ','{' ,'\n' ,'\t' ,'\n' ,'\t','r','e','l','e','a','s','e','G','r','a','b' ,'\n' ,'\t','d','e','s','t','r','o','y',' ','$','w','(','d','d',')' ,'\n' ,'\t','$','w','(','b','u','t','t','o','n',')',' ','c','o','n','f','i','g','u','r','e',' ','-','s','t','a','t','e',' ','n','o','r','m','a','l' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','#','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*' ,'\n' ,' ',' ',' ',' ','#',' ','P','R','O','C','E','D','U','R','E',':',' ','s','e','t','C','u','r','r','e','n','t' ,'\n' ,' ',' ',' ',' ','#',' ','A','R','G','U','M','E','N','T','S',':',' ','l','o','c','a','t','i','o','n' ,'\n' ,' ',' ',' ',' ','#',' ','R','E','T','U','R','N','E','D',' ','V','A','L','U','E','S',':',' ','n','o','n','e' ,'\n' ,' ',' ',' ',' ','#',' ','A','C','C','E','S','S',':',' ','p','r','i','v','a','t','e' ,'\n' ,' ',' ',' ',' ','#',' ','D','E','S','C','R','I','P','T','I','O','N',':' ,'\n' ,' ',' ',' ',' ','#','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','m','e','t','h','o','d',' ','s','e','t','C','u','r','r','e','n','t',' ','{','l','o','c','a','t','i','o','n','}',' ','{' ,'\n' ,'\t','s','e','t',' ','s','_','d','d','b','t','a','b','l','e',' ','$','l','o','c','a','t','i','o','n' ,'\n' ,' ',' ',' ',' ','}' ,'\n' ,' ',' ',' ',' ','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#' ,'\n' ,' ',' ',' ',' ' ,'\n' ,' ',' ',' ',' ','p','r','o','t','e','c','t','e','d',' ','a','_','s','_','l','a','b','e','l','\t','\t',';','#',' ','t','h','e',' ','i','n','d','e','x',' ','b','e','t','w','e','e','n',' ','l','a','b','e','l','s',' ','a','n','d',' ','n','a','m','e','s','.',' ',' ' ,'\n' ,' ',' ',' ',' ',';','#',' ','e','.','g','.',' ','a','_','s','_','l','a','b','e','l','(','P','o','l','i','t','i','c','a','l',' ','B','o','u','n','d','a','r','i','e','s',')','=','P','O' ,'\n' ,' ',' ',' ',' ','p','r','o','t','e','c','t','e','d',' ','u','s','e','r','c','h','a','r',' ','\"','*','\"',' ',' ',';','#',' ','c','h','a','r','a','c','t','e','r',' ','t','h','a','t',' ','p','r','e','f','i','x','e','s',' ','m','a','p','s',' ','d','e','f','i','n','e','d',' ','b','y',' ','e','x','p','r' ,'\n' ,' ',' ',' ',' ','p','r','o','t','e','c','t','e','d',' ','c','o','v','e','r','a','g','e','O','r','d','e','r',' ','{','A','r','e','a',' ','L','i','n','e',' ','T','e','x','t',' ','P','o','i','n','t','}' ,'\n' ,'}' ,'\n' ,'\n' ,'\n' ,'\0'}; ogdi-ogdi_4_1_0/ogdi/driver/vrf/feature.c000066400000000000000000001466341345660466700204520ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Implementation of vrf Server getObject* functions * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.20 2016-07-06 09:00:14 erouault * add heuristics in vrf_get_ring_coords() to detect cycling topology of edges that lead to endless looping and eventually crashes. Be robust to memory allocation failures in various places, and properly cleanup allocated structures when returning * * Revision 1.19 2016/06/28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.18 2016/06/27 20:05:12 erouault * Grow some buffers in VRF driver (patch by Craig Bruce) * * Revision 1.17 2009/05/08 04:15:50 warmerda * fixed count type in VRF driver for 64bit systems (#2787502) * * Revision 1.16 2007/05/09 20:46:28 cbalint * From: Even Rouault * Date: Friday 21:14:18 * * * fix filename case sensitivy problems (for Unix-like systems). * * * fix incorrect use of sprintf in vrf_GetMetadata. * * * report wgs84 instead of nad83, not sure whether that is true * for all VPF products, but at least it's correct for VMAP products * that *must* be WGS84. A better fix would be to read the VPF table * that contains this information. * * * fix a few minor memory leaks and memory usage issues. * * * enable XMIN, YMIN, XMAX and YMAX columns to be of type double * in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * * * add .pjt and .tjt as possible extensions for join tables * (VMAP2i 'MIG2i000' product). * * * fix duplicated layers report (VMAP2i 'MIG2i000' product). * * * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * * * optionnaly, convert text to UTF-8 when environment variable * CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable * on Windows I guess (only tested on Linux) and maybe too specific. * * * enable reading of VPF products without table indexes file * (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when * there is a variable length field in one table, an index should exist, * but some test products don't follow this. The approach here is to read * the whole table content and build the index in memory. * * Modified Files: * ChangeLog ogdi/driver/vrf/feature.c ogdi/driver/vrf/object.c * ogdi/driver/vrf/utils.c ogdi/driver/vrf/vrf.c * ogdi/driver/vrf/vrfswq.c vpflib/musedir.c vpflib/strfunc.c * vpflib/vpfbrows.c vpflib/vpfprop.c vpflib/vpfquery.c * vpflib/vpfread.c vpflib/vpftable.c * * Revision 1.15 2007/02/12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.14 2004/10/26 20:29:43 warmerda * Removed hack that was dropping some inner rings from polygons unnecessarily. * The hack appears to be to deal with some problem of inner rings duplicating * outer rings in browse products, but I don't know how to check the original * case. See bug report 692844. * * Revision 1.13 2004/04/04 04:33:01 warmerda * added vrf_free_ObjAttributeBuffer * * Revision 1.12 2004/02/19 05:46:28 warmerda * fixed memory leak of edge coords with dangles * * Revision 1.11 2003/05/22 17:04:05 warmerda * Removed debug statement. * * Revision 1.10 2003/05/22 16:58:01 warmerda * Several fixes related to reading VITD area geometries properly even if * the datasets face information seems to be corrupt. See bug: * http://sf.net/tracker/index.php?func=detail&aid=741854&group_id=11181&atid=111181 * * Revision 1.9 2003/05/21 18:50:19 warmerda * verify that table_pos(COORDINATE) succeeds in point/line feature read * * Revision 1.8 2001/08/16 21:02:37 warmerda * Removed MAXSEGS and MAXRINGS fixed limits * * Revision 1.7 2001/08/16 20:40:34 warmerda * applied VITD fixes - merge primitive lines into a feature * * Revision 1.6 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.5 2001/06/13 17:33:59 warmerda * upgraded source headers * */ #include "ecs.h" #include "vrf.h" #include ECS_CVSID("$Id$"); vpf_projection_type NOPROJ = {DDS, 0.0, 0.0, 0.0, 0.0, 0, 0.0, 0.0, NULL, NULL, "Decimal Degrees "}; /********************************************************************* vrf_merge_line_prim() Local service routine for vrf_get_merged_line_feature, which applies the algorithm to merge a single new line segment into an existing aggregated line. IN ecs_Server *s: ecs_Server structure ecs_Layer *layer: Layer information structure int primCount,primList: Primitive ID list OUT return int: Error code. True if the function execute correctly, false else. ********************************************************************/ static int vrf_merge_line_prim( int *vertCount, double * vertX, double *vertY, ecs_Line * line ) { int insertFlag = FALSE, reverseFlag = FALSE, i, insertStart; int line_vert = line->c.c_len; /* Figure out the end points that match, if any, so we know how to organize */ if( vertX[0] == line->c.c_val[0].x && vertY[0] == line->c.c_val[0].y ) { insertFlag = TRUE; reverseFlag = TRUE; } else if( vertX[*vertCount - 1] == line->c.c_val[0].x && vertY[*vertCount - 1] == line->c.c_val[0].y ) { /* append to end, no reverse */ } else if( vertX[*vertCount - 1] == line->c.c_val[line_vert-1].x && vertY[*vertCount - 1] == line->c.c_val[line_vert-1].y ) { reverseFlag = TRUE; } else if( vertX[0] == line->c.c_val[line_vert-1].x && vertY[0] == line->c.c_val[line_vert-1].y ) { insertFlag = TRUE; } else { /* there is no coincident end points ... give up */ return FALSE; } /* If we are inserting the new primitive in front of the existing vertices, then we will have to push the existing ones down ... */ if( insertFlag ) { for( i = *vertCount - 1; i >= 0; i-- ) { vertX[i + line_vert - 1] = vertX[i]; vertY[i + line_vert - 1] = vertY[i]; } } /* Insert the new primitives vertices */ if( insertFlag ) insertStart = 0; else insertStart = *vertCount - 1; for( i = 0; i < line_vert; i++ ) { if( reverseFlag ) { vertX[insertStart + i] = line->c.c_val[line_vert - i - 1].x; vertY[insertStart + i] = line->c.c_val[line_vert - i - 1].y; } else { vertX[insertStart + i] = line->c.c_val[i].x; vertY[insertStart + i] = line->c.c_val[i].y; } } *vertCount += (line_vert - 1); return TRUE; } /********************************************************************* vrf_get_merged_line_feature Fill the ecs_Result with the merged coordinates of the passed primitive list. IN ecs_Server *s: ecs_Server structure ecs_Layer *layer: Layer information structure int primCount,primList: Primitive ID list OUT return int: Error code. True if the function execute correctly, false else. ********************************************************************/ int vrf_get_merged_line_feature (s, layer, primCount, primList, tileList, dryRun) ecs_Server *s; ecs_Layer *layer; int primCount; int32 *primList; short *tileList; int dryRun; { int iPrim; ecs_Result *primResults; double *vertX, *vertY; int vertCount, maxVertCount, i, *primConsumed, work_done; int primsRemaining; ecs_Line *line; /* simple case, no merging of primitives. */ if( primCount == 1 ) { if( dryRun ) return TRUE; return vrf_get_line_feature( s, layer, primList[0], tileList[0], &(s->result) ); } /* Collect geometry for each of the primitives. */ primResults = (ecs_Result *) calloc(sizeof(ecs_Result),primCount); maxVertCount = 0; for( iPrim = 0; iPrim < primCount; iPrim++ ) { if( !vrf_get_line_feature( s, layer, primList[iPrim], tileList[iPrim], primResults+iPrim ) ) { for( ; iPrim >=0; iPrim-- ) ecs_CleanUp( primResults + iPrim ); free( primResults ); if( !dryRun ) ecs_SetError(&(s->result), 1,"Error in vrf_get_merged_line_feature"); return FALSE; } maxVertCount += ECSGEOM((primResults+iPrim)).line.c.c_len; } /* * Initialize our aggregate feature with the first primitive. */ vertX = (double *) malloc(sizeof(double) * maxVertCount); vertY = (double *) malloc(sizeof(double) * maxVertCount); primConsumed = (int *) calloc(sizeof(int),primCount); line = &(ECSGEOM((primResults+0)).line); vertCount = line->c.c_len; for( i = 0; i < (int) line->c.c_len; i++ ) { vertX[i] = line->c.c_val[i].x; vertY[i] = line->c.c_val[i].y; } /* * Merge in new features one at a time. If we make a pass through all * the unmerged features without being able to merge another one * at either end we give up, abandoning any remaining primitives. */ primsRemaining = primCount - 1; work_done = TRUE; while( work_done && primsRemaining > 0 ) { work_done = FALSE; for( iPrim = 1; iPrim < primCount; iPrim++ ) { line = &(ECSGEOM((primResults+iPrim)).line); if( primConsumed[iPrim] ) continue; if( vrf_merge_line_prim( &vertCount, vertX, vertY, line ) ) { work_done = TRUE; primConsumed[iPrim] = TRUE; primsRemaining--; } } } #ifdef DEBUG if( primsRemaining ) { fprintf(stderr, "primCount = %d, primsRemaining = %d\n", primCount, primsRemaining); for( iPrim = 0; iPrim < primCount; iPrim++ ) { line = &(ECSGEOM((primResults+iPrim)).line); if( iPrim == 0 || primConsumed[iPrim] ) fprintf(stderr,"consumed line\n"); else fprintf(stderr,"remaining line\n"); fprintf(stderr, "tile: %d\n", tileList[iPrim]); for( i = 0; i < line->c.c_len; i++ ) { fprintf(stderr, "%f %f\n", line->c.c_val[i].x, line->c.c_val[i].y); } } { fprintf(stderr, "merged line\n"); for( i = 0; i < vertCount; i++ ) { fprintf(stderr, "%f %f\n", vertX[i], vertY[i]); } } } #endif if( !dryRun ) { assert( primsRemaining == 0 ); /* Build returned line structure. */ if (!ecs_SetGeomLine(&(s->result), vertCount)) return FALSE; for( i = 0; i < vertCount; i++ ) { ECS_SETGEOMLINECOORD((&(s->result)), i, vertX[i], vertY[i]); } } /* Cleanup datastructures. */ free( vertX ); free( vertY ); free( primConsumed ); for( iPrim = 0; iPrim < primCount; iPrim++ ) ecs_CleanUp( primResults + iPrim ); free( primResults ); return primsRemaining == 0; } /********************************************************************* vrf_get_line_feature Fill the ecs_Result with the vrf information directly extract from the table. IN ecs_Server *s: ecs_Server structure ecs_Layer *layer: Layer information structure int prim_id: Primitive ID OUT return int: Error code. True if the function execute correctly, false else. ********************************************************************/ int vrf_get_line_feature (s, layer, prim_id, tile_id, result) ecs_Server *s; ecs_Layer *layer; int prim_id; short tile_id; ecs_Result *result; { int32 pos, count; row_type row; int i; coordinate_type *ptr1=NULL; tri_coordinate_type *ptr2=NULL; double_coordinate_type *ptr3=NULL; double_tri_coordinate_type *ptr4=NULL; register LayerPrivateData *lpriv = (LayerPrivateData *) layer->priv; /* ----------------------------------------------------------- Check the tables to see if they are open ----------------------------------------------------------- */ if (!vrf_checkLayerTables(s,layer)) { return FALSE; } if( !_selectTileLineWithRet(s, layer, tile_id) ) { return FALSE; } /* ----------------------------------------------------------- Extract table informations from the ecs_Server structure "s". ----------------------------------------------------------- */ row = read_row (prim_id, lpriv->l.line.edgeTable); if (row == NULL) { ecs_SetError(result, 1,"Unable to extract the edge"); return FALSE; } pos = table_pos ("COORDINATES", lpriv->l.line.edgeTable); if( pos == -1 ) { ecs_SetError(result, 2, "No COORDINATE column"); free_row(row,lpriv->l.line.edgeTable); return FALSE; } /* ----------------------------------------------------------- Get the coordinates in the table ----------------------------------------------------------- */ switch (lpriv->l.line.edgeTable.header[pos].type) { case 'C': ptr1 = get_table_element (pos, row, lpriv->l.line.edgeTable, NULL, &count); break; case 'Z': ptr2 = get_table_element (pos, row, lpriv->l.line.edgeTable, NULL, &count); break; case 'B': ptr3 = get_table_element (pos, row, lpriv->l.line.edgeTable, NULL, &count); break; case 'Y': ptr4 = get_table_element (pos, row, lpriv->l.line.edgeTable, NULL, &count); break; default: ecs_SetError(result, 2, "Undefined VRF table type"); free_row(row,lpriv->l.line.edgeTable); return FALSE; } free_row(row,lpriv->l.line.edgeTable); /* ----------------------------------------------------------- Initialize line structure ----------------------------------------------------------- */ if (!ecs_SetGeomLine(result, count)) return FALSE; /* ----------------------------------------------------------- Fill the table line structure and free the old structure ptr ----------------------------------------------------------- */ switch (lpriv->l.line.edgeTable.header[pos].type) { case 'C': { if ((count == 1) && (ptr1 == (coordinate_type*)NULL)) { ecs_SetError(result, 2, "Only one coordinate found for a line"); xvt_free ((char*)ptr1); return FALSE; } else if( ptr1 == NULL ) { ecs_SetError(result, 1, "ptr1 == NULL"); return FALSE; } else { for (i=0; ipriv; if( !_selectTileLineWithRet(s, layer, tile_id) ) return FALSE; return vrf_get_mbr(lpriv->l.line.mbrTable, prim_id, xmin, ymin, xmax, ymax); } /********************************************************************* vrf_get_lines_mbr Get the related mbr of a list of primitive lines IN ecs_Layer *layer: Layer information structure int primCount: primitive count int primList: list of Primitive IDs OUT return int: Error code. True if the function execute correctly, false else. double *xmin, *xmax, *ymin, *ymax: Returned bounding box ********************************************************************/ int vrf_get_lines_mbr (s, layer, primCount, primList, tileList, xmin, ymin, xmax, ymax) ecs_Server* s; ecs_Layer *layer; int32 primCount; int32 *primList; short *tileList; double *xmin; double *ymin; double *xmax; double *ymax; { int i; if( !vrf_get_line_mbr( s, layer, primList[0], tileList[0], xmin, ymin, xmax, ymax ) ) return FALSE; for( i = 1; i < primCount; i++ ) { double x2min, x2max, y2min, y2max; if( !vrf_get_line_mbr( s, layer, primList[i], tileList[i], &x2min, &y2min, &x2max, &y2max ) ) return FALSE; if( x2min < *xmin ) *xmin = x2min; if( y2min < *ymin ) *ymin = y2min; if( x2max > *xmax ) *xmax = x2max; if( y2max > *ymax ) *ymax = y2max; } return TRUE; } /********************************************************************* GET_TEXT_FEATURE ********************************************************************/ int vrf_get_text_feature (s, layer, prim_id) ecs_Server *s; ecs_Layer *layer; int prim_id; { row_type row; /* Row type in the text primitive table */ vpf_table_type table; /* VRF table type format */ int32 pos; /* Position in the text primitive table */ int32 count; /* Number of caracters that were read */ double x,y; /* coordinates of the text */ int code; /* success or failure of the operation */ LayerPrivateData *PrivData; /* Private information on the layer */ char * desc; /* ----------------------------------------------------------- Check the tables to see if they are open ----------------------------------------------------------- */ if (!vrf_checkLayerTables(s,layer)) { return FALSE; } PrivData = (LayerPrivateData *) layer->priv; /* casting the private data for a VPF Point layer from */ table = PrivData->l.text.textTable; /* our interest here is the primitive table */ row = read_row (prim_id, table); /* Read the prim_id row from the text primitive table */ if( row == NULL ) { ecs_SetError(&(s->result), 1, "Unable to get row"); return FALSE; } pos = table_pos ("STRING", table); /* find the position in the primitive table */ desc = (char *) get_table_element (pos, row, table, NULL, &count); /* get the text string */ pos = table_pos ("SHAPE_LINE", table); /* get the text coordinate, code will receive the result of th 0 = problem, 1 = success */ if ((code = vrf_get_xy (table, row, pos, &x, &y)) == TRUE) { code = ecs_SetGeomText(&(s->result),x,y,desc); } else { ecs_SetError(&(s->result), 1, "Unable to get coordinates"); } free_row(row,PrivData->l.text.textTable); xvt_free(desc); /* here all the information needed is known in result (ecs_Result) that is in s (ecs_Server) */ return code; } /********************************************************************* GET_POINT_FEATURE Derived from draw_point_row [vpfdraw.c] ********************************************************************/ int vrf_get_point_feature (s, layer, prim_id) ecs_Server *s; ecs_Layer *layer; int prim_id; { row_type row; /* Row type in the point primitive table */ vpf_table_type table; /* VRF table type format */ int32 pos; /* Position in the point primitive table */ double x,y; /* Coordinates of the point */ int code; /* Success or failure of the operation */ LayerPrivateData *PrivData; /* Private information on the layer */ /* ----------------------------------------------------------- Check the tables to see if they are open ----------------------------------------------------------- */ if (!vrf_checkLayerTables(s,layer)) { return FALSE; } PrivData = (LayerPrivateData *) layer->priv; /* casting the private data for a VPF Point layer from */ table = PrivData->l.point.primTable; /* our interest here is the primitive table */ row = read_row (prim_id, table); /* Read the prim_id row from the point primitive table */ pos = table_pos ("COORDINATE", table); /* find the position in the primitive table */ /* get the point coordinate, code will receive the result of th 0 = problem, 1 = success */ if ( pos != -1 && (code = vrf_get_xy (table, row, pos, &x, &y)) == TRUE) { code = ecs_SetGeomPoint(&(s->result),x,y); } else { ecs_SetError(&(s->result), 1, "Unable to get coordinates"); code = FALSE; } free_row(row,PrivData->l.point.primTable); /* here all the information needed is known in result (ecs_Result) that is in s (ecs_Server) */ return code; } /********************************************************************* GET_AREA_FEATURE Derived from outline_face [vpfdraw.c] ********************************************************************/ int vrf_get_area_feature (s, layer, prim_id) ecs_Server *s; ecs_Layer *layer; int prim_id; { int32 n=0; int code,i,j,k,qty; face_rec_type face_rec; ring_rec_type ring_rec; vpf_table_type facetable, ringtable, edgetable; AREA_FEATURE area; double x,y; #ifdef notdef int firstlength; #endif int max_rings; /* ----------------------------------------------------------- Check the tables to see if they are open ----------------------------------------------------------- */ if (!vrf_checkLayerTables(s,layer)) { return FALSE; } facetable = ((LayerPrivateData *) layer->priv)->l.area.faceTable; ringtable = ((LayerPrivateData *) layer->priv)->l.area.ringTable; edgetable = ((LayerPrivateData *) layer->priv)->l.area.edgeTable; face_rec = read_face (prim_id, facetable); ring_rec = read_ring (face_rec.ring, ringtable); /* Allocate space to store addresses of all the ring structures */ max_rings = 5; area.rings = (RING**)xvt_zmalloc (max_rings * sizeof (RING*)); if (area.rings == NULL) { ecs_SetError(&(s->result), 2, "No enough memory"); return FALSE; } /* Get the outer ring coords */ area.rings[n] = (RING*)xvt_zmalloc (sizeof (RING)); if (area.rings[n] == NULL) { ecs_SetError(&(s->result), 2, "No enough memory"); xvt_free ((char*)area.rings); return FALSE; } area.rings[n]->id = n+1; if (!vrf_get_ring_coords (s,area.rings[n], prim_id, ring_rec.edge, edgetable)) { xvt_free((char*)area.rings[0]); xvt_free ((char*)area.rings); return FALSE; } #ifdef notdef firstlength = area.rings[n]->nr_segs; #endif n++; /* Get the coords for any inner rings that exist */ while (ring_rec.face == prim_id) { ring_rec = read_next_ring (ringtable); if (feof (ringtable.fp)) break; /* ** The Browse Case: It is possible the last island cover the same ** region than the first one. ** ** NFW/2004: The following logic seems unreasonably broad and has for ** certain been causing some island polygons (such as for the island at ** 14.85E, 60.55N in inwatera@hydro(*) of the eurasia VMAP0 dataset) to ** disappear without reason. There may be a case where this logic should ** apply, but without detail on how to reproduce the original issue, I am ** just removing the logic completely. ** ** See ogdi.sf.net bug tracker bug: 692844 */ #ifdef notdef if (n>=2 && ring_rec.face != prim_id && area.rings[n-1]->nr_segs == firstlength) { n--; break; } #endif if (ring_rec.face == prim_id) { if( n == max_rings ) { RING** newrings; max_rings *= 2; newrings = (RING **) xvt_realloc(area.rings, sizeof(RING *) * max_rings); if( newrings == NULL ) { for(i=0;inr_segs;j++) { xvt_free((char*) area.rings[i]->segs[j]->coords); xvt_free((char*) area.rings[i]->segs[j]); } xvt_free((char*)area.rings[i]->segs); xvt_free((char*)area.rings[i]); } xvt_free ((char*)area.rings); ecs_SetError(&(s->result), 2, "No enough memory"); return FALSE; } area.rings = newrings; } area.rings[n] = (RING*)xvt_zmalloc (sizeof (RING)); if (area.rings[n] == NULL) { for(i=0;inr_segs;j++) { xvt_free((char*) area.rings[i]->segs[j]->coords); xvt_free((char*) area.rings[i]->segs[j]); } xvt_free((char*)area.rings[i]->segs); xvt_free((char*)area.rings[i]); } xvt_free ((char*)area.rings); ecs_SetError(&(s->result), 2, "No enough memory"); return FALSE; } area.rings[n]->id = n+1; if (!vrf_get_ring_coords (s,area.rings[n], prim_id, ring_rec.edge, edgetable)) { for(i=0;inr_segs;j++) { xvt_free((char*) area.rings[i]->segs[j]->coords); xvt_free((char*) area.rings[i]->segs[j]); } xvt_free((char*)area.rings[i]->segs); xvt_free((char*)area.rings[i]); } xvt_free((char*)area.rings[n]); xvt_free ((char*)area.rings); ecs_SetError(&(s->result), 2, "No enough memory"); return FALSE; } n++; } } area.nr_rings = n; assert( n <= max_rings ); /* Extract all coordinates from area and put them in a ecs_Area */ code = TRUE; if ((code = ecs_SetGeomArea(&(s->result), area.nr_rings))) { for(i=0;inr_segs;j++) qty += area.rings[i]->segs[j]->nr_coords; /* Initialise the ring and add all the coordinates */ if( (code = ecs_SetGeomAreaRing(&(s->result), i, qty, 0.0, 0.0)) ) { qty = 0; for(j=0;jnr_segs;j++) { for(k=0; ksegs[j]->nr_coords;k++) { x = (double) area.rings[i]->segs[j]->coords[k].x; y = (double) area.rings[i]->segs[j]->coords[k].y; ECS_SETGEOMAREACOORD((&(s->result)), i, qty, x, y); qty++; } } } } } for(i=0;i < area.nr_rings;i++) { for(j=0;jnr_segs;j++) { xvt_free((char*) area.rings[i]->segs[j]->coords); xvt_free((char*) area.rings[i]->segs[j]); } xvt_free((char*)area.rings[i]->segs); xvt_free((char*)area.rings[i]); } xvt_free ((char*)area.rings); return code; } /********************************************************************* GET_RING_COORDS Derived from outline_face_ring [vpfdraw.c] ********************************************************************/ int vrf_get_ring_coords (s,ring, face_id, start_edge, edgetable) ecs_Server *s; RING *ring; int32 face_id, start_edge; vpf_table_type edgetable; { edge_rec_type edge_rec; int32 next_edge, prevnode, i, n=0; boolean done=FALSE; vpf_projection_type proj; double_coordinate_type dcoord; SEGMENT **temp; long eqlface1=0L; #ifdef notdef long eqlface2=0L; #endif /*long eqlnpts;*/ long eqlleft_edge=0L, eqlright_edge=0L; long maxsegs; char buffer[120]; char start_dir = '+'; maxsegs = 5; proj = NOPROJ; edge_rec = read_edge (start_edge, edgetable, proj.inverse_proj); if (edge_rec.npts == 0) { sprintf(buffer,"Unable to read the edge %d in the face %d", (int) start_edge, (int) face_id); ecs_SetError(&(s->result), 1,buffer); return FALSE; } edge_rec.dir = '+'; prevnode = edge_rec.start_node; if (edge_rec.start_node == edge_rec.end_node) done = TRUE; next_edge = vrf_next_face_edge (&edge_rec, &prevnode, face_id); if ((edge_rec.right_face == face_id) && (edge_rec.left_face == face_id)) { eqlface1 = 1L; /*eqlnpts = edge_rec.npts;*/ eqlleft_edge = edge_rec.left_edge; eqlright_edge = edge_rec.right_edge; start_dir = edge_rec.dir; } else eqlface1 = 0L; /* Allocate plenty of space for array of segment addresses */ ring->segs = (SEGMENT**)xvt_zmalloc (maxsegs * sizeof (SEGMENT*)); if( ring->segs == NULL ) { if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); sprintf(buffer,"Unable to allocate memory in vrf_get_ring_coords() for face %d", (int) face_id); ecs_SetError(&(s->result), 1,buffer); return FALSE; } /* Load the first segment of the ring */ ring->segs[n] = (SEGMENT*)xvt_zmalloc (sizeof (SEGMENT)); if( ring->segs[n] == NULL ) { xvt_free((char*)ring->segs); ring->segs = NULL; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); sprintf(buffer,"Unable to allocate memory in vrf_get_ring_coords() for face %d", (int) face_id); ecs_SetError(&(s->result), 1,buffer); return FALSE; } ring->segs[n]->nr_coords = edge_rec.npts; ring->segs[n]->id = n+1; /* Allocate space for the coordinates of the first segment */ ring->segs[n]->coords = (COORDINATE*)xvt_zmalloc ((size_t)ring->segs[n]->nr_coords * sizeof (COORDINATE)); if( ring->segs[n]->coords == NULL ) { xvt_free((char*)ring->segs[n]); xvt_free((char*)ring->segs); ring->segs = NULL; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); sprintf(buffer,"Unable to allocate memory in vrf_get_ring_coords() for face %d", (int) face_id); ecs_SetError(&(s->result), 1,buffer); return FALSE; } /* If the direction is - load in reverse order */ if (edge_rec.dir == '-') { for (i=(edge_rec.npts-1); i>=0; i--) { dcoord = next_edge_coordinate (&edge_rec); ring->segs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } else { for (i=0; isegs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } n++; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); while (!done) { /* This is a temptative way to detect cycles in the chaining of edges: */ /* There is no reason that a sane ring might follow each edges more than */ /* twice */ if( n > edgetable.nrows * 2 ) { sprintf(buffer,"Cycle detected in the edges of face %d", (int) face_id); for( --n; n >= 0; --n ) { xvt_free((char*) ring->segs[n]->coords); xvt_free((char*) ring->segs[n]); } xvt_free(ring->segs); ring->segs = NULL; ecs_SetError(&(s->result), 1,buffer); return FALSE; } if (next_edge < 0) { done = TRUE; } if (next_edge == 0) { done = TRUE; } if (next_edge == start_edge && !eqlface1) { done = TRUE; continue; } if (next_edge == start_edge && eqlface1 && eqlleft_edge == 0L && eqlright_edge == 0L) { done = TRUE; } if (!done) { edge_rec = read_edge( next_edge, edgetable, (long)proj.inverse_proj); if (edge_rec.npts == 0) { sprintf(buffer,"Unable to read the edge %d in the face %d, segment %d", (int) next_edge, (int) face_id, n); for( --n; n >= 0; --n ) { xvt_free((char*) ring->segs[n]->coords); xvt_free((char*) ring->segs[n]); } xvt_free(ring->segs); ring->segs = NULL; ecs_SetError(&(s->result), 1,buffer); return FALSE; } next_edge = vrf_next_face_edge( &edge_rec, &prevnode, face_id ); #ifdef notdef if ((edge_rec.right_face == face_id) && (edge_rec.left_face ==face_id)) eqlface2 = 1L; else eqlface2 = 0L; #endif /* * This is to catch cases where there would appear to be a dangle * (so we set eqlface1), but when we go to repeat the start edge * we find we are going the same direction as the first time. * This occurs with some VITD dataset as per bug 741854 on * http://ogdi.sf.net/ */ #ifndef SKIP_BUG_741854_FIX if( edge_rec.id == start_edge && edge_rec.dir == start_dir ) { if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); edge_rec.coords = NULL; done = TRUE; continue; } #endif /* Allocate space for the next segment */ if (eqlface1 && edge_rec.id == eqlleft_edge) eqlleft_edge = 0L; if (eqlface1 && edge_rec.id == eqlright_edge) eqlright_edge = 0L; if( n == maxsegs ) { SEGMENT** newsegs; maxsegs *= 2; newsegs = (SEGMENT**) xvt_realloc(ring->segs, maxsegs * sizeof (SEGMENT*)); if( newsegs == NULL ) { sprintf(buffer,"Line %d: Memory allocation failure for segment %d in the face %d", __LINE__, n, (int) face_id); for( --n; n >= 0; --n ) { xvt_free((char*) ring->segs[n]->coords); xvt_free((char*) ring->segs[n]); } xvt_free(ring->segs); ring->segs = NULL; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); ecs_SetError(&(s->result), 1,buffer); return FALSE; } ring->segs = newsegs; } ring->segs[n] = (SEGMENT*)xvt_zmalloc (sizeof (SEGMENT)); if( ring->segs[n] == NULL ) { sprintf(buffer,"Line %d: Memory allocation failure for segment %d in the face %d", __LINE__, n, (int) face_id); for( ; n >= 0; --n ) { xvt_free((char*) ring->segs[n]->coords); xvt_free((char*) ring->segs[n]); } xvt_free(ring->segs); ring->segs = NULL; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); ecs_SetError(&(s->result), 1,buffer); return FALSE; } ring->segs[n]->nr_coords = edge_rec.npts; ring->segs[n]->id = n+1; /* Allocate space for the segment coordinates */ ring->segs[n]->coords = (COORDINATE*)xvt_zmalloc ((size_t)ring->segs[n]->nr_coords * sizeof (COORDINATE)); if( ring->segs[n]->coords == NULL ) { sprintf(buffer,"Line %d: Memory allocation failure for segment %d in the face %d", __LINE__, n, (int) face_id); for( ; n >= 0; --n ) { xvt_free((char*) ring->segs[n]->coords); xvt_free((char*) ring->segs[n]); } xvt_free(ring->segs); ring->segs = NULL; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); ecs_SetError(&(s->result), 1,buffer); return FALSE; } /* If the direction is - load in reverse order */ if (edge_rec.dir == '-') { for (i=(edge_rec.npts-1); i>=0; i--) { dcoord = next_edge_coordinate (&edge_rec); ring->segs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } else { for (i=0; isegs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } n++; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); edge_rec.coords = NULL; } /* if (!done) */ } /* while */ ring->nr_segs = n; assert( ring->nr_segs <= maxsegs ); /* Realloc the segs array to free unused memory */ temp = (SEGMENT**)xvt_realloc(ring->segs, ring->nr_segs * sizeof (SEGMENT*)); if( temp ) ring->segs = temp; return TRUE; } /********************************************************************* NEXT_FACE_EDGE Derived from next_face_edge [vpfdraw.c] ********************************************************************/ int32 vrf_next_face_edge (edge_rec, prevnode, face_id) edge_rec_type *edge_rec; int32 *prevnode, face_id; { int32 next; if ((edge_rec->right_face == face_id) && (edge_rec->left_face == face_id)) { /* Dangle - go the opposite dir to continue aint32 the boundary */ if (*prevnode == edge_rec->start_node) { edge_rec->dir = '+'; next = edge_rec->right_edge; *prevnode = edge_rec->end_node; } else if (*prevnode == edge_rec->end_node) { edge_rec->dir = '-'; next = edge_rec->left_edge; *prevnode = edge_rec->start_node; } else { next = -1; } } else if (edge_rec->right_face == face_id) { /* The face is on the right - take the right forward edge */ next = edge_rec->right_edge; edge_rec->dir = '+'; *prevnode = edge_rec->end_node; } else if (edge_rec->left_face == face_id) { /* The face is on the left - take the left forward edge */ next = edge_rec->left_edge; edge_rec->dir = '-'; *prevnode = edge_rec->start_node; } /* * I think we only end up here if the face information is wrong for some * reason. I have this problem with most layers in some VITD datasets * 04KOREA (Edition 1) VITD data. In this case we fall back to establishing * the correction edge direction based on the start and end node. * * See bug 741854 on http://ogdi.sf.net/ */ else { if (*prevnode == edge_rec->start_node) { edge_rec->dir = '+'; next = edge_rec->right_edge; *prevnode = edge_rec->end_node; } else if (*prevnode == edge_rec->end_node) { edge_rec->dir = '-'; next = edge_rec->left_edge; *prevnode = edge_rec->start_node; } else { next = -1; } } return next; } /********************************************************************* vrf_get_area_mbr Get the related mbr of a primitive face IN ecs_Server *s: ecs_Server structure ecs_Layer *layer: Layer information structure int prim_id: Primitive ID OUT return int: Error code. True if the function execute correctly, false else. double *xmin, *xmax, *ymin, *ymax: Returned bounding box ********************************************************************/ int vrf_get_area_mbr (layer, prim_id, xmin, ymin, xmax, ymax) ecs_Layer *layer; int32 prim_id; double *xmin; double *ymin; double *xmax; double *ymax; { LayerPrivateData *lpriv = (LayerPrivateData *) layer->priv; return vrf_get_mbr(lpriv->l.area.mbrTable, prim_id, xmin, ymin, xmax, ymax); } /**************************************************************************** vrf_get_xy Extract from the database the point contain at the "pos" column of the table "table" at the row "row". If the structure found is a list of coordinate, only the first one will be returned. IN vpf_table_type table : Table of primitives (already open) row_type row : Table row in "table" long pos : Column position in "table" for "COORDINATE" OUT double *x,*y : Point extract from structure return int : This flag indicate the success or the failure of the function. ***************************************************************************/ int vrf_get_xy (table, row, pos, x, y) vpf_table_type table; row_type row; int32 pos; double *x; double *y; { int32 count = 0; coordinate_type temp1, *ptr1; tri_coordinate_type temp2, *ptr2; double_coordinate_type temp3, *ptr3; double_tri_coordinate_type temp4, *ptr4; switch (table.header[pos].type) { case 'C': { ptr1 = get_table_element (pos, row, table, &temp1, &count); if ((count == 1) && (ptr1 == (coordinate_type*)NULL)) { *x = (double) temp1.x; *y = (double) temp1.y; } else if( ptr1 == NULL ) { return FALSE; } else { *x = (double) ptr1->x; *y = (double) ptr1->y; if (ptr1) free(ptr1); } break; } case 'Z': { ptr2 = get_table_element (pos, row, table, &temp2, &count); if ((count == 1) && (ptr2 == (tri_coordinate_type*)NULL)) { *x = temp2.x; *y = temp2.y; } else if( ptr2 == NULL ) { return FALSE; } else { *x = (double) ptr2[0].x; *y = (double) ptr2[0].y; if (ptr2) xvt_free ((char*)ptr2); } break; } case 'B': { ptr3 = get_table_element (pos, row, table, &temp3, &count); if ((count == 1) && (ptr3 == (double_coordinate_type*)NULL)) { *x = (double) temp3.x; *y = (double) temp3.y; } else if( ptr3 == NULL ) { return FALSE; } else { *x = (double) ptr3[0].x; *y = (double) ptr3[0].y; if (ptr3) xvt_free ((char*)ptr3); } break; } case 'Y': { ptr4 = get_table_element (pos, row, table, &temp4, &count); if ((count == 1) && (ptr4 == (double_tri_coordinate_type*)NULL)) { *x = (double) temp4.x; *y = (double) temp4.y; } else if( ptr4 == NULL ) { return FALSE; } else { *x = (double) ptr4[0].x; *y = (double) ptr4[0].y; if (ptr4) xvt_free ((char*)ptr4); } break; } default: break; } /* switch type */ return TRUE; } /**************************************************************************** vrf_get_ObjAttributes Get the attributes from the feature table and generate a string with it. IN vpf_table_type table : Table of primitives (already open) int32 row_pos : Row position in table OUT return char *: The returned string. If NULL, the operation was unsuccessul. ***************************************************************************/ static char *returnString = NULL; char *vrf_get_ObjAttributes(table, row_pos) vpf_table_type table; int32 row_pos; { int i; char buffer[255]; row_type row; int32 lenght; char temp1, *ptr1; float temp2; double temp3; short int temp4; int temp5; date_type temp6; int32 count; if (returnString != NULL) { free(returnString); returnString = NULL; } row = read_row(row_pos,table); lenght = 4; returnString = (char *) malloc(lenght); strcpy(returnString,""); for(i = 0; i < table.nfields; ++i) { switch(table.header[i].type) { case 'T': case 'L': ptr1 = get_table_element (i, row, table, &temp1, &count); if ((count == 1) && (ptr1 == (char *) NULL)) { lenght += 6; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } sprintf(buffer,"%c",temp1); strcat(returnString,"{ "); strcat(returnString,buffer); strcat(returnString," } "); } else { lenght += count + 6; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); free(ptr1); return NULL; } strcat(returnString,"{ "); strcat(returnString,ptr1); strcat(returnString," } "); free(ptr1); } break; /*added 5-28-97 case "D" */ case 'D': /* Date */ ptr1 = get_table_element (i, row, table, &temp6, &count); if ((count == 1) && (ptr1 == (char *) NULL)) { lenght += 5 + sizeof(date_type); /*Changed from += 6 to += 5 + sizeof(date_type)*/ returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } sprintf(buffer,"%20s",temp6); /*dap Changed %c to %20s*/ strcat(returnString,"{ "); strcat(returnString,buffer); strcat(returnString," } "); } else { /* Changed from += count + 6 to += 5 + (count * sizeof(date_type))*/ lenght += 5 + (count * sizeof(date_type)); returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); free(ptr1); return NULL; } strcat(returnString,"{ "); strcat(returnString,ptr1); strcat(returnString," } "); free(ptr1); } break; case 'F': get_table_element (i, row, table, &temp2, &count); sprintf(buffer,"%f",temp2); lenght += strlen(buffer) + 2; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } strcat(returnString,buffer); strcat(returnString," "); break; case 'R': get_table_element (i, row, table, &temp3, &count); sprintf(buffer,"%f",temp3); lenght += strlen(buffer) + 2; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } strcat(returnString,buffer); strcat(returnString," "); break; case 'S': get_table_element (i, row, table, &temp4, &count); sprintf(buffer,"%d",temp4); lenght += strlen(buffer) + 2; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } strcat(returnString,buffer); strcat(returnString," "); break; case 'I': get_table_element (i, row, table, &temp5, &count); sprintf(buffer,"%d",temp5); lenght += strlen(buffer) + 2; returnString = (char *) realloc(returnString,lenght); if (returnString == NULL) { free_row(row,table); return NULL; } strcat(returnString,buffer); strcat(returnString," "); break; } } free_row(row,table); return returnString; } void vrf_free_ObjAttributeBuffer() { if( returnString != NULL ) { free( returnString ); returnString = NULL; } } int vrf_checkLayerTables(s,l) ecs_Server *s; ecs_Layer *l; { register LayerPrivateData *lpriv; lpriv = (LayerPrivateData *) l->priv; switch(l->sel.F) { case Area: if (lpriv->l.area.faceTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table fac not open"); return FALSE; } if (lpriv->l.area.mbrTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return FALSE; } if (lpriv->l.area.ringTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table rng not open"); return FALSE; } if (lpriv->l.area.edgeTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table edg not open"); return FALSE; } break; case Line: if (lpriv->l.line.mbrTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return FALSE; } if (lpriv->l.line.edgeTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table edg not open"); return FALSE; } break; case Point: if (lpriv->l.point.primTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table end or cnd not open"); return FALSE; } break; case Text: if (lpriv->l.text.textTable.fp == NULL) { ecs_SetError(&(s->result), 1, "VRF table txt not open"); return FALSE; } break; default: return FALSE; } return TRUE; } ogdi-ogdi_4_1_0/ogdi/driver/vrf/makefile000066400000000000000000000022331345660466700203350ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = vrf TARGETGEN=$(DYNAGEN) SOURCES = vrf.c utils.c feature.c object.c open.c swq.c vrfswq.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) $(VPF_INCLUDE) $(GLUTIL_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(WIN_LINKLIB) $(VPF_STATICLIB) $(MATH_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR datadict.h $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/ogdi/driver/vrf/object.c000066400000000000000000001510531345660466700202540ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Implementation of vrf Server getObject* functions * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.12 2016-07-06 09:00:39 erouault * VRF: implement ecs_SetErrorShouldStop() logic in the various _getNext.... methods * * Revision 1.11 2016/07/04 17:03:12 erouault * Error handling: Add a ecs_SetErrorShouldStop() function that can be * used internally when the code is able to recover from an error. The user * may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO * as environment variable (the default being YES: stop on error). * Add a ecs_SetReportErrorFunction() method to install a custom callback that * will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still * aware of errors that occured. If not defined, the error will be logged in stderr. * * Revision 1.10 2016/07/04 14:34:40 erouault * VPF: _getNextObject / _getObject functions: validate the value of the tile_id to avoid a potential out-of-bounds read. Fix crash on dqyarea@dqy layer of DNC17/H1708311 * * Revision 1.9 2007/05/09 20:46:28 cbalint * From: Even Rouault * Date: Friday 21:14:18 * * * fix filename case sensitivy problems (for Unix-like systems). * * * fix incorrect use of sprintf in vrf_GetMetadata. * * * report wgs84 instead of nad83, not sure whether that is true * for all VPF products, but at least it's correct for VMAP products * that *must* be WGS84. A better fix would be to read the VPF table * that contains this information. * * * fix a few minor memory leaks and memory usage issues. * * * enable XMIN, YMIN, XMAX and YMAX columns to be of type double * in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * * * add .pjt and .tjt as possible extensions for join tables * (VMAP2i 'MIG2i000' product). * * * fix duplicated layers report (VMAP2i 'MIG2i000' product). * * * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * * * optionnaly, convert text to UTF-8 when environment variable * CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable * on Windows I guess (only tested on Linux) and maybe too specific. * * * enable reading of VPF products without table indexes file * (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when * there is a variable length field in one table, an index should exist, * but some test products don't follow this. The approach here is to read * the whole table content and build the index in memory. * * Modified Files: * ChangeLog ogdi/driver/vrf/feature.c ogdi/driver/vrf/object.c * ogdi/driver/vrf/utils.c ogdi/driver/vrf/vrf.c * ogdi/driver/vrf/vrfswq.c vpflib/musedir.c vpflib/strfunc.c * vpflib/vpfbrows.c vpflib/vpfprop.c vpflib/vpfquery.c * vpflib/vpfread.c vpflib/vpftable.c * * Revision 1.8 2004/10/19 14:17:03 warmerda * primList leak fixed in vrf driver * * Revision 1.7 2001/08/16 20:40:34 warmerda * applied VITD fixes - merge primitive lines into a feature * * Revision 1.6 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.5 2001/06/13 17:33:59 warmerda * upgraded source headers * */ #include "ecs.h" #include "vrf.h" ECS_CVSID("$Id$"); /* ******************************************************************** FUNCTION_INFORMATION NAME _getTileAndPrimId DESCRIPTION With a object id, this function return the feature id of the object, and the tile id and primitive id related to it. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API ecs_Layer *l: The current layer int32 object_id: The object id OUTPUT int32 *feature_id: The feature id short *tile_id: The tile id of the primitive object int32 *prim_id: The primitive id related to the feature END_PARAMETERS END_FUNCTION_INFORMATION PSEUDO-CODE Set tile_id, feature_id and prim_id to -1. If the layer is not tiled (the primitives are in tiles) Begin Set tile_id to 1 End If the primitive id at the position object_id is negative (not calculated yet) Begin If a join table exist (the joinTableName is valid) Begin // 1:n relation, get the feature id in the join table Get the row object id in the join table If a join table feature id row don't exist in the join table Begin Set the feature table with object id (relation 1:1). End Else Begin Get the position of the feature attribute in the join table (with the join table feature id name). Read the content of the join table at this position and set feature_id. End If the tile_id is -1 Begin Get the position of the tile id attribute in the join table. Read the content of the join table at this position and set tile_id. End Get the position of the prim id attribute in the join table (with featureTablePrimIdName). Read the content of the join table at this position and set prim_id. Free the row in the join table. End Else Begin // 1:1 relation without a join table. Set the feature id with object id. Get the row object id in the feature table. If the tile_id is -1 Begin Get the position of the tile id attribute in the feature table. Read the content of the feature table at this position and set tile_id. End Get the position of the prim id attribute in the feature table (with featureTablePrimIdName). Read the content of the feature table at this position and set prim_id. Free the row in the feature table. End Set the index at the position object_id with the feature_id, the tile_id and the prim_id. End ******************************************************************** */ void _getTileAndPrimId(s,l,object_id,feature_id,tile_id,prim_id) ecs_Server *s; ecs_Layer *l; int32 object_id; int32 *feature_id; short *tile_id; int32 *prim_id; { int32 count; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; row_type row,join_row; int pos; (void) s; *tile_id = -1; *prim_id = -1; *feature_id = -1; if (!lpriv->isTiled) { *tile_id = 1; } if (lpriv->index[object_id].prim_id == -1) { if ((lpriv->joinTableName != NULL) && (*tile_id != -1 || (table_pos("TILE_ID",lpriv->joinTable) != -1)) && (table_pos(lpriv->featureTablePrimIdName,lpriv->joinTable) != -1)) { join_row = get_row(object_id+1, lpriv->joinTable); if (lpriv->joinTableFeatureIdName == NULL) { *feature_id = object_id+1; } else { pos = table_pos(lpriv->joinTableFeatureIdName,lpriv->joinTable); if (pos != -1) { get_table_element(pos, join_row, lpriv->joinTable, feature_id, &count); } else { return; } } if (*tile_id != 1) { pos = table_pos("TILE_ID",lpriv->joinTable); if (pos != -1) { /* DAP TR326 */ if (lpriv->joinTable.nrows <= 0) { *tile_id = -2; *prim_id = -1; return; } else { get_table_element(pos,join_row, lpriv->joinTable, tile_id, &count); } } else { return; } } pos = table_pos(lpriv->featureTablePrimIdName,lpriv->joinTable); if (pos != -1) { get_table_element(pos,join_row, lpriv->joinTable, prim_id, &count); } else { *feature_id = -1; *tile_id = -1; return; } free_row(join_row,lpriv->joinTable); } else { row = get_row(object_id+1, lpriv->featureTable); *feature_id = object_id+1; if (*tile_id != 1) { pos = table_pos("TILE_ID",lpriv->featureTable); if (pos != -1) { get_table_element(pos, row, lpriv->featureTable, tile_id, &count); } else { free_row(row, lpriv->featureTable); return; } } pos = table_pos(lpriv->featureTablePrimIdName,lpriv->featureTable); if (pos != -1) { get_table_element(pos, row, lpriv->featureTable, prim_id, &count); } else { free_row(row, lpriv->featureTable); return; } free_row(row, lpriv->featureTable); } lpriv->index[object_id].feature_id = *feature_id; lpriv->index[object_id].tile_id = *tile_id; lpriv->index[object_id].prim_id = *prim_id; } else { *feature_id = lpriv->index[object_id].feature_id; *tile_id = lpriv->index[object_id].tile_id; *prim_id = lpriv->index[object_id].prim_id; } } /* * -------------------------------------------------------------------------- * _getPrimList() * * Build list of primitives joined to the same feature. * This function assumes that all the primitives for a given feature * will occur together in the join table. While this appears to be * true of test datasets, it might not be true in general. Eventually * an efficient for relating a feature id with it's list of primitives * should be build, and maintained over the access to this join table * if this is to be safe. * * Note the object_id passed to this function is supposed to be the * row number of the first primitive in the join table when using * join tables and merging features. * -------------------------------------------------------------------------- */ void _getPrimList( ecs_Server *s, ecs_Layer *l, int32 object_id, int32 *feature_id, int32 *primCount, int32 **primList, short **tileList, int32 *next_index ) { LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 edg_id; int maxCount = 0; int32 object_id_save; /* Get the first primitive for this feature. */ _getTileAndPrimId(s,l,object_id,feature_id,&tile_id,&edg_id); object_id++; object_id_save = object_id; /* If we aren't operating in merged format, just return this primiitive */ maxCount = 1; *primCount = 1; *primList = (int32 *) malloc(sizeof(int32) * maxCount); *tileList = (short *) malloc(sizeof(short) * maxCount); (*primList)[0] = edg_id; (*tileList)[0] = tile_id; if( !lpriv->mergeFeatures ) { *next_index = object_id; return; } /* Collect all other primitives with the same line id. Note we are incrementing the global index value. */ while( object_id < lpriv->joinTable.nrows ) { int32 this_feature_id; _getTileAndPrimId(s,l,object_id, &this_feature_id,&tile_id,&edg_id); if( this_feature_id != *feature_id ) break; /* This primitive matches our feature_id, add to the list. */ if( *primCount == maxCount ) { int32* newPrimList; short* newTileList; maxCount += 100; newPrimList = (int32*) realloc(*primList, sizeof(int32) * maxCount); if( newPrimList == NULL ) { /* Should probably error out loudly */ free( *primList ); *primList = NULL; free( *tileList ); *tileList = NULL; *primCount = 0; object_id++; break; } *primList = newPrimList; newTileList = (short*) realloc(*tileList, sizeof(short) * maxCount); if( newPrimList == NULL ) { /* Should probably error out loudly */ free( *primList ); *primList = NULL; free( *tileList ); *tileList = NULL; *primCount = 0; object_id++; break; } *tileList = newTileList; } (*primList)[*primCount] = edg_id; (*tileList)[*primCount] = tile_id; (*primCount)++; object_id++; } /* On some products, consecutive lines of same feature id are not mergeable, * so return them one at a time to avoid loosing information */ if( *primCount > 1 ) { if (!vrf_get_merged_line_feature(s,l,*primCount,*primList,*tileList,TRUE)) { *primCount = 1; object_id = object_id_save; } } *next_index = object_id; } /* * -------------------------------------------------------------------------- * _getPrimListByFeatureId() * * Build list of primitives joined to the same feature based on the * feature id as a key. This can be kind of slow since the join * table is scanned linearly. * -------------------------------------------------------------------------- */ static void _getPrimListByFeatureId( ecs_Server *s, ecs_Layer *l, int32 object_id, /* this should be feature id */ int32 *primCount, int32 **primList, short **tileList, int32 *next_index ) { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int edgeCount, edgeId; if( lpriv->mergeFeatures ) edgeCount = lpriv->joinTable.nrows; else edgeCount = l->nbfeature; for( edgeId = 0; edgeId < edgeCount; edgeId++ ) { short tile_id; int32 prim_id, this_feature_id; _getTileAndPrimId( s, l, edgeId, &this_feature_id, &tile_id, &prim_id ); if( object_id == this_feature_id ) { _getPrimList( s, l, edgeId, &this_feature_id, primCount, primList, tileList, next_index ); return; } } *primCount = 0; *primList = NULL; *tileList = NULL; } /* * -------------------------------------------------------------------------- * _get*Object*Area: * * a set of functions to acheive Area objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectArea(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 area_id; int32 fac_id; int found = 0; char *temp; double xmin, xmax, ymin, ymax; retry: while(!found && l->index < l->nbfeature) { _getTileAndPrimId(s,l,l->index,&area_id,&tile_id, &fac_id); /* Check the case of the polygon with all the database polygon as island. The case only appear with DCW */ if ((l->index == 0) && (spriv->isDCW == TRUE)) { l->index++; continue; } if (set_member(area_id,lpriv->feature_rows)) { if (tile_id == -1) { if( ecs_SetErrorShouldStop(&(s->result), 1, "The VRF tiles are badly defined") ) return; l->index++; continue; } if (tile_id == -2) { if( ecs_SetErrorShouldStop(&(s->result), 1, "The join table is empty") ) return; l->index++; continue; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { /* Happens with dqyarea@dqy(*) coverage of DNC17/H1708311 */ char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; l->index++; continue; } else if (lpriv->isTiled == 0 || spriv->tile[tile_id-1].isSelected) { _selectTileArea(s,l,tile_id); if (!vrf_get_area_mbr(l,fac_id,&xmin,&ymin,&xmax,&ymax)) { if( ecs_SetErrorShouldStop(&(s->result), 1, "VRF table mbr not open") ) return; l->index++; continue; } if (!vrf_IsOutsideRegion(ymax,ymin,xmax,xmin, &(s->currentRegion))) { found = 1; break; } } } l->index++; } /* if a feature is found, get the feature info */ if (found) { if (!vrf_get_area_feature(s,l,fac_id)) { if( !ecs_ShouldStopOnError() ) { char* message= strdup(s->result.message); int should_stop; ecs_CleanUp(&(s->result)); should_stop = ecs_SetErrorShouldStop(&(s->result),1,message); free(message); if( !should_stop ) { found = 0; l->index++; goto retry; } } return; } l->index++; } else { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Add the identifier to the object */ sprintf(buffer,"%d",(int) area_id); ecs_SetObjectId(&(s->result),buffer); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, area_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); /* Add the bounding box to the object */ ECS_SETGEOMBOUNDINGBOX((&(s->result)),xmin,ymin,xmax,ymax); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectArea(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int object_id; int32 area_id; short tile_id; int32 fac_id; double xmin, xmax, ymin, ymax; char *temp; object_id = atoi(id); if (object_id > l->nbfeature || object_id < 0) { ecs_SetError(&(s->result),1,"Invalid area id"); return; } _getTileAndPrimId(s,l,object_id,&area_id,&tile_id, &fac_id); if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } _selectTileArea(s,l,tile_id); if (!vrf_get_area_feature(s,l,fac_id)) return; /* Add the identifier to the object */ ecs_SetObjectId(&(s->result),id); if (vrf_get_area_mbr(l,fac_id,&xmin,&ymin,&xmax,&ymax)) { ECS_SETGEOMBOUNDINGBOX((&(s->result)),xmin,ymin,xmax,ymax); } else { ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return; } /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, area_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectIdArea(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 fac_id; int feature_id; int32 area_id; double xmin, xmax, ymin, ymax; int32 index; double distance,result; distance = HUGE_VAL; feature_id = -1; for(index = 0; index < l->nbfeature; index++) { _getTileAndPrimId(s,l,index,&area_id,&tile_id, &fac_id); if (set_member(area_id,lpriv->feature_rows)) { if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } else if (!(lpriv->isTiled) || ((coord->x > spriv->tile[tile_id-1].xmin) && (coord->x < spriv->tile[tile_id-1].xmax) && (coord->y > spriv->tile[tile_id-1].ymin) && (coord->y < spriv->tile[tile_id-1].ymax))) { _selectTileArea(s,l,tile_id); if (!vrf_get_area_mbr(l,fac_id,&xmin,&ymin,&xmax,&ymax)) { ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return; } if ((coord->x>xmin) && (coord->xy>ymin) && (coord->yresult))))), coord->x, coord->y); if (result < distance) { distance = result; feature_id = index; } } } } } if (feature_id < 0) { ecs_SetError(&(s->result),1,"Can't find any area at this location"); return; } sprintf(buffer,"%d",feature_id); ecs_SetText(&(s->result),buffer); ecs_SetSuccess(&(s->result)); } /*************************************/ void _selectTileArea(s,l,tile_id) ecs_Server *s; ecs_Layer *l; int tile_id; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; char buffer[256]; if (lpriv->isTiled) { if (lpriv->current_tileid != tile_id) { if (lpriv->current_tileid != -1) { /* fermeture des tables ouvertes precedemment */ #ifdef TESTOPENTABLE printf("close lpriv->l.area.faceTable\n"); printf("close lpriv->l.area.edgeTable\n"); printf("close lpriv->l.area.ringTable\n"); printf("close lpriv->l.area.mbrTable\n"); #endif vpf_close_table(&(lpriv->l.area.faceTable)); vpf_close_table(&(lpriv->l.area.ringTable)); vpf_close_table(&(lpriv->l.area.edgeTable)); vpf_close_table(&(lpriv->l.area.mbrTable)); } /* ouverture des tables de primitives dans la bonne tuile */ #ifdef TESTOPENTABLE printf("open lpriv->l.area.faceTable\n"); printf("open lpriv->l.area.edgeTable\n"); printf("open lpriv->l.area.ringTable\n"); printf("open lpriv->l.area.mbrTable\n"); #endif if (tile_id != 0) { sprintf(buffer,"%s/%s/%s/fac",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/%s/FAC",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); } lpriv->l.area.faceTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/%s/edg",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/%s/EDG",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); } lpriv->l.area.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/%s/rng",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/%s/RNG",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); } lpriv->l.area.ringTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/%s/fbr",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/%s/FBR",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); } lpriv->l.area.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); } else { sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->primitiveTableName); lpriv->l.area.faceTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/edg",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/EDG",spriv->library,lpriv->coverage); } lpriv->l.area.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/rng",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/RNG",spriv->library,lpriv->coverage); } lpriv->l.area.ringTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/fbr",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/FBR",spriv->library,lpriv->coverage); } lpriv->l.area.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); } lpriv->current_tileid = tile_id; } } else { if (lpriv->current_tileid == -1) { /* ouverture des tables de primitives non-tuilees */ #ifdef TESTOPENTABLE printf("open lpriv->l.area.faceTable\n"); printf("open lpriv->l.area.edgeTable\n"); printf("open lpriv->l.area.ringTable\n"); printf("open lpriv->l.area.mbrTable\n"); #endif sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->primitiveTableName); lpriv->l.area.faceTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/edg",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/EDG",spriv->library,lpriv->coverage); } lpriv->l.area.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/rng",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/RNG",spriv->library,lpriv->coverage); } lpriv->l.area.ringTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/fbr",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/FBR",spriv->library,lpriv->coverage); } lpriv->l.area.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); lpriv->current_tileid = 1; } } } /* * -------------------------------------------------------------------------- * _get*Object*Line: * * a set of functions to acheive Line objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectLine(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[256]; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int32 line_id; int found = 0; char *temp; double xmin, xmax, ymin, ymax; int edgeCount; int32 *primList = NULL, primCount = 0; short *tileList = NULL; if( lpriv->mergeFeatures ) edgeCount = lpriv->joinTable.nrows; else edgeCount = l->nbfeature; retry: while(!found && l->index < edgeCount) { if( primList != NULL ) { free( primList ); primList = NULL; } if( tileList != NULL ) { free( tileList ); tileList = NULL; } _getPrimList( s, l, l->index, &line_id, &primCount, &primList, &tileList, (int32 *) &(l->index)); if (set_member(line_id,lpriv->feature_rows)) { if (!vrf_get_lines_mbr(s, l,primCount,primList,tileList,&xmin,&ymin,&xmax,&ymax)) { free( primList ); primList = NULL; free( tileList ); tileList = NULL; if( ecs_SetErrorShouldStop(&(s->result),1,"Unable to open mbr") ) return; continue; } if (!vrf_IsOutsideRegion(ymax,ymin,xmax,xmin, &(s->currentRegion))) { found = 1; break; } } } /* if a feature is found, get the feature info */ if (found) { if( !vrf_get_merged_line_feature(s,l,primCount,primList,tileList, FALSE) ) { free( primList ); primList = NULL; free( tileList ); tileList = NULL; if( !ecs_ShouldStopOnError() ) { char* message= strdup(s->result.message); int should_stop; ecs_CleanUp(&(s->result)); should_stop = ecs_SetErrorShouldStop(&(s->result),1,message); free(message); if( !should_stop ) { found = 0; goto retry; } } return; } } else { free( primList ); free( tileList ); ecs_SetError(&(s->result),2,"End of selection"); return; } free( primList ); free( tileList ); /* Add the identifier to the object */ sprintf(buffer,"%d", (int) line_id); ecs_SetObjectId(&(s->result),buffer); /* Add the bounding box to the object */ ECS_SETGEOMBOUNDINGBOX((&(s->result)),xmin,ymin,xmax,ymax); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, line_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectLine(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int object_id; double xmin, xmax, ymin, ymax; char *temp; int32 primCount, *primList, next_object; short *tileList; object_id = atoi(id); _getPrimListByFeatureId( s, l, object_id, &primCount, &primList, &tileList, &next_object ); if (primCount == 0) { ecs_SetError(&(s->result), 1, "No primitives identified for this feature."); return; } if (!vrf_get_merged_line_feature(s,l,primCount,primList,tileList, FALSE)) return; /* Add the identifier to the object */ ecs_SetObjectId(&(s->result),id); if (vrf_get_lines_mbr(s, l,primCount,primList,tileList,&xmin,&ymin,&xmax,&ymax)) { ECS_SETGEOMBOUNDINGBOX((&(s->result)),xmin,ymin,xmax,ymax); } else { free( primList ); free( tileList ); ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return; } free( primList ); free( tileList ); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, object_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectIdLine(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { char buffer[256]; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int feature_id; int32 line_id, primCount, *primList; short* tileList; double xmin, xmax, ymin, ymax; int32 index, edgeCount; double distance,result; distance = HUGE_VAL; feature_id = -1; if( lpriv->mergeFeatures ) edgeCount = lpriv->joinTable.nrows; else edgeCount = l->nbfeature; index = 0; while( index < edgeCount ) { _getPrimList( s, l, index, &line_id, &primCount, &primList, &tileList, &index); if (set_member(line_id,lpriv->feature_rows)) { if (!vrf_get_lines_mbr(s,l,primCount,primList,tileList,&xmin,&ymin,&xmax,&ymax)) { ecs_SetError(&(s->result), 1, "VRF table mbr not open"); return; } if ((coord->x>xmin) && (coord->xy>ymin) && (coord->yresult))))), coord->x, coord->y); if (result < distance) { distance = result; feature_id = line_id; } } } } if (feature_id < 0) { ecs_SetError(&(s->result),1,"Can't find any line at this location"); free(primList); free(tileList); return; } free(primList); free(tileList); sprintf(buffer,"%d",feature_id); ecs_SetText(&(s->result),buffer); ecs_SetSuccess(&(s->result)); } /*************************************/ void _selectTileLine(s,l,tile_id) ecs_Server *s; ecs_Layer *l; int tile_id; { _selectTileLineWithRet(s,l,tile_id); } int _selectTileLineWithRet(s,l,tile_id) ecs_Server *s; ecs_Layer *l; int tile_id; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; char buffer[256]; if (lpriv->isTiled) { if( tile_id < 1 || tile_id > spriv->nbTile ) { return 0; } if (lpriv->current_tileid != tile_id) { if (lpriv->current_tileid != -1) { /* fermeture des tables ouvertes precedemment */ #ifdef TESTOPENTABLE printf("close lpriv->l.line.mbrTable\n"); printf("close lpriv->l.line.edgeTable\n"); #endif vpf_close_table(&(lpriv->l.line.edgeTable)); vpf_close_table(&(lpriv->l.line.mbrTable)); } /* ouverture des tables de primitives dans la bonne tuile */ #ifdef TESTOPENTABLE printf("open lpriv->l.line.edgeTable\n"); printf("open lpriv->l.line.mbrTable\n"); #endif if (tile_id != 0) { sprintf(buffer,"%s/%s/%s/%s",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path,lpriv->primitiveTableName); lpriv->l.line.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/%s/ebr",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/%s/EBR",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path); } lpriv->l.line.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); } else { sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->primitiveTableName); lpriv->l.line.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/ebr",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/EBR",spriv->library,lpriv->coverage); } lpriv->l.line.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); } lpriv->current_tileid = tile_id; } } else { if (lpriv->current_tileid == -1) { /* ouverture des tables de primitives non-tuilees */ #ifdef TESTOPENTABLE printf("open lpriv->l.line.edgeTable\n"); printf("open lpriv->l.line.mbrTable\n"); #endif sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->primitiveTableName); lpriv->l.line.edgeTable = vpf_open_table(buffer, disk, "rb", NULL); sprintf(buffer,"%s/%s/ebr",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/EBR",spriv->library,lpriv->coverage); } lpriv->l.line.mbrTable = vpf_open_table(buffer, disk, "rb", NULL); lpriv->current_tileid = 1; } } return 1; } /* * -------------------------------------------------------------------------- * _get*Object*Point: * * a set of functions to acheive Point objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectPoint(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 point_id; int32 fpoint_id; int found = 0; char *temp; while(!found && l->index < l->nbfeature) { _getTileAndPrimId(s,l,l->index,&fpoint_id,&tile_id, &point_id); if (set_member(fpoint_id,lpriv->feature_rows)) { if (tile_id == -1) { if( ecs_SetErrorShouldStop(&(s->result), 1, "The VRF tiles are badly defined")) return; l->index++; continue; } if (tile_id == -2) { if( !ecs_SetErrorShouldStop(&(s->result), 1, "The join table is empty") ) return; l->index++; continue; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; l->index++; continue; } else if (lpriv->isTiled == 0 || spriv->tile[tile_id-1].isSelected) { _selectTilePoint(s,l,tile_id); if (!vrf_get_point_feature(s,l,point_id)) { if( !ecs_ShouldStopOnError() ) { char* message= strdup(s->result.message); int should_stop; ecs_CleanUp(&(s->result)); should_stop = ecs_SetErrorShouldStop(&(s->result),1,message); free(message); if( should_stop ) return; else { l->index++; continue; } } else { return; } } if ((ECSGEOM((&(s->result))).point.c.x>s->currentRegion.west) && (ECSGEOM((&(s->result))).point.c.xcurrentRegion.east) && (ECSGEOM((&(s->result))).point.c.y>s->currentRegion.south) && (ECSGEOM((&(s->result))).point.c.ycurrentRegion.north)) { found = 1; break; } } } l->index++; } /* if a feature is found, get the feature info */ if (found) { l->index++; } else { ecs_SetError(&(s->result),2,"End of selection"); return; } /* Add the identifier to the object */ sprintf(buffer,"%d",(int) point_id+1); ecs_SetObjectId(&(s->result),buffer); /* Add the bounding box to the object */ ECS_SETGEOMBOUNDINGBOX((&(s->result)), ECSGEOM((&(s->result))).point.c.x, ECSGEOM((&(s->result))).point.c.y, ECSGEOM((&(s->result))).point.c.x, ECSGEOM((&(s->result))).point.c.y); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, fpoint_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectPoint(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int object_id; int32 point_id; short tile_id; int32 prim_id; char *temp; object_id = atoi(id); if (object_id > l->nbfeature || object_id < 0) { ecs_SetError(&(s->result),1,"Invalid point id"); return; } _getTileAndPrimId(s,l,object_id,&point_id,&tile_id, &prim_id); if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } _selectTilePoint(s,l,tile_id); if (!vrf_get_point_feature(s,l,prim_id)) return; /* Add the identifier to the object */ ecs_SetObjectId(&(s->result),id); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, point_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectIdPoint(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 prim_id; int32 point_id; int feature_id; int32 index; double distance,result; distance = HUGE_VAL; feature_id = -1; for(index = 0; index < l->nbfeature; index++) { _getTileAndPrimId(s,l,index,&point_id,&tile_id, &prim_id); if (set_member(point_id,lpriv->feature_rows)) { if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } else if (!(lpriv->isTiled) || ((coord->x > spriv->tile[tile_id-1].xmin) && (coord->x < spriv->tile[tile_id-1].xmax) && (coord->y > spriv->tile[tile_id-1].ymin) && (coord->y < spriv->tile[tile_id-1].ymax))) { _selectTilePoint(s,l,tile_id); if (!vrf_get_point_feature(s,l,prim_id)) return; result = ecs_DistanceObjectWithTolerance((&(ECSOBJECT((&(s->result))))), coord->x, coord->y); if (result < distance) { distance = result; feature_id = index; } } } } if (feature_id < 0) { ecs_SetError(&(s->result),1,"Can't find any point at this location"); return; } sprintf(buffer,"%d",feature_id); ecs_SetText(&(s->result),buffer); ecs_SetSuccess(&(s->result)); } /*************************************/ void _selectTilePoint(s,l,tile_id) ecs_Server *s; ecs_Layer *l; int tile_id; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; char buffer[256]; if (lpriv->isTiled) { if (lpriv->current_tileid != tile_id) { if (lpriv->current_tileid != -1) { #ifdef TESTOPENTABLE printf("close lpriv->l.point.primTable\n"); #endif /* fermeture des tables ouvertes precedemment */ vpf_close_table(&(lpriv->l.point.primTable)); } /* ouverture des tables de primitives dans la bonne tuile */ #ifdef TESTOPENTABLE printf("open lpriv->l.point.primTable\n"); #endif if (tile_id != 0) { sprintf(buffer,"%s/%s/%s/%s",spriv->library,lpriv->coverage, spriv->tile[tile_id-1].path,lpriv->primitiveTableName); lpriv->l.point.primTable = vpf_open_table(buffer, disk, "rb", NULL); } else { sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage, lpriv->primitiveTableName); lpriv->l.point.primTable = vpf_open_table(buffer, disk, "rb", NULL); } lpriv->current_tileid = tile_id; } } else { if (lpriv->current_tileid == -1) { /* ouverture des tables de primitives non-tuilees */ #ifdef TESTOPENTABLE printf("open lpriv->l.point.primTable\n"); #endif sprintf(buffer,"%s/%s/%s",spriv->library, lpriv->coverage,lpriv->primitiveTableName); lpriv->l.point.primTable = vpf_open_table(buffer, disk, "rb", NULL); lpriv->current_tileid = 1; } } } /*************************************/ /* * -------------------------------------------------------------------------- * _get*Object*Text: * * a set of functions to acheive Text objects retrieval * -------------------------------------------------------------------------- */ void _getNextObjectText(s,l) ecs_Server *s; ecs_Layer *l; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 text_id; int32 prim_id; int found = 0; char *temp; while(!found && l->index < l->nbfeature) { _getTileAndPrimId(s,l,l->index,&text_id,&tile_id, &prim_id); if (set_member(text_id,lpriv->feature_rows)) { if (tile_id == -1) { if( ecs_SetErrorShouldStop(&(s->result), 1, "The VRF tiles are badly defined") ) return; l->index ++; continue; } if (tile_id == -2) { if( ecs_SetErrorShouldStop(&(s->result), 1, "The join table is empty") ) return; l->index ++; continue; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; l->index ++; continue; } else if (lpriv->isTiled == 0 || spriv->tile[tile_id-1].isSelected) { _selectTileText(s,l,tile_id); if (!vrf_get_text_feature(s,l,prim_id)) { if( !ecs_ShouldStopOnError() ) { char* message= strdup(s->result.message); int should_stop; ecs_CleanUp(&(s->result)); should_stop = ecs_SetErrorShouldStop(&(s->result),1,message); free(message); if( should_stop ) return; else { l->index ++; continue; } } else { return; } } if ((ECSGEOM((&(s->result))).text.c.x>s->currentRegion.west) && (ECSGEOM((&(s->result))).text.c.xcurrentRegion.east) && (ECSGEOM((&(s->result))).text.c.y>s->currentRegion.south) && (ECSGEOM((&(s->result))).text.c.ycurrentRegion.north)) { found = 1; break; } } } l->index++; } /* if a feature is found, get the feature info */ if (found) { l->index++; } else { ecs_CleanUp(&(s->result)); ecs_SetError(&(s->result),2,"End of selection"); return; } /* Add the identifier to the object */ sprintf(buffer,"%d", (int) text_id); ecs_SetObjectId(&(s->result),buffer); /* Add the bounding box to the object */ ECS_SETGEOMBOUNDINGBOX((&(s->result)), ECSGEOM((&(s->result))).text.c.x, ECSGEOM((&(s->result))).text.c.y, ECSGEOM((&(s->result))).text.c.x, ECSGEOM((&(s->result))).text.c.y); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, text_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectText(s,l,id) ecs_Server *s; ecs_Layer *l; char *id; { ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; int object_id; short tile_id; int32 prim_id; int32 text_id; char *temp; object_id = atoi(id); if (object_id > l->nbfeature || object_id < 0) { ecs_SetError(&(s->result),1,"Invalid text id"); return; } _getTileAndPrimId(s,l,object_id,&text_id,&tile_id, &prim_id); if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } _selectTileText(s,l,tile_id); if (!vrf_get_text_feature(s,l,prim_id)) return; /* Add the identifier to the object */ ecs_SetObjectId(&(s->result),id); /* Add the attributes to the object */ temp =vrf_get_ObjAttributes(lpriv->featureTable, text_id); if (temp != NULL) ecs_SetObjectAttr(&(s->result),temp); else ecs_SetObjectAttr(&(s->result),""); ecs_SetSuccess(&(s->result)); } /*************************************/ void _getObjectIdText(s,l,coord) ecs_Server *s; ecs_Layer *l; ecs_Coordinate *coord; { char buffer[256]; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; short tile_id; int32 prim_id; int32 text_id; int feature_id; int32 index; double distance,result; distance = HUGE_VAL; feature_id = -1; for(index = 0; index < l->nbfeature; index++) { _getTileAndPrimId(s,l,index,&text_id,&tile_id, &prim_id); if (set_member(text_id,lpriv->feature_rows)) { if (tile_id == -1) { ecs_SetError(&(s->result), 1, "The VRF tiles are badly defined"); return; } if (tile_id == -2) { ecs_SetError(&(s->result), 1, "The join table is empty"); return; } if( lpriv->isTiled && (tile_id < 1 || tile_id > spriv->nbTile) ) { char szErrorMsg[128]; sprintf(szErrorMsg, "Object index=%d references incorrect tile_id=%d (nbTile=%d)", l->index, tile_id, spriv->nbTile); if( ecs_SetErrorShouldStop(&(s->result), 1, szErrorMsg) ) return; } else if (!(lpriv->isTiled) || ((coord->x > spriv->tile[tile_id-1].xmin) && (coord->x < spriv->tile[tile_id-1].xmax) && (coord->y > spriv->tile[tile_id-1].ymin) && (coord->y < spriv->tile[tile_id-1].ymax))) { _selectTileText(s,l,tile_id); if (!vrf_get_text_feature(s,l,prim_id)) return; result = ecs_DistanceObjectWithTolerance((&(ECSOBJECT((&(s->result))))), coord->x, coord->y); if (result < distance) { distance = result; feature_id = index; } } } } if (feature_id < 0) { ecs_SetError(&(s->result),1,"Can't find any text at this location"); return; } sprintf(buffer,"%d",feature_id); ecs_SetText(&(s->result),buffer); ecs_SetSuccess(&(s->result)); } /*************************************/ void _selectTileText(s,l,tile_id) ecs_Server *s; ecs_Layer *l; int tile_id; { register LayerPrivateData *lpriv = (LayerPrivateData *) l->priv; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; char buffer[256]; if (lpriv->isTiled) { if (lpriv->current_tileid != tile_id) { if (lpriv->current_tileid != -1) { /* fermeture des tables ouvertes precedemment */ #ifdef TESTOPENTABLE printf("close lpriv->l.text.textTable\n"); #endif vpf_close_table(&(lpriv->l.text.textTable)); } /* ouverture des tables de primitives dans la bonne tuile */ if (tile_id != 0) { sprintf(buffer,"%s/%s/%s/%s",spriv->library,lpriv->coverage,spriv->tile[tile_id-1].path,lpriv->primitiveTableName); } else { sprintf(buffer,"%s/%s/txt",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0 ) { sprintf(buffer,"%s/%s/TXT",spriv->library,lpriv->coverage); } } #ifdef TESTOPENTABLE printf("open lpriv->l.text.textTable\n"); #endif lpriv->l.text.textTable = vpf_open_table(buffer, disk, "rb", NULL); lpriv->current_tileid = tile_id; } } else { if (lpriv->current_tileid == -1) { #ifdef TESTOPENTABLE printf("open lpriv->l.text.textTable\n"); #endif /* ouverture des tables de primitives non-tuilees */ sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->primitiveTableName); lpriv->l.text.textTable = vpf_open_table(buffer, disk, "rb", NULL); lpriv->current_tileid = 1; } } } void _closeLayerTable(s,l) ecs_Server *s; ecs_Layer *l; { register LayerPrivateData *lpriv; (void) s; lpriv = (LayerPrivateData *) l->priv; if (lpriv->current_tileid == -1) { return; } switch(l->sel.F) { case Area: #ifdef TESTOPENTABLE printf("close: lpriv->l.area.faceTable\n"); printf("close: lpriv->l.area.mbrTable\n"); printf("close: lpriv->l.area.ringTable\n"); printf("close: lpriv->l.area.edgeTable\n"); #endif if (&(lpriv->l.area.faceTable) != NULL) vpf_close_table(&(lpriv->l.area.faceTable)); if (&(lpriv->l.area.mbrTable) != NULL) vpf_close_table(&(lpriv->l.area.mbrTable)); if (&(lpriv->l.area.ringTable) != NULL) vpf_close_table(&(lpriv->l.area.ringTable)); if (&(lpriv->l.area.edgeTable) != NULL) vpf_close_table(&(lpriv->l.area.edgeTable)); break; case Line: #ifdef TESTOPENTABLE printf("close: lpriv->l.line.edgeTable\n"); printf("close: lpriv->l.line.mbrTable\n"); #endif if (&(lpriv->l.line.edgeTable) != NULL) vpf_close_table(&(lpriv->l.line.edgeTable)); if (&(lpriv->l.line.mbrTable) != NULL) vpf_close_table(&(lpriv->l.line.mbrTable)); break; case Point: #ifdef TESTOPENTABLE printf("close: lpriv->l.point.primTable\n"); #endif if (&(lpriv->l.point.primTable) != NULL) vpf_close_table(&(lpriv->l.point.primTable)); break; case Text: #ifdef TESTOPENTABLE printf("close: lpriv->l.text.textTable\n"); #endif if (&(lpriv->l.text.textTable) != NULL) vpf_close_table(&(lpriv->l.text.textTable)); break; default: return; } lpriv->current_tileid = -1; return; } ogdi-ogdi_4_1_0/ogdi/driver/vrf/open.c000066400000000000000000000064341345660466700177510ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Implementation of vrf Server open, close and rewind functions * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.6 2001-06-21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.5 2001/06/13 17:33:59 warmerda * upgraded source headers * */ #include "ecs.h" #include "vrf.h" ECS_CVSID("$Id$"); /* * -------------------------------------------------------------------------- * _openAreaLayer: * * open an initialize a new vrf area vector layer * -------------------------------------------------------------------------- */ void _openAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _closeAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _rewindAreaLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* * -------------------------------------------------------------------------- * _openLineLayer: * * open an initialize a new vrf line vector layer * -------------------------------------------------------------------------- */ void _openLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _closeLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _rewindLineLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* * -------------------------------------------------------------------------- * _openPointLayer: * * open an initialize a new vrf sites layer * -------------------------------------------------------------------------- */ void _openPointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _closePointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _rewindPointLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } /* * -------------------------------------------------------------------------- * _openTextLayer: * * open an initialize a new vrf paint/label layer * -------------------------------------------------------------------------- */ void _openTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _closeTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } void _rewindTextLayer(s,l) ecs_Server *s; ecs_Layer *l; { (void) s; (void) l; } ogdi-ogdi_4_1_0/ogdi/driver/vrf/swq.c000066400000000000000000000444461345660466700176270ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Driver Support Library * Purpose: Generic SQL WHERE Expression Implementation. * Author: Frank Warmerdam * ****************************************************************************** * Copyright (C) 2001 Information Interoperability Institute (3i) * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of 3i not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. 3i makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.3 2001-06-26 00:57:34 warmerda * fixed strcasecmp on WIN32 * * Revision 1.2 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.1 2001/06/20 21:49:16 warmerda * New * */ #include #include #include #include "swq.h" #include "ecs.h" ECS_CVSID("$Id$"); #ifndef SWQ_MALLOC #define SWQ_MALLOC(x) malloc(x) #define SWQ_FREE(x) free(x) #endif #ifndef TRUE # define TRUE 1 #endif #ifndef FALSE # define FALSE 0 #endif #ifdef WIN32 # define strcasecmp stricmp #endif char swq_error[1024]; /************************************************************************/ /* swq_isalphanum() */ /* */ /* Is the passed character in the set of things that could */ /* occur in an alphanumeric token, or a number? */ /************************************************************************/ static int swq_isalphanum( char c ) { if( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '+' || c == '-' || c == '_' ) return TRUE; else return FALSE; } /************************************************************************/ /* swq_token() */ /************************************************************************/ static char *swq_token( const char *expression, char **next ) { char *token; int i_token; while( *expression == ' ' || *expression == '\t' ) expression++; if( *expression == '\0' ) { *next = (char *) expression; return NULL; } /* -------------------------------------------------------------------- */ /* Handle string constants. */ /* -------------------------------------------------------------------- */ if( *expression == '"' ) { expression++; token = (char *) SWQ_MALLOC(strlen(expression)+1); i_token = 0; while( *expression != '\0' ) { if( *expression == '\\' && expression[1] == '"' ) expression++; else if( *expression == '"' ) { expression++; break; } token[i_token++] = *(expression++); } token[i_token] = '\0'; } /* -------------------------------------------------------------------- */ /* Handle alpha-numerics. */ /* -------------------------------------------------------------------- */ else if( swq_isalphanum( *expression ) ) { token = (char *) SWQ_MALLOC(strlen(expression)+1); i_token = 0; while( swq_isalphanum( *expression ) ) { token[i_token++] = *(expression++); } token[i_token] = '\0'; } /* -------------------------------------------------------------------- */ /* Handle special tokens. */ /* -------------------------------------------------------------------- */ else { token = (char *) SWQ_MALLOC(3); token[0] = *expression; token[1] = '\0'; expression++; /* special logic to group stuff like '>=' into one token. */ if( (*token == '<' || *token == '>' || *token == '=' || *token == '!') && (*expression == '<' || *expression == '>' || *expression == '=')) { token[1] = *expression; token[2] = '\0'; expression++; } } *next = (char *) expression; return token; } /************************************************************************/ /* swq_identify_field() */ /************************************************************************/ static swq_op swq_identify_op( const char *token ) { if( strcasecmp(token,"OR") == 0 ) return SWQ_OR; if( strcasecmp(token,"AND") == 0 ) return SWQ_AND; if( strcasecmp(token,"NOT") == 0 ) return SWQ_NOT; if( strcasecmp(token,"<=") == 0 ) return SWQ_LE; if( strcasecmp(token,">=") == 0 ) return SWQ_GE; if( strcasecmp(token,"=") == 0 ) return SWQ_EQ; if( strcasecmp(token,"!=") == 0 ) return SWQ_NE; if( strcasecmp(token,"<>") == 0 ) return SWQ_NE; if( strcasecmp(token,"<") == 0 ) return SWQ_LT; if( strcasecmp(token,">") == 0 ) return SWQ_GT; return SWQ_UNKNOWN; } /************************************************************************/ /* swq_op_is_logical() */ /************************************************************************/ static int swq_op_is_logical( swq_op op ) { return op == SWQ_OR || op == SWQ_AND || op == SWQ_NOT; } /************************************************************************/ /* swq_identify_field() */ /************************************************************************/ static int swq_identify_field( const char *token, int field_count, char **field_list, swq_field_type *field_types, swq_field_type *this_type ) { int i; for( i = 0; i < field_count; i++ ) { if( strcasecmp( field_list[i], token ) == 0 ) { if( field_types != NULL ) *this_type = field_types[i]; else *this_type = SWQ_OTHER; return i; } } *this_type = SWQ_OTHER; return -1; } /************************************************************************/ /* swq_subexpr_compile() */ /************************************************************************/ static const char * swq_subexpr_compile( char **tokens, int field_count, char **field_list, swq_field_type *field_types, swq_expr **expr_out, int *tokens_consumed ) { swq_expr *op; const char *error; *tokens_consumed = 0; *expr_out = NULL; if( tokens[0] == NULL || tokens[1] == NULL ) { sprintf( swq_error, "Not enough tokens to complete expression." ); return swq_error; } op = (swq_field_op *) SWQ_MALLOC(sizeof(swq_field_op)); memset( op, 0, sizeof(swq_field_op) ); op->field_index = -1; if( strcmp(tokens[0],"(") == 0 ) { int sub_consumed = 0; error = swq_subexpr_compile( tokens + 1, field_count, field_list, field_types, (swq_expr **) &(op->first_sub_expr), &sub_consumed ); if( error != NULL ) { swq_expr_free( op ); return error; } if( strcmp(tokens[sub_consumed+1],")") != 0 ) { swq_expr_free( op ); sprintf(swq_error,"Unclosed brackets, or incomplete expression."); return swq_error; } *tokens_consumed += sub_consumed + 2; /* If we are at the end of the tokens, we should return our subnode */ if( tokens[*tokens_consumed] == NULL || strcmp(tokens[*tokens_consumed],")") == 0 ) { *expr_out = (swq_expr *) op->first_sub_expr; op->first_sub_expr = NULL; swq_expr_free( op ); return NULL; } } else { op->field_index = swq_identify_field( tokens[*tokens_consumed], field_count, field_list, field_types, &(op->field_type) ); if( op->field_index < 0 ) { swq_expr_free( op ); sprintf( swq_error, "Failed to identify field:" ); strncat( swq_error, tokens[*tokens_consumed], sizeof(swq_error) - strlen(swq_error) - 1 ); return swq_error; } (*tokens_consumed)++; } /* ** Identify the operation. */ if( tokens[*tokens_consumed] == NULL || tokens[*tokens_consumed+1] == NULL) { sprintf( swq_error, "Not enough tokens to complete expression." ); return swq_error; } op->operation = swq_identify_op( tokens[*tokens_consumed] ); if( op->operation == SWQ_UNKNOWN ) { swq_expr_free( op ); sprintf( swq_error, "Failed to identify operation:" ); strncat( swq_error, tokens[*tokens_consumed], sizeof(swq_error) - strlen(swq_error) - 1 ); return swq_error; } if( swq_op_is_logical( op->operation ) && op->first_sub_expr == NULL ) { swq_expr_free( op ); strcpy( swq_error, "Used logical operation with non-logical operand."); return swq_error; } if( op->field_index != -1 && op->field_type == SWQ_STRING && (op->operation != SWQ_EQ && op->operation != SWQ_NE) ) { sprintf( swq_error, "Attempt to use STRING field `%s' with numeric comparison `%s'.", field_list[op->field_index], tokens[*tokens_consumed] ); swq_expr_free( op ); return swq_error; } (*tokens_consumed)++; /* ** Collect the second operand as a subexpression. */ if( tokens[*tokens_consumed] == NULL ) { sprintf( swq_error, "Not enough tokens to complete expression." ); return swq_error; } if( swq_op_is_logical( op->operation ) ) { int sub_consumed = 0; error = swq_subexpr_compile( tokens + *tokens_consumed, field_count, field_list, field_types, (swq_expr **) &(op->second_sub_expr), &sub_consumed ); if( error != NULL ) { swq_expr_free( op ); return error; } *tokens_consumed += sub_consumed; } /* ** Otherwise collect it as a literal value. */ else { op->string_value = (char *) SWQ_MALLOC(strlen(tokens[*tokens_consumed])+1); strcpy( op->string_value, tokens[*tokens_consumed] ); op->int_value = atoi(op->string_value); op->float_value = atof(op->string_value); if( op->field_index != -1 && (op->field_type == SWQ_INTEGER || op->field_type == SWQ_FLOAT) && op->string_value[0] != '-' && op->string_value[0] != '+' && op->string_value[0] != '.' && (op->string_value[0] < '0' || op->string_value[0] > '9') ) { sprintf( swq_error, "Attempt to compare numeric field `%s' to non-numeric" " value `%s' is illegal.", field_list[op->field_index], op->string_value ); swq_expr_free( op ); return swq_error; } (*tokens_consumed)++; } *expr_out = op; op = NULL; /* ** Are we part of an unparantized logical expression chain? If so, ** grab the remainder of the expression at "this level" and add to the ** local tree. */ if( tokens[*tokens_consumed] != NULL && swq_op_is_logical(swq_identify_op( tokens[*tokens_consumed] )) ) { swq_expr *remainder = NULL; swq_expr *parent; int sub_consumed; error = swq_subexpr_compile( tokens + *tokens_consumed + 1, field_count, field_list, field_types, &remainder, &sub_consumed ); if( error != NULL ) { swq_expr_free( *expr_out ); *expr_out = NULL; return error; } parent = (swq_field_op *) SWQ_MALLOC(sizeof(swq_field_op)); memset( parent, 0, sizeof(swq_field_op) ); parent->field_index = -1; parent->first_sub_expr = (struct swq_node_s *) *expr_out; parent->second_sub_expr = (struct swq_node_s *) remainder; parent->operation = swq_identify_op( tokens[*tokens_consumed] ); *expr_out = parent; *tokens_consumed += sub_consumed + 1; } return NULL; } /************************************************************************/ /* swq_expr_compile() */ /************************************************************************/ const char *swq_expr_compile( const char *where_clause, int field_count, char **field_list, swq_field_type *field_types, swq_expr **expr_out ) { #define MAX_TOKEN 1024 char *token_list[MAX_TOKEN], *rest_of_expr; int token_count = 0; int tokens_consumed, i; const char *error; /* ** Collect token array. */ rest_of_expr = (char *) where_clause; while( token_count < MAX_TOKEN ) { token_list[token_count] = swq_token( rest_of_expr, &rest_of_expr ); if( token_list[token_count] == NULL ) break; token_count++; } token_list[token_count] = NULL; /* ** Parse the expression. */ *expr_out = NULL; error = swq_subexpr_compile( token_list, field_count, field_list, field_types, expr_out, &tokens_consumed ); for( i = 0; i < token_count; i++ ) SWQ_FREE( token_list[i] ); if( error != NULL ) return error; if( tokens_consumed < token_count ) { swq_expr_free( *expr_out ); *expr_out = NULL; sprintf( swq_error, "Syntax error, %d extra tokens", token_count - tokens_consumed ); return swq_error; } return NULL; } /************************************************************************/ /* swq_expr_free() */ /************************************************************************/ void swq_expr_free( swq_expr *expr ) { if( expr == NULL ) return; if( expr->first_sub_expr != NULL ) swq_expr_free( (swq_expr *) expr->first_sub_expr ); if( expr->second_sub_expr != NULL ) swq_expr_free( (swq_expr *) expr->second_sub_expr ); if( expr->string_value != NULL ) SWQ_FREE( expr->string_value ); SWQ_FREE( expr ); } /************************************************************************/ /* swq_expr_evaluate() */ /************************************************************************/ int swq_expr_evaluate( swq_expr *expr, swq_op_evaluator fn_evaluator, void *record_handle ) { if( expr->operation == SWQ_OR ) { return swq_expr_evaluate( (swq_expr *) expr->first_sub_expr, fn_evaluator, record_handle) || swq_expr_evaluate( (swq_expr *) expr->second_sub_expr, fn_evaluator, record_handle); } else if( expr->operation == SWQ_AND ) { return swq_expr_evaluate( (swq_expr *) expr->first_sub_expr, fn_evaluator, record_handle) && swq_expr_evaluate( (swq_expr *) expr->second_sub_expr, fn_evaluator, record_handle); } else { return fn_evaluator( expr, record_handle ); } return FALSE; } /************************************************************************/ /* swq_expr_dump() */ /************************************************************************/ void swq_expr_dump( swq_expr *expr, FILE * fp, int depth ) { char spaces[60]; int i; const char *op_name = "unknown"; for( i = 0; i < depth*2 && i < sizeof(spaces); i++ ) spaces[i] = ' '; spaces[i] = '\0'; /* ** first term. */ if( expr->first_sub_expr != NULL ) swq_expr_dump( (swq_expr *) expr->first_sub_expr, fp, depth + 1 ); else fprintf( fp, "%s Field %d\n", spaces, expr->field_index ); /* ** Operation. */ if( expr->operation == SWQ_OR ) op_name = "OR"; if( expr->operation == SWQ_AND ) op_name = "AND"; if( expr->operation == SWQ_NOT) op_name = "NOT"; if( expr->operation == SWQ_GT ) op_name = ">"; if( expr->operation == SWQ_LT ) op_name = "<"; if( expr->operation == SWQ_EQ ) op_name = "="; if( expr->operation == SWQ_NE ) op_name = "!="; if( expr->operation == SWQ_GE ) op_name = ">="; if( expr->operation == SWQ_LE ) op_name = "<="; fprintf( fp, "%s%s\n", spaces, op_name ); /* ** Second term. */ if( expr->second_sub_expr != NULL ) swq_expr_dump( (swq_expr *) expr->second_sub_expr, fp, depth + 1 ); else fprintf( fp, "%s %s\n", spaces, expr->string_value ); } ogdi-ogdi_4_1_0/ogdi/driver/vrf/swq.h000066400000000000000000000052161345660466700176240ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Driver Support Library * Purpose: Generic SQL WHERE Expression Evaluator Declarations. * Author: Frank Warmerdam * ****************************************************************************** * Copyright (C) 2001 Information Interoperability Institute (3i) * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of 3i not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. 3i makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.1 2001-06-20 21:49:16 warmerda * New * */ #ifndef _SWQ_H_INCLUDED_ #define _SWQ_H_INCLUDED_ typedef enum { SWQ_OR, SWQ_AND, SWQ_NOT, SWQ_EQ, SWQ_NE, SWQ_GE, SWQ_LE, SWQ_LT, SWQ_GT, SWQ_UNKNOWN } swq_op; typedef enum { SWQ_INTEGER, SWQ_FLOAT, SWQ_STRING, SWQ_BOOLEAN, SWQ_OTHER } swq_field_type; typedef struct { swq_op operation; /* only for logical expression on subexpression */ struct swq_node_s *first_sub_expr; struct swq_node_s *second_sub_expr; /* only for binary field operations */ int field_index; swq_field_type field_type; char *string_value; int int_value; double float_value; } swq_field_op; typedef swq_field_op swq_expr; typedef int (*swq_op_evaluator)(swq_field_op *op, void *record_handle); /* Compile an SQL WHERE clause into an internal form. The field_list is ** the list of fields in the target 'table', used to render where into ** field numbers instead of names. */ const char *swq_expr_compile( const char *where_clause, int field_count, char **field_list, swq_field_type *field_types, swq_expr **expr ); /* ** Evaluate an expression for a particular record using an application ** provided field operation evaluator, and abstract record handle. */ int swq_expr_evaluate( swq_expr *expr, swq_op_evaluator fn_evaluator, void *record_handle ); void swq_expr_free( swq_expr * ); #endif /* def _SWQ_H_INCLUDED_ */ ogdi-ogdi_4_1_0/ogdi/driver/vrf/utils.c000066400000000000000000002066251345660466700201540ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Various VRF supporting functions. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.21 2016-07-07 15:50:15 erouault * fix stack buffer overflow in vrf_GetMetadata() when reading the level in CAT files. Found by GCC 5.2 -faddress=sanitize * * Revision 1.20 2016/07/04 17:03:12 erouault * Error handling: Add a ecs_SetErrorShouldStop() function that can be * used internally when the code is able to recover from an error. The user * may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO * as environment variable (the default being YES: stop on error). * Add a ecs_SetReportErrorFunction() method to install a custom callback that * will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still * aware of errors that occured. If not defined, the error will be logged in stderr. * * Revision 1.19 2016/07/04 12:49:56 erouault * VPF: Avoid a missing fcs file in a coverage to prevent opening any coverage of the library (fix opening of DNC17/COA17A dataset) * * Revision 1.18 2008/05/28 00:18:21 cbalint * * fix minor printf format gcc warnings. * * Revision 1.17 2007/05/09 20:46:28 cbalint * From: Even Rouault * Date: Friday 21:14:18 * * * fix filename case sensitivy problems (for Unix-like systems). * * * fix incorrect use of sprintf in vrf_GetMetadata. * * * report wgs84 instead of nad83, not sure whether that is true * for all VPF products, but at least it's correct for VMAP products * that *must* be WGS84. A better fix would be to read the VPF table * that contains this information. * * * fix a few minor memory leaks and memory usage issues. * * * enable XMIN, YMIN, XMAX and YMAX columns to be of type double * in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * * * add .pjt and .tjt as possible extensions for join tables * (VMAP2i 'MIG2i000' product). * * * fix duplicated layers report (VMAP2i 'MIG2i000' product). * * * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * * * optionnaly, convert text to UTF-8 when environment variable * CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable * on Windows I guess (only tested on Linux) and maybe too specific. * * * enable reading of VPF products without table indexes file * (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when * there is a variable length field in one table, an index should exist, * but some test products don't follow this. The approach here is to read * the whole table content and build the index in memory. * * Modified Files: * ChangeLog ogdi/driver/vrf/feature.c ogdi/driver/vrf/object.c * ogdi/driver/vrf/utils.c ogdi/driver/vrf/vrf.c * ogdi/driver/vrf/vrfswq.c vpflib/musedir.c vpflib/strfunc.c * vpflib/vpfbrows.c vpflib/vpfprop.c vpflib/vpfquery.c * vpflib/vpfread.c vpflib/vpftable.c * * Revision 1.16 2004/10/26 19:57:36 warmerda * Fixed problem where "reg" regular expression was freed, but the change * was not recognised since compiled was not being reset. Got rid of * compiled flag entirely. * * Revision 1.15 2004/10/25 19:34:31 warmerda * The Level "buffint" should be short, not int, when forming the metadata. * * Revision 1.14 2004/02/18 21:33:18 warmerda * free regex memory * * Revision 1.13 2003/05/21 18:47:31 warmerda * initialize spriv->tile[0].path in untiled (VITD) case * * Revision 1.12 2001/08/16 19:59:08 warmerda * partially rewrite vrf_build_coverage_capabilities to avoid repeating entries * * Revision 1.11 2001/07/05 14:16:06 warmerda * fixed vrf_GetMetadata error duplicating first layer in a class, bug 111181 * * Revision 1.10 2001/06/29 19:17:00 warmerda * fixed unterminated 'temp' string * * Revision 1.9 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.8 2001/06/13 17:33:59 warmerda * upgraded source headers * */ #include #include #include "ecs.h" #include "vrf.h" #include "vpfprop.h" ECS_CVSID("$Id$"); #ifdef _WINDOWS #define SEPARATOR '\\' #else #define SEPARATOR '/' #endif /* ---------------------------------------------------------------------- * vrf_parsePath: * * decomposition du pathname en database, location et mapset * ---------------------------------------------------------------------- */ #define SYNTAXERRORMESSAGE "Badly formed pathname: %s, must be fclass@coverage(expression)" int vrf_parsePath(s,lpriv,sel) ecs_Server *s; LayerPrivateData *lpriv; ecs_LayerSelection *sel; { return vrf_parsePathValue(s,sel->Select,&(lpriv->fclass),&(lpriv->coverage),&(lpriv->expression)); } /* ---------------------------------------------------------------------- * vrf_parsePathValues: * * decomposition du pathname en database, location et mapset * ---------------------------------------------------------------------- */ int vrf_parsePathValue(s,request,fclass,coverage,expression) ecs_Server *s; char *request; char **fclass; char **coverage; char **expression; { char buffer[512],*temp; int i,pos; const char* arobase; /* Found the first "(" */ pos = 0; for(i=0;i<(int) strlen(request);i++) { if (request[i] == '(') { pos = i; break; } } temp = malloc(pos+1); if (temp == NULL) { ecs_SetError(&(s->result),1,"not enough memory"); return 0; } strncpy(temp,request,pos); temp[pos] = '\0'; if ((int) strlen(request) > pos) { *expression = malloc(strlen(request)-pos+1); if (*expression == NULL) { free(temp); ecs_SetError(&(s->result),1,"not enough memory"); return 0; } strncpy(*expression,request+pos+1,strlen(request)-pos-2); (*expression)[strlen(request)-pos-2] = '\0'; } else { free(temp); ecs_SetError(&(s->result),1,"no expressions set in this request"); return 0; } arobase = strchr(temp, '@'); if( !arobase ) { sprintf(buffer,SYNTAXERRORMESSAGE,request); ecs_SetError(&(s->result),1,buffer); free(temp); free(*expression); return 0; } *fclass = malloc(arobase - temp + 1); memcpy(*fclass, temp, arobase - temp); (*fclass)[arobase - temp] = 0; *coverage = malloc(strlen(arobase+1) + 1); strcpy(*coverage, arobase + 1); if (strlen(*fclass) == 0) { sprintf(buffer,SYNTAXERRORMESSAGE,s->pathname); ecs_SetError(&(s->result),1,buffer); free(temp); free(*expression); return 0; } if (strlen(*coverage) == 0) { sprintf(buffer,SYNTAXERRORMESSAGE,s->pathname); ecs_SetError(&(s->result),1,buffer); free(temp); free(*expression); return 0; } free(temp); return 1; } /* ---------------------------------------------------------------------- * vrf_freePathRegex() * * free resources related to regex path checker. * ---------------------------------------------------------------------- */ void vrf_freePathRegex() { } /* ******************************************************************** FUNCTION_INFORMATION NAME vrf_getFileNameFromFcs DESCRIPTION Extract from the FCS the important information needed by a given layer. END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API ecs_Layer *lpriv: The current layer private information END_PARAMETERS END_FUNCTION_INFORMATION PSEUDO-CODE Check with muse access see if in the coverage there is a FCS. If it exist, open it in fcsTable. For each row in the fcs table Begin Get the current row in the table. If the first element of the row get the same name than the current feature class Begin Set the variable found to 1 Check if a join table exist and get it's name. Set isJointed to TRUE if one is found for this coverage. Get the feature table name attribute in the row (position 2). Set this value in lpriv->featureTableName. Get the primitive table name attribute in the row (position 4). Set this value in lpriv->primitiveTableName. If there is a joint table Begin If the primitive table name is a join table. Begin Clear from the memory the lpriv->primitiveTableName. Get the join table name attribute in the row (position 4). Set this value in lpriv->joinTableName. Get the join table foreign key name attribute in the row (position 3). Set this value in lpriv->joinTableForeignKeyName. Get the join table feature id name attribute in the row (position 5). Set this value in lpriv->joinTableFeatureIdName. Check the remaining rows in the fcs table one by one Begin Set buf2 at the second position of the row. Set buf3 at the fourth position of the row. If buf2 contain the joinTableName and buf3 don't contain the featureTableName Begin Get the primitive table name attribute in the row (position 4). Set this value in lpriv->primitiveTableName. Get the join table primitive id name attribute in the row (position 3). Set this value in lpriv->featureTablePrimIdName. End Free buf2 Free buf3 End End Else Begin // No links are define between the join table and the // feature table in fcs. We suppose a relation 1:1. Set the lpriv->joinTableName with the join filename found previously. Set lpriv->joinTableForeignKeyName to NULL. Get the feature table primitive id name attribute in the row (position 3). Set this value in lpriv->featureTablePrimIdName. End End Else Begin // There is no join table Set the lpriv->joinTableName to NULL. Set lpriv->joinTableForeignKeyName to NULL. Get the feature table primitive id name attribute in the row (position 3). Set this value in lpriv->featureTablePrimIdName. End End Free the row End Close the fcs table Return a success message ******************************************************************** */ int vrf_getFileNameFromFcs(s,lpriv) ecs_Server *s; LayerPrivateData *lpriv; { char buffer[512]; char *buf1; char *buf2; char *buf3; int count; int i,j; int found = 0; row_type row, row2; char code; register ServerPrivateData *spriv = s->priv; char tempfilename[100]; int isJointed; int feature_class_pos, table1_pos, table1_key_pos, table2_pos, table2_key_pos; static const char* extJointTables[] = { ".pjt", ".ajt", ".ljt", ".rjt", ".njt", ".tjt"}; sprintf(buffer,"%s/%s/fcs",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/%s/FCS",spriv->library,lpriv->coverage); if (muse_access(buffer,0) != 0) { ecs_SetError(&(s->result),1,"Can't open the FCS table, invalid VRF coverage"); return 0; } } #ifdef TESTOPENTABLE printf("open lpriv->fcsTable:%s\n",buffer); #endif lpriv->fcsTable = vpf_open_table(buffer, disk, "rb", NULL); if (lpriv->fcsTable.path == NULL) { ecs_SetError(&(s->result),1,"Can't open the FCS table, invalid VRF coverage"); return 0; } feature_class_pos = table_pos("FEATURE_CLASS", lpriv->fcsTable); table1_pos = table_pos("TABLE1", lpriv->fcsTable); table1_key_pos = table_pos("TABLE1_KEY", lpriv->fcsTable); table2_pos = table_pos("TABLE2", lpriv->fcsTable); table2_key_pos = table_pos("TABLE2_KEY", lpriv->fcsTable); for (i = 1; i <= lpriv->fcsTable.nrows && !found; ++i) { row = get_row(i, lpriv->fcsTable); buf1 = justify((char*)get_table_element(feature_class_pos, row, lpriv->fcsTable, NULL, &count)); if (stricmp(buf1,lpriv->fclass) == 0) { found = 1; /* Check if a join table exist and get it's name */ isJointed = FALSE; for(j=0;jfclass); strcat(tempfilename,extJointTables[j]); sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,tempfilename); if (muse_access(buffer,0) == 0) { isJointed = TRUE; break; } } /* Access information in fcs */ lpriv->featureTableName = justify((char *)get_table_element(table1_pos, row, lpriv->fcsTable, NULL, &count)); lpriv->primitiveTableName = justify((char *)get_table_element(table2_pos, row, lpriv->fcsTable, NULL, &count)); code = lpriv->primitiveTableName[strlen(lpriv->primitiveTableName)-2]; if (isJointed) { if ( (code == 'j') || (code == 'J')) { free(lpriv->primitiveTableName); lpriv->primitiveTableName = NULL; lpriv->joinTableName = justify((char *)get_table_element(table2_pos, row, lpriv->fcsTable, NULL, &count)); lpriv->joinTableForeignKeyName = justify((char *)get_table_element(table1_key_pos, row, lpriv->fcsTable, NULL, &count)); lpriv->joinTableFeatureIdName = justify((char *)get_table_element(table2_key_pos, row, lpriv->fcsTable, NULL, &count)); for (j = i+1; j <= lpriv->fcsTable.nrows && lpriv->primitiveTableName == NULL; ++j) { row2 = get_row(j, lpriv->fcsTable); buf2 = justify((char*)get_table_element(table1_pos, row2, lpriv->fcsTable, NULL, &count)); buf3 = justify((char*)get_table_element(table2_pos, row2, lpriv->fcsTable, NULL, &count)); if ((stricmp(buf2,lpriv->joinTableName) == 0) && (stricmp(buf3,lpriv->featureTableName) != 0)) { lpriv->primitiveTableName = justify((char *)get_table_element(table2_pos, row2, lpriv->fcsTable, NULL, &count)); lpriv->featureTablePrimIdName = justify((char *)get_table_element(table1_key_pos, row2, lpriv->fcsTable, NULL, &count)); } free(buf2); free(buf3); free_row(row2, lpriv->fcsTable); } if (lpriv->primitiveTableName == NULL) { fprintf(stderr, "Invalid join table structure for feature %s\n", lpriv->featureTableName); return 0; } } else { lpriv->joinTableName = malloc(strlen(tempfilename)+1); strcpy(lpriv->joinTableName,tempfilename); lpriv->joinTableForeignKeyName = NULL; lpriv->joinTableFeatureIdName = NULL; lpriv->featureTablePrimIdName = justify((char *)get_table_element(3, row, lpriv->fcsTable, NULL, &count)); } } else { lpriv->joinTableName = NULL; lpriv->joinTableForeignKeyName = NULL; lpriv->featureTablePrimIdName = justify((char *)get_table_element(3, row, lpriv->fcsTable, NULL, &count)); } } free(buf1); free_row(row, lpriv->fcsTable); } #ifdef TESTOPENTABLE printf("close: spriv->fcsTable\n"); #endif vpf_close_table(&(lpriv->fcsTable)); if (!found) { ecs_SetError(&(s->result),1,"Can't open the FCS table, invalid VRF coverage"); return 0; } else { return 1; } } /* ---------------------------------------------------------- * vrf_VerifyCATFile: * * Verify if s->pathname is really a LAT file * ---------------------------------------------------------- */ int vrf_verifyCATFile(s) ecs_Server *s; { char buffer[512]; register ServerPrivateData *spriv = s->priv; /* verification code must be inserted here */ sprintf(buffer,"%s/cat",spriv->library); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/CAT",spriv->library); if (muse_access(buffer,0) != 0) { ecs_SetError(&(s->result),1,"Can't open CAT file, invalid VRF database"); return 0; } } #ifdef TESTOPENTABLE printf("open spriv->catTable:%s\n",buffer); #endif spriv->catTable = vpf_open_table(buffer, disk, "rb", NULL); if (spriv->catTable.path == NULL) { ecs_SetError(&(s->result),1,"Can't open CAT file, invalid VRF database"); return 0; } return 1; } /* ------------------------------------------------------------------------- * vrf_Getmetadata: * * preparation de la fenetre globale pour le server * -------------------------------------------------------------------------- */ /* fix invalid 'sprintf(x, "%s", x)' usage, which works 'fine' with -O0 compilation flag but not with -O */ static int rec_sprintf(char* str, const char* format, ...) { char* temp = malloc(250000); int ret; va_list ap; va_start(ap, format); ret = vsprintf(temp, format, ap); va_end(ap); strcpy(str, temp); free(temp); return ret; } int vrf_GetMetadata(s) ecs_Server *s; { int i,j; char *buf1; char *buf2; char *bufname; char *bufdesc; int count; row_type row; row_type rowcat; row_type rowcomp; row_type rowfca; float buffloat; register ServerPrivateData *spriv = s->priv; char buffer[256]; char tab[3][7]={"char","float","int"}; char *covname; int z,k,it_pos,val_pos,des_pos,att_pos; char *item_buf, *att_buf, *des_buf, *tval; vpf_table_type table; storage_type stor = disk; date_type datee; /* row_type row;*/ float fval; int32 n; int intval; int existtableflag; char separator[2]={SEPARATOR,'\0'}; int flag; int test; /* int32 count; */ buf1 = NULL; /* build the begining of metadatastring*/ rec_sprintf (spriv->metadatastring,"{displaymetada { { CURRENT DATABASE:%s\n\nDATA HEADER TABLE(DHT):\n\n",spriv->database); /* code pour recuperer les valeurs de DHT */ sprintf(buffer,"%s%sdht",spriv->database,separator); if (muse_access(buffer,0) ==0) { #ifdef TESTOPENTABLE printf("open spriv->dhtTable:%s\n",buffer); #endif spriv->dhtTable = vpf_open_table(buffer, disk, "rb", NULL); for (i = 1; i <= spriv->dhtTable.nrows; ++i) { row = get_row(i, spriv->dhtTable); test=table_pos("DATABASE_NAME",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("DATABASE_NAME",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sDatabase_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("DATABASE_DESC",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("DATABASE_DESC",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sDatabase_description: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("MEDIA_STANDARD",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("MEDIA_STANDARD",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sMedia_Standard: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ORIGINATOR",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("ORIGINATOR",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sOriginator: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ADDRESSEE",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("ADDRESSEE",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAddressee: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("DOWNGRADE_DATE",spriv->dhtTable); if (test >= 0) { get_table_element(table_pos("DOWNGRADE_DATE",spriv->dhtTable), row, spriv->dhtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sDowngrade_date: %s\n",spriv->metadatastring,datee); } test=table_pos("RELEASABILITY",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("RELEASABILITY",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sReleasability: %s\n",spriv->metadatastring,buf1); free(buf1); } test = table_pos("OTHER_STD_NAME", spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("OTHER_STD_NAME", spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sOther_STD_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test = table_pos("OTHER_STD_DATE",spriv->dhtTable); if (test >= 0) { get_table_element(table_pos("OTHER_STD_DATE",spriv->dhtTable), row, spriv->dhtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sOther_std_date: %s\n",spriv->metadatastring,datee); } test = table_pos("OTHER_STD_VER",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("OTHER_STD_VER",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sOther_STD_ver: %s\n",spriv->metadatastring,buf1); free(buf1); } test = table_pos("OTHER_STD_VER",spriv->dhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("OTHER_STD_VER",spriv->dhtTable), row, spriv->dhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sEdition_number: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("EDITION_DATE",spriv->dhtTable); if (test >= 0) { get_table_element(table_pos("EDITION_DATE",spriv->dhtTable), row, spriv->dhtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sEdition_date: %s\n",spriv->metadatastring,datee); } free_row(row, spriv->dhtTable); } } vpf_close_table(&(spriv->dhtTable)); /* code pour recuperer les valeurs de LAT */ rec_sprintf (spriv->metadatastring,"%s\n\n\nLIBRARY ATTRIBUTE TABLE(LAT):\n\n",spriv->metadatastring); for (i = 1; i <= spriv->latTable.nrows; ++i) { row = get_row(i, spriv->latTable); buf1 = justify((char*)get_table_element(1, row, spriv->latTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sCoverage name: %s\n",spriv->metadatastring,buf1); free(buf1); get_table_element(2, row, spriv->latTable, &buffloat, &count); rec_sprintf(spriv->metadatastring,"%sXMIN: %f\n",spriv->metadatastring,buffloat); get_table_element(3, row, spriv->latTable, &buffloat, &count); rec_sprintf(spriv->metadatastring,"%sYMIN: %f\n",spriv->metadatastring,buffloat); get_table_element(4, row, spriv->latTable, &buffloat, &count); rec_sprintf(spriv->metadatastring,"%sXMAX: %f\n",spriv->metadatastring,buffloat); get_table_element(5, row, spriv->latTable, &buffloat, &count); rec_sprintf(spriv->metadatastring,"%sYMAX: %f\n",spriv->metadatastring,buffloat); free_row(row, spriv->latTable); } /*ferme la liste de la ddb et ouvre la liste de la librairie*/ rec_sprintf(spriv->metadatastring,"%s } { ",spriv->metadatastring); /* code pour recuperer les valeurs dans LHT */ sprintf(buffer,"%s%slht",spriv->library,separator); if (muse_access(buffer,0) ==0) { rec_sprintf(spriv->metadatastring,"%sCURRENT DATABASE:%s\n\nLIBRARY LIBRARY HEADER TABLE(LHT):\n\n",spriv->metadatastring,spriv->database); #ifdef TESTOPENTABLE printf("open spriv->lhtTable:%s\n",buffer); #endif spriv->lhtTable = vpf_open_table(buffer,disk,"rb",NULL); for (i = 1; i <= spriv->lhtTable.nrows; ++i) { row = get_row(i, spriv->lhtTable); test=table_pos("PRODUCT_TYPE",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("PRODUCT_TYPE",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sProduct_type: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("LIBRARY_NAME",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("LIBRARY_NAME",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sLibrary_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("DESCRIPTION",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("DESCRIPTION",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sDescription: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_SERIES",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("SOURCE_SERIES",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSource_series: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_ID",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("SOURCE_ID",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSource_ID: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_EDITION",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("SOURCE_EDITION",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSource_edition: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_NAME",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("SOURCE_NAME",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSource_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_DATE",spriv->lhtTable); if (test >= 0) { get_table_element(table_pos("SOURCE_DATE",spriv->lhtTable), row, spriv->lhtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sSource_date: %s\n",spriv->metadatastring,datee); } test=table_pos("DOWNGRADING",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("DOWNGRADING",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sDowngrading: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("DOWNGRADING_DATE",spriv->lhtTable); if (test >= 0) { get_table_element(table_pos("DOWNGRADING_DATE",spriv->lhtTable), row, spriv->lhtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sDowngrading_date: %s\n",spriv->metadatastring,datee); } test=table_pos("RELEASABILITY",spriv->lhtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(table_pos("RELEASABILITY",spriv->lhtTable), row, spriv->lhtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sReleasability: %s\n",spriv->metadatastring,buf1); free(buf1); } free_row(row, spriv->lhtTable); } } /* code pour recuperer les valeurs dans CAT */ rec_sprintf (spriv->metadatastring,"%s\n\n\nCOVERAGE ATTRIBUTE TABLE(CAT):\n\n",spriv->metadatastring); for (i = 1; i <= spriv->catTable.nrows; ++i) { int buffint = 0; short buffshort = 0; row = get_row(i, spriv->catTable); buf1 = justify( (char *) get_table_element(1, row, spriv->catTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sCoverage_name: %s\n",spriv->metadatastring,buf1); free(buf1); buf1 = justify( (char *) get_table_element(2, row, spriv->catTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sDescription: %s\n",spriv->metadatastring,buf1); free(buf1); if( spriv->catTable.header[3].type == 'I' ) { get_table_element(3, row, spriv->catTable, &buffint, &count); } else if( spriv->catTable.header[3].type == 'S' ) { get_table_element(3, row, spriv->catTable, &buffshort, &count); buffint = buffshort; } rec_sprintf(spriv->metadatastring,"%sLevel: %d\n",spriv->metadatastring,buffint); free_row(row, spriv->catTable); } /* code pour recuperer les valeurs dans GRT */ sprintf(buffer,"%s%sgrt",spriv->library,separator); if (muse_access(buffer,0) ==0) { rec_sprintf (spriv->metadatastring,"%s\n\n\nGEOGRAPHIC REFERENCE TABLE(GRT):\n\n",spriv->metadatastring); #ifdef TESTOPENTABLE printf("open spriv->grtTable:%s\n",buffer); #endif spriv->grtTable = vpf_open_table(buffer,disk,"rb",NULL); for (i = 1; i <= spriv->grtTable.nrows; ++i) { row = get_row(i, spriv->grtTable); test=table_pos("DATA_TYPE",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sData_type: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("UNITS",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sUnits: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ELLIPSOID",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sEllipsoid: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ELLIPSOID_DETAIL",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sEllipsoid_detail: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("VERT_DATUM_REF",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sVert_datum_ref: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("VERT_DATUM_CODE",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sVert_datum_code: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOUND_DATUM_NAME",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSound_datum_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOUND_DATUM_CODE",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSound_datum_code: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("GEO_DATUM_NAME",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sGeo_datum_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("GEO_DATUM_CODE",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sGeo_datum_code: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("PROJECTION NAME",spriv->grtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->grtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sProjection_name: %s\n",spriv->metadatastring,buf1); free(buf1); } free_row(row, spriv->grtTable); } } vpf_close_table(&(spriv->grtTable)); /* code pour recuperer les valeurs dans DQT */ sprintf(buffer,"%s%sdqt",spriv->library,separator); if (muse_access(buffer,0) ==0) { rec_sprintf (spriv->metadatastring,"%s\n\n\nDATA QUALITY TABLE(DQT):\n\n",spriv->metadatastring); #ifdef TESTOPENTABLE printf("open spriv->dqtTable:%s\n",buffer); #endif spriv->dqtTable = vpf_open_table(buffer,disk,"rb",NULL); for (i = 1; i <= spriv->dqtTable.nrows; ++i) { row = get_row(i, spriv->dqtTable); test=table_pos("VPF_LEVEL",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sVpf_level: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("VPF_LEVEL_NAME",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sVpf_level_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("FEATURE_COMPLETE",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sFeature_complete: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ATTRIB_COMPLETE",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAttrib_complete: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("LOGICAL_CONSIST",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sLogical_consist: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("EDITION_NUM",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sEdition_num: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("CREATION_DATE",spriv->dqtTable); if (test >= 0) { get_table_element(table_pos("CREATION_DATE",spriv->dqtTable), row, spriv->dqtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sCration date: %s\n",spriv->metadatastring,datee); } test=table_pos("REVISION_DATE",spriv->dqtTable); if (test >= 0) { get_table_element(table_pos("REVISION_DATE",spriv->dqtTable), row, spriv->dqtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sRevision date: %s\n",spriv->metadatastring,datee); } test=table_pos("SPEC_NAME",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSpec_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SPEC_DATE",spriv->dqtTable); if (test >= 0) { get_table_element(table_pos("SPEC_DATE",spriv->dqtTable), row, spriv->dqtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sSpecification date: %s\n",spriv->metadatastring,datee); } test=table_pos("EARLIEST_SOURCE",spriv->dqtTable); if (test >= 0) { get_table_element(table_pos("EARLIEST_SOURCE",spriv->dqtTable), row, spriv->dqtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sEarliest source: %s\n",spriv->metadatastring,datee); } test=table_pos("LATEST_SOURCE",spriv->dqtTable); if (test >= 0) { get_table_element(table_pos("LATEST_SOURCE",spriv->dqtTable), row, spriv->dqtTable, (void *)&datee, &count); rec_sprintf(spriv->metadatastring,"%sLatest source: %s\n",spriv->metadatastring,datee); } test=table_pos("QUANT_ATT_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sQuant_att_acc: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("QUAL_ATT_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sQual_att_acc: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("COLLECTION_SPEC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sCollection_spec: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("SOURCE_FILE_NAME",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sSource_file_name: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ABS_HORIZ_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAbs_horiz_acc: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ABS_HORIZ_UNITS",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAbs_horiz_units: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ABS_VERT_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAbs_vert_acc: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("ABS_VERT_UNITS",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sAbs_vert_units: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("REL_HORIZ_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s:Rel_horiz_acc: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("REL_HORIZ_UNITS",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s:Rel_horiz_units: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("REL_VERT_ACC",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s:Rel_vert_acc %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("REL_VERT_UNITS",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s:Rel_vert_units: %s\n",spriv->metadatastring,buf1); free(buf1); } test=table_pos("COMMENTS",spriv->dqtTable); if (test >= 0) { buf1 = justify((char*)get_table_element(test, row, spriv->dqtTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%sComments: %s\n",spriv->metadatastring,buf1); free(buf1); } free_row(row, spriv->dqtTable); } } vpf_close_table(&(spriv->dqtTable)); /*ferme la premiere partie de la chaine*/ rec_sprintf(spriv->metadatastring,"%s} } } { ",spriv->metadatastring); /* code pour construire la chaine des coverages.Pour chaque coverage ouvre les fichiers ../coverage/INT.VDT, ../coverage/FLOAT.VDT, ../coverage/CHAR.VDT */ for (z = 1; z <= spriv->catTable.nrows; z++) { existtableflag=0; rowcat = get_row(z, spriv->catTable); /*ajoute debut chaine*/ rec_sprintf(spriv->metadatastring,"%s {",spriv->metadatastring); /*ajoute class et nom coverage*/ covname = justify( (char *) get_table_element(1, rowcat, spriv->catTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s family %s class",spriv->metadatastring,covname); /*ajoute description et debut du covinfo*/ buf1 = justify( (char *) get_table_element(2, rowcat, spriv->catTable, NULL, &count)); rec_sprintf(spriv->metadatastring,"%s {%s} {",spriv->metadatastring, buf1); free(buf1); /********/ /*ouvre fcs*/ sprintf(buffer,"%s/%s/fcs",spriv->library,covname); #ifdef TESTOPENTABLE printf("open spriv->fcsTable:%s\n",buffer); #endif spriv->fcsTable = vpf_open_table(buffer, disk, "rb", NULL); /*ouvre fca*/ sprintf(buffer,"%s/%s/fca",spriv->library,covname); if (muse_access(buffer,0) == 0) { #ifdef TESTOPENTABLE printf("open spriv->fcaTable:%s\n",buffer); #endif spriv->fcaTable = vpf_open_table(buffer, disk, "rb", NULL); /* We do not want to abort on a whole library because a FCS file is */ /* missing. That happens for example with DNC17/COA17A/ENV */ if (spriv->fcsTable.path == NULL) { char szErrorMessage[128]; sprintf(szErrorMessage, "Can't open the FCS table of '%s', invalid VRF coverage", covname); rec_sprintf(spriv->metadatastring,"%s Cannot open %s/%s/fcs", spriv->metadatastring,spriv->library,covname ); if( ecs_SetErrorShouldStop(&(s->result),1,szErrorMessage) ) { free(covname); vpf_close_table(&(spriv->lhtTable)); vpf_close_table(&(spriv->fcaTable)); free_row(rowcat, spriv->catTable); return 0; } } else { rec_sprintf(spriv->metadatastring,"%sdisplaymetadata {",spriv->metadatastring); } for (i = 1; i <= spriv->fcsTable.nrows; ++i) { flag=0; row = get_row(i, spriv->fcsTable); rowcomp=get_row(i-1, spriv->fcsTable); if (i>=2) { buf2 = justify((char*)get_table_element(1, rowcomp, spriv->fcsTable, NULL, &count)); buf1 = justify((char*)get_table_element(1, row, spriv->fcsTable, NULL, &count)); }else{ buf1 = justify((char*)get_table_element(1, row, spriv->fcsTable, NULL, &count)); buf2 = justify( (char *) get_table_element(2, row, spriv->lhtTable, NULL, &count)); } if (strcmp(buf1,buf2)!=0) { for (j = 1;j<= spriv->fcaTable.nrows; j++) { rowfca = get_row(j, spriv->fcaTable); bufname = justify((char*)get_table_element(table_pos("FCLASS",spriv->fcaTable), rowfca, spriv->fcaTable, NULL, &count)); bufdesc = justify((char*)get_table_element(table_pos("DESCR",spriv->fcaTable), rowfca, spriv->fcaTable, NULL, &count)); /*intbuf = get_table_element(, rowfca, spriv->fcaTable, NULL, &count));*/ if (flag==0) { if (strcmp(buf1,bufname)==0) { rec_sprintf(spriv->metadatastring,"%s { %s { %s } } ",spriv->metadatastring,bufname,bufdesc); flag=1; } } free_row(rowfca, spriv->fcaTable); free(bufname); free(bufdesc); } } free(buf1); free(buf2); free_row(row, spriv->fcsTable); free_row(rowcomp, spriv->fcsTable); } if (spriv->fcsTable.path != NULL) { rec_sprintf(spriv->metadatastring,"%s }",spriv->metadatastring); } vpf_close_table(&(spriv->fcaTable)); } else { rec_sprintf(spriv->metadatastring,"%sdisplaymetadata { }",spriv->metadatastring); } rec_sprintf(spriv->metadatastring,"%s {",spriv->metadatastring); vpf_close_table(&(spriv->fcsTable)); /********/ /* free(buf1); */ /*lit les metadonnees de INT FLOAT et CHAR.VDT dans une boucle*/ for (j=0;j<3;j++) { sprintf(buffer,"%s%s%s%s%s.vdt",spriv->library,separator,covname,separator,tab[j]); if (muse_access(buffer,0) ==0) { existtableflag=1; rec_sprintf(spriv->metadatastring,"%s \nVALUE DESCRIPTION TABLE (%s.vdt)\n\n",spriv->metadatastring,tab[j]); #ifdef TESTOPENTABLE printf("open table:%s\n",buffer); #endif table = vpf_open_table(buffer,disk,"rb",NULL); it_pos = table_pos("TABLE",table); val_pos = table_pos("VALUE",table); des_pos = table_pos("DESCRIPTION",table); att_pos = table_pos("ATTRIBUTE",table); for(k=1;k<=table.nrows;k++) /*for(k=1;k<=10;k++) */ { if (stor == disk) row = read_next_row(table); else row = get_row(k,table); item_buf = (char *)get_table_element( it_pos,row,table,NULL,&n); rightjust(item_buf); att_buf = (char *)get_table_element(att_pos,row,table,NULL,&n); rightjust(att_buf); des_buf = (char *)get_table_element(des_pos,row,table,NULL,&n); if ((strnicmp ("char",tab[j],5)) ==0) { tval = (char *)get_table_element(val_pos,row,table,NULL,&n); sprintf(buffer," %s = %s \n",tval,des_buf); rec_sprintf(spriv->metadatastring,"%s%s",spriv->metadatastring,buffer); free(tval); } if ((strnicmp ("int",tab[j],6)) ==0 && table.header[val_pos].type == 'I' ) { get_table_element(val_pos,row,table,&intval,&n); sprintf(buffer," %12ld = %s \n", (long)intval,des_buf); rec_sprintf(spriv->metadatastring,"%s%s", spriv->metadatastring,buffer); } if ((strnicmp ("int",tab[j],6)) ==0 && table.header[val_pos].type == 'S' ) { short short_val; get_table_element(val_pos,row,table,&short_val,&n); sprintf(buffer," %12ld = %s \n", (long)short_val,des_buf); rec_sprintf(spriv->metadatastring,"%s%s", spriv->metadatastring,buffer); } if ((strnicmp ("float",tab[j],6) ==0)) { get_table_element(val_pos,row,table,&fval,&n); sprintf(buffer," %12f = %s \n",fval,des_buf); rec_sprintf(spriv->metadatastring,"%s%s",spriv->metadatastring,buffer); } free(des_buf); free(item_buf); free(att_buf); free_row(row, table); } /** for k on table.nrows **/ #ifdef TESTOPENTABLE printf("close: table\n"); #endif vpf_close_table(&table); } /**if muse access**/ } /**for j=1,j<=3**/ free(covname); if (existtableflag==0) rec_sprintf(spriv->metadatastring,"%snodata",spriv->metadatastring); /* ferme la chaine covinfo*/ rec_sprintf(spriv->metadatastring,"%s} } } ",spriv->metadatastring); free_row(rowcat, spriv->catTable); } /**(i = 1; i <= spriv->catTable.nrows**/ /*ferme la chaine generale*/ rec_sprintf(spriv->metadatastring,"%s }",spriv->metadatastring); /*printf ("%s",spriv->metadatastring);*/ vpf_close_table(&(spriv->lhtTable)); return 1; } /* ------------------------------------------------------------------------- * vrf_initRegionWithDefault: * * preparation de la fenetre globale pour le server * -------------------------------------------------------------------------- */ int vrf_initRegionWithDefault(s) ecs_Server *s; { int i; int found = 0; char *buf1; int count; row_type row; float buffloat; register ServerPrivateData *spriv = s->priv; /* code to get global bounding box of library is inserted here */ for (i = 1; i <= spriv->latTable.nrows && !found; ++i) { row = get_row(i, spriv->latTable); buf1 = justify((char*)get_table_element(1, row, spriv->latTable, NULL, &count)); if (stricmp(buf1,spriv->libname) == 0) { found = 1; get_table_element(5, row, spriv->latTable, &buffloat, &count); s->globalRegion.north = buffloat; get_table_element(3, row, spriv->latTable, &buffloat, &count); s->globalRegion.south = buffloat; get_table_element(4, row, spriv->latTable, &buffloat, &count); s->globalRegion.east = buffloat; get_table_element(2, row, spriv->latTable, &buffloat, &count); s->globalRegion.west = buffloat; } free(buf1); free_row(row, spriv->latTable); } if (!found) { ecs_SetError(&(s->result),1,"Can't find entry in LAT table, invalid VRF library"); return 0; } /* If the west is higher than east, add 360 deg to east */ if (s->globalRegion.west > s->globalRegion.east) s->globalRegion.east += 360.0; s->globalRegion.ns_res = 0.01; s->globalRegion.ew_res = 0.01; dyn_SelectRegion(s,&(s->globalRegion)); return 1; } /* ------------------------------------------------------------------------- * vrf_initTiling: * * Lecture de la table de reference de toutes les tuiles * -------------------------------------------------------------------------- */ int vrf_initTiling(s) ecs_Server *s; { char buffer[256]; int i; int32 fac_id,count; void *dummy = NULL; vpf_table_type tile_table, mbr_tile_table; register ServerPrivateData *spriv = s->priv; sprintf(buffer,"%s/tileref/tileref.aft",spriv->library); if (muse_access(buffer,0)!=0) { sprintf(buffer,"%s/TILEREF/TILEREF.AFT",spriv->library); if (muse_access(buffer,0)!=0) { spriv->isTiled = 0; spriv->tile = (VRFTile *) malloc(sizeof(VRFTile)); spriv->tile[0].isSelected = 1; spriv->tile[0].xmin = (float) s->globalRegion.south; spriv->tile[0].xmax = (float) s->globalRegion.north; spriv->tile[0].ymin = (float) s->globalRegion.west; spriv->tile[0].ymax = (float) s->globalRegion.east; spriv->tile[0].path = NULL; spriv->nbTile = 1; return 1; } } spriv->isTiled = 1; #ifdef TESTOPENTABLE printf("open tile_table:%s\n",buffer); #endif tile_table = vpf_open_table(buffer,ram,"rb",NULL); spriv->tile = (VRFTile *) malloc(sizeof(VRFTile) * tile_table.nrows); if (spriv->tile == NULL) { #ifdef TESTOPENTABLE printf("close: tile_table\n"); #endif vpf_close_table(&(tile_table)); ecs_SetError(&(s->result),1,"Can't allocate enough memory to read tile reference"); return 0; } memset( spriv->tile, 0, sizeof(VRFTile) * tile_table.nrows ); sprintf(buffer,"%s/tileref/fbr",spriv->library); if (muse_access(buffer,0)!=0) { sprintf(buffer,"%s/TILEREF/FBR",spriv->library); if (muse_access(buffer,0)!=0) { #ifdef TESTOPENTABLE printf("close: tile_table\n"); #endif vpf_close_table(&tile_table); ecs_SetError(&(s->result),1,"Can't open tileref/fbr file"); return 0; } } #ifdef TESTOPENTABLE printf("open mbr_tile_table:%s\n",buffer); #endif #ifdef VRF_DEBUG printf("NbTile in _initTiling:%d\n",spriv->nbTile); #endif mbr_tile_table = vpf_open_table(buffer,ram,"rb",NULL); spriv->nbTile = tile_table.nrows; for (i = 0; i < spriv->nbTile; ++i) { /* Check if fac_id exist */ if (table_pos("FAC_ID", tile_table) == -1) { fac_id = i+1; } else { named_table_element("FAC_ID",i+1,tile_table,&fac_id,&count); } spriv->tile[i].path = justify((char *) named_table_element("TILE_NAME",i+1,tile_table,dummy,&count)); named_table_element("XMIN",fac_id,mbr_tile_table,&(spriv->tile[i].xmin),&count); named_table_element("XMAX",fac_id,mbr_tile_table,&(spriv->tile[i].xmax),&count); named_table_element("YMIN",fac_id,mbr_tile_table,&(spriv->tile[i].ymin),&count); named_table_element("YMAX",fac_id,mbr_tile_table,&(spriv->tile[i].ymax),&count); spriv->tile[i].isSelected = 0; } #ifdef TESTOPENTABLE printf("close: tile_table\n"); printf("close: mbr_tile_table\n"); #endif vpf_close_table(&tile_table); vpf_close_table(&mbr_tile_table); return 1; } int vrf_IsOutsideRegion(n,s,e,w,region) double n,s,e,w; ecs_Region *region; { if ((n <= region->south) || (s >= region->north) || (e <= region->west) || (w >= region->east)) { return 1; } return 0; } void vrf_AllFClass(s,coverage) ecs_Server *s; char *coverage; { vpf_table_type table; row_type row; unsigned int i, j, n, k, count=0; char *temp; char *name, *fclass, **list; char ftype[8] = {'A', 'L', 'T', 'P', 'a', 'l', 't', 'p' }; BOOLEAN found; char buffer[256]; register ServerPrivateData *spriv = s->priv; /* Build path to feature class atrribute table */ sprintf(buffer,"%s/%s/fcs",spriv->library,coverage); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/%s/FCS",spriv->library,coverage); } if (muse_access(buffer,0) == 0) { #ifdef TESTOPENTABLE printf("open table:%s\n",buffer); #endif table = vpf_open_table (buffer, DISK, "rb", NULL); list =(char**) malloc ((table.nrows+1) * sizeof(char *)); for (i=0; i < (unsigned int) table.nrows; i++) { row = get_row ((i+1), table); fclass = (char*)get_table_element (1, row, table, NULL, &n); /* Get feature class name */ fclass = justify (fclass); /* Now find the name of the feature table that matches the feature class */ name = (char*)get_table_element (2, row, table, NULL, &n); temp = (char*) malloc (strlen (fclass) + 1); strncpy (temp, name, strlen (fclass)); if (strcmp (fclass, temp) != 0) { free (name); name = (char*) get_table_element (4, row, table, NULL, &n); } free (temp); /* Start the name list with the first record */ if (i == 0) { list[count] = (char*) malloc ((n+1) * sizeof (char)); strcpy (list[count], name); count++; } /* Check to see if the feature class name has already been added to the list */ found = FALSE; for (j=0; jresult)," "); for(k=0; k < 4; ++k) { ecs_AddText(&(s->result),"{ "); for (i=0; iresult),buffer); ecs_AddText(&(s->result)," "); } } } ecs_AddText(&(s->result),"} "); } for (i=0; ipriv; char *buf1; int found = 0; char *featureTableName; char *fclass; char *coverage; char *expression; int32 count; /* Extract the request info */ if (!vrf_parsePathValue(s,request,&fclass,&coverage,&expression)) return FALSE; /* Print the main informations in the dictionary */ sprintf(buffer,"FEATURE CLASS: %s \nCOVERAGE : %s \n",fclass,coverage); if (!ecs_SetText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } /* Found in the FCS the tables */ sprintf(buffer,"%s/%s/fcs",spriv->library,coverage); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/%s/FCS",spriv->library,coverage); if (muse_access(buffer,0) != 0) { ecs_SetError(&(s->result),1,"Can't open the FCS table, invalid VRF coverage"); free(fclass); free(coverage); free(expression); return FALSE; } } #ifdef TESTOPENTABLE printf("open fcstable:%s\n",buffer); #endif fcstable = vpf_open_table(buffer, disk, "rb", NULL); if (fcstable.path == NULL) { ecs_SetError(&(s->result),1,"Can't open the FCS table, invalid VRF coverage"); free(fclass); free(coverage); free(expression); return FALSE; } for (i = 1; i <= fcstable.nrows && !found; ++i) { row = get_row(i, fcstable); buf1 = justify((char*)get_table_element(1, row, fcstable, NULL, &count)); if (stricmp(buf1,fclass) == 0) { found = 1; featureTableName = justify((char *)get_table_element(2, row, fcstable, NULL, &count)); sprintf(buffer,"%s/%s/%s",spriv->library,coverage,featureTableName); free(featureTableName); } free(buf1); free_row(row, fcstable); } #ifdef TESTOPENTABLE printf("close: fcstable\n"); #endif vpf_close_table(&fcstable); /* For each attribute. Get all the informations. */ #ifdef TESTOPENTABLE printf("open ft:%s\n",buffer); #endif ft = vpf_open_table(buffer,stor,"rb",NULL); sprintf(buffer,"ATTRIBUTES:\n"); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } for(i=0;iresult),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } if(ft.header[i].vdt[0] != '\0') /** create table name **/ { sprintf(temp,"%s\\%s",spriv->library,coverage); /** add to the path the new table name **/ strcpy(temp2,temp); strcat(temp2,"\\"); strcat(temp2,ft.header[i].vdt); if(muse_access(temp2,0) == 0) { #ifdef TESTOPENTABLE printf("open table:%s\n",temp2); #endif table = vpf_open_table(temp2,stor,"rb",NULL); it_pos = table_pos("TABLE",table); val_pos = table_pos("VALUE",table); des_pos = table_pos("DESCRIPTION",table); att_pos = table_pos("ATTRIBUTE",table); for(k=1;k<=table.nrows;k++) { if (stor == disk) row = read_next_row(table); else row = get_row(k,table); item_buf = (char *)get_table_element( it_pos,row,table,NULL,&n); rightjust(item_buf); if (strlen(item_buf) > strlen(fclass)) item_buf[strlen(fclass)] = '\0'; att_buf = (char *)get_table_element(att_pos,row,table,NULL,&n); rightjust(att_buf); if(stricmp(item_buf,fclass) == 0 && stricmp(att_buf,ft.header[i].name) == 0) { des_buf = (char *)get_table_element(des_pos,row,table,NULL,&n); switch (ft.header[i].type) { case 'T': case 'L': tval = (char *)get_table_element(val_pos,row,table,NULL,&n); sprintf(buffer," %s = %s \n",tval,des_buf); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } free(tval);break; case 'I': get_table_element(val_pos,row,table,&ival,&n); sprintf(buffer," %12d = %s \n",ival,des_buf); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } break; case 'S': get_table_element(val_pos,row,table,&sintval,&n); sprintf(buffer," %d = %s \n",sintval,des_buf); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } break; case 'F': get_table_element(val_pos,row,table,&fval,&n); sprintf(buffer," %12f = %s \n",fval,des_buf); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } break; } /** switch **/ free(des_buf); } /** if strcmp **/ free(item_buf); free(att_buf); free_row(row,table); } /** for k on table.nrows **/ #ifdef TESTOPENTABLE printf("close: table\n"); #endif vpf_close_table(&table); } /** if access **/ } /** if there is vdt **/ } /** for fields **/ /** get information from narrative file if it exists **/ if(ft.narrative[0] != '\0') { sprintf(temp,"%s%s",ft.path,ft.narrative); if (muse_access(temp,0)==0) { sprintf(buffer,"\n\n"); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } #ifdef TESTOPENTABLE printf("open nar:%s\n",temp); #endif nar = vpf_open_table(temp,disk,"rb",NULL); for (i=1;i<=nar.nrows;i++) { row = read_next_row(nar); line = (char *)get_table_element(1,row,nar,NULL,&n); rightjust(line); sprintf(buffer,"%s\n",line); if (!ecs_AddText(&(s->result),buffer)) { free(fclass); free(coverage); free(expression); return FALSE; } free(line); free_row(row,nar); } #ifdef TESTOPENTABLE printf("close: nar\n"); #endif vpf_close_table(&nar); } } /** clean up **/ #ifdef TESTOPENTABLE printf("close: ft\n"); #endif vpf_close_table(&ft); free(fclass); free(coverage); free(expression); return 1; } static void vrf_build_layer_capabilities( ecs_Server *s, const char *coverage, const char *name ) { char line[512]; char short_name[128]; const char *family; int i; /* -------------------------------------------------------------------- */ /* Establish the family of this feature type, and the shortened name.*/ /* -------------------------------------------------------------------- */ for( i = 0; name[i] != '.' && name[i] != '\0'; i++ ) {} if( strncmp(name+i,".A",2) == 0 || strncmp(name+i,".a",2) == 0 ) family = "Area"; else if( strncmp(name+i,".L",2) == 0 || strncmp(name+i,".l",2) == 0 ) family = "Line"; else if( strncmp(name+i,".p",2) == 0 || strncmp(name+i,".p",2) == 0 ) family = "Point"; else if( strncmp(name+i,".T",2) == 0 || strncmp(name+i,".t",2) == 0 ) family = "Text"; else { /* It isn't a geographic feature type, skip it */ return; } strncpy( short_name, name, i ); short_name[i] = '\0'; /* -------------------------------------------------------------------- */ /* Create the various entries. */ /* -------------------------------------------------------------------- */ ecs_AddText(&(s->result), " \n"); sprintf( line, " %s@%s(*)\n", short_name, coverage ); ecs_AddText(&(s->result), line); ecs_AddText(&(s->result), " PROJ4:+proj=longlat +datum=wgs84\n" ); sprintf( line, " %s\n", family ); ecs_AddText(&(s->result), line); sprintf( line, " \n", short_name, coverage ); ecs_AddText(&(s->result), line); sprintf(line, " \n", s->globalRegion.west, s->globalRegion.south, s->globalRegion.east, s->globalRegion.north ); ecs_AddText(&(s->result),line); sprintf(line, " \n", s->globalRegion.west, s->globalRegion.south, s->globalRegion.east, s->globalRegion.north, s->globalRegion.ew_res, s->globalRegion.ns_res ); ecs_AddText(&(s->result),line); ecs_AddText(&(s->result), " \n"); } /* based on vrf_AllFClass() */ static void vrf_build_coverage_capabilities( ecs_Server *s, const char *coverage) { vpf_table_type table; row_type row; unsigned int i, n; char *name, *fclass; char buffer[256]; register ServerPrivateData *spriv = s->priv; /* Build path to feature class atrribute table */ sprintf(buffer,"%s/%s/fcs",spriv->library,coverage); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/%s/FCS",spriv->library,coverage); } if (muse_access(buffer,0) == 0) { char **list; int count = 0, j; table = vpf_open_table (buffer, DISK, "rb", NULL); list = (char**) malloc ((table.nrows+1) * sizeof(char *)); for (i=0; i < (unsigned int) table.nrows; i++) { row = get_row ((i+1), table); fclass = (char*)get_table_element (1, row, table, NULL, &n); /* Get feature class name */ fclass = justify (fclass); /* Now find the name of the feature table that matches the feature class */ name = (char*)get_table_element (2, row, table, NULL, &n); if (strncmp (fclass, name, strlen(fclass)) != 0) { free (name); name = (char*) get_table_element (4, row, table, NULL, &n); } free( fclass ); if (!is_join(name)) { /* Have we already processed this name? */ for( j = 0; j < count && strcmp(list[j],name) != 0; j++ ) {} if( j == count ) { vrf_build_layer_capabilities( s, coverage, name ); list[count++] = name; } else free( name ); } else free(name); free_row (row, table); } vpf_close_table (&table); for( i = 0; i < count; i++ ) free( list[i] ); free( list ); } } int vrf_build_capabilities(ecs_Server *s, const char *request) { ServerPrivateData *spriv = (ServerPrivateData *) s->priv; ecs_SetText(&(s->result), "" ); ecs_AddText(&(s->result), "\n" "\n" " \n" " ogdi_unique_identity\n" " \n" ); if( strcmp(request,"ogdi_server_capabilities") != 0 ) { int i; ecs_AddText(&(s->result), " \n" ); for (i = 1; i <= spriv->catTable.nrows; ++i) { row_type row; char *coverage; char *description; int count; row = get_row(i, spriv->catTable); coverage = justify( (char *) get_table_element(1, row, spriv->catTable, NULL, &count)); description = justify( (char *) get_table_element(2, row, spriv->catTable, NULL, &count)); free_row(row, spriv->catTable); ecs_AddText(&(s->result), " \n" ); ecs_AddText(&(s->result)," " ); ecs_AddText(&(s->result),coverage); ecs_AddText(&(s->result),"\n" ); ecs_AddText(&(s->result)," " ); ecs_AddText(&(s->result),description); ecs_AddText(&(s->result),"\n" ); vrf_build_coverage_capabilities(s,coverage); free(coverage); free(description); ecs_AddText(&(s->result), " \n" ); } ecs_AddText(&(s->result), " \n" ); } ecs_AddText(&(s->result), "\n" ); return TRUE; } #ifndef _WINDOWS /* int stricmp(a,b) const char *a; const char *b; { return strcasecmp(a,b); } int _stricmp(a,b) const char *a; const char *b; { return strcasecmp(a,b); } */ #endif ogdi-ogdi_4_1_0/ogdi/driver/vrf/vrf.c000066400000000000000000000672731345660466700176150ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Implementation of the dyn_* entry points to the VRF driver. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.21 2016-07-06 09:01:30 erouault * VRF: fix memory leaks in error code paths of dyn_SelectLayer() * * Revision 1.20 2007/05/09 21:29:50 cbalint * fix is to increase of 1 the size of smallint (5 -> 6) * * Revision 1.19 2007/05/09 20:46:28 cbalint * From: Even Rouault * Date: Friday 21:14:18 * * * fix filename case sensitivy problems (for Unix-like systems). * * * fix incorrect use of sprintf in vrf_GetMetadata. * * * report wgs84 instead of nad83, not sure whether that is true * for all VPF products, but at least it's correct for VMAP products * that *must* be WGS84. A better fix would be to read the VPF table * that contains this information. * * * fix a few minor memory leaks and memory usage issues. * * * enable XMIN, YMIN, XMAX and YMAX columns to be of type double * in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * * * add .pjt and .tjt as possible extensions for join tables * (VMAP2i 'MIG2i000' product). * * * fix duplicated layers report (VMAP2i 'MIG2i000' product). * * * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * * * optionnaly, convert text to UTF-8 when environment variable * CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable * on Windows I guess (only tested on Linux) and maybe too specific. * * * enable reading of VPF products without table indexes file * (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when * there is a variable length field in one table, an index should exist, * but some test products don't follow this. The approach here is to read * the whole table content and build the index in memory. * * Modified Files: * ChangeLog ogdi/driver/vrf/feature.c ogdi/driver/vrf/object.c * ogdi/driver/vrf/utils.c ogdi/driver/vrf/vrf.c * ogdi/driver/vrf/vrfswq.c vpflib/musedir.c vpflib/strfunc.c * vpflib/vpfbrows.c vpflib/vpfprop.c vpflib/vpfquery.c * vpflib/vpfread.c vpflib/vpftable.c * * Revision 1.18 2007/02/12 21:01:48 cbalint * Fix win32 target. It build and works now. (tested with VC6) * * Revision 1.17 2007/02/12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.16 2006/05/05 19:10:54 warmerda * VRF fix when doing feature merging with index sizing (ie. with DNC 13 dataset) * * Revision 1.15 2004/02/19 06:56:43 warmerda * fixed serious bug in releaseAllLayers() with multiple layers * * Revision 1.14 2004/02/19 05:59:22 warmerda * Removed temporary debug messages. * * Revision 1.13 2004/02/18 21:49:18 warmerda * Fixed typo in last fix. * * Revision 1.12 2004/02/18 21:33:18 warmerda * free regex memory * * Revision 1.11 2001/08/16 20:40:34 warmerda * applied VITD fixes - merge primitive lines into a feature * * Revision 1.10 2001/06/29 19:16:30 warmerda * fixed memory leak if FCS not found * * Revision 1.9 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.8 2001/06/20 21:49:31 warmerda * added improved query support (swq) * * Revision 1.7 2001/06/13 17:33:59 warmerda * upgraded source headers * */ #include "ecs.h" #include "vrf.h" #include "datadict.h" ECS_CVSID("$Id$"); /* layer oriented functions are keeped in data structure to simplify code */ LayerMethod layerMethod[11] = { /* 0 */ { NULL, NULL, NULL,NULL }, /* Area */ { _getNextObjectArea, _getObjectArea, _getObjectIdArea, _selectTileArea }, /* Line */ { _getNextObjectLine, _getObjectLine, _getObjectIdLine, _selectTileLine }, /* Point */ { _getNextObjectPoint, _getObjectPoint, _getObjectIdPoint, _selectTilePoint }, /* Matrix */ { NULL, NULL, NULL, NULL }, /* Image */ { NULL, NULL, NULL, NULL }, /* Text */ { _getNextObjectText, _getObjectText, _getObjectIdText, _selectTileText }, /* Edge */ { NULL, NULL, NULL, NULL }, /* Face */ { NULL, NULL, NULL, NULL }, /* Node */ { NULL, NULL, NULL, NULL }, /* Ring */ { NULL, NULL, NULL, NULL } }; /* ---------------------------------------------------------------------- * _dyn_CreateServer: * * Creation of a new GRASS server * ---------------------------------------------------------------------- */ ecs_Result *dyn_CreateServer(s,Request) ecs_Server *s; char *Request; { char buffer[256]; char *ptr; int i; register ServerPrivateData *spriv; (void) Request; #ifdef VRF_DEBUG printf("dyn_CreateServer\n"); #endif spriv = s->priv = (void *) calloc(1,sizeof(ServerPrivateData)); if (s->priv == NULL) { ecs_SetError(&(s->result), 1, "Could not create VRF server, not enough memory"); return &(s->result); } spriv->nbTile = 1; spriv->tile = NULL; spriv->isTiled = 0; spriv->isMetaLoad = FALSE; /* Check if s->pathname is valid */ if (strlen(s->pathname) == 0) { ecs_SetError(&(s->result), 1, "Could not create VRF server, invalid URL"); return &(s->result); } /* extract full library pathname from s->pathname */ if (s->pathname[2] == ':') { /* if it contain something like /e:/cdrom/dcw, strip first slash */ strcpy(spriv->library,&(s->pathname[1])); } else { strcpy(spriv->library,s->pathname); } /* extract full database pathname and library short name from s->pathname */ for(i = strlen(spriv->library) - 1; spriv->library[i] != '/'; --i); strncpy(spriv->database,spriv->library,i); spriv->database[i] = 0; strcpy(spriv->libname,&(spriv->library[i+1])); /* verify if this is really a VRF database */ if (!vrf_verifyCATFile(s)) { return &(s->result); } /* Is it a DCW database (in the path) */ spriv->isDCW = FALSE; for (i=0;i<(int) (strlen(s->pathname)-3);i++) { ptr = &(s->pathname[i]); if (strnicmp(ptr,"dcw",3) == 0) { spriv->isDCW = TRUE; break; } } /* open schema files */ sprintf(buffer,"%s/lat",spriv->database); if (muse_access(buffer,0) != 0) { sprintf(buffer,"%s/LAT",spriv->database); } #ifdef TESTOPENTABLE printf("open spriv->latTable:%s\n",buffer); #endif spriv->latTable = vpf_open_table(buffer, disk, "rb", NULL); if (spriv->latTable.fp == NULL) { ecs_SetError(&(s->result),1,"Unable to open the LAT table"); return &(s->result); } /* initialize the server globalRegion with the one found in the LAT file */ if (!vrf_initRegionWithDefault(s)) { return &(s->result); } /* read all tile reference */ if (!vrf_initTiling(s)) { return &(s->result); } s->nblayer = 0; /* no layer selected so far */ s->currentLayer = -1; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_DestroyServer: * * Destruction of this GRASS server * ---------------------------------------------------------------------- */ ecs_Result *dyn_DestroyServer(s) ecs_Server *s; { register ServerPrivateData *spriv = s->priv; #ifdef VRF_DEBUG printf("dyn_DestroyServer\n"); #endif /* Release all layer */ vrf_releaseAllLayers(s); /* if dynamic mapset than remove directory contents */ #ifdef TESTOPENTABLE printf("close: spriv->catTable\n"); printf("close: spriv->latTable\n"); #endif vpf_close_table(&(spriv->catTable)); vpf_close_table(&(spriv->latTable)); /* DAP 6/19/97 */ if (spriv->tile != NULL) { int iTile; for( iTile=0; iTile < spriv->nbTile; iTile++ ) { if( spriv->tile[iTile].path != NULL ) free( spriv->tile[iTile].path ); } free(spriv->tile); spriv->tile = NULL; } s->currentLayer = -1; s->nblayer = 0; /* no layer selected so far */ free(spriv); vrf_freePathRegex(); vrf_free_ObjAttributeBuffer(); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ******************************************************************** FUNCTION_INFORMATION NAME dyn_SelectLayer DESCRIPTION Select a VRF layer END_DESCRIPTION PARAMETERS INPUT ecs_Server *s: Server info given by OGDI API END_PARAMETERS END_FUNCTION_INFORMATION PSEUDO-CODE Check if a layer exist with ecs_GetLayer. If a layer exist Begin Close the current layer table if it exist The current layer is now the layer returned by ecs_GetLayer The index of this layer is set to 0 Return a success message. End Close the current layer table if it exist Set a new layer in the layer structure with ecs_SetLayer. Allocate the memory needed to hold private infor about the new layer Decompose sel into library, coverage, feature class and expression with vrf_parsePath. Obtain the feature and primitive table file name from the FCS file with vrf_getFileNameFromFcs Open the feature table. If the feature table don`t open correctly, return an error message. If a joint table exist for this feature table, open it. If the join table don't open correctly, return an error message. Process the expression and create a table of selected features. Set the current layer with the current layer. Set the index of the current layer to 0 to force the object extract to start from the first object. Calculate the number of objects. If there is a join table, use the length of the join table. Else, use the lenght of the feature table. Define the current tile id to -1 to indicate to the driver there is no tile already defined. Allocate and initialize the VPF index with the number of objects. Initialize the contain of this table with -1 for each argument. Return a success message ******************************************************************** */ ecs_Result *dyn_SelectLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { char buffer[256]; int layer,i, index_size; register ServerPrivateData *spriv = s->priv; register LayerPrivateData *lpriv; #ifdef VRF_DEBUG printf("dyn_SelectLayer\n"); #endif /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) != -1) { if (s->currentLayer != -1) _closeLayerTable(s,&(s->layer[s->currentLayer])); #if 0 /* Close the join table for the previous layer */ lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; if (lpriv->joinTableName != NULL) { #ifdef TESTOPENTABLE printf("close lpriv->joinTable\n"); #endif if (lpriv->joinTable.fp == NULL) vpf_close_table(&(lpriv->joinTable)); } #endif /* if it already exists than assign currentLayer and set index to 0 to force rewind */ s->currentLayer = layer; s->layer[layer].index = 0; lpriv = (LayerPrivateData *) s->layer[layer].priv; #if 0 /* Open the current join table */ if (lpriv->joinTableName != NULL) { sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->joinTableName); if (muse_access(buffer,0) == 0 ) { #ifdef TESTOPENTABLE printf("open lpriv->joinTable:%s\n",buffer); #endif lpriv->joinTable = vpf_open_table(buffer,disk,"rb",NULL); if (lpriv->joinTable.fp == NULL) { ecs_SetError(&(s->result),1,"Unable to open the join table"); vpf_close_table(lpriv->featureTable); free(s->layer[layer].priv); ecs_FreeLayer(s,layer); return &(s->result); } } } #endif ecs_SetSuccess(&(s->result)); return &(s->result); } if (s->currentLayer != -1) _closeLayerTable(s,&(s->layer[s->currentLayer])); /* it did not exists so we are going to try to create it */ if ((layer = ecs_SetLayer(s,sel)) == -1) { return &(s->result); } /* allocate memory to hold private info about this new layer */ if ((s->layer[layer].priv = (void *) malloc(sizeof(LayerPrivateData))) == NULL) { ecs_SetError(&(s->result),1,"Not enough memory to allocate layer private data"); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; lpriv->index = NULL; lpriv->coverage = NULL; lpriv->fclass = NULL; lpriv->expression = NULL; lpriv->featureTableName = NULL; lpriv->featureTablePrimIdName = NULL; lpriv->joinTableName = NULL; lpriv->joinTableForeignKeyName = NULL; lpriv->joinTableFeatureIdName = NULL; lpriv->primitiveTableName = NULL; lpriv->isTiled = spriv->isTiled; /* decompose sel into library, coverage, feature class and expression */ if (!vrf_parsePath(s,lpriv,sel)) { free(s->layer[layer].priv); ecs_FreeLayer(s,layer); return &(s->result); } if (stricmp(lpriv->coverage,"tileref") == 0 || stricmp(lpriv->coverage,"gazette") == 0 || stricmp(lpriv->coverage,"libref") == 0) { lpriv->isTiled = 0; } /* obtain the feature and primitive table file name from the FCS file */ if (!vrf_getFileNameFromFcs(s,lpriv)) { free( lpriv->coverage ); free( lpriv->fclass ); free( lpriv->expression ); free( lpriv->featureTableName ); free( lpriv->featureTablePrimIdName ); free( lpriv->joinTableName ); free( lpriv->joinTableForeignKeyName ); free( lpriv->joinTableFeatureIdName ); free( lpriv->primitiveTableName ); free(s->layer[layer].priv); ecs_FreeLayer(s,layer); return &(s->result); } /* open layer */ sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->featureTableName); if (muse_access(buffer,0) == 0 ) { #ifdef TESTOPENTABLE printf("open spriv->featureTable:%s\n",buffer); #endif lpriv->featureTable = vpf_open_table(buffer,disk,"rb",NULL); if (lpriv->featureTable.fp == NULL) { ecs_SetError(&(s->result),1,"Unable to open the feature table"); free(s->layer[layer].priv); ecs_FreeLayer(s,layer); return &(s->result); } if (lpriv->joinTableName != NULL) { sprintf(buffer,"%s/%s/%s",spriv->library,lpriv->coverage,lpriv->joinTableName); if (muse_access(buffer,0) == 0 ) { #ifdef TESTOPENTABLE printf("open lpriv->joinTable:%s\n",buffer); #endif lpriv->joinTable = vpf_open_table(buffer,disk,"rb",NULL); if (lpriv->joinTable.fp == NULL) { ecs_SetError(&(s->result),1,"Unable to open the join table"); vpf_close_table(lpriv->featureTable); free(s->layer[layer].priv); ecs_FreeLayer(s,layer); return &(s->result); } } /* Check if Tile_ID is defined in the join table for tiled datasets, if not, it's an attribute join. There is no apparent way of identifying whether this is an attribute join or not for non-tiled datasets such as VITD which don't have TILE_ID, but do have feature joins so we assume in this case that it is a feature join. */ if (table_pos("TILE_ID",lpriv->joinTable) == -1 && lpriv->isTiled ) { #ifdef TESTOPENTABLE printf("close lpriv->joinTable:%s\n", lpriv->joinTableName); #endif vpf_close_table(&(lpriv->joinTable)); free(lpriv->joinTableName); lpriv->joinTableName = NULL; } } } else { free( lpriv->coverage ); free( lpriv->fclass ); free( lpriv->expression ); free( lpriv->featureTableName ); free( lpriv->featureTablePrimIdName ); free( lpriv->joinTableName ); free( lpriv->joinTableForeignKeyName ); free( lpriv->joinTableFeatureIdName ); free( lpriv->primitiveTableName ); free(s->layer[layer].priv); ecs_FreeLayer(s,layer); ecs_SetError(&(s->result),1,"Can't open this feature class"); return &(s->result); } lpriv->feature_rows = query_table2(lpriv->expression,lpriv->featureTable); /* process result */ s->currentLayer = layer; s->layer[layer].index = 0; lpriv->mergeFeatures = FALSE; #ifdef VRF_LINE_JOIN_HACK if( s->layer[layer].sel.F == Line && lpriv->joinTableName != NULL ) lpriv->mergeFeatures = TRUE; #endif if (lpriv->joinTableName != NULL && !lpriv->mergeFeatures) s->layer[layer].nbfeature = lpriv->joinTable.nrows; else s->layer[layer].nbfeature = lpriv->featureTable.nrows; lpriv->current_tileid = -1; if( lpriv->joinTableName != NULL ) index_size = lpriv->joinTable.nrows + 1; else index_size = lpriv->featureTable.nrows + 1; lpriv->index = (VRFIndex *) malloc(sizeof(VRFIndex) * index_size); for (i=0; i < index_size; ++i) { lpriv->index[i].prim_id = -1; } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_ReleaseLayer: * * deselect a layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_ReleaseLayer(s,sel) ecs_Server *s; ecs_LayerSelection *sel; { int layer; char buffer[128]; register LayerPrivateData *lpriv; #ifdef VRF_DEBUG printf("dyn_ReleaseLayer\n"); #endif /* first, try to find an existing layer with same request and family */ if ((layer = ecs_GetLayer(s,sel)) == -1) { sprintf(buffer,"Invalid layer %s",sel->Select); ecs_SetError(&(s->result),1,buffer); return &(s->result); } lpriv = (LayerPrivateData *) s->layer[layer].priv; if (s->currentLayer != -1) { _closeLayerTable(s,&(s->layer[s->currentLayer])); s->currentLayer = -1; } #ifdef TESTOPENTABLE printf("close: spriv->featureTable\n"); printf("close: spriv->fcsTable\n"); #endif if (lpriv->joinTableName != NULL) { #ifdef TESTOPENTABLE printf("close lpriv->joinTable:%s\n", lpriv->joinTableName); #endif vpf_close_table(&(lpriv->joinTable)); } vpf_close_table(&(lpriv->featureTable)); vpf_close_table(&(lpriv->fcsTable)); set_nuke(&(lpriv->feature_rows)); if (lpriv->joinTableFeatureIdName) { free(lpriv->joinTableFeatureIdName); lpriv->joinTableFeatureIdName = NULL; } if (lpriv->joinTableForeignKeyName) { free(lpriv->joinTableForeignKeyName); lpriv->joinTableForeignKeyName = NULL; } if (lpriv->joinTableName) { free(lpriv->joinTableName); lpriv->joinTableName = NULL; } free(lpriv->coverage); free(lpriv->fclass); free(lpriv->expression); free(lpriv->featureTableName); free(lpriv->primitiveTableName); free(lpriv->featureTablePrimIdName); free(lpriv->index); free(lpriv); ecs_FreeLayer(s,layer); ecs_SetSuccess(&(s->result)); return &(s->result); } /* deselect all layer */ void vrf_releaseAllLayers(s) ecs_Server *s; { int i; /* count down since nblayer will change as we go */ for (i = s->nblayer-1; i >= 0; i--) dyn_ReleaseLayer(s,&(s->layer[i].sel)); } /* ---------------------------------------------------------------------- * dyn_SelectRegion: * * selection current geographic region. * ---------------------------------------------------------------------- */ ecs_Result *dyn_SelectRegion(s,gr) ecs_Server *s; ecs_Region *gr; { register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; int i; #ifdef VRF_DEBUG printf("dyn_SelectRegion\n"); #endif s->currentRegion.north = gr->north; s->currentRegion.south = gr->south; /* GDAL < 2.5 passed swapped values of east/west. This used to work */ /* because of the reprojection code that has now ben removed */ s->currentRegion.east = gr->east >= gr->west ? gr->east : gr->west; s->currentRegion.west = gr->west <= gr->east ? gr->west : gr->east; s->currentRegion.ns_res = gr->ns_res; s->currentRegion.ew_res = gr->ew_res; /* reset currentLayer index to 0 to force rewind */ if (s->currentLayer != -1) { s->layer[s->currentLayer].index = 0; } #ifdef VRF_DEBUG printf("nbtile: %d\n",spriv->nbTile); #endif for(i = 0; i < spriv->nbTile; ++i) { if (spriv->isTiled) { if (vrf_IsOutsideRegion(spriv->tile[i].ymax, spriv->tile[i].ymin, spriv->tile[i].xmax, spriv->tile[i].xmin, &(s->currentRegion))) { spriv->tile[i].isSelected = 0; } else { spriv->tile[i].isSelected = 1; } } } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetDictionary: * * return the itcl_class object * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetDictionary(s) ecs_Server *s; { ecs_SetText(&(s->result),datadict); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetAttributesFormat: * * return the attribute format of the currently selected layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetAttributesFormat(s) ecs_Server *s; { int i; register LayerPrivateData *lpriv; ecs_AttributeFormat type=0; int length=0; int precision=0; lpriv = (LayerPrivateData *) s->layer[s->currentLayer].priv; ecs_SetObjAttributeFormat(&(s->result)); /* the code to retreive attribute format of a specific layer is inserted here */ for(i = 0; i < lpriv->featureTable.nfields; ++i) { switch(lpriv->featureTable.header[i].type) { case 'T': case 'L': length = lpriv->featureTable.header[i].count; if (length == -1) { type = Varchar; length = 0; } else type = Char; precision = 0; break; case 'F': type = Float; length = 15; precision = 6; break; case 'R': type = Double; length = 25; precision = 12; break; case 'D': type = Char; length = 20; precision = 0; break; case 'S': type = Smallint; length = 6; precision = 0; break; case 'I': type = Integer; length = 10; precision = 0; break; } ecs_AddAttributeFormat(&(s->result), lpriv->featureTable.header[i].name, type, length, precision, 0); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetNextObject: * * return the next object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetNextObject(s) ecs_Server *s; { (layerMethod[s->layer[s->currentLayer].sel.F].getNextObject)(s,&(s->layer[s->currentLayer])); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetObject: * * return an object for the current layer * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObject(s,Id) ecs_Server *s; char *Id; { (layerMethod[s->layer[s->currentLayer].sel.F].getObject)(s,&(s->layer[s->currentLayer]),Id); return &(s->result); } /* ---------------------------------------------------------------------- * dyn_GetObjectIdFromCoord: * * return the object id sitting at (or near) to a coordinate * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetObjectIdFromCoord(s,coord) ecs_Server *s; ecs_Coordinate *coord; { (layerMethod[s->layer[s->currentLayer].sel.F].getObjectIdFromCoord)(s,&(s->layer[s->currentLayer]),coord); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_UpdateDictionary: * * Return the content of this location data dictionary in a Tcl List * ---------------------------------------------------------------------- */ ecs_Result *dyn_UpdateDictionary(s,arg) ecs_Server *s; char *arg; { int i,count; row_type row; char *coverage; char *description; register ServerPrivateData *spriv = (ServerPrivateData *) s->priv; /* Get all the metadata and store them in a string*/ if (spriv->isMetaLoad == FALSE) { if (!vrf_GetMetadata(s)) { return &(s->result); } spriv->isMetaLoad = TRUE; } if ((arg == NULL) || (strcmp(arg,"") == 0)) { ecs_SetText(&(s->result)," "); ecs_AddText(&(s->result),spriv->metadatastring); } else if (strcmp(arg,"ogdi_capabilities") == 0 || strcmp(arg,"ogdi_server_capabilities") == 0 ) { if( !vrf_build_capabilities( s, arg ) ) return &(s->result); } else if ((strncmp(arg,"cat_list",8)) == 0) { ecs_SetText(&(s->result)," "); for (i = 1; i <= spriv->catTable.nrows; ++i) { row = get_row(i, spriv->catTable); coverage = justify( (char *) get_table_element(1, row, spriv->catTable, NULL, &count)); description = justify( (char *) get_table_element(2, row, spriv->catTable, NULL, &count)); free_row(row, spriv->catTable); /* if (strcmp(coverage,"libref") != 0 && strcmp(coverage,"tileref") != 0) {*/ ecs_AddText(&(s->result),"{ "); ecs_AddText(&(s->result),coverage); ecs_AddText(&(s->result)," {"); ecs_AddText(&(s->result),description); ecs_AddText(&(s->result),"}"); vrf_AllFClass(s,coverage); ecs_AddText(&(s->result),"} "); /* }*/ free(coverage); free(description); } } else { if (!vrf_feature_class_dictionary(s,arg)) return &(s->result); } ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetServerProjection: * * Return this server cartographic projection * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetServerProjection(s) ecs_Server *s; { ecs_SetText(&(s->result), "+proj=longlat +datum=wgs84"); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_GetGlobalBound: * * Return this server global bounding region * ---------------------------------------------------------------------- */ ecs_Result *dyn_GetGlobalBound(s) ecs_Server *s; { ecs_SetGeoRegion(&(s->result),s->globalRegion.north, s->globalRegion.south, s->globalRegion.east, s->globalRegion.west, s->globalRegion.ns_res, s->globalRegion.ew_res); ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_SetServerLanguage: * * Set this server lnaguage for error message; not yet implemented * ---------------------------------------------------------------------- */ ecs_Result *dyn_SetServerLanguage(s,language) ecs_Server *s; u_int language; { (void) language; ecs_SetSuccess(&(s->result)); return &(s->result); } /* ---------------------------------------------------------------------- * _dyn_SetCompression: * * No compression used in local databases. * ---------------------------------------------------------------------- */ ecs_Result *dyn_SetCompression(s,compression) ecs_Server *s; ecs_Compression *compression; { (void) compression; ecs_SetSuccess(&(s->result)); return &(s->result); } ogdi-ogdi_4_1_0/ogdi/driver/vrf/vrf.def000066400000000000000000000006711345660466700201160ustar00rootroot00000000000000LIBRARY VRF CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetAttributesFormat dyn_GetNextObject dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_GetObject dyn_GetObjectIdFromCoord dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage ogdi-ogdi_4_1_0/ogdi/driver/vrf/vrf.h000066400000000000000000000336721345660466700176160ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Data structure and prototype definition for the VRF driver * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.10 2004-04-04 04:33:01 warmerda * added vrf_free_ObjAttributeBuffer * * Revision 1.9 2004/02/18 21:33:18 warmerda * free regex memory * * Revision 1.8 2001/08/16 21:02:37 warmerda * Removed MAXSEGS and MAXRINGS fixed limits * * Revision 1.7 2001/08/16 20:40:34 warmerda * applied VITD fixes - merge primitive lines into a feature * * Revision 1.6 2001/06/20 21:49:31 warmerda * added improved query support (swq) * * Revision 1.5 2001/06/13 17:33:59 warmerda * upgraded source headers * */ /********************************************************************* MODULE_INFORMATION NAME VRF driver DESCRIPTION This driver access VRF database. It is part a of the Open Geospatial Datastore Interface (OGDI). This driver communicate VRF data to the OGDI API. END_DESCRIPTION EXPORTED_FUNCTIONS dyn_CreateServer dyn_DestroyServer dyn_SelectLayer dyn_ReleaseLayer dyn_SelectRegion dyn_GetDictionary dyn_GetAttributesFormat dyn_GetNextObject dyn_GetObject dyn_GetObjectIdFromCoord dyn_UpdateDictionary dyn_GetServerProjection dyn_GetGlobalBound dyn_SetServerLanguage END_EXPORTED_FUNCTIONS C_SOURCES vrf.c vrf.h object.c feature.c open.c utils.c END_C_SOURCES END_MODULE_INFORMATION ****************************************************************/ /* #define TESTOPENTABLE 1 */ #include #ifdef _WINDOWS #include #include "compat/dirent.h" #else #include #include #include #endif #include "glutil.h" #include "vpfview.h" #include "vpfquery.h" #include "vpfprim.h" #include "musedir.h" #include "strfunc.h" /* ---------------------------------------- * Define VRF_LINE_JOIN_HACK to enable * merging of line features based on the * join table. * ---------------------------------------- */ #define VRF_LINE_JOIN_HACK /* ---------------------------------------- * Definition of VRF specific structures * ---------------------------------------- */ #ifndef max #define max(x,y) ((x > y) ? x : y) #endif /* private data for a VPF Line layer */ typedef struct { vpf_table_type edgeTable; vpf_table_type mbrTable; } VRFLine; /* private data for a VPF Area layer */ typedef struct { vpf_table_type faceTable; vpf_table_type mbrTable; vpf_table_type ringTable; vpf_table_type edgeTable; } VRFArea; /* private data for a VPF Point layer */ typedef struct { vpf_table_type primTable; } VRFPoint; /* private data for a VPF text layer */ typedef struct { vpf_table_type textTable; } VRFText; typedef struct { char *path; /* directory where the tiled info sits */ float xmin; /* geographic extents of this tile */ float xmax; float ymin; float ymax; int isSelected; /* is within the current geographic region or not */ } VRFTile; /********************************************************************* STRUCTURE_INFORMATION NAME VRFIndex DESCRIPTION Description of one cell of the index table END_DESCRIPTION ATTRIBUTES int32 feature_id: The identifier of the feature identifiant short tile_id: The tile id of the primitive data int32 prim_id: The identifier of the primitive identifiant END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { int32 feature_id; short tile_id; int32 prim_id; } VRFIndex; /********************************************************************* STRUCTURE_INFORMATION NAME LayerPrivateData DESCRIPTION Layer private data description. END_DESCRIPTION ATTRIBUTES vpf_table_type featureTable: The feature table vpf_table_type joinTable: The join table set_type feature_rows: A set over the feature table showing the selection accordingly to the expression. int current_tileid: Indicate which tile is currently selected. VRFIndex *index: The index of feature to primitives relations. char *coverage: The current coverage of the layer char *fclass: The feature class of the coverage char *expression: The selection expression over the features. vpf_table_type fcsTable: The FCS table. char *featureTableName: The feature table name. char *featureTablePrimIdName: The feature table PrimId attribute name. char *joinTableName: The join table name. char *joinTableForeignKeyName: The join table foreign key name char *joinTableFeatureIdName: The join table FeatureId attribute name. char *primitiveTableName: The primitive table name. union { VRFArea area; VRFLine line; VRFPoint point; VRFText text; } l; : This union contain the specialization for each data type. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { vpf_table_type featureTable; vpf_table_type joinTable; set_type feature_rows; /* the set of all selected features according to expression */ int current_tileid; /* usefull to know when to reset the primitive tables: only when a new tile is encountered */ VRFIndex *index; char *coverage; /* the result of the sel.Request parsing */ char *fclass; char *expression; vpf_table_type fcsTable; char *featureTableName; char *featureTablePrimIdName; char *joinTableName; char *joinTableForeignKeyName; char *joinTableFeatureIdName; char *primitiveTableName; int isTiled; /* is this a tiled layer ? */ int mergeFeatures; /* merge primitives into features based on join table*/ union { /* specifics to each feature type */ VRFArea area; VRFLine line; VRFPoint point; VRFText text; } l; } LayerPrivateData; typedef struct { char database[256]; /* fullpath to database and library are usefull when opening table */ char library[256]; char libname[32]; /* the short name of the library (last part of the path) */ char metadatastring[250000]; /*transfert to updatedictionnary of the metadata strings*/ vpf_table_type catTable; /* support files are opened at client creation and remain opened until client destruction */ vpf_table_type latTable; vpf_table_type dhtTable; vpf_table_type lhtTable; vpf_table_type grtTable; vpf_table_type dqtTable; vpf_table_type fcsTable; vpf_table_type fcaTable; int isTiled; /* is this a tiled library ? */ VRFTile *tile; /* tile info, if any, for this library */ int nbTile; /* number of tile, if tiled */ int isDCW; /* Is it a DCW database? */ int isMetaLoad; /* Indicate if the metainfo is load */ } ServerPrivateData; /* layer oriented method are keeped into a single data structure to simplify the code */ typedef void layerfunc(); typedef void layerobfunc(); typedef void layercoordfunc(); typedef struct { layerfunc *getNextObject; layerobfunc *getObject; layercoordfunc *getObjectIdFromCoord; layerfunc *selectTile; } LayerMethod; /* VPF feature types used */ #define MAGIC_VEC2_DATA 120000002L typedef struct { float x; float y; } COORDINATE; typedef struct { int32 id; int32 nr_coords; COORDINATE *coords; } SEGMENT; typedef struct { int32 id; int32 nr_segs; SEGMENT **segs; } RING; typedef struct { int32 id; int32 nr_rings; RING **rings; } AREA_FEATURE; /* private functions prototype */ /* vrf.c */ void vrf_releaseAllLayers _ANSI_ARGS_((ecs_Server *s)); /* utils.c */ void vrf_freePathRegex(); int vrf_parsePath _ANSI_ARGS_((ecs_Server *s,LayerPrivateData *lpriv,ecs_LayerSelection *sel)); int vrf_parsePathValue _ANSI_ARGS_((ecs_Server *s,char *request,char **fclass, char **coverage,char **expression)); int vrf_getFileNameFromFcs _ANSI_ARGS_((ecs_Server *s, LayerPrivateData *lpriv)); int vrf_verifyCATFile _ANSI_ARGS_((ecs_Server *s)); int vrf_initRegionWithDefault _ANSI_ARGS_((ecs_Server *s)); int vrf_GetMetadata _ANSI_ARGS_((ecs_Server *s)); int vrf_initTiling _ANSI_ARGS_((ecs_Server *s)); int vrf_IsOutsideRegion _ANSI_ARGS_((double n, double s, double e,double w, ecs_Region *region)); void vrf_AllFClass _ANSI_ARGS_((ecs_Server *s, char *coverage)); int vrf_feature_class_dictionary _ANSI_ARGS_((ecs_Server *s,char *request)); int vrf_build_capabilities( ecs_Server *s, const char *request ); /* feature.c */ int vrf_get_xy _ANSI_ARGS_((vpf_table_type table, row_type row,int32 pos, double *x,double *y)); int vrf_get_point_feature _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int prim_id)); int vrf_get_line_feature _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int prim_id, short tile_id, ecs_Result *result )); int vrf_get_merged_line_feature _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int primCount, int32 *primList, short *tileList, int dryRun)); int vrf_get_text_feature _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int prim_id)); int vrf_get_area_feature _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int prim_id)); int vrf_get_line_mbr _ANSI_ARGS_((ecs_Server* s, ecs_Layer *layer,int32 prim_id,short tile_id,double *xmin,double *ymin,double *xmax,double *ymax)); int vrf_get_lines_mbr _ANSI_ARGS_((ecs_Server* s, ecs_Layer *layer, int32 primCount, int32 *primList, short* tileList, double *xmin,double *ymin, double *xmax,double *ymax)); int vrf_get_area_mbr _ANSI_ARGS_((ecs_Layer *layer,int32 prim_id,double *xmin,double *ymin,double *xmax,double *ymax)); int vrf_get_ring_coords _ANSI_ARGS_((ecs_Server *s, RING *ring, int32 face_id, int32 start_edge,vpf_table_type edgetable)); int32 vrf_next_face_edge _ANSI_ARGS_((edge_rec_type *edge_rec,int32 *prevnode, int32 face_id)); char *vrf_get_ObjAttributes _ANSI_ARGS_((vpf_table_type table,int32 row_pos)); void vrf_free_ObjAttributeBuffer(); int vrf_checkLayerTables _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); /* vrfswq.c */ set_type query_table2( char *expression, vpf_table_type table ); /* layer oriented method definition */ /* open.c */ void _openLineLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _openAreaLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _openPointLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _openTextLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closeLineLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closeAreaLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closePointLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _closeTextLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindLineLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindAreaLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindPointLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _rewindTextLayer _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); /* object.c */ void _getTileAndPrimId _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l, int32 object_id,int32 *feature_id, short *tile_id,int32 *prim_id)); void _getPrimList _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l, int32 object_id, int32 *feature_id, int32 *primCount, int32 **primList, short** tileList, int32 *next_object_id)); void _getNextObjectLine _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getNextObjectArea _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getNextObjectPoint _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getNextObjectText _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer)); void _getObjectLine _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectArea _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectPoint _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectText _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, char *objectId)); void _getObjectIdLine _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); void _getObjectIdArea _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); void _getObjectIdPoint _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); void _getObjectIdText _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, ecs_Coordinate *coord)); int _selectTileLineWithRet _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int tile_id)); void _selectTileLine _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int tile_id)); void _selectTileArea _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int tile_id)); void _selectTilePoint _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int tile_id)); void _selectTileText _ANSI_ARGS_((ecs_Server *s,ecs_Layer *layer, int tile_id)); void _closeLayerTable _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l)); ogdi-ogdi_4_1_0/ogdi/driver/vrf/vrfswq.c000066400000000000000000000260041345660466700203330ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI VRF Driver * Purpose: Implements VPF query capability based on SWQ in a manner similar * to the vpfquery.c code distributed with vpflib. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.7 2007-05-09 20:46:28 cbalint * From: Even Rouault * Date: Friday 21:14:18 * * * fix filename case sensitivy problems (for Unix-like systems). * * * fix incorrect use of sprintf in vrf_GetMetadata. * * * report wgs84 instead of nad83, not sure whether that is true * for all VPF products, but at least it's correct for VMAP products * that *must* be WGS84. A better fix would be to read the VPF table * that contains this information. * * * fix a few minor memory leaks and memory usage issues. * * * enable XMIN, YMIN, XMAX and YMAX columns to be of type double * in EBR and FBR files (for read the VMAP2i 'MIG2i000' product). * * * add .pjt and .tjt as possible extensions for join tables * (VMAP2i 'MIG2i000' product). * * * fix duplicated layers report (VMAP2i 'MIG2i000' product). * * * handle 'L' (Latin1) type for text files (GEOCAPI 'MIGxxx' products). * * * optionnaly, convert text to UTF-8 when environment variable * CONVERT_OGDI_TXT_TO_UTF8 is defined. This part is not portable * on Windows I guess (only tested on Linux) and maybe too specific. * * * enable reading of VPF products without table indexes file * (GEOCAPI 'MIG013' and 'MIG016' products). VPF norm says that when * there is a variable length field in one table, an index should exist, * but some test products don't follow this. The approach here is to read * the whole table content and build the index in memory. * * Modified Files: * ChangeLog ogdi/driver/vrf/feature.c ogdi/driver/vrf/object.c * ogdi/driver/vrf/utils.c ogdi/driver/vrf/vrf.c * ogdi/driver/vrf/vrfswq.c vpflib/musedir.c vpflib/strfunc.c * vpflib/vpfbrows.c vpflib/vpfprop.c vpflib/vpfquery.c * vpflib/vpfread.c vpflib/vpftable.c * * Revision 1.6 2007/02/12 15:52:57 cbalint * * Preliminary cleanup. * Get rif of unitialized variables, and unused ones. * * Revision 1.5 2004/10/25 21:24:43 warmerda * Fixed case of 1 character wide fields as per Stephane's submission * in bug 809737. * * Revision 1.4 2004/10/25 19:09:06 warmerda * Fixed so that string comparisons on fields long than 1 character * work. Also fixed so that trailing spaces are trimmed off string * values before comparing. * * Revision 1.3 2001/06/26 00:57:34 warmerda * fixed strcasecmp on WIN32 * * Revision 1.2 2001/06/21 20:30:15 warmerda * added ECS_CVSID * * Revision 1.1 2001/06/20 21:49:16 warmerda * New * */ #include "ecs.h" #include "vrf.h" #include "swq.h" ECS_CVSID("$Id$"); #ifndef __LINKLIST_H__ #include "linklist.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __SET_H__ #include "set.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif #ifdef WIN32 # define strcasecmp stricmp #endif typedef struct { row_type row; vpf_table_type table; } evaluator_info; /************************************************************************/ /* vrf_swq_evaluator() */ /* */ /* Evaluate a single operation from the WHERE expression on a */ /* row from the VRF table. */ /************************************************************************/ int vrf_swq_evaluator( swq_field_op *op, void *raw_info ) { int32 lval, count; short sval; float fval; char *tptr; evaluator_info *info = (evaluator_info *) raw_info; row_type row = info->row; vpf_table_type table = info->table; /* -------------------------------------------------------------------- */ /* String field comparison. */ /* -------------------------------------------------------------------- */ if( table.header[op->field_index].type == 'T' || table.header[op->field_index].type == 'L' ) { int ret_result, i; /* count=1 is a special case because the value is returned into a char instead of returning an allocated string */ if (table.header[op->field_index].count == 1) { char cval; get_table_element( op->field_index, row, table, &cval, &count ); if( op->operation == SWQ_EQ ) ret_result = (cval == op->string_value[0]); else ret_result = (cval != op->string_value[0]); } else { tptr = (char *)get_table_element( op->field_index, row, table, NULL, &count ); /* trim whitepsace */ for( i = strlen(tptr)-1; i >= 0 && tptr[i] == ' '; i-- ) tptr[i] = '\0'; if( op->operation == SWQ_EQ ) ret_result = (strcasecmp(tptr,op->string_value) == 0); else ret_result = (strcasecmp(tptr,op->string_value) != 0); xvt_free(tptr); } return ret_result; } /* -------------------------------------------------------------------- */ /* Numeric field comparison. */ /* -------------------------------------------------------------------- */ else { if (table.header[op->field_index].count != 1) return FALSE; if( table.header[op->field_index].type == 'S' ) { get_table_element( op->field_index, row, table, &sval, &count ); fval = sval; } else if( table.header[op->field_index].type == 'I' ) { get_table_element( op->field_index, row, table, &lval, &count ); fval = lval; } else { get_table_element( op->field_index, row, table, &fval, &count ); } switch( op->operation ) { case SWQ_EQ: return fval == op->float_value; case SWQ_NE: return fval != op->float_value; case SWQ_GT: return fval > op->float_value; case SWQ_LT: return fval < op->float_value; case SWQ_GE: return fval >= op->float_value; case SWQ_LE: return fval <= op->float_value; default: return FALSE; } } } /************************************************************************ * query_table2() * * This function returns the set of selected rows of a VPF table * based upon the evaluation of the given selection expression string. * * see swq.h/swq.c for details on the expression syntax. * * Parameters: * * expression ==(char *) selection expression string. * table ==(vpf_table_type) VPF table structure. * return ==(set_type) set of selected rows. ************************************************************************/ set_type query_table2( char *expression, vpf_table_type table ) { register int32 i, ipos; set_type select_set; swq_expr *expr; const char *error; int nfields; char **fieldname; swq_field_type *fieldtype; evaluator_info ev_info; select_set = set_init (table.nrows); /* -------------------------------------------------------------------- */ /* If the expression is "*" then just turn on all members of */ /* select_set and return. */ /* -------------------------------------------------------------------- */ if (strcmp (expression, "*") == 0) { set_on(select_set); return select_set; } /* -------------------------------------------------------------------- */ /* Prepare the field list. */ /* -------------------------------------------------------------------- */ nfields = (int32)table.nfields; fieldname = (char**) malloc(nfields * sizeof(char *)); fieldtype = (swq_field_type *) malloc(nfields * sizeof(swq_field_type)); for (i=0; i < nfields; i++) { fieldname[i] = (char *) table.header[i].name; if( table.header[i].type == 'T' || table.header[i].type == 'L' ) fieldtype[i] = SWQ_STRING; else if( table.header[i].type == 'F' ) fieldtype[i] = SWQ_FLOAT; else if( table.header[i].type == 'I' || table.header[i].type == 'S' ) fieldtype[i] = SWQ_INTEGER; else fieldtype[i] = SWQ_OTHER; } /* -------------------------------------------------------------------- */ /* Compile the WHERE expression. */ /* -------------------------------------------------------------------- */ error = swq_expr_compile( expression, nfields, fieldname, fieldtype, &expr ); if ( error != NULL || expr == NULL ) return select_set; /* -------------------------------------------------------------------- */ /* Process the table, one record at a time. */ /* -------------------------------------------------------------------- */ if (table.storage == DISK) { ipos = index_pos (1L, table); fseek( table.fp, ipos, SEEK_SET ); } ev_info.table = table; for (i=1;i<=table.nrows;i++) { if (table.storage == DISK) ev_info.row = read_next_row(table); else ev_info.row = get_row( i, table ); if( swq_expr_evaluate( expr, vrf_swq_evaluator, (void *) &ev_info ) ) set_insert( i, select_set ); free_row(ev_info.row, table); } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ free( fieldtype ); free( fieldname ); swq_expr_free( expr ); return select_set; } ogdi-ogdi_4_1_0/ogdi/examples/000077500000000000000000000000001345660466700163635ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/examples/example1/000077500000000000000000000000001345660466700200775ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/examples/example1/.cvsignore000066400000000000000000000000061345660466700220730ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/examples/example1/example1.c000066400000000000000000000022111345660466700217530ustar00rootroot00000000000000#include "ecs.h" char url[] = "gltp:/grass/c:/demo/spearfish/PERMANENT"; char layer[] = "roads@PERMANENT(*)"; int main() { int ClientID; ecs_Result *result; ecs_Region selectionRegion; ecs_LayerSelection selectionLayer; /* Create a client with ClientID as a reference */ result = cln_CreateClient(&ClientID,url); /* The user must set a region value in the client geographic projection */ selectionRegion.north = 4928000.0; selectionRegion.south = 4914000.0; selectionRegion.east = 609000.0; selectionRegion.west = 590000.0; selectionRegion.ns_res = 50.0; selectionRegion.ew_res = 50.0; result = cln_SelectRegion(ClientID,&selectionRegion); /* Define the layer to select */ selectionLayer.Select = (char *) layer; selectionLayer.F = Line; result = cln_SelectLayer(ClientID,&selectionLayer); /* The application process the result of cln_SelectLayer. */ result = cln_GetNextObject(ClientID); while (ECSSUCCESS(result)) { result = cln_GetNextObject(ClientID); } result = cln_ReleaseLayer(ClientID,&selectionLayer); result = cln_DestroyClient(ClientID); return 0; } ogdi-ogdi_4_1_0/ogdi/examples/example1/makefile000066400000000000000000000005551345660466700216040ustar00rootroot00000000000000TOBEGEN = example1 TARGETGEN=$(PROGGEN) SOURCES = example1.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) $(COPY_LOCAL) clean: default-clean ogdi-ogdi_4_1_0/ogdi/examples/example2/000077500000000000000000000000001345660466700201005ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/examples/example2/.cvsignore000066400000000000000000000000061345660466700220740ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/examples/example2/example2.c000066400000000000000000000102331345660466700217600ustar00rootroot00000000000000#include #include "ecs.h" int PrintResult(); /* This example will print all the lines objects from a database defined by user. The user will give the url and the layer selection to the program and, immediately, he will see the lines print on screen. */ int main() { int ClientID; char url[100]; char layerSelection[100]; ecs_Result *result; ecs_Region selectionRegion; ecs_LayerSelection selectionLayer; int code; int errin; code = TRUE; printf("Enter the URL: "); errin = scanf("%s",url); if (errin == 0) { printf("URL Input error.\n"); exit(1); } printf("Enter the layer: "); errin = scanf("%s",layerSelection); if (errin == 0) { printf("Layer Input error.\n"); exit (1); } PrintResult("cln_CreateClient", cln_CreateClient(&ClientID,url)); PrintResult("cln_GetGlobalBound", (result=cln_GetGlobalBound(ClientID))); /* It's better to allocate locally all the data structure to be sent to the API. In this case, ECSREGION(result) is not used directly in argument of cln_SelectRegion. The SelectRegion destroy the old ecs_Result and it's argument at the same time. */ selectionRegion.north = ECSREGION(result).north; selectionRegion.south = ECSREGION(result).south; selectionRegion.east = ECSREGION(result).east; selectionRegion.west = ECSREGION(result).west; selectionRegion.ns_res = ECSREGION(result).ns_res; selectionRegion.ew_res = ECSREGION(result).ew_res; PrintResult("cln_SelectRegion",cln_SelectRegion(ClientID,&selectionRegion)); selectionLayer.Select = (char *) layerSelection; selectionLayer.F = Line; PrintResult("cln_SelectLayer",cln_SelectLayer(ClientID,&selectionLayer)); while (code) { code = PrintResult("cln_GetNextObject",cln_GetNextObject(ClientID)); } PrintResult("cln_ReleaseLayer",cln_ReleaseLayer(ClientID,&selectionLayer)); PrintResult("cln_DestroyClient",cln_DestroyClient(ClientID)); return 1; } /* The following function will make the analysis of the structure ecs_Result return by all API functions. He will print information of the contain of the structure. Of course, this function is incomplete, only error messages, region informations, text and line info will be print. If an error occur, the function will call exit() after the printing the message. */ int PrintResult(command,result) char *command; ecs_Result *result; { unsigned int i; int code; code = TRUE; /* Print the command string */ printf("\n%s\n\n",command); /* Check is a result is pass as an argument */ if (result == NULL) printf("No structure returned\n"); /* Check is the request is successful */ if (ECSSUCCESS(result)) { /* Check the contain type of result */ switch(ECSRESULTTYPE(result)) { case Object: /* result contain an geographical object. Now check the contain if it's a line and print the line geographical object. */ if (ECSGEOMTYPE(result) == Line) { printf("Object ID:%s\n",ECSOBJECTID(result)); printf("Object Attributes:%s\n",ECSOBJECTATTR(result)); for(i=0;imessage); if (!ECSEOF(result)) { /* The error message is not an eof. Call exit() */ exit(0); } code = FALSE; } printf("***************************************************\n"); return code; } ogdi-ogdi_4_1_0/ogdi/examples/example2/makefile000066400000000000000000000005551345660466700216050ustar00rootroot00000000000000TOBEGEN = example2 TARGETGEN=$(PROGGEN) SOURCES = example2.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(OGDI_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) $(COPY_LOCAL) clean: default-clean ogdi-ogdi_4_1_0/ogdi/examples/makefile000066400000000000000000000023371345660466700200700ustar00rootroot00000000000000# Copyright (C) 2001 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # include $(TOPDIR)/config/common.mak # # Sub-directories that need to be built # subdirs = example1 example2 # # Default target to build everything in all sub-directories # all: $(subdirs) # # Target to allow individual sub-directories to be built # (e.g. make cgmmod) # .PHONY: $(subdirs) $(subdirs): cd $@; $(MAKE) # # Pass specialized targets into the sub-directories # .PHONY: $(STANDARD_TARGETS) $(STANDARD_TARGETS): @for i in $(subdirs); do \ $(MAKE) --directory $$i $@; \ done ogdi-ogdi_4_1_0/ogdi/gltpd/000077500000000000000000000000001345660466700156575ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/gltpd/.cvsignore000066400000000000000000000000061345660466700176530ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/gltpd/asyncsvr.c000066400000000000000000000340751345660466700177040ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI gltpd Server * Purpose: GLTPD Mainline. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.7 2016-06-28 14:32:45 erouault * Fix all warnings about unused variables raised by GCC 4.8 * * Revision 1.6 2007/02/12 21:01:48 cbalint * Fix win32 target. It build and works now. (tested with VC6) * * Revision 1.5 2007/02/12 16:09:06 cbalint * * Add hook macros for all GNU systems, hook fread,fwrite,read,fgets. * * Handle errors in those macro, if there are any. * * Fix some includes for GNU systems. * * Reduce remaining warnings, now we got zero warnings with GCC. * * Modified Files: * config/unix.mak contrib/ogdi_import/dbfopen.c * contrib/ogdi_import/shapefil.h contrib/ogdi_import/shpopen.c * ogdi/c-api/ecs_xdr.c ogdi/c-api/ecsinfo.c ogdi/c-api/server.c * ogdi/datum_driver/canada/nadconv.c ogdi/driver/adrg/adrg.c * ogdi/driver/adrg/adrg.h ogdi/driver/adrg/object.c * ogdi/driver/adrg/utils.c ogdi/driver/rpf/rpf.h * ogdi/driver/rpf/utils.c ogdi/gltpd/asyncsvr.c * ogdi/glutil/iofile.c vpflib/vpfprim.c vpflib/vpfspx.c * vpflib/vpftable.c vpflib/vpftidx.c vpflib/xvt.h * * Revision 1.4 2002/02/21 16:38:19 warmerda * undefine svc_fdset if defined - helps avoid odd library requirements on linux * * Revision 1.3 2001/04/09 15:04:35 warmerda * applied new source headers * */ #include "ecs.h" #include ECS_CVSID("$Id$"); #ifdef _WINDOWS # include "rpc/pmap_cln.h" # include "time.h" #else # include # include "time.h" #endif #include #ifdef _WINDOWS # include #else # include #endif #ifdef HAVE_STD_RPC_INCLUDES # include #endif #ifdef svc_fdset #undef svc_fdset #endif #define COMTIMEOUT 900 long timecount; static void dispatchno_1(); extern void ecsprog_1(); u_long newprogramno; static char str1[255]; static char *argv0; static void gltpd_svc_run(); FILE *gltpdstate = NULL; int main(argc,argv) int argc; char **argv; { SVCXPRT *transp; int num; int isDispatch = TRUE; char *debug; #ifdef _WINDOWS rpc_nt_init(); #endif debug = getenv("GLTPDLOGFILE"); if (debug) { gltpdstate = (FILE *) "."; if (gltpdstate) { printf("%d: Start in the main\n",getpid()); for(num=0;numrq_proc) { case NULLPROC: if (debug && gltpdstate) { printf("%d: Dispatcher function: NULLPROC case\n",getpid()); } (void)svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL); return; case 1: /* Dispatcher de service */ if (debug && gltpdstate) { printf("%d: Dispatcher function: Call the dispatcher request\n",getpid()); } memset((char *)&argument,0, sizeof(argument)); if (!svc_getargs(transp, (xdrproc_t) xdr_void, (char *) &argument)) { svcerr_decode(transp); return; } #ifndef _WINDOWS /* Reap zombie children */ /* while (waitpid(-1, NULL, WNOHANG) > 0); if (fork()) { return; }*/ #endif /* Trouver le numero du nouveau serveur * Note: On Windows NT, this really should not be created here because * the child creates its own socket and registers it. Leave it for now. */ if (debug && gltpdstate) { printf("%d: Dispatcher function: Call the svctcp_create function\n",getpid()); } newtransp = svctcp_create(RPC_ANYSOCK, 0, 0); /* Trouver dynamiquement un numero d'identifiant */ newprogramno = ECS_TRANSIENT_MIN; while( !pmap_set(newprogramno, ECSVERS, IPPROTO_TCP, newtransp->xp_port)) { newprogramno++; if (newprogramno == ECS_TRANSIENT_MAX) { newprogramno = ECS_TRANSIENT_MIN; } } svc_destroy(newtransp); if (debug && gltpdstate) { printf("%d: Dispatcher function: RPC number: %ld\n", getpid(), newprogramno); } #ifdef _WINDOWS /* Cas Windows avec CreateProcess */ ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); saProcess.nLength = sizeof(saProcess); saProcess.lpSecurityDescriptor =NULL; saProcess.bInheritHandle=TRUE; saThread.nLength = sizeof(saThread); saThread.lpSecurityDescriptor =NULL; saThread.bInheritHandle=FALSE; /* spawn process */ if (strncmp(str1,"-d",2) == 0) { if (debug && gltpdstate) { printf("%d: Dispatcher function: Call the svc_sendreply function\n",getpid()); } if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } /* Enregistrer le nouveau serveur */ if (debug && gltpdstate) { printf("%d: Dispatcher function: Call svc_register\n",getpid()); } if (!svc_register(newtransp, newprogramno, ECSVERS, ecsprog_1, 0)) { if (debug && gltpdstate) { printf("%d: Dispatcher function: unable to register the server\n",getpid()); } (void)fprintf(stderr, "unable to register (ECSPROG, ECSVERS, tcp).\n"); exit(1); } if (debug && gltpdstate) { printf("%d: Dispatcher function: unable to register the server\n",getpid()); } gltpd_svc_run(); exit(1); } sprintf(temp,"%s %d",argv0, newprogramno); if (debug && gltpdstate) { printf("%d: Dispatcher function: Call CreateProcess\n",getpid()); } result = CreateProcess (argv0, temp, /* command line */ &saProcess, &saThread, FALSE, DETACHED_PROCESS, NULL, NULL,&si, &piProcessB); if (result) { CloseHandle(piProcessB.hProcess); CloseHandle(piProcessB.hThread); } else { if (debug && gltpdstate) { printf("%d: Dispatcher function: Error occur during CreateProcess %s\n",getpid(),temp); } return; } /* Rtourner le resultat au client, mais auparavent on laisse le temps au serveur de s'intialiser */ Sleep(3000); if (debug && gltpdstate) { printf("%d: Dispatcher function: Call sendreply\n",getpid()); } if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } #else /* Cas UNIX avec fork if (debug && gltpdstate) { printf("%d: Dispatcher function: Call sendreply\n",getpid()); fclose(gltpdstate); } if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } if (debug && gltpdstate) { printf("%d: Dispatcher function: Call svc_register\n",getpid()); fclose(gltpdstate); } if (!svc_register(newtransp, newprogramno, ECSVERS, ecsprog_1, 0)) { (void)fprintf(stderr, "unable to register (ECSPROG, ECSVERS, tcp).\n"); exit(1); } gltpd_svc_run(); (void)fprintf(stderr, "svc_run returned\n"); exit(1); */ sprintf(temp,"%s %ld &",argv0, newprogramno); if (debug && gltpdstate) { printf("%d: Dispatcher function: Call CreateProcess\n",getpid()); } /* Reap zombie children */ while (waitpid(-1, NULL, WNOHANG) > 0); ogdi_system(temp); /* Rtourner le resultat au client, mais auparavent on laisse le temps au serveur de s'intialiser */ sleep(1); if (debug && gltpdstate) { printf("%d: Dispatcher function: Call sendreply\n",getpid()); } if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, (xdrproc_t) xdr_void, (char *) &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } #endif break; default: svcerr_noproc(transp); return; } } #ifdef _WINDOWS void gltpd_svc_run() { xdrproc_t xdr_argument; struct timeval timeout; #ifdef FD_SETSIZE fd_set readfds; #else int readfds; #endif timeout.tv_sec = COMTIMEOUT; timeout.tv_usec = 1; for (;;) { #ifdef FD_SETSIZE readfds = svc_fdset; #else readfds = svc_fds; #endif switch (select(0, &readfds, (int *)NULL, (int *)NULL, (struct timeval *)&timeout)) { case -1: if (WSAerrno == EINTR) { continue; } return; case 0: perror("gltpd_svc_run: - timeout"); return; default: svc_getreqset(&readfds); } } } #else void gltpd_svc_run() { fd_set readfdset; extern int errno; static int tsize = 0; struct timeval timeout; xdrproc_t xdr_argument; /*xdrproc_t xdr_result;*/ long currenttime; timeout.tv_sec = COMTIMEOUT; timeout.tv_usec = 0; if (!tsize) tsize = getdtablesize(); for (;;) { readfdset = svc_fdset; switch (select(tsize, &readfdset, (fd_set*) NULL, (fd_set*) NULL, (struct timeval *) &timeout)) { case -1: if (errno == EBADF) { continue; } if (errno == EINTR) { time(¤ttime); if (currenttime - timecount > COMTIMEOUT) { xdr_argument = (xdrproc_t) xdr_void; /*xdr_result = (xdrproc_t) xdr_ecs_Result;*/ destroyserver_1_svc(xdr_argument,NULL); perror("gltpd_svc_run: - timeout"); return; } continue; } perror("gltpd_svc_run: - select failed"); return; case 0: xdr_argument = (xdrproc_t) xdr_void; /*xdr_result = (xdrproc_t) xdr_ecs_Result;*/ destroyserver_1_svc(xdr_argument,NULL); perror("gltpd_svc_run: - timeout"); return; default: svc_getreqset(&readfdset); time(&timecount); } } } #endif ogdi-ogdi_4_1_0/ogdi/gltpd/ecs_sif.c000066400000000000000000000142661345660466700174470ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI gltpd Server * Purpose: Server function wrappers. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.3 2001-04-09 15:04:35 warmerda * applied new source headers * */ #include "ecs.h" ECS_CVSID("$Id$"); ecs_Server *svr_handle; ecs_Result ecs_dummy_sif; /* In this real gltpd server, this is a stub function */ ecs_Result * createproxyserver_1_svc(args,rqstp) ecs_ProxyCreateServer *args; struct svc_req *rqstp; { (void) args; (void) rqstp; return NULL; } ecs_Result * createserver_1_svc(args,rqstp) char **args; struct svc_req *rqstp; { (void) rqstp; svr_handle = (ecs_Server *) malloc(sizeof(ecs_Server)); if (svr_handle == NULL) { ecs_ResultInit(&ecs_dummy_sif); ecs_SetError(&ecs_dummy_sif,1,"no more memory"); return &ecs_dummy_sif; } return svr_CreateServer (svr_handle, *args, 0); } ecs_Result * destroyserver_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { ecs_Result *msg; (void) args; (void) rqstp; msg = svr_DestroyServer(svr_handle); return msg; } ecs_Result *selectlayer_1_svc(args,rqstp) ecs_LayerSelection *args; struct svc_req *rqstp; { (void) rqstp; return svr_SelectLayer(svr_handle, args); } ecs_Result *releaselayer_1_svc(args,rqstp) ecs_LayerSelection *args; struct svc_req *rqstp; { (void) rqstp; return svr_ReleaseLayer(svr_handle, args); } ecs_Result *selectregion_1_svc(args,rqstp) ecs_Region *args; struct svc_req *rqstp; { (void) rqstp; return svr_SelectRegion(svr_handle, args); } ecs_Result *getdictionnary_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetDictionary(svr_handle); } ecs_Result *getattributeformat_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetAttributesFormat(svr_handle); } ecs_Result *getnextobject_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetNextObject(svr_handle); } ecs_Result *getrasterinfo_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetRasterInfo(svr_handle); } ecs_Result *getobject_1_svc(args,rqstp) char **args; struct svc_req *rqstp; { (void) rqstp; return svr_GetObject(svr_handle, *args); } ecs_Result *getobjectidfromcoord_1_svc(args,rqstp) ecs_Coordinate *args; struct svc_req *rqstp; { (void) rqstp; return svr_GetObjectIdFromCoord(svr_handle, args); } ecs_Result *updatedictionary_1_svc(args,rqstp) char **args; struct svc_req *rqstp; { (void) rqstp; return svr_UpdateDictionary(svr_handle,*args); } ecs_Result *getserverprojection_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetServerProjection(svr_handle); } ecs_Result *getglobalbound_1_svc(args,rqstp) void *args; struct svc_req *rqstp; { (void) rqstp; (void) args; return svr_GetGlobalBound(svr_handle); } ecs_Result *setserverlanguage_1_svc(args,rqstp) u_int *args; struct svc_req *rqstp; { (void) rqstp; return svr_SetServerLanguage(svr_handle, *args); } ecs_Result * setrasterconversion_1_svc(args,rqstp) ecs_RasterConversion *args; struct svc_req *rqstp; { (void) rqstp; return svr_SetRasterConversion(svr_handle,args); } ecs_Result *setcompression_1_svc(compression,rqstp) ecs_Compression *compression; struct svc_req *rqstp; { (void) rqstp; if ((compression->ctype != ECS_COMPRESS_NONE) && (compression->ctype != ECS_COMPRESS_ZLIB)) { ecs_SetError(&ecs_dummy_sif,1,"Compression format not supported"); return &ecs_dummy_sif; } if (compression->cversion != 0) { ecs_SetError(&ecs_dummy_sif,1,"Compression version not supported"); return &ecs_dummy_sif; } svr_handle->compression.ctype = compression->ctype; svr_handle->compression.cversion = compression->cversion; if (compression->cachesize == 0) { svr_handle->compression.cachesize = ECS_CACHE_DEFAULT; } else if (compression->cachesize > ECS_CACHE_MAX) { svr_handle->compression.cachesize = ECS_CACHE_MAX; } else { svr_handle->compression.cachesize = compression->cachesize; } if (compression->ctype == ECS_COMPRESS_ZLIB) { if (compression->clevel == 0) { svr_handle->compression.clevel = ECS_ZLIB_LEVEL_DEFAULT; } else if (compression->clevel > 9) { svr_handle->compression.clevel = 9; } else { svr_handle->compression.clevel = compression->clevel; } if (compression->cblksize > ECS_ZLIB_BLKSIZE_MAX) { svr_handle->compression.cblksize = ECS_ZLIB_BLKSIZE_MAX; } else if (compression->cblksize == 0) { svr_handle->compression.cblksize = ECS_ZLIB_BLKSIZE_DEFAULT; } else { svr_handle->compression.cblksize = compression->cblksize; } } else { svr_handle->compression.clevel = 0; svr_handle->compression.cblksize = 0; } svr_handle->compression.cfullsize = 0; ecs_SetSuccess(&ecs_dummy_sif); return &ecs_dummy_sif; } ogdi-ogdi_4_1_0/ogdi/gltpd/ecs_svc.c000066400000000000000000000160251345660466700174540ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" #ifndef _WINDOWS #include #include /* getenv, exit */ #include /* for pmap_unset */ #include /* strcmp */ #include #include /* ioctl, TIOCNOTTY */ #include /* open */ #include /* open */ #include /* open */ #include /* getdtablesize */ #include #include #include #endif /* ifndef _WINDOWS */ extern unsigned long newprogramno; #include #ifndef SIG_PF #define SIG_PF void(*)(int) #endif #define _RPCSVC_CLOSEDOWN 120 #define main dummy #define RPC_SVC_FG #ifdef svc_fdset #undef svc_fdset #endif extern ecs_Server *svr_handle; static void closedown(int sig); void start_closedown_check(void) { #ifndef _WINDOWS (void) signal(SIGALRM, (SIG_PF) closedown); (void) alarm(_RPCSVC_CLOSEDOWN); #endif /* ifndef _WINDOWS */ } int _rpcpmstart; /* Started by a port monitor ? */ int _rpcfdtype; /* Whether Stream or Datagram ? */ int _rpcsvcdirty; /* Still serving ? */ static void _msgout(char* msg) { #ifdef RPC_SVC_FG if (_rpcpmstart) (void) fprintf(stderr, "%s\n", msg); else (void) fprintf(stderr, "%s\n", msg); #else (void) fprintf(stderr, "%s\n", msg); #endif } static void closedown(int sig) { (void) signal(sig, (SIG_PF) closedown); if (_rpcsvcdirty == 0) { extern fd_set svc_fdset; static int size; int i, openfd; if (_rpcfdtype == SOCK_DGRAM) exit(0); if (size == 0) { size = getdtablesize(); } for (i = 0, openfd = 0; i < size && openfd < 2; i++) if (FD_ISSET(i, &svc_fdset)) openfd++; if (openfd <= 1) exit(0); } (void) alarm(_RPCSVC_CLOSEDOWN); } void ecsprog_1(struct svc_req *rqstp, register SVCXPRT *transp) { union { char *createserver_1_arg; ecs_LayerSelection selectlayer_1_arg; ecs_LayerSelection releaselayer_1_arg; ecs_Region selectregion_1_arg; char *getobject_1_arg; ecs_Coordinate getobjectidfromcoord_1_arg; char *updatedictionary_1_arg; u_int setserverlanguage_1_arg; ecs_RasterConversion setrasterconversion_1_arg; ecs_ProxyCreateServer createproxyserver_1_arg; ecs_Compression setcompression_1_arg; } argument; char *result; xdrproc_t xdr_argument, xdr_result; char *(*local)(char *, struct svc_req *); _rpcsvcdirty = 1; switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL); _rpcsvcdirty = 0; return; case CREATESERVER: xdr_argument = (xdrproc_t) xdr_wrapstring; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) createserver_1_svc; break; case DESTROYSERVER: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) destroyserver_1_svc; break; case SELECTLAYER: xdr_argument = (xdrproc_t) xdr_ecs_LayerSelection; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) selectlayer_1_svc; break; case RELEASELAYER: xdr_argument = (xdrproc_t) xdr_ecs_LayerSelection; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) releaselayer_1_svc; break; case SELECTREGION: xdr_argument = (xdrproc_t) xdr_ecs_Region; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) selectregion_1_svc; break; case GETDICTIONNARY: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getdictionnary_1_svc; break; case GETATTRIBUTEFORMAT: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getattributeformat_1_svc; break; case GETNEXTOBJECT: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getnextobject_1_svc; break; case GETRASTERINFO: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getrasterinfo_1_svc; break; case GETOBJECT: xdr_argument = (xdrproc_t) xdr_wrapstring; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getobject_1_svc; break; case GETOBJECTIDFROMCOORD: xdr_argument = (xdrproc_t) xdr_ecs_Coordinate; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getobjectidfromcoord_1_svc; break; case UPDATEDICTIONARY: xdr_argument = (xdrproc_t) xdr_wrapstring; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) updatedictionary_1_svc; break; case GETSERVERPROJECTION: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getserverprojection_1_svc; break; case GETGLOBALBOUND: xdr_argument = (xdrproc_t) xdr_void; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) getglobalbound_1_svc; break; case SETSERVERLANGUAGE: xdr_argument = (xdrproc_t) xdr_u_int; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) setserverlanguage_1_svc; break; case SETRASTERCONVERSION: xdr_argument = (xdrproc_t) xdr_ecs_RasterConversion; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) setrasterconversion_1_svc; break; case CREATEPROXYSERVER: xdr_argument = (xdrproc_t) xdr_ecs_ProxyCreateServer; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) createproxyserver_1_svc; break; case SETCOMPRESSION: xdr_argument = (xdrproc_t) xdr_ecs_Compression; xdr_result = (xdrproc_t) xdr_ecs_Result; local = (char *(*)(char *, struct svc_req *)) setcompression_1_svc; break; default: svcerr_noproc(transp); _rpcsvcdirty = 0; return; } (void) memset((char *)&argument, 0, sizeof (argument)); if (!svc_getargs(transp, xdr_argument, (caddr_t) &argument)) { svcerr_decode(transp); _rpcsvcdirty = 0; return; } result = (*local)((char *)&argument, rqstp); if (result) { ecs_Result *tmp = (ecs_Result *) result; /* The CreateServer call must be always uncompressed */ if (svr_handle && rqstp->rq_proc != CREATESERVER) { tmp->compression = svr_handle->compression; } else { /* This will occur after a DESTROYSERVER call */ tmp->compression.ctype = ECS_COMPRESS_NONE; tmp->compression.cversion = 0; tmp->compression.clevel = 0; tmp->compression.cblksize = 0; tmp->compression.cfullsize = 0; tmp->compression.cachesize = 0; } } if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } if (!svc_freeargs(transp, xdr_argument, (caddr_t) &argument)) { _msgout("unable to free arguments"); exit(1); } if (rqstp->rq_proc == DESTROYSERVER) { #ifdef _WINDOWS rpc_nt_exit(); #endif pmap_unset(newprogramno, ECSVERS); exit(0); } _rpcsvcdirty = 0; return; } ogdi-ogdi_4_1_0/ogdi/gltpd/makefile000066400000000000000000000033671345660466700173700ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = gltpd TARGETGEN=$(PROGGEN) SOURCES = asyncsvr.c ecs_sif.c ecs_svc.c INCLUDES = $(CURRENT_INCLUDE) $(OGDI_INCLUDE)\ $(ZLIB_INCLUDE) $(GENERAL_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) $(FLAGS_X86DEF) $(RPC_INCLUDES) LINK_LIBS= $(OGDI_LINKLIB) $(ZLIB_LINKLIB) $(RPC_LINKLIB) \ $(MATH_LINKLIB) \ $(LIBC_LINKLIB) $(UCB_STATICLIB) $(DL_LINKLIB) \ $(WIN_LINKLIB) $(X11_LINKLIB) $(LXLIB_LINKLIB) \ $(TK_LINKLIB) $(TCL_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR ecs_svc.c $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) # # Because the RPCGEN process doesn't work too well on many # platforms we disable it by default, and make people do a "make rpcgen" # to regenerate ecs_xdr.c explicitly. # #ecs_svc.c: ../include/ecs.x rpcgen: -$(RM) -f ecs.x $(FILECOPY) ../include/ecs.x ecs.x $(RM) -f $(OBJDIR)/ecs_svc.c.raw rpcgen -K 120 -I -b -C -s tcp -o $(OBJDIR)/ecs_svc.c.raw ecs.x perl ../scripts/svc_clean.pl \ -o ecs_svc.c $(OBJDIR)/ecs_svc.c.raw $(RM) -f ecs.x clean: default-clean ogdi-ogdi_4_1_0/ogdi/gltpd/sun/000077500000000000000000000000001345660466700164645ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/gltpd/sun/asyncsvr.c000066400000000000000000000154431345660466700205070ustar00rootroot00000000000000 #include "ecs.h" #ifdef _WINDOWS #include "rpc/pmap_cln.h" #endif #include #include #define COMTIMEOUT 900 static void dispatchno_1(); extern void ecsprog_1(); u_long newprogramno; static char str1[255]; void per_svc_run(); int main(argc,argv) int argc; char **argv; { SVCXPRT *transp; int num; int isDispatch = TRUE; #ifdef _WINDOWS rpc_nt_init(); #endif /* Analyser la requete */ switch(argc) { case 2: sscanf(argv[1],"%s",str1); if (strncmp(str1,"-d",2) == 0) { isDispatch = TRUE; } else { isDispatch = FALSE; sscanf(argv[1],"%d",&num); } break; case 1: isDispatch == TRUE; strcpy(str1,""); break; default: printf("Wrong number of arguments\n"); exit(0); break; }; /* Si un argument existe pour ce serveur, creer directement ce serveur sans passer par le dispatcher */ /* Creer le serveur directement */ if (isDispatch) { /* Passer par le dispatcher normalement */ (void)pmap_unset(ECSPROG, ECSVERS); transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { (void)fprintf(stderr, "cannot create tcp service.\n"); return 0; } if (!svc_register(transp, ECSPROG, ECSVERS, dispatchno_1, IPPROTO_TCP)) { (void)fprintf(stderr, "unable to register (DISPATCHNO, DISPATCHVERS, tcp).\n"); return 0; } svc_run(); (void)fprintf(stderr, "svc_run returned\n"); } else { (void)pmap_unset(num, ECSVERS); /* Enregistrer le nouveau serveur */ transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { (void)fprintf(stderr, "cannot create tcp service.\n"); return 0; } if (!svc_register(transp, num, ECSVERS, ecsprog_1, IPPROTO_TCP)) { (void)fprintf(stderr, "unable to register (ECSPROG, ECSVERS, tcp).\n"); exit(1); } per_svc_run(); } #ifdef _WINDOWS rpc_nt_exit(); #endif return 1; } static void dispatchno_1(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp; { #ifdef _WINDOWS STARTUPINFO si; SECURITY_ATTRIBUTES saProcess, saThread; PROCESS_INFORMATION piProcessB; #endif char temp[256]; bool_t result; union { int fill; } argument; SVCXPRT *newtransp; switch (rqstp->rq_proc) { case NULLPROC: (void)svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL); return; case 1: /* Dispatcher de service */ memset((char *)&argument,0, sizeof(argument)); if (!svc_getargs(transp, xdr_void, &argument)) { svcerr_decode(transp); return; } #ifndef _WINDOWS if(fork()) return; #endif /* Trouver le numero du nouveau serveur */ newtransp = svctcp_create(RPC_ANYSOCK, 0, 0); /* Trouver dynamiquement un numero d'identifiant */ newprogramno = ECS_TRANSIENT_MIN; while( !pmap_set( newprogramno, ECSVERS, IPPROTO_TCP, newtransp->xp_port)) { newprogramno = ECS_TRANSIENT_MIN + ( newprogramno + 1 ) % (ECS_TRANSIENT_MAX - ECS_TRANSIENT_MIN + 1); } #ifdef _WINDOWS /* Cas Windows avec CreateProcess */ ZeroMemory(&si,sizeof(si)); si.cb = sizeof(si); saProcess.nLength = sizeof(saProcess); saProcess.lpSecurityDescriptor =NULL; saProcess.bInheritHandle=TRUE; saThread.nLength = sizeof(saThread); saThread.lpSecurityDescriptor =NULL; saThread.bInheritHandle=FALSE; /* spawn process */ if (strncmp(str1,"-d",2) != 0) { sprintf(temp,"gltpd %d",newprogramno); result = CreateProcess ("gltpd.exe", temp, /* command line */ &saProcess, &saThread, FALSE, DETACHED_PROCESS, NULL, NULL,&si, &piProcessB); } else { if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } /* Enregistrer le nouveau serveur */ if (!svc_register(newtransp, newprogramno, ECSVERS, ecsprog_1, 0)) { (void)fprintf(stderr, "unable to register (ECSPROG, ECSVERS, tcp).\n"); exit(1); } per_svc_run(); exit(1); } if (result) { CloseHandle(piProcessB.hProcess); CloseHandle(piProcessB.hThread); } else { return; } /* Retourner le resultat au client, mais auparavent on laisse le temps au serveur de s'intialiser */ Sleep(1000); if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } #else /* Cas UNIX avec fork */ /* Retourner le resultat au client */ if (!svc_sendreply(transp, (xdrproc_t) xdr_u_long, (char *) &newprogramno)) { svcerr_systemerr(transp); printf("erreur reply\n"); } if (!svc_freeargs(transp, xdr_void, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); exit(1); } /* Enregistrer le nouveau serveur */ if (!svc_register(newtransp, newprogramno, ECSVERS, ecsprog_1, 0)) { (void)fprintf(stderr, "unable to register (ECSPROG, ECSVERS, tcp).\n"); exit(1); } per_svc_run(); (void)fprintf(stderr, "svc_run returned\n"); exit(1); #endif break; default: svcerr_noproc(transp); return; } } #ifdef _WINDOWS void per_svc_run() { svc_run(); /* struct timeval timeout; fd_set readfds; Message *retour; timeout.tv_sec = COMTIMEOUT; timeout.tv_usec = 0; for (;;) { readfds = svc_fdset; switch (select(0, &readfds, (struct fd_set *) 0, (struct fd_set *)0, (struct timeval *) &timeout)) { case -1: if (WSAerrno == EINTR) { continue; } perror("svc_run: - select failed"); return; case 0: retour = disconnecthost_1(); perror("per_svc_run: - timeout"); return; default: svc_getreqset(&readfds); } } */ } #else void per_svc_run() { svc_run(); /* fd_set readfdset; extern int errno; static int tsize = 0; struct timeval timeout; Message *retour; timeout.tv_sec = COMTIMEOUT; timeout.tv_usec = 0; if (!tsize) tsize = getdtablesize(); for (;;) { readfdset = svc_fdset; switch (select(tsize, &readfdset, (fd_set*) NULL, (fd_set*) NULL, (struct timeval *) &timeout)) { case -1: if (errno == EBADF) { continue; } perror("svc_run: - select failed"); return; case 0: retour = disconnecthost_1(); perror("per_svc_run: - timeout"); return; default: svc_getreqset(&readfdset); } } */ } #endif ogdi-ogdi_4_1_0/ogdi/gltpd/sun/ecs_sif.c000066400000000000000000000047011345660466700202450ustar00rootroot00000000000000#include "ecs.h" ecs_Server *mptr; ecs_Result ecs_dummy_sif; ecs_Result *createserver_1(args,rqstp) char **args; struct svc_req *rqstp; { mptr = (ecs_Server *) malloc(sizeof(ecs_Server)); if (mptr == NULL) { ecs_ResultInit(&ecs_dummy_sif); ecs_SetError(&ecs_dummy_sif,1,"no more memory"); return &ecs_dummy_sif; } return svr_CreateServer (mptr, *args, 0); } ecs_Result *destroyserver_1(args,rqstp) void *args; struct svc_req *rqstp; { ecs_Result *msg; msg = svr_DestroyServer(mptr); free(mptr); mptr = NULL; return msg; } ecs_Result *selectlayer_1(args,rqstp) ecs_LayerSelection *args; struct svc_req *rqstp; { return svr_SelectLayer(mptr, args); } ecs_Result *releaselayer_1(args,rqstp) ecs_LayerSelection *args; struct svc_req *rqstp; { return svr_ReleaseLayer(mptr, args); } ecs_Result *selectregion_1(args,rqstp) ecs_Region *args; struct svc_req *rqstp; { return svr_SelectRegion(mptr, args); } ecs_Result *getdictionnary_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetDictionary(mptr); } ecs_Result *getattributeformat_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetAttributesFormat(mptr); } ecs_Result *getnextobject_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetNextObject(mptr); } ecs_Result *getrasterinfo_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetRasterInfo(mptr); } ecs_Result *getobject_1(args,rqstp) char **args; struct svc_req *rqstp; { return svr_GetObject(mptr, *args); } ecs_Result *getobjectidfromcoord_1(args,rqstp) ecs_Coordinate *args; struct svc_req *rqstp; { return svr_GetObjectIdFromCoord(mptr, args); } ecs_Result *updatedictionary_1(args,rqstp) char **args; struct svc_req *rqstp; { return svr_UpdateDictionary(mptr,*args); } ecs_Result *getserverprojection_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetServerProjection(mptr); } ecs_Result *getglobalbound_1(args,rqstp) void *args; struct svc_req *rqstp; { return svr_GetGlobalBound(mptr); } ecs_Result *setserverlanguage_1(args,rqstp) u_int *args; struct svc_req *rqstp; { return svr_SetServerLanguage(mptr, *args); } ecs_Result * setrasterconversion_1(args,rqstp) ecs_RasterConversion *args; struct svc_req *rqstp; { return svr_SetRasterConversion(mptr,args); } ogdi-ogdi_4_1_0/ogdi/gltpd/sun/ecs_svc.c000066400000000000000000000150401345660466700202550ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" #include #include /* getenv, exit */ #include #include #include #include #include #include /* rlimit */ #include #ifdef DEBUG #define RPC_SVC_FG #endif #define _RPCSVC_CLOSEDOWN 120 #define main dummy static int _rpcpmstart; /* Started by a port monitor ? */ /* States a server can be in wrt request */ #define _IDLE 0 #define _SERVED 1 #define _SERVING 2 static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */ static void _msgout(msg) char *msg; { #ifdef RPC_SVC_FG if (_rpcpmstart) syslog(LOG_ERR, msg); else (void) fprintf(stderr, "%s\n", msg); #else syslog(LOG_ERR, msg); #endif } static void closedown(sig) int sig; { if (_rpcsvcstate == _IDLE) { extern fd_set svc_fdset; static int size; int i, openfd; struct t_info tinfo; if (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS)) exit(0); if (size == 0) { struct rlimit rl; rl.rlim_max = 0; getrlimit(RLIMIT_NOFILE, &rl); if ((size = rl.rlim_max) == 0) { return; } } for (i = 0, openfd = 0; i < size && openfd < 2; i++) if (FD_ISSET(i, &svc_fdset)) openfd++; if (openfd <= 1) exit(0); } if (_rpcsvcstate == _SERVED) _rpcsvcstate = _IDLE; (void) signal(SIGALRM, (void(*)()) closedown); (void) alarm(_RPCSVC_CLOSEDOWN/2); } void ecsprog_1(rqstp, transp) struct svc_req *rqstp; register SVCXPRT *transp; { union { char *createserver_1_arg; ecs_LayerSelection selectlayer_1_arg; ecs_LayerSelection releaselayer_1_arg; ecs_Region selectregion_1_arg; char *getobject_1_arg; ecs_Coordinate getobjectidfromcoord_1_arg; char *updatedictionary_1_arg; u_int setserverlanguage_1_arg; ecs_RasterConversion setrasterconversion_1_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); _rpcsvcstate = _SERVING; switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply(transp, xdr_void, (char *)NULL); _rpcsvcstate = _SERVED; return; case CREATESERVER: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) createserver_1; break; case DESTROYSERVER: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) destroyserver_1; break; case SELECTLAYER: xdr_argument = xdr_ecs_LayerSelection; xdr_result = xdr_ecs_Result; local = (char *(*)()) selectlayer_1; break; case RELEASELAYER: xdr_argument = xdr_ecs_LayerSelection; xdr_result = xdr_ecs_Result; local = (char *(*)()) releaselayer_1; break; case SELECTREGION: xdr_argument = xdr_ecs_Region; xdr_result = xdr_ecs_Result; local = (char *(*)()) selectregion_1; break; case GETDICTIONNARY: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getdictionnary_1; break; case GETATTRIBUTEFORMAT: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getattributeformat_1; break; case GETNEXTOBJECT: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getnextobject_1; break; case GETRASTERINFO: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getrasterinfo_1; break; case GETOBJECT: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) getobject_1; break; case GETOBJECTIDFROMCOORD: xdr_argument = xdr_ecs_Coordinate; xdr_result = xdr_ecs_Result; local = (char *(*)()) getobjectidfromcoord_1; break; case UPDATEDICTIONARY: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) updatedictionary_1; break; case GETSERVERPROJECTION: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getserverprojection_1; break; case GETGLOBALBOUND: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getglobalbound_1; break; case SETSERVERLANGUAGE: xdr_argument = xdr_u_int; xdr_result = xdr_ecs_Result; local = (char *(*)()) setserverlanguage_1; break; case SETRASTERCONVERSION: xdr_argument = xdr_ecs_RasterConversion; xdr_result = xdr_ecs_Result; local = (char *(*)()) setrasterconversion_1; break; default: svcerr_noproc(transp); _rpcsvcstate = _SERVED; return; } (void) memset((char *)&argument, 0, sizeof (argument)); if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); _rpcsvcstate = _SERVED; return; } result = (*local)(&argument, rqstp); if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } if (!svc_freeargs(transp, xdr_argument, &argument)) { _msgout("unable to free arguments"); exit(1); } _rpcsvcstate = _SERVED; return; } main() { pid_t pid; int i; char mname[FMNAMESZ + 1]; if (!ioctl(0, I_LOOK, mname) && (!strcmp(mname, "sockmod") || !strcmp(mname, "timod"))) { char *netid; struct netconfig *nconf = NULL; SVCXPRT *transp; int pmclose; _rpcpmstart = 1; openlog("ecs", LOG_PID, LOG_DAEMON); if ((netid = getenv("NLSPROVIDER")) == NULL) { /* started from inetd */ pmclose = 1; } else { if ((nconf = getnetconfigent(netid)) == NULL) _msgout("cannot get transport info"); pmclose = (t_getstate(0) != T_DATAXFER); } if (strcmp(mname, "sockmod") == 0) { if (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, "timod")) { _msgout("could not get the right module"); exit(1); } } if ((transp = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) { _msgout("cannot create server handle"); exit(1); } if (nconf) freenetconfigent(nconf); if (!svc_reg(transp, ECSPROG, ECSVERS, ecsprog_1, 0)) { _msgout("unable to register (ECSPROG, ECSVERS)."); exit(1); } if (pmclose) { (void) signal(SIGALRM, (void(*)()) closedown); (void) alarm(_RPCSVC_CLOSEDOWN/2); } svc_run(); exit(1); /* NOTREACHED */ } else { #ifndef RPC_SVC_FG int size; struct rlimit rl; pid = fork(); if (pid < 0) { perror("cannot fork"); exit(1); } if (pid) exit(0); rl.rlim_max = 0; getrlimit(RLIMIT_NOFILE, &rl); if ((size = rl.rlim_max) == 0) exit(1); for (i = 0; i < size; i++) (void) close(i); i = open("/dev/console", 2); (void) dup2(i, 1); (void) dup2(i, 2); setsid(); openlog("ecs", LOG_PID, LOG_DAEMON); #endif } if (!svc_create(ecsprog_1, ECSPROG, ECSVERS, "netpath")) { _msgout("unable to create (ECSPROG, ECSVERS) for netpath."); exit(1); } svc_run(); _msgout("svc_run returned"); exit(1); /* NOTREACHED */ } ogdi-ogdi_4_1_0/ogdi/glutil/000077500000000000000000000000001345660466700160455ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/glutil/.cvsignore000066400000000000000000000000061345660466700200410ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/glutil/dirent.c000066400000000000000000000122161345660466700175000ustar00rootroot00000000000000#ifdef _WINDOWS /* dir.c for MS-DOS by Samuel Lam , June/87 */ /* * @(#)dir.c 1.4 87/11/06 Public Domain. * * A public domain implementation of BSD directory routines for * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), * August 1897 * Ported to OS/2 by Kai Uwe Rommel * December 1989, February 1990 * Ported to Windows NT 22 May 91 * other mods Summer '92 brianmo@microsoft.com * opendirx() was horribly written, very inefficient, and did not take care * of all cases. It is still not too clean, but it is far more efficient. * Changes made by Gordon Chaffee (chaffee@bugs-bunny.cs.berkeley.edu) */ /*Includes: * crt */ #include #include #include #include #include #include "dirent.h" #define stat _stat /* * NT specific */ #include /* * random typedefs */ #define HDIR HANDLE #define HFILE HANDLE #define PHFILE PHANDLE /* * local functions */ static char *getdirent(char *); static void free_dircontents(struct _dircontents *); static HDIR FindHandle; static WIN32_FIND_DATA FileFindData; static struct dirent dp; DIR *opendirx(char *name, char *pattern) { struct stat statb; DIR *dirp; char c; char *s; struct _dircontents *dp; int len; int unc; char path[ OFS_MAXPATHNAME ]; register char *ip, *op; for (ip = name, op = path; ; op++, ip++) { *op = *ip; if (*ip == '\0') { break; } } len = ip - name; if (len > 0) { unc = ((path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/')); c = path[len - 1]; if (unc) { if (c != '\\' && c != '/') { path[len] = '/'; len++; path[len] ='\0'; } } else { if ((c == '\\' || c == '/') && (len > 1)) { len--; path[len] = '\0'; if (path[len - 1] == ':' ) { path[len] = '/'; len++; path[len] = '.'; len++; path[len] = '\0'; } } else if (c == ':' ) { path[len] = '.'; len++; path[len] ='\0'; } } } else { unc = 0; path[0] = '.'; path[1] = '\0'; len = 1; } if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) { return NULL; } dirp = malloc(sizeof(DIR)); if (dirp == NULL) { return dirp; } c = path[len - 1]; if (c == '.' ) { if (len == 1) { len--; } else { c = path[len - 2]; if (c == '\\' || c == ':') { len--; } else { path[len] = '/'; len++; } } } else if (!unc && ((len != 1) || (c != '\\' && c != '/'))) { path[len] = '/'; len++; } strcpy(path + len, pattern); dirp -> dd_loc = 0; dirp -> dd_contents = dirp -> dd_cp = NULL; if ((s = getdirent(path)) == NULL) { return dirp; } do { if (((dp = malloc(sizeof(struct _dircontents))) == NULL) || ((dp -> _d_entry = malloc(strlen(s) + 1)) == NULL) ) { if (dp) free(dp); free_dircontents(dirp -> dd_contents); return NULL; } if (dirp -> dd_contents) dirp -> dd_cp = dirp -> dd_cp -> _d_next = dp; else dirp -> dd_contents = dirp -> dd_cp = dp; strcpy(dp -> _d_entry, s); dp -> _d_next = NULL; } while ((s = getdirent(NULL)) != NULL); dirp -> dd_cp = dirp -> dd_contents; return dirp; } DIR *opendir(char *name) { return opendirx(name, "*"); } void closedir(DIR * dirp) { free_dircontents(dirp -> dd_contents); free(dirp); } struct dirent *readdir(DIR * dirp) { /* static struct dirent dp; */ if (dirp -> dd_cp == NULL) return NULL; /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */ dp.d_name = dirp->dd_cp->_d_entry; dp.d_namlen = dp.d_reclen = strlen(dp.d_name); dp.d_ino = dirp->dd_loc+1; /* fake the inode */ dirp -> dd_cp = dirp -> dd_cp -> _d_next; dirp -> dd_loc++; return &dp; } void seekdir(DIR * dirp, long off) { long i = off; struct _dircontents *dp; if (off >= 0) { for (dp = dirp -> dd_contents; --i >= 0 && dp; dp = dp -> _d_next); dirp -> dd_loc = off - (i + 1); dirp -> dd_cp = dp; } } long telldir(DIR * dirp) { return dirp -> dd_loc; } static void free_dircontents(struct _dircontents * dp) { struct _dircontents *odp; while (dp) { if (dp -> _d_entry) free(dp -> _d_entry); dp = (odp = dp) -> _d_next; free(odp); } } /* end of "free_dircontents" */ static char *getdirent(char *dir) { int got_dirent; if (dir != NULL) { /* get first entry */ if ((FindHandle = FindFirstFile( dir, &FileFindData )) == (HDIR)0xffffffff) { return NULL; } got_dirent = 1; } else /* get next entry */ got_dirent = FindNextFile( FindHandle, &FileFindData ); if (got_dirent) return FileFindData.cFileName; else { FindClose(FindHandle); return NULL; } } /* end of getdirent() */ struct passwd * _cdecl getpwnam(char *name) { return NULL; } struct passwd * _cdecl getpwuid(int uid) { return NULL; } int getuid() { return 0; } void _cdecl endpwent(void) { } #endif /* _WINDOWS */ ogdi-ogdi_4_1_0/ogdi/glutil/getglenv.c000066400000000000000000000102141345660466700200220ustar00rootroot00000000000000#ifdef _WINDOWS #undef _WINREG_ #include #endif #include #include "glutil.h" #include /* prototype */ char *gl_GetRegistryString(char *regPath, char *keyname); int gl_SetRegistryString(char *regPath, char *keyname, char *keyinfo); /************************************************************************* * Retreive the information related to where is the bin path of GRASSLAND * * Results: * A string * **************************************************************************/ char *getGLenv() { static char *gl = NULL; if (gl != NULL) return gl; #ifdef _WINDOWS gl = gl_GetRegistryString(GLHOME, APPLICATION_NAME); if (gl == NULL) return NULL; #else gl = getenv("GRASSLAND"); if (gl == NULL) return NULL; #endif return gl; } /**************************************************************************** * Retreive the information related to where is the home user path of GRASSLAND * * Results: * A string * ****************************************************************************/ char *getUSRHOMEenv() { static char *gl = NULL; if (gl != NULL) return gl; #ifdef _WINDOWS gl = gl_GetRegistryString(GLHOME, APPLICATION_USER_HOME); if (gl == NULL) return NULL; #else gl = getenv("HOME"); if (gl == NULL) return NULL; #endif return gl; } /************************************************************************* * Retreive the information related to where is the GISRC file * * Results: * A string * **************************************************************************/ char *getGISRCenv() { static char *gl = NULL; if (gl != NULL) return gl; #ifdef _WINDOWS gl = gl_GetRegistryString(GLHOME, APPLICATION_USER_GISRC); if (gl == NULL) return NULL; #else gl = getenv("GISRC"); if (gl == NULL) return NULL; #endif return gl; } /************************************************************************* * Retreive the information related to where is the GISBASE path * * Results: * A string * **************************************************************************/ char *getGISBASEenv() { static char *gl = NULL; if (gl != NULL) return gl; #ifdef _WINDOWS gl = gl_GetRegistryString(GLHOME, APPLICATION_USER_GISBASE); if (gl == NULL) return NULL; #else gl = getenv("GISBASE"); if (gl == NULL) return NULL; #endif return gl; } #ifdef _WINDOWS /************************************************************************* * Retreive the key information from HKEY_LOCAL_MACHINE in the registry * * Results: * A string * **************************************************************************/ char *gl_GetRegistryString(char *regPath, char *keyname) { HKEY hkey; DWORD dwSize; DWORD dwType; int ret; char *value = NULL; ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_READ, &hkey); if (ret == ERROR_SUCCESS) { ret = RegQueryValueEx(hkey, keyname, NULL, &dwType, NULL, &dwSize); if (ret == ERROR_SUCCESS) { if (dwType != REG_SZ) { RegCloseKey(hkey); return NULL; } value = (char *) malloc(dwSize); if (value) { ret = RegQueryValueEx(hkey, keyname, NULL, &dwType, value, &dwSize); if (ret != ERROR_SUCCESS) { free((char *) value); value = NULL; } } } RegCloseKey(hkey); } return value; } /************************************************************************* * Sets the key information from HKEY_LOCAL_MACHINE in the registry * * Results: * 1 if success * 0 if fail * **************************************************************************/ int gl_SetRegistryString(char *regPath, char *keyname, char *keyinfo) { HKEY hkey; DWORD dwDispose; int ret; int size; char *classer; ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, NULL, REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hkey, &dwDispose); if (ret == ERROR_SUCCESS) { size = strlen(keyinfo); ret = RegSetValueEx(hkey, keyname, 0, REG_SZ, keyinfo, size); if (ret != ERROR_SUCCESS) { RegCloseKey(hkey); return 0; } else { RegCloseKey(hkey); return 1; } } else { return 0; } } #endif ogdi-ogdi_4_1_0/ogdi/glutil/glutil.h000066400000000000000000000011571345660466700175220ustar00rootroot00000000000000#define GLHOME "SOFTWARE\\GRASSLAND\\HOME" #define GLINFO "SOFTWARE\\GRASSLAND\\INFO" #define APPLICATION_NAME "GRASSLAND" #define APPLICATION_USER_HOME "USRHOME" #define APPLICATION_USER_GISRC "GISRC" #define APPLICATION_USER_GISBASE "GISBASE" /* PROTOTYPE */ char *getGLenv(void); char *getUSRHOMEenv(void); char *getGISRCenv(); char *getGISBASEenv(); int remove_dir(char *path); char *ConvertFStoBSString(char *in); char *ConvertBStoFSString(char *in); int bCreate_status_d_text(char *text1,char *text2); int bUpdate_status_d_text(char *text1,char *text2); int bIs_status_d_Cancel_checked(); void close_status_d(); ogdi-ogdi_4_1_0/ogdi/glutil/iofile.c000066400000000000000000000074321345660466700174660ustar00rootroot00000000000000#ifdef _WINDOWS #include #include #include #include #include #else #include #include #include #endif #include "glutil.h" #include /* *---------------------------------------------------------------------- * remove_dir * * Empty a directory (delete all *.* files) and remove the directory * * Results: * A int (1 = done, 0 = error * *---------------------------------------------------------------------- */ int remove_dir(path) char *path; { #ifdef _WINDOWS struct _finddata_t c_file; long hfile; char current_dir[_MAX_PATH]; if (_getcwd(current_dir,_MAX_PATH) == NULL) { return 0; } if (_chdir(path)) { return 0; } if ((hfile = _findfirst("*.*", &c_file)) == -1L) { return 0; } else { do { unlink(c_file.name); } while(_findnext(hfile, &c_file) == 0); _findclose(hfile); } _chdir(current_dir); return (int) RemoveDirectory(path); #else char buffer[256]; sprintf(buffer,"rm -r %s",path); ogdi_system(buffer); return 0; #endif } /* *---------------------------------------------------------------------- * ConvertFStoBSString -- * * Convert a string with forward slashes to a string with backslashes * The returned string must be freed with ckfree. * * Results: * A string * * Side effects: * Memory is allocated. *---------------------------------------------------------------------- */ char *ConvertFStoBSString(char *in) { char *out; char *ip, *op; int len; len = strlen(in) + 1; out = malloc(len); if (out == NULL) return in; op = out; ip = in; while (*ip != '\0') { if (*ip == '/') { *op = '\\'; } else { *op = *ip; } ip++; op++; } *op = '\0'; return out; } /* *---------------------------------------------------------------------- * ConvertBStoFSString -- * * Convert a string with backslashes to a string with Forward slashes * The returned string must be freed with ckfree. * * Results: * A string * * Side effects: * Memory is allocated. *---------------------------------------------------------------------- */ char *ConvertBStoFSString(char *in) { char *out; char *ip, *op; int len; len = strlen(in) + 1; out = malloc(len); if (out == NULL) return in; op = out; ip = in; while (*ip != '\0') { if (*ip == '\\') { *op = '/'; } else { *op = *ip; } ip++; op++; } *op = '\0'; return out; } #ifdef _WINDOWS int list_element (out, element, desc, mapset, lister) FILE *out; char *element; char *desc; char *mapset; int (*lister)(); { char path[1000]; char buf[400]; int count,j; struct _finddata_t c_file; long hfile; char current_dir[_MAX_PATH]; count = 0; /* * convert . to current mapset */ if (strcmp (mapset,".") == 0) mapset = G_mapset(); /* * get the full name of the GIS directory within the mapset * and list its contents (if it exists) * * if lister() routine is given, the ls command must give 1 name */ G__file_name (path, element, "", mapset); if(access(path, 0) != 0) return 0; /* * if a title so that we can call lister() with the names * otherwise the ls must be forced into columnar form. */ if (_getcwd(current_dir,_MAX_PATH) == NULL) return 0; if (_chdir(path)) return 0; fprintf(out,"in mapset %s:\n\n",mapset); if ((hfile = _findfirst("*.*", &c_file)) == -1L) { _chdir(current_dir); return 0; } count = 0; do { if ( (c_file.attrib & (_A_HIDDEN | _A_SYSTEM)) == 0 && c_file.name[0] != '.') { fprintf(out," %s\n", c_file.name); count++; } } while(_findnext(hfile, &c_file) == 0); fprintf(out,"\n"); _findclose(hfile); _chdir(current_dir); return count; } #endif ogdi-ogdi_4_1_0/ogdi/glutil/makefile000066400000000000000000000020361345660466700175460ustar00rootroot00000000000000# # Grassland utility functions # # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = glutil TARGETGEN=$(ARCHGEN) SOURCES = getglenv.c iofile.c dirent.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/ogdi/glutil/status_d.c000066400000000000000000000136451345660466700200500ustar00rootroot00000000000000//================================================================================ // // status_d.c Francois Levert LAS inc. // Create a Dialog with a cancel button. This dialog will be used to send status // messages to the user. Two strings messages are provided by the status dialog. //================================================================================ #include #include "status_d.h" #include "glutil.h" /* Prototype */ void ThreadProc (LPVOID arg); int CreateStatus_D_Thread(HANDLE outHandle); void CloseStatus_D_Thread(); /*** global variables ***/ static BOOL bCancelChecked = TRUE; /* Is Cancel Button pressed */ LPTSTR lpszText1; /* String message 1 */ LPTSTR lpszText2; /* String message 2 */ BOOL bDialog_created = FALSE; /* Is The status Dialog created */ HWND global_hDlg = NULL; /* Handle of the main dialog */ HANDLE myThread; /* Thread created for the display event of the status dislog */ int bStatus; /* Status of the creation of the Status Dialog */ BOOL CALLBACK status_dDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_COMMAND: Handle_WM_COMMAND(hDlg, wParam, lParam); return TRUE; case WM_INITDIALOG: Handle_WM_INITDIALOG(hDlg); return TRUE; /* case WM_MY_PAINT: Handle_WM_PAINT(hDlg); return TRUE; */ case WM_CLOSE: /* SetCursor(LoadCursor(NULL, IDC_ARROW)); */ EndDialog(hDlg, 0); CloseStatus_D_Thread(); } return FALSE; } void Handle_WM_COMMAND(HWND hDlg, WPARAM wParam, LPARAM lParam) { if (HIWORD(wParam) != BN_CLICKED) return; switch(LOWORD(wParam) ) { case ID_CANCEL: bCancelChecked = TRUE; SendMessage(hDlg, WM_CLOSE, 0, 0); break; } return; } void Handle_WM_INITDIALOG(HWND hDlg) { RECT rect; int cx,cy; GetWindowRect(hDlg, &rect); cx = rect.right - rect.left; cy = rect.top - rect.bottom; lpszText1= "Status 1"; lpszText2= "Status 2"; bDialog_created = TRUE; bCancelChecked = FALSE; SetWindowPos(hDlg, HWND_TOP, 5 ,5, cx, cy, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); SetFocus((HWND) ID_CANCEL); /* SetCursor(LoadCursor(NULL, IDC_APPSTARTING)); */ } void Handle_WM_PAINT(HWND hDlg) { SetDlgItemText(hDlg, ID_TEXT1, lpszText1); SetDlgItemText(hDlg, ID_TEXT2, lpszText2); SendMessage(hDlg, WM_PAINT, 0, 0); } //================================================================================ // Tell if the cancel has been pressed //================================================================================ int bIs_status_d_Cancel_checked() { return (int) bCancelChecked; } //================================================================================ // Update the status dialog messages //================================================================================ int bUpdate_status_d_text(char *text1,char *text2) { if(bDialog_created) { lpszText1 = (LPTSTR) text1; lpszText2 = (LPTSTR) text2; SetFocus((HWND) global_hDlg); if (global_hDlg != NULL) Handle_WM_PAINT(global_hDlg); return 1; } return 0; } //================================================================================ // Create a status message dialog //================================================================================ int bCreate_status_d_text(char *text1,char *text2) { int bResult; lpszText1 = (LPTSTR) text1; lpszText2 = (LPTSTR) text2; bResult = CreateStatus_D_Thread(NULL); if (bResult == 0) return 0; /* Not able to create a thread == not able to create a dialog */ return bStatus; /* Return the Create Dialog Status (see ThreadProc) */ } //================================================================================ // Close the status message dialog //================================================================================ void close_status_d() { if (global_hDlg != NULL) SendMessage(global_hDlg, WM_CLOSE, 0, 0); } //================================================================================ // Create a thread for the status Dialog //================================================================================ int CreateStatus_D_Thread(HANDLE outHandle) { DWORD threadId; CHAR Buf[80]; HANDLE sem; sem = CreateSemaphore(NULL, 0, 1, NULL); myThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)sem, 0, (LPDWORD)&threadId); if (!myThread) { wsprintf(Buf, "Error in creating the Status Dialog thread: %d", GetLastError()); MessageBox (GetFocus(), Buf, "WM_CREATE", MB_OK); return 0; } WaitForSingleObject(sem, INFINITE); return 1; } //================================================================================ // Create a thread for the status Dialog //================================================================================ void CloseStatus_D_Thread() { TerminateThread(myThread, 0); } //================================================================================ // A thread procedure which only send messages to be taken // by the Satus Dialog Procedure. //================================================================================ VOID ThreadProc ( LPVOID arg) { MSG msg; HANDLE sem = (HANDLE) arg; global_hDlg = CreateDialog( NULL, MAKEINTRESOURCE(STATUS_D), GetFocus(), (DLGPROC)status_dDlgProc); if ( global_hDlg == (HWND) NULL) bStatus = 0; else bStatus = 1; ReleaseSemaphore(sem, 1, NULL); /* this will resumed the main thread permetting bCreate_status_d_text() to return bStatus */ do { // do forever ... GetMessage(&msg, NULL, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); SendMessage(global_hDlg, msg.message, 0, 0); /* PostThreadMessage((DWORD) arg, msg.message, 0, 0); */ }while(1); } ogdi-ogdi_4_1_0/ogdi/glutil/status_d.mak000066400000000000000000000140361345660466700203710ustar00rootroot00000000000000# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 !IF "$(CFG)" == "" CFG=Win32 Debug !MESSAGE No configuration specified. Defaulting to Win32 Debug. !ENDIF !IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE on this makefile !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "status_d.mak" CFG="Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF ################################################################################ # Begin Project MTL=MkTypLib.exe CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WinRel" # PROP BASE Intermediate_Dir "WinRel" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WinRel" # PROP Intermediate_Dir "WinRel" OUTDIR=.\WinRel INTDIR=.\WinRel ALL : $(OUTDIR)/status_d.exe $(OUTDIR)/status_d.bsc $(OUTDIR) : if not exist $(OUTDIR)/nul mkdir $(OUTDIR) # ADD BASE MTL /nologo /D "NDEBUG" /win32 # ADD MTL /nologo /D "NDEBUG" /win32 MTL_PROJ=/nologo /D "NDEBUG" /win32 # ADD BASE CPP /nologo /ML /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c # ADD CPP /nologo /ML /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c CPP_PROJ=/nologo /ML /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ /FR$(INTDIR)/ /Fp$(OUTDIR)/"status_d.pch" /Fo$(INTDIR)/ /c CPP_OBJS=.\WinRel/ # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" RSC_PROJ=/l 0x409 /fo$(INTDIR)/"status_d.res" /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo BSC32_FLAGS=/nologo /o$(OUTDIR)/"status_d.bsc" BSC32_SBRS= \ $(INTDIR)/status_d.sbr $(OUTDIR)/status_d.bsc : $(OUTDIR) $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386 LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO\ /SUBSYSTEM:windows /INCREMENTAL:no /PDB:$(OUTDIR)/"status_d.pdb" /MACHINE:I386\ /OUT:$(OUTDIR)/"status_d.exe" DEF_FILE= LINK32_OBJS= \ $(INTDIR)/status_d.obj \ $(INTDIR)/status_d.res $(OUTDIR)/status_d.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << !ELSEIF "$(CFG)" == "Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WinDebug" # PROP BASE Intermediate_Dir "WinDebug" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WinDebug" # PROP Intermediate_Dir "WinDebug" OUTDIR=.\WinDebug INTDIR=.\WinDebug ALL : $(OUTDIR)/status_d.exe $(OUTDIR)/status_d.bsc $(OUTDIR) : if not exist $(OUTDIR)/nul mkdir $(OUTDIR) # ADD BASE MTL /nologo /D "_DEBUG" /win32 # ADD MTL /nologo /D "_DEBUG" /win32 MTL_PROJ=/nologo /D "_DEBUG" /win32 # ADD BASE CPP /nologo /ML /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c # ADD CPP /nologo /ML /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c CPP_PROJ=/nologo /ML /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ /FR$(INTDIR)/ /Fp$(OUTDIR)/"status_d.pch" /Fo$(INTDIR)/\ /Fd$(OUTDIR)/"status_d.pdb" /c CPP_OBJS=.\WinDebug/ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" RSC_PROJ=/l 0x409 /fo$(INTDIR)/"status_d.res" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo BSC32_FLAGS=/nologo /o$(OUTDIR)/"status_d.bsc" BSC32_SBRS= \ $(INTDIR)/status_d.sbr $(OUTDIR)/status_d.bsc : $(OUTDIR) $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /DEBUG /MACHINE:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /DEBUG /MACHINE:I386 LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO\ /SUBSYSTEM:windows /INCREMENTAL:yes /PDB:$(OUTDIR)/"status_d.pdb" /DEBUG\ /MACHINE:I386 /OUT:$(OUTDIR)/"status_d.exe" DEF_FILE= LINK32_OBJS= \ $(INTDIR)/status_d.obj \ $(INTDIR)/status_d.res $(OUTDIR)/status_d.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << !ENDIF .c{$(CPP_OBJS)}.obj: $(CPP) $(CPP_PROJ) $< .cpp{$(CPP_OBJS)}.obj: $(CPP) $(CPP_PROJ) $< .cxx{$(CPP_OBJS)}.obj: $(CPP) $(CPP_PROJ) $< ################################################################################ # Begin Group "Source Files" ################################################################################ # Begin Source File SOURCE=.\status_d.c DEP_STATU=\ .\status_d.h $(INTDIR)/status_d.obj : $(SOURCE) $(DEP_STATU) $(INTDIR) # End Source File ################################################################################ # Begin Source File SOURCE=.\status_d.rc DEP_STATUS=\ .\status_d.h $(INTDIR)/status_d.res : $(SOURCE) $(DEP_STATUS) $(INTDIR) $(RSC) $(RSC_PROJ) $(SOURCE) # End Source File # End Group # End Project ################################################################################ ogdi-ogdi_4_1_0/ogdi/glutil/status_d.rc000066400000000000000000000011171345660466700202210ustar00rootroot00000000000000/**************************************************************************** status_d.rc produced by Francois Levert from LAS inc. ****************************************************************************/ #define WIN32_LEAN_AND_MEAN #include #include "status_d.h" STATUS_D DIALOG 6, 15, 243, 119 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Status Update" FONT 8, "MS Sans Serif" { PUSHBUTTON "Cancel", ID_CANCEL, 96, 96, 50, 14 LTEXT "Text", ID_TEXT1, 8, 11, 225, 16 LTEXT "Text", ID_TEXT2, 8, 34, 226, 16 } ogdi-ogdi_4_1_0/ogdi/glutil/status_d.vcp000066400000000000000000000052711345660466700204120ustar00rootroot00000000000000JSG0 .\status_d.makCProjectDocTemplate,onohCourier.&/ogdi-ogdi_4_1_0/ogdi/include/000077500000000000000000000000001345660466700161705ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/include/ecs.h000066400000000000000000000533531345660466700171240ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #ifndef _ECSH_H_RPCGEN #define _ECSH_H_RPCGEN #include #ifdef __cplusplus extern "C" { #endif /* * fichier genere par RPCGEN a partir de ecs.x * * Declaration des structures & prototypes de l'extension client/serveur. * Ce fichier est recu par rpcgen et ce dernier generera 4 fichiers pour * pour l'extension client/serveur. Le "header" suivant doit ce retrouver * dans tout les fichiers */ /* * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. */ extern u_int ecs_compression_type; extern u_int ecs_compression_version; extern u_int ecs_compression_blksize; extern u_int ecs_compression_level; extern u_int ecs_compression_fullsize; #define ECS_SUCCESS 0 #define ECS_FAILURE 1 #define ECS_RASTERSIZE 1000 #define ECS_MTEXT 1024 #define ECS_TRANSIENT_MIN 1073741824 #define ECS_TRANSIENT_MAX 1610612735 #define ECS_COMPRESS_NONE 0 #define ECS_COMPRESS_ZLIB 1 #define ECS_ZLIB_VERSION 0 #define ECS_ZLIB_LEVEL_DEFAULT 1 #define ECS_ZLIB_BLKSIZE_DEFAULT 512 #define ECS_ZLIB_BLKSIZE_MAX 131072 #define ECS_CACHE_DEFAULT 25 #define ECS_CACHE_MIN 1 #define ECS_CACHE_MAX 10000 enum ecs_Family { Area = 1, Line = 2, Point = 3, Matrix = 4, Image = 5, Text = 6, Edge = 7, Face = 8, Node = 9, Ring = 10 }; typedef enum ecs_Family ecs_Family; struct ecs_Region { double north; double south; double east; double west; double ns_res; double ew_res; }; typedef struct ecs_Region ecs_Region; enum ecs_Resampling { nn = 1 }; typedef enum ecs_Resampling ecs_Resampling; enum ecs_Transformation { projective = 1, affine = 2, similarity = 3 }; typedef enum ecs_Transformation ecs_Transformation; struct ecs_RasterConversion { struct { u_int coef_len; double *coef_val; } coef; ecs_Resampling r_method; ecs_Transformation t_method; }; typedef struct ecs_RasterConversion ecs_RasterConversion; struct ecs_Coordinate { double x; double y; }; typedef struct ecs_Coordinate ecs_Coordinate; struct ecs_FeatureRing { ecs_Coordinate centroid; struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_FeatureRing ecs_FeatureRing; struct ecs_Area { struct { u_int ring_len; ecs_FeatureRing *ring_val; } ring; }; typedef struct ecs_Area ecs_Area; struct ecs_Line { struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_Line ecs_Line; struct ecs_Point { ecs_Coordinate c; }; typedef struct ecs_Point ecs_Point; struct ecs_Matrix { struct { u_int x_len; u_int *x_val; } x; }; typedef struct ecs_Matrix ecs_Matrix; struct ecs_Image { struct { u_int x_len; u_int *x_val; } x; }; typedef struct ecs_Image ecs_Image; struct ecs_Text { char *desc; ecs_Coordinate c; }; typedef struct ecs_Text ecs_Text; struct ecs_Node { int id; int containfaceid; ecs_Coordinate c; }; typedef struct ecs_Node ecs_Node; struct ecs_Edge { int id; int startnodeid; int endnodeid; int rightfaceid; int leftfaceid; int rightfedgeid; int leftfedgeid; struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_Edge ecs_Edge; enum ecs_TopoLevel { Level012 = 1, Level3 = 2 }; typedef enum ecs_TopoLevel ecs_TopoLevel; struct ecs_Face { int id; struct { u_int edgeid_len; int *edgeid_val; } edgeid; }; typedef struct ecs_Face ecs_Face; struct ecs_AreaPrim { ecs_TopoLevel level; union { struct { u_int edgeid_len; int *edgeid_val; } edgeid; struct { u_int fedgeid_len; ecs_Face *fedgeid_val; } fedgeid; } ecs_AreaPrim_u; }; typedef struct ecs_AreaPrim ecs_AreaPrim; struct ecs_Geometry { ecs_Family family; union { ecs_Area area; ecs_Line line; ecs_Point point; ecs_Matrix matrix; ecs_Image image; ecs_Text text; ecs_Node node; ecs_Edge edge; ecs_AreaPrim ring; } ecs_Geometry_u; }; typedef struct ecs_Geometry ecs_Geometry; struct ecs_Object { char *Id; ecs_Geometry geom; char *attr; double xmin; double ymin; double xmax; double ymax; }; typedef struct ecs_Object ecs_Object; enum ecs_AttributeFormat { Char = 1, Varchar = 2, Longvarchar = 3, Decimal = 4, Numeric = 5, Smallint = 6, Integer = 7, Real = 8, Float = 9, Double = 10 }; typedef enum ecs_AttributeFormat ecs_AttributeFormat; struct ecs_ObjAttribute { char *name; ecs_AttributeFormat type; int lenght; int precision; int nullable; }; typedef struct ecs_ObjAttribute ecs_ObjAttribute; struct ecs_ObjAttributeFormat { struct { u_int oa_len; ecs_ObjAttribute *oa_val; } oa; }; typedef struct ecs_ObjAttributeFormat ecs_ObjAttributeFormat; struct ecs_Category { long no_cat; u_int r; u_int g; u_int b; char *label; u_long qty; }; typedef struct ecs_Category ecs_Category; struct ecs_RasterInfo { long mincat; long maxcat; int width; int height; struct { u_int cat_len; ecs_Category *cat_val; } cat; }; typedef struct ecs_RasterInfo ecs_RasterInfo; struct ecs_Compression { u_int cachesize; u_int ctype; u_int cversion; u_int clevel; u_int cblksize; u_int cfullsize; }; typedef struct ecs_Compression ecs_Compression; enum ecs_ResultType { SimpleError = 0, Object = 1, GeoRegion = 2, objAttributeFormat = 3, RasterInfo = 4, AText = 5, MultiResult = 6 }; typedef enum ecs_ResultType ecs_ResultType; typedef struct ecs_ResultUnion ecs_ResultUnion; struct ecs_ResultUnion { ecs_ResultType type; union { ecs_Object dob; ecs_Region gr; ecs_ObjAttributeFormat oaf; ecs_RasterInfo ri; char *s; struct { u_int results_len; ecs_ResultUnion *results_val; } results; } ecs_ResultUnion_u; }; struct ecs_Result { ecs_Compression compression; int error; char *message; ecs_ResultUnion res; }; typedef struct ecs_Result ecs_Result; struct ecs_LayerSelection { char *Select; ecs_Family F; }; typedef struct ecs_LayerSelection ecs_LayerSelection; struct ecs_ProxyCreateServer { char *server_name; char *server_url; }; typedef struct ecs_ProxyCreateServer ecs_ProxyCreateServer; #include /* Outils pour l'aide a ecs */ #define ECSPROG ((unsigned long)(0x20000001)) #define ECSVERS ((unsigned long)(1)) #if defined(__STDC__) || defined(__cplusplus) #define CREATESERVER ((unsigned long)(1)) extern ecs_Result * createserver_1(char **, CLIENT *); extern ecs_Result * createserver_1_svc(char **, struct svc_req *); #define DESTROYSERVER ((unsigned long)(2)) extern ecs_Result * destroyserver_1(void *, CLIENT *); extern ecs_Result * destroyserver_1_svc(void *, struct svc_req *); #define SELECTLAYER ((unsigned long)(3)) extern ecs_Result * selectlayer_1(ecs_LayerSelection *, CLIENT *); extern ecs_Result * selectlayer_1_svc(ecs_LayerSelection *, struct svc_req *); #define RELEASELAYER ((unsigned long)(4)) extern ecs_Result * releaselayer_1(ecs_LayerSelection *, CLIENT *); extern ecs_Result * releaselayer_1_svc(ecs_LayerSelection *, struct svc_req *); #define SELECTREGION ((unsigned long)(5)) extern ecs_Result * selectregion_1(ecs_Region *, CLIENT *); extern ecs_Result * selectregion_1_svc(ecs_Region *, struct svc_req *); #define GETDICTIONNARY ((unsigned long)(6)) extern ecs_Result * getdictionnary_1(void *, CLIENT *); extern ecs_Result * getdictionnary_1_svc(void *, struct svc_req *); #define GETATTRIBUTEFORMAT ((unsigned long)(7)) extern ecs_Result * getattributeformat_1(void *, CLIENT *); extern ecs_Result * getattributeformat_1_svc(void *, struct svc_req *); #define GETNEXTOBJECT ((unsigned long)(8)) extern ecs_Result * getnextobject_1(void *, CLIENT *); extern ecs_Result * getnextobject_1_svc(void *, struct svc_req *); #define GETRASTERINFO ((unsigned long)(9)) extern ecs_Result * getrasterinfo_1(void *, CLIENT *); extern ecs_Result * getrasterinfo_1_svc(void *, struct svc_req *); #define GETOBJECT ((unsigned long)(10)) extern ecs_Result * getobject_1(char **, CLIENT *); extern ecs_Result * getobject_1_svc(char **, struct svc_req *); #define GETOBJECTIDFROMCOORD ((unsigned long)(11)) extern ecs_Result * getobjectidfromcoord_1(ecs_Coordinate *, CLIENT *); extern ecs_Result * getobjectidfromcoord_1_svc(ecs_Coordinate *, struct svc_req *); #define UPDATEDICTIONARY ((unsigned long)(12)) extern ecs_Result * updatedictionary_1(char **, CLIENT *); extern ecs_Result * updatedictionary_1_svc(char **, struct svc_req *); #define GETSERVERPROJECTION ((unsigned long)(13)) extern ecs_Result * getserverprojection_1(void *, CLIENT *); extern ecs_Result * getserverprojection_1_svc(void *, struct svc_req *); #define GETGLOBALBOUND ((unsigned long)(14)) extern ecs_Result * getglobalbound_1(void *, CLIENT *); extern ecs_Result * getglobalbound_1_svc(void *, struct svc_req *); #define SETSERVERLANGUAGE ((unsigned long)(15)) extern ecs_Result * setserverlanguage_1(u_int *, CLIENT *); extern ecs_Result * setserverlanguage_1_svc(u_int *, struct svc_req *); #define SETRASTERCONVERSION ((unsigned long)(17)) extern ecs_Result * setrasterconversion_1(ecs_RasterConversion *, CLIENT *); extern ecs_Result * setrasterconversion_1_svc(ecs_RasterConversion *, struct svc_req *); #define CREATEPROXYSERVER ((unsigned long)(100)) extern ecs_Result * createproxyserver_1(ecs_ProxyCreateServer *, CLIENT *); extern ecs_Result * createproxyserver_1_svc(ecs_ProxyCreateServer *, struct svc_req *); #define SETCOMPRESSION ((unsigned long)(101)) extern ecs_Result * setcompression_1(ecs_Compression *, CLIENT *); extern ecs_Result * setcompression_1_svc(ecs_Compression *, struct svc_req *); extern int ecsprog_1_freeresult(SVCXPRT *, xdrproc_t, caddr_t); #else /* K&R C */ #define CREATESERVER ((unsigned long)(1)) extern ecs_Result * createserver_1(); extern ecs_Result * createserver_1_svc(); #define DESTROYSERVER ((unsigned long)(2)) extern ecs_Result * destroyserver_1(); extern ecs_Result * destroyserver_1_svc(); #define SELECTLAYER ((unsigned long)(3)) extern ecs_Result * selectlayer_1(); extern ecs_Result * selectlayer_1_svc(); #define RELEASELAYER ((unsigned long)(4)) extern ecs_Result * releaselayer_1(); extern ecs_Result * releaselayer_1_svc(); #define SELECTREGION ((unsigned long)(5)) extern ecs_Result * selectregion_1(); extern ecs_Result * selectregion_1_svc(); #define GETDICTIONNARY ((unsigned long)(6)) extern ecs_Result * getdictionnary_1(); extern ecs_Result * getdictionnary_1_svc(); #define GETATTRIBUTEFORMAT ((unsigned long)(7)) extern ecs_Result * getattributeformat_1(); extern ecs_Result * getattributeformat_1_svc(); #define GETNEXTOBJECT ((unsigned long)(8)) extern ecs_Result * getnextobject_1(); extern ecs_Result * getnextobject_1_svc(); #define GETRASTERINFO ((unsigned long)(9)) extern ecs_Result * getrasterinfo_1(); extern ecs_Result * getrasterinfo_1_svc(); #define GETOBJECT ((unsigned long)(10)) extern ecs_Result * getobject_1(); extern ecs_Result * getobject_1_svc(); #define GETOBJECTIDFROMCOORD ((unsigned long)(11)) extern ecs_Result * getobjectidfromcoord_1(); extern ecs_Result * getobjectidfromcoord_1_svc(); #define UPDATEDICTIONARY ((unsigned long)(12)) extern ecs_Result * updatedictionary_1(); extern ecs_Result * updatedictionary_1_svc(); #define GETSERVERPROJECTION ((unsigned long)(13)) extern ecs_Result * getserverprojection_1(); extern ecs_Result * getserverprojection_1_svc(); #define GETGLOBALBOUND ((unsigned long)(14)) extern ecs_Result * getglobalbound_1(); extern ecs_Result * getglobalbound_1_svc(); #define SETSERVERLANGUAGE ((unsigned long)(15)) extern ecs_Result * setserverlanguage_1(); extern ecs_Result * setserverlanguage_1_svc(); #define SETRASTERCONVERSION ((unsigned long)(17)) extern ecs_Result * setrasterconversion_1(); extern ecs_Result * setrasterconversion_1_svc(); #define CREATEPROXYSERVER ((unsigned long)(100)) extern ecs_Result * createproxyserver_1(); extern ecs_Result * createproxyserver_1_svc(); #define SETCOMPRESSION ((unsigned long)(101)) extern ecs_Result * setcompression_1(); extern ecs_Result * setcompression_1_svc(); extern int ecsprog_1_freeresult(); #endif /* K&R C */ #define ECSPROXYPROG ((unsigned long)(0x20000002)) #define ECSPROXYVERS ((unsigned long)(1)) #if defined(__STDC__) || defined(__cplusplus) #define PROXY_CREATEREMOTESERVER ((unsigned long)(1)) extern ecs_Result * proxy_createremoteserver_1(char **, CLIENT *); extern ecs_Result * proxy_createremoteserver_1_svc(char **, struct svc_req *); #define PROXY_DESTROYSERVER ((unsigned long)(2)) extern ecs_Result * proxy_destroyserver_1(void *, CLIENT *); extern ecs_Result * proxy_destroyserver_1_svc(void *, struct svc_req *); #define PROXY_SELECTLAYER ((unsigned long)(3)) extern ecs_Result * proxy_selectlayer_1(ecs_LayerSelection *, CLIENT *); extern ecs_Result * proxy_selectlayer_1_svc(ecs_LayerSelection *, struct svc_req *); #define PROXY_RELEASELAYER ((unsigned long)(4)) extern ecs_Result * proxy_releaselayer_1(ecs_LayerSelection *, CLIENT *); extern ecs_Result * proxy_releaselayer_1_svc(ecs_LayerSelection *, struct svc_req *); #define PROXY_SELECTREGION ((unsigned long)(5)) extern ecs_Result * proxy_selectregion_1(ecs_Region *, CLIENT *); extern ecs_Result * proxy_selectregion_1_svc(ecs_Region *, struct svc_req *); #define PROXY_GETDICTIONNARY ((unsigned long)(6)) extern ecs_Result * proxy_getdictionnary_1(void *, CLIENT *); extern ecs_Result * proxy_getdictionnary_1_svc(void *, struct svc_req *); #define PROXY_GETATTRIBUTEFORMAT ((unsigned long)(7)) extern ecs_Result * proxy_getattributeformat_1(void *, CLIENT *); extern ecs_Result * proxy_getattributeformat_1_svc(void *, struct svc_req *); #define PROXY_GETNEXTOBJECT ((unsigned long)(8)) extern ecs_Result * proxy_getnextobject_1(void *, CLIENT *); extern ecs_Result * proxy_getnextobject_1_svc(void *, struct svc_req *); #define PROXY_GETRASTERINFO ((unsigned long)(9)) extern ecs_Result * proxy_getrasterinfo_1(void *, CLIENT *); extern ecs_Result * proxy_getrasterinfo_1_svc(void *, struct svc_req *); #define PROXY_GETOBJECT ((unsigned long)(10)) extern ecs_Result * proxy_getobject_1(char **, CLIENT *); extern ecs_Result * proxy_getobject_1_svc(char **, struct svc_req *); #define PROXY_GETOBJECTIDFROMCOORD ((unsigned long)(11)) extern ecs_Result * proxy_getobjectidfromcoord_1(ecs_Coordinate *, CLIENT *); extern ecs_Result * proxy_getobjectidfromcoord_1_svc(ecs_Coordinate *, struct svc_req *); #define PROXY_UPDATEDICTIONARY ((unsigned long)(12)) extern ecs_Result * proxy_updatedictionary_1(char **, CLIENT *); extern ecs_Result * proxy_updatedictionary_1_svc(char **, struct svc_req *); #define PROXY_GETSERVERPROJECTION ((unsigned long)(13)) extern ecs_Result * proxy_getserverprojection_1(void *, CLIENT *); extern ecs_Result * proxy_getserverprojection_1_svc(void *, struct svc_req *); #define PROXY_GETGLOBALBOUND ((unsigned long)(14)) extern ecs_Result * proxy_getglobalbound_1(void *, CLIENT *); extern ecs_Result * proxy_getglobalbound_1_svc(void *, struct svc_req *); #define PROXY_SETSERVERLANGUAGE ((unsigned long)(15)) extern ecs_Result * proxy_setserverlanguage_1(u_int *, CLIENT *); extern ecs_Result * proxy_setserverlanguage_1_svc(u_int *, struct svc_req *); #define PROXY_SETRASTERCONVERSION ((unsigned long)(17)) extern ecs_Result * proxy_setrasterconversion_1(ecs_RasterConversion *, CLIENT *); extern ecs_Result * proxy_setrasterconversion_1_svc(ecs_RasterConversion *, struct svc_req *); #define PROXY_CREATESERVER ((unsigned long)(100)) extern ecs_Result * proxy_createserver_1(ecs_ProxyCreateServer *, CLIENT *); extern ecs_Result * proxy_createserver_1_svc(ecs_ProxyCreateServer *, struct svc_req *); #define PROXY_SETCOMPRESSION ((unsigned long)(101)) extern ecs_Result * proxy_setcompression_1(ecs_Compression *, CLIENT *); extern ecs_Result * proxy_setcompression_1_svc(ecs_Compression *, struct svc_req *); extern int ecsproxyprog_1_freeresult(SVCXPRT *, xdrproc_t, caddr_t); #else /* K&R C */ #define PROXY_CREATEREMOTESERVER ((unsigned long)(1)) extern ecs_Result * proxy_createremoteserver_1(); extern ecs_Result * proxy_createremoteserver_1_svc(); #define PROXY_DESTROYSERVER ((unsigned long)(2)) extern ecs_Result * proxy_destroyserver_1(); extern ecs_Result * proxy_destroyserver_1_svc(); #define PROXY_SELECTLAYER ((unsigned long)(3)) extern ecs_Result * proxy_selectlayer_1(); extern ecs_Result * proxy_selectlayer_1_svc(); #define PROXY_RELEASELAYER ((unsigned long)(4)) extern ecs_Result * proxy_releaselayer_1(); extern ecs_Result * proxy_releaselayer_1_svc(); #define PROXY_SELECTREGION ((unsigned long)(5)) extern ecs_Result * proxy_selectregion_1(); extern ecs_Result * proxy_selectregion_1_svc(); #define PROXY_GETDICTIONNARY ((unsigned long)(6)) extern ecs_Result * proxy_getdictionnary_1(); extern ecs_Result * proxy_getdictionnary_1_svc(); #define PROXY_GETATTRIBUTEFORMAT ((unsigned long)(7)) extern ecs_Result * proxy_getattributeformat_1(); extern ecs_Result * proxy_getattributeformat_1_svc(); #define PROXY_GETNEXTOBJECT ((unsigned long)(8)) extern ecs_Result * proxy_getnextobject_1(); extern ecs_Result * proxy_getnextobject_1_svc(); #define PROXY_GETRASTERINFO ((unsigned long)(9)) extern ecs_Result * proxy_getrasterinfo_1(); extern ecs_Result * proxy_getrasterinfo_1_svc(); #define PROXY_GETOBJECT ((unsigned long)(10)) extern ecs_Result * proxy_getobject_1(); extern ecs_Result * proxy_getobject_1_svc(); #define PROXY_GETOBJECTIDFROMCOORD ((unsigned long)(11)) extern ecs_Result * proxy_getobjectidfromcoord_1(); extern ecs_Result * proxy_getobjectidfromcoord_1_svc(); #define PROXY_UPDATEDICTIONARY ((unsigned long)(12)) extern ecs_Result * proxy_updatedictionary_1(); extern ecs_Result * proxy_updatedictionary_1_svc(); #define PROXY_GETSERVERPROJECTION ((unsigned long)(13)) extern ecs_Result * proxy_getserverprojection_1(); extern ecs_Result * proxy_getserverprojection_1_svc(); #define PROXY_GETGLOBALBOUND ((unsigned long)(14)) extern ecs_Result * proxy_getglobalbound_1(); extern ecs_Result * proxy_getglobalbound_1_svc(); #define PROXY_SETSERVERLANGUAGE ((unsigned long)(15)) extern ecs_Result * proxy_setserverlanguage_1(); extern ecs_Result * proxy_setserverlanguage_1_svc(); #define PROXY_SETRASTERCONVERSION ((unsigned long)(17)) extern ecs_Result * proxy_setrasterconversion_1(); extern ecs_Result * proxy_setrasterconversion_1_svc(); #define PROXY_CREATESERVER ((unsigned long)(100)) extern ecs_Result * proxy_createserver_1(); extern ecs_Result * proxy_createserver_1_svc(); #define PROXY_SETCOMPRESSION ((unsigned long)(101)) extern ecs_Result * proxy_setcompression_1(); extern ecs_Result * proxy_setcompression_1_svc(); extern int ecsproxyprog_1_freeresult(); #endif /* K&R C */ /* the xdr functions */ #if defined(__STDC__) || defined(__cplusplus) extern bool_t xdr_ecs_Family(XDR *, ecs_Family*); extern bool_t xdr_ecs_Region(XDR *, ecs_Region*); extern bool_t xdr_ecs_Resampling(XDR *, ecs_Resampling*); extern bool_t xdr_ecs_Transformation(XDR *, ecs_Transformation*); extern bool_t xdr_ecs_RasterConversion(XDR *, ecs_RasterConversion*); extern bool_t xdr_ecs_Coordinate(XDR *, ecs_Coordinate*); extern bool_t xdr_ecs_FeatureRing(XDR *, ecs_FeatureRing*); extern bool_t xdr_ecs_Area(XDR *, ecs_Area*); extern bool_t xdr_ecs_Line(XDR *, ecs_Line*); extern bool_t xdr_ecs_Point(XDR *, ecs_Point*); extern bool_t xdr_ecs_Matrix(XDR *, ecs_Matrix*); extern bool_t xdr_ecs_Image(XDR *, ecs_Image*); extern bool_t xdr_ecs_Text(XDR *, ecs_Text*); extern bool_t xdr_ecs_Node(XDR *, ecs_Node*); extern bool_t xdr_ecs_Edge(XDR *, ecs_Edge*); extern bool_t xdr_ecs_TopoLevel(XDR *, ecs_TopoLevel*); extern bool_t xdr_ecs_Face(XDR *, ecs_Face*); extern bool_t xdr_ecs_AreaPrim(XDR *, ecs_AreaPrim*); extern bool_t xdr_ecs_Geometry(XDR *, ecs_Geometry*); extern bool_t xdr_ecs_Object(XDR *, ecs_Object*); extern bool_t xdr_ecs_AttributeFormat(XDR *, ecs_AttributeFormat*); extern bool_t xdr_ecs_ObjAttribute(XDR *, ecs_ObjAttribute*); extern bool_t xdr_ecs_ObjAttributeFormat(XDR *, ecs_ObjAttributeFormat*); extern bool_t xdr_ecs_Category(XDR *, ecs_Category*); extern bool_t xdr_ecs_RasterInfo(XDR *, ecs_RasterInfo*); extern bool_t xdr_ecs_Compression(XDR *, ecs_Compression*); extern bool_t xdr_ecs_ResultType(XDR *, ecs_ResultType*); extern bool_t xdr_ecs_ResultUnion(XDR *, ecs_ResultUnion*); extern bool_t xdr_ecs_Result(XDR *, ecs_Result*); extern bool_t xdr_ecs_LayerSelection(XDR *, ecs_LayerSelection*); extern bool_t xdr_ecs_ProxyCreateServer(XDR *, ecs_ProxyCreateServer*); #else /* K&R C */ extern bool_t xdr_ecs_Family(); extern bool_t xdr_ecs_Region(); extern bool_t xdr_ecs_Resampling(); extern bool_t xdr_ecs_Transformation(); extern bool_t xdr_ecs_RasterConversion(); extern bool_t xdr_ecs_Coordinate(); extern bool_t xdr_ecs_FeatureRing(); extern bool_t xdr_ecs_Area(); extern bool_t xdr_ecs_Line(); extern bool_t xdr_ecs_Point(); extern bool_t xdr_ecs_Matrix(); extern bool_t xdr_ecs_Image(); extern bool_t xdr_ecs_Text(); extern bool_t xdr_ecs_Node(); extern bool_t xdr_ecs_Edge(); extern bool_t xdr_ecs_TopoLevel(); extern bool_t xdr_ecs_Face(); extern bool_t xdr_ecs_AreaPrim(); extern bool_t xdr_ecs_Geometry(); extern bool_t xdr_ecs_Object(); extern bool_t xdr_ecs_AttributeFormat(); extern bool_t xdr_ecs_ObjAttribute(); extern bool_t xdr_ecs_ObjAttributeFormat(); extern bool_t xdr_ecs_Category(); extern bool_t xdr_ecs_RasterInfo(); extern bool_t xdr_ecs_Compression(); extern bool_t xdr_ecs_ResultType(); extern bool_t xdr_ecs_ResultUnion(); extern bool_t xdr_ecs_Result(); extern bool_t xdr_ecs_LayerSelection(); extern bool_t xdr_ecs_ProxyCreateServer(); #endif /* K&R C */ #ifdef __cplusplus } #endif #endif /* !_ECS.H_H_RPCGEN */ ogdi-ogdi_4_1_0/ogdi/include/ecs.x000066400000000000000000000222611345660466700171360ustar00rootroot00000000000000#ifdef RPC_HDR %/* % * fichier genere par RPCGEN a partir de ecs.x % * % * Declaration des structures & prototypes de l'extension client/serveur. % * Ce fichier est recu par rpcgen et ce dernier generera 4 fichiers pour % * pour l'extension client/serveur. Le "header" suivant doit ce retrouver % * dans tout les fichiers % */ % % % /* Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc*/ % /* Permission to use, copy, modify and distribute this software and */ % /* its documentation for any purpose and without fee is hereby granted, */ % /* provided that the above copyright notice appear in all copies, that */ % /* both the copyright notice and this permission notice appear in */ % /* supporting documentation, and that the name of L.A.S. Inc not be used */ % /* in advertising or publicity pertaining to distribution of the software */ % /* without specific, written prior permission. L.A.S. Inc. makes no */ % /* representations about the suitability of this software for any purpose.*/ % /* It is provided "as is" without express or implied warranty. */ % %extern u_int ecs_compression_type; %extern u_int ecs_compression_version; %extern u_int ecs_compression_blksize; %extern u_int ecs_compression_level; %extern u_int ecs_compression_fullsize; % #endif #ifdef RPC_SVC %#define main dummy %#define RPC_SVC_FG % %extern ecs_Server *svr_handle; % %void start_closedown_check(void) %{ % extern int _rpcpmstart; % static void closedown(int sig); % % _rpcpmstart = 1; % (void) signal(SIGALRM, (SIG_PF) closedown); % (void) alarm(_RPCSVC_CLOSEDOWN); %} % #endif const ECS_SUCCESS = 0; const ECS_FAILURE = 1; const ECS_RASTERSIZE = 1000; const ECS_MTEXT = 1024; const ECS_TRANSIENT_MIN = 1073741824; const ECS_TRANSIENT_MAX = 1610612735; const ECS_COMPRESS_NONE = 0; const ECS_COMPRESS_ZLIB = 1; const ECS_ZLIB_VERSION = 0; const ECS_ZLIB_LEVEL_DEFAULT = 1; const ECS_ZLIB_BLKSIZE_DEFAULT = 512; const ECS_ZLIB_BLKSIZE_MAX = 131072; const ECS_CACHE_DEFAULT = 25; const ECS_CACHE_MIN = 1; const ECS_CACHE_MAX = 10000; enum ecs_Family { Area = 1, Line = 2, Point = 3, Matrix = 4, Image = 5, Text = 6, Edge = 7, Face = 8, Node = 9, Ring =10 }; /* * Structure contenant la description d'une region geographique. */ struct ecs_Region { double north; double south; double east; double west; double ns_res; double ew_res; }; /* * Structure contenant les informations relatif a la conversion * de projection de raster */ enum ecs_Resampling { nn = 1 }; enum ecs_Transformation { projective = 1, affine = 2, similarity = 3 }; struct ecs_RasterConversion { double coef<>; ecs_Resampling r_method; ecs_Transformation t_method; }; /* * Description d'une coordonnee geographique. */ struct ecs_Coordinate { double x; double y; }; /* * Description d'un objet geographique de type Area. */ struct ecs_FeatureRing { ecs_Coordinate centroid; ecs_Coordinate c<>; }; struct ecs_Area { ecs_FeatureRing ring<>; }; /* * Description d'un objet geographique de type Line. */ struct ecs_Line { ecs_Coordinate c<>; }; /* * Description d'un objet geographique de type Point. */ struct ecs_Point { ecs_Coordinate c; }; /* * Description d'un objet geographique de type Matrix. */ struct ecs_Matrix { unsigned int x<>; }; /* * Description d'un objet geographique de type Image. */ struct ecs_Image { unsigned int x<>; }; /* * Description d'un objet geographique de type Text. */ struct ecs_Text { string desc<>; ecs_Coordinate c; }; /* * Description de la primitive NODE */ struct ecs_Node { int id; int containfaceid; ecs_Coordinate c; }; /* * Description de la primitive EDGE */ struct ecs_Edge { int id; int startnodeid; int endnodeid; int rightfaceid; int leftfaceid; int rightfedgeid; int leftfedgeid; ecs_Coordinate c<>; }; /* * Description de la primitive RING. Si topology level 0,1 ou 2 une liste de "edges" * si topology level 3 une face (ecs_Face) avec une liste de "edges" */ enum ecs_TopoLevel { Level012 = 1, Level3 = 2 }; /* * Descrition de la primitive FACE */ struct ecs_Face { int id; int edgeid<>; }; union ecs_AreaPrim switch (ecs_TopoLevel level) { case Level012 : int edgeid<>; case Level3 : ecs_Face fedgeid<>; default : void; }; /* * Description de la geometrie d'un object ecs */ union ecs_Geometry switch (ecs_Family family) { case Area: ecs_Area area; case Line: ecs_Line line; case Point: ecs_Point point; case Matrix: ecs_Matrix matrix; case Image: ecs_Image image; case Text: ecs_Text text; case Node: ecs_Node node; case Edge: ecs_Edge edge; case Ring: ecs_AreaPrim ring; default : void; }; struct ecs_Object { string Id<>; ecs_Geometry geom; string attr<>; double xmin; /* "bounding box" de l'objet */ double ymin; double xmax; double ymax; }; /* * Format des types disponible dans SQL */ enum ecs_AttributeFormat { Char = 1, Varchar = 2, Longvarchar = 3, Decimal = 4, Numeric = 5, Smallint = 6, Integer = 7, Real = 8, Float = 9, Double = 10 }; /* * Description d'un type d'attribut. */ struct ecs_ObjAttribute { string name<>; ecs_AttributeFormat type; int lenght; int precision; int nullable; }; struct ecs_ObjAttributeFormat { ecs_ObjAttribute oa<>; }; struct ecs_Category { long no_cat; unsigned int r; unsigned int g; unsigned int b; string label<>; unsigned long qty; /* nbre de cellules ayant cette categorie dans la matrice */ }; struct ecs_RasterInfo { long mincat; long maxcat; int width; int height; ecs_Category cat<>; }; /* * Structure for compression parameters */ struct ecs_Compression { unsigned int cachesize; /* Number of items to get with getnextobject */ unsigned int ctype; /* Compression type i.e. ECS_COMPRESS_ZLIB */ unsigned int cversion; /* Which version of this compression */ unsigned int clevel; /* How agressively to compress min 1 - 9 max */ unsigned int cblksize; /* Number of bytes to compress at a time */ unsigned int cfullsize; /* Used by server */ }; /* * Description du resultat retourne par ECS */ enum ecs_ResultType { SimpleError = 0, Object = 1, GeoRegion = 2, objAttributeFormat = 3, RasterInfo = 4, AText = 5, MultiResult = 6 }; union ecs_ResultUnion switch(ecs_ResultType type) { case Object: ecs_Object dob; case GeoRegion: ecs_Region gr; case objAttributeFormat: ecs_ObjAttributeFormat oaf; case RasterInfo: ecs_RasterInfo ri; case AText : string s<>; case MultiResult : ecs_ResultUnion results<>; default : void; }; struct ecs_Result { ecs_Compression compression; int error; string message<>; ecs_ResultUnion res; }; /* * Structure pour le parametre compose de SELECTLAYER */ struct ecs_LayerSelection { string Select<>; ecs_Family F; }; /* * Structure for proxy server connect */ struct ecs_ProxyCreateServer { string server_name<>; string server_url<>; }; #ifdef RPC_HDR % %#include /* Outils pour l'aide a ecs */ % #endif #if (!defined(RPC_SVC) && !defined(RPC_CLNT)) || \ ((defined(RPC_SVC) || defined(RPC_CLNT)) && !defined(PROXY)) /* Definition des programmes */ program ECSPROG { version ECSVERS { ecs_Result CREATESERVER(string) = 1; ecs_Result DESTROYSERVER(void) = 2; ecs_Result SELECTLAYER(ecs_LayerSelection) = 3; ecs_Result RELEASELAYER(ecs_LayerSelection) = 4; ecs_Result SELECTREGION(ecs_Region) = 5; ecs_Result GETDICTIONNARY(void) = 6; ecs_Result GETATTRIBUTEFORMAT(void) = 7; ecs_Result GETNEXTOBJECT(void) = 8; ecs_Result GETRASTERINFO(void) = 9; ecs_Result GETOBJECT(string) = 10; ecs_Result GETOBJECTIDFROMCOORD(ecs_Coordinate) = 11; ecs_Result UPDATEDICTIONARY(string) = 12; ecs_Result GETSERVERPROJECTION(void) = 13; ecs_Result GETGLOBALBOUND(void) = 14; ecs_Result SETSERVERLANGUAGE(unsigned int) = 15; ecs_Result SETRASTERCONVERSION(ecs_RasterConversion) = 17; ecs_Result CREATEPROXYSERVER(ecs_ProxyCreateServer) = 100; ecs_Result SETCOMPRESSION(ecs_Compression) = 101; } = 1; } = 0x20000001; #endif #if (!defined(RPC_SVC) && !defined(RPC_CLNT)) || \ ((defined(RPC_SVC) || defined(RPC_CLNT)) && defined(PROXY)) program ECSPROXYPROG { version ECSPROXYVERS { ecs_Result PROXY_CREATEREMOTESERVER(string) = 1; ecs_Result PROXY_DESTROYSERVER(void) = 2; ecs_Result PROXY_SELECTLAYER(ecs_LayerSelection) = 3; ecs_Result PROXY_RELEASELAYER(ecs_LayerSelection) = 4; ecs_Result PROXY_SELECTREGION(ecs_Region) = 5; ecs_Result PROXY_GETDICTIONNARY(void) = 6; ecs_Result PROXY_GETATTRIBUTEFORMAT(void) = 7; ecs_Result PROXY_GETNEXTOBJECT(void) = 8; ecs_Result PROXY_GETRASTERINFO(void) = 9; ecs_Result PROXY_GETOBJECT(string) = 10; ecs_Result PROXY_GETOBJECTIDFROMCOORD(ecs_Coordinate) = 11; ecs_Result PROXY_UPDATEDICTIONARY(string) = 12; ecs_Result PROXY_GETSERVERPROJECTION(void) = 13; ecs_Result PROXY_GETGLOBALBOUND(void) = 14; ecs_Result PROXY_SETSERVERLANGUAGE(unsigned int) = 15; ecs_Result PROXY_SETRASTERCONVERSION(ecs_RasterConversion) = 17; ecs_Result PROXY_CREATESERVER(ecs_ProxyCreateServer) = 100; ecs_Result PROXY_SETCOMPRESSION(ecs_Compression) = 101; } = 1; } = 0x20000002; #endif ogdi-ogdi_4_1_0/ogdi/include/ecs_util.h000066400000000000000000001425441345660466700201620ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Core C API * Purpose: Include file for all the OGDI (included by ecs.h). * Contains most macros, and function prototypes, and structures * that aren't transmitted over RPC (the rest are in ecs.h). * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.30 2016-07-11 09:13:29 erouault * Really fix Windows compilation issue due to int32/uint32 * * Revision 1.29 2016/07/08 10:22:55 erouault * Fix various compilation problems on Windows (contributed by Jerome Siot) * * Revision 1.28 2016/07/05 13:28:46 erouault * ecs_util.h: update to 20160705 so that we have a way to know if ecs_SetReportErrorFunction() is available * * Revision 1.27 2016/07/04 17:33:49 erouault * Also export ecs_ShouldStopOnError and ecs_SetErrorShouldStop on Windows * * Revision 1.26 2016/07/04 17:03:12 erouault * Error handling: Add a ecs_SetErrorShouldStop() function that can be * used internally when the code is able to recover from an error. The user * may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO * as environment variable (the default being YES: stop on error). * Add a ecs_SetReportErrorFunction() method to install a custom callback that * will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still * aware of errors that occured. If not defined, the error will be logged in stderr. * * Revision 1.25 2016/06/27 20:23:20 erouault * Fix compiler warnings raised by GCC 4.4 * * Revision 1.24 2008/05/28 01:47:03 cbalint * * prepare 3.2.0.beta2 * * Revision 1.23 2007/05/09 21:41:24 cbalint * 3.2.0beta2 release * * Revision 1.22 2007/02/24 17:12:33 cbalint * 3.2.0beta1 pre-release * Modified Files: * ChangeLog HOWTO-RELEASE NEWS configure configure.in * mkogdidist.sh ogdi/include/ecs_util.h * * Revision 1.21 2007/02/13 20:24:28 cbalint * fix 64bit platforms. * * Revision 1.20 2007/02/13 02:11:18 cbalint * 3.1.6 release. * * Revision 1.19 2005/03/01 00:49:27 warmerda * Updated to 3.1.5. * * Revision 1.18 2004/10/26 20:45:52 warmerda * Uupdated to 3.1.4. * * Revision 1.17 2004/10/04 15:53:12 warmerda * Updated to version 3.1.3. * * Revision 1.16 2003/12/15 18:11:21 warmerda * Updated version to 3.1.2. * * Revision 1.15 2003/01/29 15:46:45 warmerda * fixed spelling of length * * Revision 1.14 2002/12/18 14:31:47 warmerda * provide more precision for PI and use M_PI if available * * Revision 1.13 2002/03/28 16:09:07 warmerda * updated version/release info * * Revision 1.12 2001/09/28 18:56:20 warmerda * added OGDI_VERSION and OGDI_RELEASEDATE * * Revision 1.11 2001/07/18 03:55:09 warmerda * Fixed case where DISABLE_CVSID is defined. * * Revision 1.10 2001/06/22 16:28:24 warmerda * fixed typo in ECS_SETGEOMIMAGEVALUE * * Revision 1.9 2001/04/12 19:25:39 warmerda * added RGB<->Pixel functions * * Revision 1.8 2001/04/12 18:15:25 warmerda * added/finished capabilities support * * Revision 1.7 2001/04/12 05:29:47 warmerda * added ecs_LayerCapabilities structure, and additions to ecs_Client * * Revision 1.6 2001/04/09 15:04:35 warmerda * applied new source headers * */ #ifndef ECS_UTIL #define ECS_UTIL 1 #define OGDI_VERSION 410 #define OGDI_RELEASEDATE 20190420 #include #include #include #include #include #include #include #ifdef _WINDOWS #include #include #else #include #endif #include #include #include "ecs.h" #ifdef _SCO #include #endif #ifdef _WINDOWS #include #define alarm(a) printf("") #endif #ifndef __INT32DEF__ #define __INT32DEF__ #ifdef _MSC_VER typedef signed int int32; typedef unsigned int uint32; #elif defined(_ALPHA) typedef int32_t int32; typedef uint32_t uint32; #else typedef int32_t int32; typedef uint32_t uint32; #endif #endif /***********************************************************************/ /* Global definitions */ #undef _ANSI_ARGS_ #undef CONST #if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) # define _USING_PROTOTYPES_ 1 # define _ANSI_ARGS_(x) x # define CONST const # ifdef __cplusplus # define VARARGS(first) (first, ...) # else # define VARARGS(first) () # endif #else # define _ANSI_ARGS_(x) () # define CONST #endif #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif /* * Macro to use instead of "void" for arguments that must have * type "void *" in ANSI C; maps them to type "char *" in * non-ANSI systems. */ #ifndef VOID # ifdef __STDC__ # define VOID void # else # define VOID char # endif #endif /* * Miscellaneous declarations (to allow Tcl to be used stand-alone, * without the rest of Sprite). */ #ifndef NULL #define NULL 0 #endif #define ECSTOLERANCE 0.05 #define PROJ_UNKNOWN "unknown" #define PROJ_LONGLAT "+proj=longlat" #define ECSGETJ(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[0]*j1 + s->rasterconversion.coef.coef_val[1]*i1 + s->rasterconversion.coef.coef_val[6]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5) #define ECSGETI(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[2]*j1 + s->rasterconversion.coef.coef_val[3]*i1 + s->rasterconversion.coef.coef_val[7]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5) #ifndef PI # ifdef M_PI # define PI M_PI # else # define PI 3.1415926535897932384626433832795029 # endif #endif /*********************************************************************** * Define ECS_CVSID() macro. It can be disabled during a build by * defining DISABLE_CVSID in the compiler options. * * The cvsid_aw() function is just there to prevent reports of ecs_cvsid() * being unused. */ #ifndef DISABLE_CVSID #if defined(__GNUC__) && __GNUC__ >= 4 # define ECS_CVSID(string) static const char ecs_cvsid[] __attribute__((used)) = string; #else # define ECS_CVSID(string) static char ecs_cvsid[] = string; \ static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : ecs_cvsid ); } #endif #else # define ECS_CVSID(string) #endif /***********************************************************************/ /* defines for defaults file */ #define MAX_DEF_LINE_LENGTH 1024 #define DEFAULTS_INDEX_FILE "ogdidef.idx" /***********************************************************************/ /* server.c declarations */ #define OGDIID -1 #define OGDICAT -2 #define OGDIDESC -3 #define OGDILAYERINC 32 typedef ecs_Result *dynfunc(); typedef int attrfunc(); /********************************************************************* STRUCTURE_INFORMATION NAME ecs_AttributeLink DESCRIPTION Description of a possible link between a geographic layer and a attribute driver END_DESCRIPTION ATTRIBUTES char *url: URL of the geographic layer char *layer: Geographic layer selection string ecs_Family family: Family of the geographic objects selected by this layer char *DriverType: The kind of attribute driver to be link char *InformationSource: Information source of the link char *UserDescription: User description char *AutorizationDescription: Autorization description char *SelectionRequest: The request to construct the link. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { char *url; char *layer; ecs_Family family; char *DriverType; char *InformationSource; char *UserDescription; char *AutorizationDescription; char *SelectionRequest; } ecs_AttributeLink; /********************************************************************* STRUCTURE_INFORMATION NAME ecs_Layer DESCRIPTION Contain all the layer selection information. END_DESCRIPTION ATTRIBUTES ecs_LayerSelection sel: Layer Selection Information int index: For GetNextObject, the current object extracted int nbfeature: The number of features in a layer. Optionnal. void *priv: The private geographic information of the geographic driver for a geographic layer. ecs_AttributeLink *AttributeDriverLinkPtr: The item in the list of possible odbc link that's in use. If null, no ODBC link void *attribute_priv: The private geographic information of the geographic driver. attrfunc *InitializeDBLinkFuncPtr: The pointer to the function dyn_InitializeDBLink in the attribute driver attrfunc *DeinitializeDBLinkFuncPtr: The pointer to the function dyn_DeinitializeDBLink in the attribute driver attrfunc *GetColumnsInfoFuncPtr: The pointer to the function dyn_GetColumnsInfo in the attribute driver attrfunc *SelectAttributes: The pointer to the function dyn_SelectAttributes in the attribute driver attrfunc *IsSelectedFuncPtr: The pointer to the function dyn_IsSelected in the attribute driver attrfunc *GetSelectedAttributesFuncPtr: The pointer to the function GetSelectedAttributes in the attribute driver void *AttributeDriverHandle: The dynamic library handle for the attribute driver int SelectionAttributeListQty: The quantity of elements in the SelectionAttributeList int *SelectionAttributeList: The list of positions of the objects attributes in use in the IsValueIsSelected of the attribute driver char *AttrRequest: The attribute request with the "?code?" replaced with "?" END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { ecs_LayerSelection sel; int index; int nbfeature; void *priv; ecs_AttributeLink *AttributeDriverLinkPtr; void *attribute_priv; attrfunc *InitializeDBLinkFuncPtr; attrfunc *DeinitializeDBLinkFuncPtr; attrfunc *GetColumnsInfoFuncPtr; attrfunc *SelectAttributesFuncPtr; attrfunc *IsSelectedFuncPtr; attrfunc *GetSelectedAttributesFuncPtr; void *AttributeDriverHandle; int SelectionAttributeListQty; int *SelectionAttributeList; char *AttrRequest; } ecs_Layer; /********************************************************************* STRUCTURE_INFORMATION NAME ecs_Server DESCRIPTION Contain all the geographic driver information END_DESCRIPTION ATTRIBUTES void *priv: The private geographic information of the geographic driver ecs_Layer *layer: The table of the layer in use in the driver int nblayer: Quantity of layer in layer. int layer_tablesize: The table size of the layer table int currentLayer: The current layer in use in the driver void *handle: The dynamic library handle of the geographic driver ecs_Region currentRegion: The current region of the geographic driver ecs_Region globalRegion: The global region of the geographic driver char *projection: The projection string of the contain of the geographic driver char *hostname: The hostname extracted from the URL char *server_type: The server type extracted from the URL char *pathname: The path name extracted from the URL int isRemote: Indicate if the server is a remote server or not ecs_RasterConversion rasterconversion: Used to convert rasters in the driver ecs_Result result: Returned structure to the client int AttributeListQty: Quantity of links in AttributeList ecs_AttributeList *AttributeList: The list of attribute links available dynfunc *createserver: Pointer to the function dyn_CreateServer dynfunc *destroyserver: Pointer to the function dyn_DestroyServer dynfunc *selectlayer: Pointer to the function dyn_SelectLayer dynfunc *releaselayer: Pointer to the function dyn_ReleaseLayer dynfunc *closelayer: Pointer to the function dyn_ReleaseLayer dynfunc *selectregion: Pointer to the function dyn_SelectRegion dynfunc *getdictionary: Pointer to the function dyn_GetDictionary dynfunc *getattrformat: Pointer to the function dyn_GetAttributesFormat dynfunc *getnextobject: Pointer to the function dyn_GetNextObject dynfunc *getrasterinfo: Pointer to the function dyn_GetRasterInfo dynfunc *getobject: Pointer to the function dyn_GetObject dynfunc *getobjectid: Pointer to the function dyn_GetObjectIdFromCoord dynfunc *updatedictionary: Pointer to the function dyn_UpdateDictionary dynfunc *getserverprojection: Pointer to the function dyn_GetServerProjection dynfunc *getglobalbound: Pointer to the function dyn_GetGlobalBound dynfunc *setserverlanguage: Pointer to the function dyn_SetServerLanguage dynfunc *setrasterconversion: Pointer to the function dyn_SetRasterConversion END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { /* Specific information for dynamic part of the server */ void *priv; ecs_Layer *layer; int nblayer; int currentLayer; int layer_tablesize; /* dynamic library handle */ void *handle; /* Regions of the server */ ecs_Region currentRegion; ecs_Region globalRegion; /* Server projection */ char *projection; /* Extracted information from URL */ char *url; char *hostname; char *server_type; char *pathname; /* Indicate if the server is a remote server or not */ int isRemote; /* Indicate if the client is local or not */ int localClient; /* RasterConversion structure */ ecs_RasterConversion rasterconversion; /* Structure returned to client */ ecs_Result result; /* Compression parameters */ ecs_Compression compression; /* pointers to functions */ dynfunc *createserver; dynfunc *destroyserver; dynfunc *selectlayer; dynfunc *releaselayer; dynfunc *closelayer; dynfunc *selectregion; dynfunc *getdictionary; dynfunc *getattrformat; dynfunc *getnextobject; dynfunc *getrasterinfo; dynfunc *getobject; dynfunc *getobjectid; dynfunc *updatedictionary; dynfunc *getserverprojection; dynfunc *getglobalbound; dynfunc *setserverlanguage; dynfunc *setrasterconversion; dynfunc *setcompression; int AttributeListQty; ecs_AttributeLink *AttributeList; } ecs_Server; ecs_Result *svr_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request, int isLocal)); ecs_Result *svr_DestroyServer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *svr_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); void svr_BroadCloseLayers _ANSI_ARGS_((ecs_Server *s)); void svr_CloseLayer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr)); ecs_Result *svr_GetDictionary _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetNextObject _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetRasterInfo _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id)); ecs_Result *svr_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord)); ecs_Result *svr_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info)); ecs_Result *svr_GetServerProjection _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetGlobalBound _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language)); ecs_Result *svr_SetCompression _ANSI_ARGS_((ecs_Server *s, ecs_Compression *compression)); ecs_Result *svr_SetRasterConversion _ANSI_ARGS_((ecs_Server *s, ecs_RasterConversion *rc)); /* These functions will be called by dynamic servers */ int ecs_SetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel)); int ecs_GetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel)); void ecs_FreeLayer _ANSI_ARGS_((ecs_Server *s, int layer)); int ecs_RemoveDir _ANSI_ARGS_((char *path)); /* These functions are internally used in server.c */ int ecs_GetLateralDBConnectionCtrlFile _ANSI_ARGS_((ecs_Server *s)); int ecs_SetAttributeLinkWithRequest _ANSI_ARGS_((ecs_Server *s, char *request, ecs_Family family)); int ecs_RemoveAttributeLinkWithRequest _ANSI_ARGS_((ecs_Server *s, char *request, ecs_Family family)); int ecs_SetAttributeQuery _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error)); int ecs_ReleaseAttributeQuery _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error)); int ecs_UnstackRequest _ANSI_ARGS_((ecs_Server *s, char **request)); int AddAttributeLink _ANSI_ARGS_((ecs_Server *s, char *url, char *layer, char *family, char *drivertype, char *infosource, char *userdesc, char *autorization, char *request)); int ecs_SetBindListForVector _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, ecs_Result *msg, char ***BindList, char **error)); int ecs_SetBindListForMatrix _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,ecs_Category *ptr,char ***BindList,char **error)); int ecs_AddAttributeLink _ANSI_ARGS_((ecs_Server *s,char *url,char *layer,ecs_Family family,char *drivertype,char *infosource, char *userdesc,char *autorization,char *request)); int ecs_ExtractRequestInformation _ANSI_ARGS_((char *request,char **ExtractRequest,char **DriverType,char **InformationSource, char **UserDescription,char **AutorizationDescription, char **SelectionRequest)); /***********************************************************************/ /* ecs_dyna.c declarations */ void *ecs_OpenDynamicLib _ANSI_ARGS_((char *libname)); void *ecs_GetDynamicLibFunction _ANSI_ARGS_((void *handle,char *functionname)); void ecs_CloseDynamicLib _ANSI_ARGS_((void *handle)); /***********************************************************************/ /* ecsdist.c declarations */ double ecs_DistanceObject _ANSI_ARGS_((ecs_Object *obj, double X, double Y)); double ecs_DistanceObjectWithTolerance _ANSI_ARGS_((ecs_Object *obj, double X, double Y)); double ecs_SetTolerance _ANSI_ARGS_((ecs_Region *reg)); double ecs_DistanceMBR _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy)); double ecs_DistanceSegment _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy)); int ecs_IsPointInPolygon _ANSI_ARGS_((int npoints, ecs_Coordinate *poly,double x,double y)); /***********************************************************************/ /* ecsinfo.c declaration */ int ecs_GetDefaultInfo _ANSI_ARGS_((char* url, char* key, char** result)); /***********************************************************************/ /* ecsassoc.c declarations */ /* WARNING: These define do more than one operation. Please, don't consider these as functions. */ /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro indicate the object type of ecs_Result ---------------------------------------------------------------- */ #define ECSRESULTTYPE(result) ((result)->res.type) /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro access the union in ecs_Result and facilitate ecs_Result structures access. ---------------------------------------------------------------- */ #define ECSRESULT(result) ((result)->res.ecs_ResultUnion_u) /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro indicate the geographical object type contain in ecs_Result ---------------------------------------------------------------- */ #define ECSGEOMTYPE(result) ((result)->res.ecs_ResultUnion_u.dob.geom.family) /* ---------------------------------------------------------------- ECSGEOM: This macro access the union contain in the geographical object in ecs_Result. ---------------------------------------------------------------- */ #define ECSGEOM(result) ((result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u) /* ---------------------------------------------------------------- ECSAREARING: This macro access the area ring in the geographic object of type Area ---------------------------------------------------------------- */ #define ECSAREARING(result,pos) ((result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[(pos)]) /* ---------------------------------------------------------------- ECSERROR: Indicate if ecs_Result contain an error code ---------------------------------------------------------------- */ #define ECSERROR(r) ((r)->error != 0) /* ---------------------------------------------------------------- ECSSUCCESS: Indicate if ecs_Result contain an success code ---------------------------------------------------------------- */ #define ECSSUCCESS(r) ((r)->error == 0) /* ---------------------------------------------------------------- ECSEOF: Indicate if ecs_Result contain EOF message. Mainly use in cln_GetNextObject function. ---------------------------------------------------------------- */ #define ECSEOF(r) ((r)->error == 2) /* ---------------------------------------------------------------- ECSPROJ: Indicate if ecs_Result contain PROJ error message. Mainly use in cln_GetNextObject function. ---------------------------------------------------------------- */ #define ECSPROJ(r) ((r)->error == 3) /* ---------------------------------------------------------------- ECSMESSAGE: Return the error message contain in ecs_Result (an string). ---------------------------------------------------------------- */ #define ECSMESSAGE(r) ((r)->message) /* ---------------------------------------------------------------- ECSREGION: Return the geographical region contain in ecs_Result (if it's the case). The structure returned is a ecs_Region. ---------------------------------------------------------------- */ #define ECSREGION(r) (ECSRESULT(r).gr) /* ---------------------------------------------------------------- ECSTEXT: Return the text string contain in ecs_Result (if it's the case). The structure returned is a string. ---------------------------------------------------------------- */ #define ECSTEXT(r) (ECSRESULT(r).s) /* ---------------------------------------------------------------- ECSRASTERINFO: Return the raster information contain in ecs_Result (if it's the case). The structure return is a ecs_RasterInfo. ---------------------------------------------------------------- */ #define ECSRASTERINFO(r) (ECSRESULT(r).ri) /* ---------------------------------------------------------------- ECSRASTERINFONB: Return the number of categories in the ecs_RasterInfo structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSRASTERINFONB(r) (ECSRASTERINFO(r).cat.cat_len) /* ---------------------------------------------------------------- ECSRASTERINFOCAT: Return the category number "c" contain in ecs_RasterInfo in ecs_Result. The structure returned is a ecs_Category. ---------------------------------------------------------------- */ #define ECSRASTERINFOCAT(r,c) (ECSRASTERINFO(r).cat.cat_val[(c)]) /* ---------------------------------------------------------------- ECSOBJECT: Return the geographic object contain in ecs_Result (if it's the case). The structure return is a ecs_Object. ---------------------------------------------------------------- */ #define ECSOBJECT(r) (ECSRESULT(r).dob) /* ---------------------------------------------------------------- ECSOBJECTID: Return the "Id" attribute contain the ecs_Object structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSOBJECTID(r) (ECSOBJECT(r).Id) /* ---------------------------------------------------------------- ECSOBJECTATTR: Return the "attr" attribute contain the ecs_Object structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSOBJECTATTR(r) (ECSOBJECT(r).attr) /* ---------------------------------------------------------------- ECSRASTER: Return the raster line table contain in ecs_Object. ---------------------------------------------------------------- */ #define ECSRASTER(r) (ECSOBJECT(r).geom.ecs_Geometry_u.matrix.x.x_val) /* ---------------------------------------------------------------- ECS_SETGEOMBOUNDINGBOX: This macro will put in the geographical object contain in "result" the bounding rectangle (lxmin, lymin, lxmax, lymax). ---------------------------------------------------------------- */ #define ECS_SETGEOMBOUNDINGBOX(result,lxmin,lymin,lxmax,lymax) { \ {if ((result)->res.type==Object) { \ (result)->res.ecs_ResultUnion_u.dob.xmin=(lxmin); \ (result)->res.ecs_ResultUnion_u.dob.ymin=(lymin); \ (result)->res.ecs_ResultUnion_u.dob.xmax=(lxmax); \ (result)->res.ecs_ResultUnion_u.dob.ymax=(lymax); \ }} \ } /* ---------------------------------------------------------------- ECSGEOMLINECOORD: This macro put a point (lx,ly) at the position "position" in a line geographical object. To entirely set the line object, ecs_SetGeomLine must be call first and for each point, ECS_SETGEOMLINECOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMLINECOORD(result,position,lx,ly) \ { \ (result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].x = (lx); \ (result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].y = (ly); \ } /* ---------------------------------------------------------------- ECSGEOMAREACOORD: This macro put a point (lx,ly) at the position "position" of the ring "ringpos" in a area geographical object. To entirely set the area object, ecs_SetGeomArea must be call first and for each ring, ecs_SetGeomAreaRing must be call. In each of this ring, ECS_SETGEOMAREACOORD must be call define the polygons points. ---------------------------------------------------------------- */ #define ECS_SETGEOMAREACOORD(result,ringpos,position,lx,ly) \ { \ (result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].x = lx; \ (result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].y = ly; \ } /* ---------------------------------------------------------------- ECSGEOMMATRIXCOORD: This macro put a value at the position "position" in a matrix geographical object. To entirely set the matrix object, ecs_SetGeomMatrix must be call first and for each column, ECS_SETGEOMMATRIXCOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMMATRIXVALUE(result,lpos,lval) \ {(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix.x.x_val[lpos] = (lval);} /* ---------------------------------------------------------------- ECSGEOMIMAGECOORD: This macro put a value at the position "position" in a image geographical object. To entirely set the image object, ecs_SetGeomImage must be call first and for each column, ECS_SETGEOMIMAGECOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMIMAGEVALUE(result,lpos,lval) \ {(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.image.x.x_val[lpos] = (lval);} /********************************/ int ecs_SetError _ANSI_ARGS_((ecs_Result *r, int errorcode, char *error_message)); /* Shoud return TRUE if processing must go on */ typedef int (*ReportErrorType)(int errorcode, const char *error_message); ReportErrorType ecs_SetReportErrorFunction(ReportErrorType pfn); int ecs_ShouldStopOnError(void); int ecs_SetErrorShouldStop _ANSI_ARGS_((ecs_Result *r, int errorcode, char *error_message)); int ecs_SetSuccess _ANSI_ARGS_((ecs_Result *r)); int ecs_AdjustResult _ANSI_ARGS_((ecs_Result *r)); int ecs_SetGeoRegion _ANSI_ARGS_((ecs_Result *r, double north, double south, double east, double west, double nsres, double ewres)); int ecs_SetText _ANSI_ARGS_((ecs_Result *r,char *text)); int ecs_AddText _ANSI_ARGS_((ecs_Result *r,char *text)); int ecs_SetRasterInfo _ANSI_ARGS_((ecs_Result *r, int width, int height)); int ecs_AddRasterInfoCategory _ANSI_ARGS_((ecs_Result *r, long no_cat, unsigned int red, unsigned int green, unsigned int blue, char *label, unsigned long qty)); int ecs_SetObjAttributeFormat _ANSI_ARGS_((ecs_Result *r)); int ecs_AddAttributeFormat _ANSI_ARGS_((ecs_Result *r, char *name, ecs_AttributeFormat type, int length, int precision, int nullable)); int ecs_SetGeomPoint _ANSI_ARGS_((ecs_Result *r, double x, double y)); int ecs_SetGeomText _ANSI_ARGS_((ecs_Result *r, double x, double y, char *desc)); int ecs_SetGeomLine _ANSI_ARGS_((ecs_Result *r, unsigned int length)); int ecs_SetGeomArea _ANSI_ARGS_((ecs_Result *r, unsigned int length)); int ecs_SetGeomAreaRing _ANSI_ARGS_((ecs_Result *r, int position, unsigned int length, double centroid_x, double centroid_y)); int ecs_SetGeomMatrix _ANSI_ARGS_((ecs_Result *r, int size)); int ecs_SetGeomMatrixWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array)); int ecs_SetGeomImage _ANSI_ARGS_((ecs_Result *r, int size)); int ecs_SetGeomImageWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array)); int ecs_SetObjectId _ANSI_ARGS_((ecs_Result *r,char *id)); int ecs_SetObjectAttr _ANSI_ARGS_((ecs_Result *r,char *attr)); int ecs_CleanUp _ANSI_ARGS_((ecs_Result *r)); int ecs_CleanUpObject _ANSI_ARGS_((ecs_Object *r)); int ecs_CleanUpResultUnion _ANSI_ARGS_((ecs_ResultUnion *r)); int ecs_ResultInit _ANSI_ARGS_((ecs_Result *r)); int ecs_CalcObjectMBR _ANSI_ARGS_((ecs_Server *s, ecs_Object *obj)); int ecs_CopyResult _ANSI_ARGS_((ecs_Result *source, ecs_Result **copy)); int ecs_CopyResultFromUnion _ANSI_ARGS_((ecs_ResultUnion *source, ecs_Result **copy)); int ecs_CopyResultUnion _ANSI_ARGS_((ecs_ResultUnion *source, ecs_ResultUnion **copy)); int ecs_CopyResultUnionWork _ANSI_ARGS_((ecs_ResultUnion *source, ecs_ResultUnion *copy)); int ecs_CopyObject _ANSI_ARGS_((ecs_Object *source, ecs_Object *copy)); int ecs_CopyGeometry _ANSI_ARGS_((ecs_Object *source, ecs_Object *copy)); int ecs_CopyArea _ANSI_ARGS_((ecs_Area *source, ecs_Area *copy)); int ecs_CopyLine _ANSI_ARGS_((ecs_Line *source, ecs_Line *copy)); int ecs_CopyPoint _ANSI_ARGS_((ecs_Point *source, ecs_Point *copy)); int ecs_CopyText _ANSI_ARGS_((ecs_Text *source, ecs_Text *copy)); int ecs_CopyMatrix _ANSI_ARGS_((ecs_Matrix *source, ecs_Matrix *copy)); int ecs_CopyImage _ANSI_ARGS_((ecs_Image *source, ecs_Image *copy)); void ecs_FreeObject _ANSI_ARGS_((ecs_Object *obj)); /***********************************************************************/ /* ecs_split.c declarations */ void ecs_freeSplitURL _ANSI_ARGS_((char **type,char **machine,char **path)); int ecs_SplitURL _ANSI_ARGS_((const char *url,char **machine,char **server,char **path)); /***********************************************************************/ /* ecs_list.c declarations */ char ecs_Backslash _ANSI_ARGS_((char *src, int *readPtr)); int ecs_FindElement _ANSI_ARGS_((char *list,char **elementPtr, char **nextPtr, int *sizePtr, int *bracePtr)); void ecs_CopyAndCollapse _ANSI_ARGS_((int count,char *src,char *dst)); int ecs_SplitList _ANSI_ARGS_((char *list,int *argcPtr,char ***argvPtr)); /***********************************************************************/ /* dynamic library server declarations */ ecs_Result *dyn_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request)); ecs_Result *dyn_DestroyServer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *dyn_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *dyn_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr)); ecs_Result *dyn_GetDictionary _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetNextObject _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetRasterInfo _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id)); ecs_Result *dyn_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord)); ecs_Result *dyn_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info)); ecs_Result *dyn_GetServerProjection _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetGlobalBound _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language)); ecs_Result *dyn_SetRasterConversion _ANSI_ARGS_((ecs_Server *s, ecs_RasterConversion *rc)); ecs_Result *dyn_SetCompression _ANSI_ARGS_((ecs_Server *s, ecs_Compression *compression)); /***********************************************************************/ /* dynamic library attribute driver declarations */ int dyn_InitializeDBLink _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error)); int dyn_DeinitializeDBLink _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error)); int dyn_GetColumnsInfo _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, int *columns_qty, ecs_ObjAttribute **attr, char **error)); int dyn_SelectAttributes _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, int attribute_qty, char **attribute_list, char **error)); int dyn_IsSelected _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, short *isSelected, char **error)); int dyn_GetSelectedAttributes _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **attributes, char **error)); /***********************************************************************/ /* * client.h -- * * Control dispatch of locals client. Also control cache management and * projection changes. * * Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc. * Il est strictement interdit de publier ou de devoiler le contenu de ce * programme sans avoir prealablement obtenu la permission de L.A.S. Inc. */ #define CACHEINITSIZE 100 #define COMPARETOLERANCE 0.000000001 /* For projection conversion, tolerance factor during projection compare */ #define ECS_TTOS 0 /* define the conversion direction (target to source) or (source to target) */ #define ECS_STOT 1 typedef struct ecs_CtlPoint { double e1,n1,e2,n2; double errorx,errory; } ecs_CtlPoint; typedef struct ecs_CtlPoints { int nbpts; ecs_CtlPoint *pts; } ecs_CtlPoints; typedef struct ecs_Cache { ecs_LayerSelection coverage; /* coverage descriptor */ int size; /* logical cache size */ int startpos; /* beginning position of cache */ int currentpos; /* current position in cache for getnextobject */ int allocatedSize; /* physical size of cache */ ecs_Result **o; /* the cache itself */ struct ecs_Cache *next; /* linked list successor, NULL if end of list */ struct ecs_Cache *previous; /* linked list predecessor */ } ecs_Cache; /********************************************************************* STRUCTURE_INFORMATION NAME ecs_Datum DESCRIPTION Description of all the possible states of a projection about datum. END_DESCRIPTION END_STRUCTURE_INFORMATION ********************************************************************/ enum ecs_Datum { nodatum = 1, nad27 = 2, nad83 = 3 }; typedef enum ecs_Datum ecs_Datum; typedef int dtfunc(); /********************************************************************* STRUCTURE_INFORMATION NAME ecs_LayerCapabilities DESCRIPTION Information about a layer gleaned from OGDI_Capabilities document. END_DESCRIPTION ATTRIBUTES char *name: The default layer name, as per the element. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ #define MAX_FAMILIES 20 typedef struct { char *name; char *title; char *srs; int families[MAX_FAMILIES]; char **parents; char **extensions; int ll_bounds_set; double ll_north; double ll_south; double ll_east; double ll_west; double srs_north; double srs_south; double srs_east; double srs_west; double srs_nsres; double srs_ewres; int query_expression_set; char *qe_prefix; char *qe_suffix; char *qe_format; char *qe_description; } ecs_LayerCapabilities; /********************************************************************* STRUCTURE_INFORMATION NAME ecs_Client DESCRIPTION Description of the attributes of the c interface object (client.c). END_DESCRIPTION ATTRIBUTES char *url: Client URL, mostly used to see if a client already exist ecs_Cache *cache: linked list of all cached coverage ecs_Cache *selectCache: A pointer to the cache selected by SelectLayer ecs_Region cacheRegion: mbr region of cache ecs_Region currentRegion: mbr of current region ecs_Family currentSelectionFamily: Current layer selection type char *tclprocname: attribute callback procedure for tcl ecs_Datum targetdatum: target datum information ecs_Datum sourcedatum: source datum information void *privdatuminfo: The private datum information pointer. Used to specify the object. char datumtable[10]: Datum table name int isCurrentRegionSet: Indicate if the current region is set double target_azimuth: The azimuth angle to apply to the target projection double sinazimuth: The azimuth sinus double cosazimuth: The azimuth cosinus ecs_Server s: The ecs_Server structure is hold here. ecs_FeatureRing *mask: Polygon mask int isMaskInclusive: Indicate if the mask is inclusive (all the objects are completelly inside) or not. END_ATTRIBUTES END_STRUCTURE_INFORMATION ********************************************************************/ typedef struct { char *url; /* Client URL, mostly used to see if a client already exist */ ecs_Cache *cache; /* linked list of all cached coverage */ ecs_Cache *selectCache; /* A pointer to the cache selected by SelectLayer */ ecs_Cache *autoCache; /* Automatic cache when using with remote servers */ ecs_Region cacheRegion; /* mbr region of cache */ ecs_Region currentRegion; /* mbr of current region */ ecs_Family currentSelectionFamily; /* Current layer selection type */ char *tclprocname; /* attribute callback procedure for tcl */ int isCurrentRegionSet; double target_azimuth; double sinazimuth; double cosazimuth; ecs_Datum targetdatum; ecs_Datum sourcedatum; char datumtable[10]; void *privdatuminfo; ecs_Server s; ecs_FeatureRing *mask; ecs_Region maskregion; int isMaskInclusive; int have_server_capabilities; char server_version_str[32]; int server_version; /* version times 1000, ie. 3100 for 3.1 */ char **global_extensions; int have_capabilities; int layer_cap_count; ecs_LayerCapabilities **layer_cap; } ecs_Client; #define MAXCLIENT 32 /* Functions used for allocation and deallocation. */ void cln_FreeClient _ANSI_ARGS_((ecs_Client **c)); int cln_AllocClient _ANSI_ARGS_((char *URL,int *error)); /* API functions */ ecs_Result *cln_CreateClient _ANSI_ARGS_((int *ClientID,char *url)); ecs_Result *cln_DestroyClient _ANSI_ARGS_((int ClientID)); ecs_Result *cln_SelectLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); ecs_Result *cln_ReleaseLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); void cln_BroadCloseLayers(); ecs_Result *cln_SelectMask _ANSI_ARGS_((int ClientID,ecs_FeatureRing *mask,int isInclusive)); ecs_Result *cln_UnSelectMask _ANSI_ARGS_((int ClientID)); ecs_Result *cln_SelectRegion _ANSI_ARGS_((int ClientID, ecs_Region *gr)); ecs_Result *cln_GetDictionary _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetAttributesFormat _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetNextObject _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetRasterInfo _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetObject _ANSI_ARGS_((int ClientID, char *Id)); ecs_Result *cln_GetObjectIdFromCoord _ANSI_ARGS_((int ClientID, ecs_Coordinate *coord)); ecs_Result *cln_UpdateDictionary _ANSI_ARGS_((int ClientID, char *info)); ecs_Result *cln_GetGlobalBound _ANSI_ARGS_((int ClientID)); ecs_Result *cln_SetServerLanguage _ANSI_ARGS_((int ClientID, u_int language)); ecs_Result *cln_SetCompression _ANSI_ARGS_((int ClientID, ecs_Compression *compression)); ecs_Result *cln_GetServerProjection _ANSI_ARGS_((int ClientID)); void cln_SetTclProc _ANSI_ARGS_((int ClientID, char *tclproc)); char *cln_GetTclProc _ANSI_ARGS_((int ClientID)); /* Projection conversion functions */ int cln_UpdateMaxRegion _ANSI_ARGS_((int ClientID, double x, double y, ecs_Region *gr, int sens, int first)); int cln_PointValid _ANSI_ARGS_((int ClientID, double x, double y)); ecs_Datum cln_GetDatumInfo _ANSI_ARGS_((char *projection)); /* Matrix conversion functions */ int cln_CalcCtlPoint _ANSI_ARGS_((int ClientID, ecs_Region *server_region, int SI, int SJ, ecs_CtlPoint *pt)); int cln_CalcCtlPoints _ANSI_ARGS_((int ClientID, ecs_CtlPoints **pts, char **error_message)); int cln_SetRasterConversion _ANSI_ARGS_((int ClientID, ecs_CtlPoints **pts, ecs_Resampling resampling, ecs_Transformation trans, char **error_message)); /* URL manipulation */ int cln_GetClientIdFromURL _ANSI_ARGS_((char *url)); int cln_GetURLList _ANSI_ARGS_((char **urllist)); /* Cache functions */ int cln_SetRegionCaches _ANSI_ARGS_((int ClientID, ecs_Region *GR, char **error_message)); int cln_LoadCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message)); int cln_ReleaseCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message)); void cln_FreeCache _ANSI_ARGS_((ecs_Cache *cache)); ecs_Cache *cln_NewCache _ANSI_ARGS_((int size)); ecs_Cache *cln_FoundCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); /* The rest */ void cln_BlockOGDI(); void cln_UnBlockOGDI(); int cln_IsGeoObjectInsideMask _ANSI_ARGS_((int ClientID,ecs_Result *obj)); int cln_ConvMBR _ANSI_ARGS_((int ClientID,double *xl,double *yl,double *xu,double *yu,int direction)); /* capabilities */ ecs_Result *cln_GetVersion( int ClientID ); int cln_CheckExtension( int ClientID, const char *extension, const char *layer_name ); const ecs_LayerCapabilities * cln_GetLayerCapabilities( int ClientID, int layer_index ); ecs_Result *cln_LoadCapabilities( int ClientID, const char *arg, int err ); void ecs_ParseCapabilities( ecs_Client *cln, const char *cap_doc, ecs_Result *result ); /***********************************************************************/ /* * ecsgeo -- * * Make geometric calculations * * Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc. * Il est strictement interdit de publier ou de devoiler le contenu de ce * programme sans avoir prealablement obtenu la permission de L.A.S. Inc. */ void ecs_begin_ellipsoid_polygon_area _ANSI_ARGS_((double a, double e2)); double ecs_Q _ANSI_ARGS_((double x)); double ecs_Qbar _ANSI_ARGS_((double x)); double ecs_planimetric_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord)); double ecs_ellipsoid_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord)); double ecs_geodesic_distance _ANSI_ARGS_((double lon1, double lat1, double lon2, double lat2)); int ecs_CalculateCentroid _ANSI_ARGS_((int nb_segment, ecs_Coordinate *coord,ecs_Coordinate *centroid)); /***********************************************************************/ typedef int tile_func(); /* ******************************************************************** STRUCTURE_INFORMATION NAME ecs_TileID DESCRIPTION Identifier for a tile END_DESCRIPTION ATTRIBUTES int x: the horizontal tile number int y: the vertical tile number short none: 0 if invalid tile END_ATTRIBUTES END_STRUCTURE_INFORMATION ******************************************************************** */ typedef struct ecs_TileID { int x; int y; short none; /* 1 if valid, 0 if uninitialized */ } ecs_TileID; /* ******************************************************************** STRUCTURE_INFORMATION NAME ecs_TileBufferLine DESCRIPTION A line in the tile buffer. Stores categories that have been retrieved from the file. END_DESCRIPTION ATTRIBUTES int *linebuffer: ptr to array of values (length is stored in ecs_Tile). int index: the y-matrix position of this line. int last: the last filled point. ecs_TileBufferLinePtr *next: pointer to next line. END_ATTRIBUTES END_STRUCTURE_INFORMATION ******************************************************************** */ typedef struct ecs_TileBufferLine { int *linebuffer; int index; int last; struct ecs_TileBufferLine *next; } ecs_TileBufferLine; /* ******************************************************************** STRUCTURE_INFORMATION NAME ecs_Tile DESCRIPTION structure for storing information about tiling END_DESCRIPTION ATTRIBUTES int x: the number of horizontal tiles int y: the number of vertical tiles ecs_Region region: the "global" region of the tile ecs_Result *callback(); the callback to get the i,j value int offValue; the value for a "no data" raster value int uninitializedValue the value for an uninitialized matrix value ecs_TileBufferLine *linebuffer; a pointer to a linked list of buffered lines int index; index of the top line in the buffer (y matrix value) int nb_lines the number of lines int linelength; the length of a line ecs_TileID currentTile; the current tile: -1 if none void *priv; private data for tile. END_ATTRIBUTES END_STRUCTURE_INFORMATION ******************************************************************** */ typedef struct ecs_TileStructure { int xtiles; /* the number of horizontal tiles */ int ytiles; /* the number of vertical tiles */ tile_func *callback; /* the callback to get the i,j value */ tile_func *tileDimCallback; /* a callback to get the tile dimensions */ int offValue; /* the value for a "no data" raster value */ int uninitializedValue; /* the value for an uninitialized matrix value */ ecs_Region region; int regionwidth; int regionheight; ecs_TileBufferLine *linebuffer; /* a pointer to a linked list of buffered lines */ int index; /* the index of the top line in the buffer */ int nb_lines; /* the number of lines */ int linelength; /* the length of a line */ int width; /* the width of a tile */ int height; /* the height of a tile */ ecs_TileID currentTile; /* the current tile: -1 if none */ void *priv; } ecs_TileStructure; /* public commands */ int ecs_TileInitialize _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Region *region, int xtiles, int ytiles, int tilewidth, int tileheight, tile_func *callbackFunc, tile_func *globalRegionFunc)); int ecs_TileGetLine _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Coordinate *start, ecs_Coordinate *end)); void ecs_TileClearBuffer _ANSI_ARGS_((ecs_TileStructure *t)); /* private commands */ int ecs_TileFind _ANSI_ARGS_((ecs_Server *s, ecs_TileID *id, ecs_Coordinate *coord)); int ecs_TileFindBuffer _ANSI_ARGS_((ecs_TileStructure *t, int bufptr, ecs_TileBufferLine **tbuf)); int ecs_TileGetCurPos _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int i, int j, int *cat)); int ecs_TileFill _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int index, ecs_TileID *tile_id)); int ecs_TileAddLine _ANSI_ARGS_((ecs_TileStructure *tile, int length, int index, ecs_TileBufferLine **tbuf)); int ecs_TileDeleteLine _ANSI_ARGS_((ecs_TileStructure *tile)); void ecs_TileDeleteAllLines _ANSI_ARGS_((ecs_TileStructure *tile)); int ecs_GetTileId _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Coordinate *coord, ecs_TileID *tile_id)); int ecs_GetTileIdFromPos _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int x, int y, ecs_TileID *tile_id)); int ecs_TileCompare _ANSI_ARGS_((ecs_TileID *id1, ecs_TileID *id2)); int ecs_SetTile _ANSI_ARGS_((ecs_TileID *destination, ecs_TileID *source)); /* RGB Image functions */ void ecs_GetRGBFromPixel( unsigned int pixel, unsigned char *transparent, unsigned char *r, unsigned char *g, unsigned char *b ); unsigned int ecs_GetPixelFromRGB( int trans, int r, int g, int b ); #endif /* ECS_UTIL */ ogdi-ogdi_4_1_0/ogdi/include/makefile000066400000000000000000000020001345660466700176600ustar00rootroot00000000000000# # RPCGEN to generate the OGDI header file. # # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # EXTRA_INSTALL_TARGETS = install-includes include $(TOPDIR)/config/common.mak all: rpcgen: -$(RM) -f $@ $@.raw rpcgen -h -C -o $@.raw ecs.x perl ../scripts/h_clean.pl -o $@ $@.raw clean: @echo Nothing to clean in ogdi/include install-includes: cp *.h $(INST_INCLUDE) ogdi-ogdi_4_1_0/ogdi/include/sun/000077500000000000000000000000001345660466700167755ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/include/sun/ecs.h000066400000000000000000000201401345660466700177150ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #ifndef _ECS_H_RPCGEN #define _ECS_H_RPCGEN #include /* * fichier genere par RPCGEN a partir de ecs.x * * Declaration des structures & prototypes de l'extension client/serveur. * Ce fichier est recu par rpcgen et ce dernier generera 4 fichiers pour * pour l'extension client/serveur. Le "header" suivant doit ce retrouver * dans tout les fichiers */ /* * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. */ #define ECS_SUCCESS 0 #define ECS_FAILURE 1 #define ECS_RASTERSIZE 1000 #define ECS_MTEXT 1024 #define ECS_TRANSIENT_MIN 1073741824 #define ECS_TRANSIENT_MAX 1610612735 enum ecs_Family { Area = 1, Line = 2, Point = 3, Matrix = 4, Image = 5, Text = 6, Edge = 7, Face = 8, Node = 9, Ring = 10 }; typedef enum ecs_Family ecs_Family; struct ecs_Region { double north; double south; double east; double west; double ns_res; double ew_res; }; typedef struct ecs_Region ecs_Region; enum ecs_Resampling { nn = 1 }; typedef enum ecs_Resampling ecs_Resampling; enum ecs_Transformation { projective = 1, affine = 2, similarity = 3 }; typedef enum ecs_Transformation ecs_Transformation; struct ecs_RasterConversion { struct { u_int coef_len; double *coef_val; } coef; ecs_Resampling r_method; ecs_Transformation t_method; }; typedef struct ecs_RasterConversion ecs_RasterConversion; struct ecs_Coordinate { double x; double y; }; typedef struct ecs_Coordinate ecs_Coordinate; struct ecs_FeatureRing { ecs_Coordinate centroid; struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_FeatureRing ecs_FeatureRing; struct ecs_Area { struct { u_int ring_len; ecs_FeatureRing *ring_val; } ring; }; typedef struct ecs_Area ecs_Area; struct ecs_Line { struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_Line ecs_Line; struct ecs_Point { ecs_Coordinate c; }; typedef struct ecs_Point ecs_Point; struct ecs_Matrix { struct { u_int x_len; u_int *x_val; } x; }; typedef struct ecs_Matrix ecs_Matrix; struct ecs_Image { struct { u_int x_len; u_int *x_val; } x; }; typedef struct ecs_Image ecs_Image; struct ecs_Text { char *desc; ecs_Coordinate c; }; typedef struct ecs_Text ecs_Text; struct ecs_Node { int id; int containfaceid; ecs_Coordinate c; }; typedef struct ecs_Node ecs_Node; struct ecs_Edge { int id; int startnodeid; int endnodeid; int rightfaceid; int leftfaceid; int rightfedgeid; int leftfedgeid; struct { u_int c_len; ecs_Coordinate *c_val; } c; }; typedef struct ecs_Edge ecs_Edge; enum ecs_TopoLevel { Level012 = 1, Level3 = 2 }; typedef enum ecs_TopoLevel ecs_TopoLevel; struct ecs_Face { int id; struct { u_int edgeid_len; int *edgeid_val; } edgeid; }; typedef struct ecs_Face ecs_Face; struct ecs_AreaPrim { ecs_TopoLevel level; union { struct { u_int edgeid_len; int *edgeid_val; } edgeid; struct { u_int fedgeid_len; ecs_Face *fedgeid_val; } fedgeid; } ecs_AreaPrim_u; }; typedef struct ecs_AreaPrim ecs_AreaPrim; struct ecs_Geometry { ecs_Family family; union { ecs_Area area; ecs_Line line; ecs_Point point; ecs_Matrix matrix; ecs_Image image; ecs_Text text; ecs_Node node; ecs_Edge edge; ecs_AreaPrim ring; } ecs_Geometry_u; }; typedef struct ecs_Geometry ecs_Geometry; struct ecs_Object { char *Id; ecs_Geometry geom; char *attr; double xmin; double ymin; double xmax; double ymax; }; typedef struct ecs_Object ecs_Object; enum ecs_AttributeFormat { Char = 1, Varchar = 2, Longvarchar = 3, Decimal = 4, Numeric = 5, Smallint = 6, Integer = 7, Real = 8, Float = 9, Double = 10 }; typedef enum ecs_AttributeFormat ecs_AttributeFormat; struct ecs_ObjAttribute { char *name; ecs_AttributeFormat type; int lenght; int precision; int nullable; }; typedef struct ecs_ObjAttribute ecs_ObjAttribute; struct ecs_ObjAttributeFormat { struct { u_int oa_len; ecs_ObjAttribute *oa_val; } oa; }; typedef struct ecs_ObjAttributeFormat ecs_ObjAttributeFormat; struct ecs_Category { long no_cat; u_int r; u_int g; u_int b; char *label; u_long qty; }; typedef struct ecs_Category ecs_Category; struct ecs_RasterInfo { long mincat; long maxcat; int width; int height; struct { u_int cat_len; ecs_Category *cat_val; } cat; }; typedef struct ecs_RasterInfo ecs_RasterInfo; enum ecs_ResultType { Object = 1, GeoRegion = 2, objAttributeFormat = 3, RasterInfo = 4, AText = 5 }; typedef enum ecs_ResultType ecs_ResultType; struct ecs_ResultUnion { ecs_ResultType type; union { ecs_Object dob; ecs_Region gr; ecs_ObjAttributeFormat oaf; ecs_RasterInfo ri; char *s; } ecs_ResultUnion_u; }; typedef struct ecs_ResultUnion ecs_ResultUnion; struct ecs_Result { int error; char *message; ecs_ResultUnion res; }; typedef struct ecs_Result ecs_Result; struct ecs_LayerSelection { char *Select; ecs_Family F; }; typedef struct ecs_LayerSelection ecs_LayerSelection; #include /* Outils pour l'aide a ecs */ #define ECSPROG ((unsigned long)(0x20000001)) #define ECSVERS ((unsigned long)(1)) #define CREATESERVER ((unsigned long)(1)) extern ecs_Result * createserver_1(); #define DESTROYSERVER ((unsigned long)(2)) extern ecs_Result * destroyserver_1(); #define SELECTLAYER ((unsigned long)(3)) extern ecs_Result * selectlayer_1(); #define RELEASELAYER ((unsigned long)(4)) extern ecs_Result * releaselayer_1(); #define SELECTREGION ((unsigned long)(5)) extern ecs_Result * selectregion_1(); #define GETDICTIONNARY ((unsigned long)(6)) extern ecs_Result * getdictionnary_1(); #define GETATTRIBUTEFORMAT ((unsigned long)(7)) extern ecs_Result * getattributeformat_1(); #define GETNEXTOBJECT ((unsigned long)(8)) extern ecs_Result * getnextobject_1(); #define GETRASTERINFO ((unsigned long)(9)) extern ecs_Result * getrasterinfo_1(); #define GETOBJECT ((unsigned long)(10)) extern ecs_Result * getobject_1(); #define GETOBJECTIDFROMCOORD ((unsigned long)(11)) extern ecs_Result * getobjectidfromcoord_1(); #define UPDATEDICTIONARY ((unsigned long)(12)) extern ecs_Result * updatedictionary_1(); #define GETSERVERPROJECTION ((unsigned long)(13)) extern ecs_Result * getserverprojection_1(); #define GETGLOBALBOUND ((unsigned long)(14)) extern ecs_Result * getglobalbound_1(); #define SETSERVERLANGUAGE ((unsigned long)(15)) extern ecs_Result * setserverlanguage_1(); #define SETRASTERCONVERSION ((unsigned long)(17)) extern ecs_Result * setrasterconversion_1(); extern int ecsprog_1_freeresult(); /* the xdr functions */ extern bool_t xdr_ecs_Family(); extern bool_t xdr_ecs_Region(); extern bool_t xdr_ecs_Resampling(); extern bool_t xdr_ecs_Transformation(); extern bool_t xdr_ecs_RasterConversion(); extern bool_t xdr_ecs_Coordinate(); extern bool_t xdr_ecs_FeatureRing(); extern bool_t xdr_ecs_Area(); extern bool_t xdr_ecs_Line(); extern bool_t xdr_ecs_Point(); extern bool_t xdr_ecs_Matrix(); extern bool_t xdr_ecs_Image(); extern bool_t xdr_ecs_Text(); extern bool_t xdr_ecs_Node(); extern bool_t xdr_ecs_Edge(); extern bool_t xdr_ecs_TopoLevel(); extern bool_t xdr_ecs_Face(); extern bool_t xdr_ecs_AreaPrim(); extern bool_t xdr_ecs_Geometry(); extern bool_t xdr_ecs_Object(); extern bool_t xdr_ecs_AttributeFormat(); extern bool_t xdr_ecs_ObjAttribute(); extern bool_t xdr_ecs_ObjAttributeFormat(); extern bool_t xdr_ecs_Category(); extern bool_t xdr_ecs_RasterInfo(); extern bool_t xdr_ecs_ResultType(); extern bool_t xdr_ecs_ResultUnion(); extern bool_t xdr_ecs_Result(); extern bool_t xdr_ecs_LayerSelection(); #endif /* !_ECS_H_RPCGEN */ ogdi-ogdi_4_1_0/ogdi/include/sun/ecs_clnt.c000066400000000000000000000135611345660466700207410ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" /* Default timeout can be changed using clnt_control() */ static struct timeval TIMEOUT = { 25, 0 }; ecs_Result * createserver_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, CREATESERVER, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * destroyserver_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, DESTROYSERVER, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectlayer_1(argp, clnt) ecs_LayerSelection *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTLAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * releaselayer_1(argp, clnt) ecs_LayerSelection *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, RELEASELAYER, (xdrproc_t) xdr_ecs_LayerSelection, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * selectregion_1(argp, clnt) ecs_Region *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SELECTREGION, (xdrproc_t) xdr_ecs_Region, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getdictionnary_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETDICTIONNARY, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getattributeformat_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETATTRIBUTEFORMAT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getnextobject_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETNEXTOBJECT, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getrasterinfo_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETRASTERINFO, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobject_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECT, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getobjectidfromcoord_1(argp, clnt) ecs_Coordinate *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETOBJECTIDFROMCOORD, (xdrproc_t) xdr_ecs_Coordinate, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * updatedictionary_1(argp, clnt) char **argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, UPDATEDICTIONARY, (xdrproc_t) xdr_wrapstring, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getserverprojection_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETSERVERPROJECTION, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * getglobalbound_1(argp, clnt) void *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, GETGLOBALBOUND, (xdrproc_t) xdr_void, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setserverlanguage_1(argp, clnt) u_int *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETSERVERLANGUAGE, (xdrproc_t) xdr_u_int, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ecs_Result * setrasterconversion_1(argp, clnt) ecs_RasterConversion *argp; CLIENT *clnt; { static ecs_Result clnt_res; memset((char *)&clnt_res, 0, sizeof (clnt_res)); if (clnt_call(clnt, SETRASTERCONVERSION, (xdrproc_t) xdr_ecs_RasterConversion, (caddr_t) argp, (xdrproc_t) xdr_ecs_Result, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } ogdi-ogdi_4_1_0/ogdi/include/sun/ecs_svc.c000066400000000000000000000150401345660466700205660ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" #include #include /* getenv, exit */ #include #include #include #include #include #include /* rlimit */ #include #ifdef DEBUG #define RPC_SVC_FG #endif #define _RPCSVC_CLOSEDOWN 120 #define main dummy static int _rpcpmstart; /* Started by a port monitor ? */ /* States a server can be in wrt request */ #define _IDLE 0 #define _SERVED 1 #define _SERVING 2 static int _rpcsvcstate = _IDLE; /* Set when a request is serviced */ static void _msgout(msg) char *msg; { #ifdef RPC_SVC_FG if (_rpcpmstart) syslog(LOG_ERR, msg); else (void) fprintf(stderr, "%s\n", msg); #else syslog(LOG_ERR, msg); #endif } static void closedown(sig) int sig; { if (_rpcsvcstate == _IDLE) { extern fd_set svc_fdset; static int size; int i, openfd; struct t_info tinfo; if (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS)) exit(0); if (size == 0) { struct rlimit rl; rl.rlim_max = 0; getrlimit(RLIMIT_NOFILE, &rl); if ((size = rl.rlim_max) == 0) { return; } } for (i = 0, openfd = 0; i < size && openfd < 2; i++) if (FD_ISSET(i, &svc_fdset)) openfd++; if (openfd <= 1) exit(0); } if (_rpcsvcstate == _SERVED) _rpcsvcstate = _IDLE; (void) signal(SIGALRM, (void(*)()) closedown); (void) alarm(_RPCSVC_CLOSEDOWN/2); } void ecsprog_1(rqstp, transp) struct svc_req *rqstp; register SVCXPRT *transp; { union { char *createserver_1_arg; ecs_LayerSelection selectlayer_1_arg; ecs_LayerSelection releaselayer_1_arg; ecs_Region selectregion_1_arg; char *getobject_1_arg; ecs_Coordinate getobjectidfromcoord_1_arg; char *updatedictionary_1_arg; u_int setserverlanguage_1_arg; ecs_RasterConversion setrasterconversion_1_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); _rpcsvcstate = _SERVING; switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply(transp, xdr_void, (char *)NULL); _rpcsvcstate = _SERVED; return; case CREATESERVER: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) createserver_1; break; case DESTROYSERVER: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) destroyserver_1; break; case SELECTLAYER: xdr_argument = xdr_ecs_LayerSelection; xdr_result = xdr_ecs_Result; local = (char *(*)()) selectlayer_1; break; case RELEASELAYER: xdr_argument = xdr_ecs_LayerSelection; xdr_result = xdr_ecs_Result; local = (char *(*)()) releaselayer_1; break; case SELECTREGION: xdr_argument = xdr_ecs_Region; xdr_result = xdr_ecs_Result; local = (char *(*)()) selectregion_1; break; case GETDICTIONNARY: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getdictionnary_1; break; case GETATTRIBUTEFORMAT: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getattributeformat_1; break; case GETNEXTOBJECT: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getnextobject_1; break; case GETRASTERINFO: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getrasterinfo_1; break; case GETOBJECT: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) getobject_1; break; case GETOBJECTIDFROMCOORD: xdr_argument = xdr_ecs_Coordinate; xdr_result = xdr_ecs_Result; local = (char *(*)()) getobjectidfromcoord_1; break; case UPDATEDICTIONARY: xdr_argument = xdr_wrapstring; xdr_result = xdr_ecs_Result; local = (char *(*)()) updatedictionary_1; break; case GETSERVERPROJECTION: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getserverprojection_1; break; case GETGLOBALBOUND: xdr_argument = xdr_void; xdr_result = xdr_ecs_Result; local = (char *(*)()) getglobalbound_1; break; case SETSERVERLANGUAGE: xdr_argument = xdr_u_int; xdr_result = xdr_ecs_Result; local = (char *(*)()) setserverlanguage_1; break; case SETRASTERCONVERSION: xdr_argument = xdr_ecs_RasterConversion; xdr_result = xdr_ecs_Result; local = (char *(*)()) setrasterconversion_1; break; default: svcerr_noproc(transp); _rpcsvcstate = _SERVED; return; } (void) memset((char *)&argument, 0, sizeof (argument)); if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); _rpcsvcstate = _SERVED; return; } result = (*local)(&argument, rqstp); if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } if (!svc_freeargs(transp, xdr_argument, &argument)) { _msgout("unable to free arguments"); exit(1); } _rpcsvcstate = _SERVED; return; } main() { pid_t pid; int i; char mname[FMNAMESZ + 1]; if (!ioctl(0, I_LOOK, mname) && (!strcmp(mname, "sockmod") || !strcmp(mname, "timod"))) { char *netid; struct netconfig *nconf = NULL; SVCXPRT *transp; int pmclose; _rpcpmstart = 1; openlog("ecs", LOG_PID, LOG_DAEMON); if ((netid = getenv("NLSPROVIDER")) == NULL) { /* started from inetd */ pmclose = 1; } else { if ((nconf = getnetconfigent(netid)) == NULL) _msgout("cannot get transport info"); pmclose = (t_getstate(0) != T_DATAXFER); } if (strcmp(mname, "sockmod") == 0) { if (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, "timod")) { _msgout("could not get the right module"); exit(1); } } if ((transp = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) { _msgout("cannot create server handle"); exit(1); } if (nconf) freenetconfigent(nconf); if (!svc_reg(transp, ECSPROG, ECSVERS, ecsprog_1, 0)) { _msgout("unable to register (ECSPROG, ECSVERS)."); exit(1); } if (pmclose) { (void) signal(SIGALRM, (void(*)()) closedown); (void) alarm(_RPCSVC_CLOSEDOWN/2); } svc_run(); exit(1); /* NOTREACHED */ } else { #ifndef RPC_SVC_FG int size; struct rlimit rl; pid = fork(); if (pid < 0) { perror("cannot fork"); exit(1); } if (pid) exit(0); rl.rlim_max = 0; getrlimit(RLIMIT_NOFILE, &rl); if ((size = rl.rlim_max) == 0) exit(1); for (i = 0; i < size; i++) (void) close(i); i = open("/dev/console", 2); (void) dup2(i, 1); (void) dup2(i, 2); setsid(); openlog("ecs", LOG_PID, LOG_DAEMON); #endif } if (!svc_create(ecsprog_1, ECSPROG, ECSVERS, "netpath")) { _msgout("unable to create (ECSPROG, ECSVERS) for netpath."); exit(1); } svc_run(); _msgout("svc_run returned"); exit(1); /* NOTREACHED */ } ogdi-ogdi_4_1_0/ogdi/include/sun/ecs_util.h000066400000000000000000000607741345660466700207730ustar00rootroot00000000000000#ifndef ECS_UTIL #define ECS_UTIL 1 #include #include #include #include #include #include #include #ifdef _WINDOWS #include #include #else #include #endif #include "ecs.h" #ifdef _SCO #include #endif /***********************************************************************/ /* Global definitions */ #undef _ANSI_ARGS_ #undef CONST #if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) # define _USING_PROTOTYPES_ 1 # define _ANSI_ARGS_(x) x # define CONST const # ifdef __cplusplus # define VARARGS(first) (first, ...) # else # define VARARGS(first) () # endif #else # define _ANSI_ARGS_(x) () # define CONST #endif #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif /* * Macro to use instead of "void" for arguments that must have * type "void *" in ANSI C; maps them to type "char *" in * non-ANSI systems. */ #ifndef VOID # ifdef __STDC__ # define VOID void # else # define VOID char # endif #endif /* * Miscellaneous declarations (to allow Tcl to be used stand-alone, * without the rest of Sprite). */ #ifndef NULL #define NULL 0 #endif #define PROJ_UNKNOWN "unknown" #define PROJ_LONGLAT "+proj=longlat" #define ECSGETJ(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[0]*j1 + s->rasterconversion.coef.coef_val[1]*i1 + s->rasterconversion.coef.coef_val[6]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5) #define ECSGETI(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[2]*j1 + s->rasterconversion.coef.coef_val[3]*i1 + s->rasterconversion.coef.coef_val[7]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5) #ifndef PI #define PI 3.14159265359 #endif /***********************************************************************/ /* server.c declarations */ #define ECSMAXLAYER 64 typedef ecs_Result *dynfunc(); typedef struct { ecs_LayerSelection sel; int index; int nbfeature; void *priv; } ecs_Layer; typedef struct { /* Specific information for dynamic part of the server */ void *priv; ecs_Layer layer[ECSMAXLAYER]; int nblayer; int currentLayer; /* dynamic library handle */ void *handle; /* Regions of the server */ ecs_Region currentRegion; ecs_Region globalRegion; /* Server projection */ char *projection; /* Extracted information from URL */ char *hostname; char *server_type; char *pathname; /* Indicate if the server is a remote server or not */ int isRemote; /* RasterConversion structure */ ecs_RasterConversion rasterconversion; /* Structure returned to client */ ecs_Result result; /* pointers to functions */ dynfunc *createserver; dynfunc *destroyserver; dynfunc *selectlayer; dynfunc *releaselayer; dynfunc *closelayer; dynfunc *selectregion; dynfunc *getdictionary; dynfunc *getattrformat; dynfunc *getnextobject; dynfunc *getrasterinfo; dynfunc *getobject; dynfunc *getobjectid; dynfunc *updatedictionary; dynfunc *getserverprojection; dynfunc *getglobalbound; dynfunc *setserverlanguage; dynfunc *setrasterconversion; } ecs_Server; ecs_Result *svr_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request, int isLocal)); ecs_Result *svr_DestroyServer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *svr_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); void svr_BroadCloseLayers _ANSI_ARGS_((ecs_Server *s)); void svr_CloseLayer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr)); ecs_Result *svr_GetDictionary _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetNextObject _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetRasterInfo _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id)); ecs_Result *svr_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord)); ecs_Result *svr_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info)); ecs_Result *svr_GetServerProjection _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_GetGlobalBound _ANSI_ARGS_((ecs_Server *s)); ecs_Result *svr_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language)); ecs_Result *svr_SetRasterConversion _ANSI_ARGS_((ecs_Server *s, ecs_RasterConversion *rc)); /* These functions will be called by dynamic servers */ int ecs_SetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel)); int ecs_GetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel)); void ecs_FreeLayer _ANSI_ARGS_((ecs_Server *s, int layer)); int ecs_RemoveDir _ANSI_ARGS_((char *path)); /***********************************************************************/ /* ecs_dyna.c declarations */ void *ecs_OpenDynamicLib _ANSI_ARGS_((char *libname)); void *ecs_GetDynamicLibFunction _ANSI_ARGS_((void *handle,char *functionname)); void ecs_CloseDynamicLib _ANSI_ARGS_((void *handle)); /***********************************************************************/ /* ecsdist.c declarations */ double ecs_DistanceObject _ANSI_ARGS_((ecs_Object *obj, double X, double Y)); double ecs_DistanceMBR _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy)); double ecs_DistanceSegment _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy)); /***********************************************************************/ /* ecsassoc.c declarations */ /* WARNING: These define do more than one operation. Please, don't consider these as functions. */ /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro indicate the object type of ecs_Result ---------------------------------------------------------------- */ #define ECSRESULTTYPE(result) result->res.type /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro access the union in ecs_Result and facilitate ecs_Result structures access. ---------------------------------------------------------------- */ #define ECSRESULT(result) result->res.ecs_ResultUnion_u /* ---------------------------------------------------------------- ECSRESULTTYPE: This macro indicate the geographical object type contain in ecs_Result ---------------------------------------------------------------- */ #define ECSGEOMTYPE(result) result->res.ecs_ResultUnion_u.dob.geom.family /* ---------------------------------------------------------------- ECSGEOM: This macro access the union contain in the geographical object in ecs_Result. ---------------------------------------------------------------- */ #define ECSGEOM(result) result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u /* ---------------------------------------------------------------- ECSAREARING: This macro access the area ring in the geographic object of type Area ---------------------------------------------------------------- */ #define ECSAREARING(result,pos) result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[pos] /* ---------------------------------------------------------------- ECSERROR: Indicate if ecs_Result contain an error code ---------------------------------------------------------------- */ #define ECSERROR(r) (r->error != 0) /* ---------------------------------------------------------------- ECSSUCCESS: Indicate if ecs_Result contain an success code ---------------------------------------------------------------- */ #define ECSSUCCESS(r) (r->error == 0) /* ---------------------------------------------------------------- ECSEOF: Indicate if ecs_Result contain EOF message. Mainly use in cln_GetNextObject function. ---------------------------------------------------------------- */ #define ECSEOF(r) (r->error == 2) /* ---------------------------------------------------------------- ECSPROJ: Indicate if ecs_Result contain PROJ error message. Mainly use in cln_GetNextObject function. ---------------------------------------------------------------- */ #define ECSPROJ(r) (r->error == 3) /* ---------------------------------------------------------------- ECSMESSAGE: Return the error message contain in ecs_Result (an string). ---------------------------------------------------------------- */ #define ECSMESSAGE(r) r->message /* ---------------------------------------------------------------- ECSREGION: Return the geographical region contain in ecs_Result (if it's the case). The structure returned is a ecs_Region. ---------------------------------------------------------------- */ #define ECSREGION(r) ECSRESULT(r).gr /* ---------------------------------------------------------------- ECSTEXT: Return the text string contain in ecs_Result (if it's the case). The structure returned is a string. ---------------------------------------------------------------- */ #define ECSTEXT(r) ECSRESULT(r).s /* ---------------------------------------------------------------- ECSRASTERINFO: Return the raster information contain in ecs_Result (if it's the case). The structure return is a ecs_RasterInfo. ---------------------------------------------------------------- */ #define ECSRASTERINFO(r) ECSRESULT(r).ri /* ---------------------------------------------------------------- ECSRASTERINFONB: Return the number of categories in the ecs_RasterInfo structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSRASTERINFONB(r) ECSRASTERINFO(r).cat.cat_len /* ---------------------------------------------------------------- ECSRASTERINFOCAT: Return the category number "c" contain in ecs_RasterInfo in ecs_Result. The structure returned is a ecs_Category. ---------------------------------------------------------------- */ #define ECSRASTERINFOCAT(r,c) ECSRASTERINFO(r).cat.cat_val[c] /* ---------------------------------------------------------------- ECSOBJECT: Return the geographic object contain in ecs_Result (if it's the case). The structure return is a ecs_Object. ---------------------------------------------------------------- */ #define ECSOBJECT(r) ECSRESULT(r).dob /* ---------------------------------------------------------------- ECSOBJECTID: Return the "Id" attribute contain the ecs_Object structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSOBJECTID(r) ECSOBJECT(r).Id /* ---------------------------------------------------------------- ECSOBJECTATTR: Return the "attr" attribute contain the ecs_Object structure contain in ecs_Result. ---------------------------------------------------------------- */ #define ECSOBJECTATTR(r) ECSOBJECT(r).attr /* ---------------------------------------------------------------- ECSRASTER: Return the raster line table contain in ecs_Object. ---------------------------------------------------------------- */ #define ECSRASTER(r) ECSOBJECT(r).geom.ecs_Geometry_u.matrix.x.x_val /* ---------------------------------------------------------------- ECS_SETGEOMBOUNDINGBOX: This macro will put in the geographical object contain in "result" the bounding rectangle (lxmin, lymin, lxmax, lymax). ---------------------------------------------------------------- */ #define ECS_SETGEOMBOUNDINGBOX(result,lxmin,lymin,lxmax,lymax) { \ if (result->res.type==Object) { \ result->res.ecs_ResultUnion_u.dob.xmin=lxmin; \ result->res.ecs_ResultUnion_u.dob.ymin=lymin; \ result->res.ecs_ResultUnion_u.dob.xmax=lxmax; \ result->res.ecs_ResultUnion_u.dob.ymax=lymax; \ } \ } /* ---------------------------------------------------------------- ECSGEOMLINECOORD: This macro put a point (lx,ly) at the position "position" in a line geographical object. To entirely set the line object, ecs_SetGeomLine must be call first and for each point, ECS_SETGEOMLINECOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMLINECOORD(result,position,lx,ly) \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].x = lx; \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].y = ly; /* ---------------------------------------------------------------- ECSGEOMAREACOORD: This macro put a point (lx,ly) at the position "position" of the ring "ringpos" in a area geographical object. To entirely set the area object, ecs_SetGeomArea must be call first and for each ring, ecs_SetGeomAreaRing must be call. In each of this ring, ECS_SETGEOMAREACOORD must be call define the polygons points. ---------------------------------------------------------------- */ #define ECS_SETGEOMAREACOORD(result,ringpos,position,lx,ly) \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].x = lx; \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].y = ly; /* ---------------------------------------------------------------- ECSGEOMMATRIXCOORD: This macro put a value at the position "position" in a matrix geographical object. To entirely set the matrix object, ecs_SetGeomMatrix must be call first and for each column, ECS_SETGEOMMATRIXCOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMMATRIXVALUE(result,lpos,lval) \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix.x.x_val[lpos] = lval /* ---------------------------------------------------------------- ECSGEOMIMAGECOORD: This macro put a value at the position "position" in a image geographical object. To entirely set the image object, ecs_SetGeomImage must be call first and for each column, ECS_SETGEOMIMAGECOORD must be call. ---------------------------------------------------------------- */ #define ECS_SETGEOMIMAGEVALUE(result,lpos,lval) \ result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.image.x.x_val[lpos] = lval /********************************/ int ecs_SetError _ANSI_ARGS_((ecs_Result *r, int errorcode, char *error_message)); int ecs_SetSuccess _ANSI_ARGS_((ecs_Result *r)); int ecs_AdjustResult _ANSI_ARGS_((ecs_Result *r)); int ecs_SetGeoRegion _ANSI_ARGS_((ecs_Result *r, double north, double south, double east, double west, double nsres, double ewres)); int ecs_SetText _ANSI_ARGS_((ecs_Result *r,char *text)); int ecs_AddText _ANSI_ARGS_((ecs_Result *r,char *text)); int ecs_SetRasterInfo _ANSI_ARGS_((ecs_Result *r, int width, int height)); int ecs_AddRasterInfoCategory _ANSI_ARGS_((ecs_Result *r, long no_cat, unsigned int red, unsigned int green, unsigned int blue, char *label, unsigned long qty)); int ecs_SetObjAttributeFormat _ANSI_ARGS_((ecs_Result *r)); int ecs_AddAttributeFormat _ANSI_ARGS_((ecs_Result *r, char *name, ecs_AttributeFormat type, int lenght, int precision, int nullable)); int ecs_SetGeomPoint _ANSI_ARGS_((ecs_Result *r, double x, double y)); int ecs_SetGeomText _ANSI_ARGS_((ecs_Result *r, double x, double y, char *desc)); int ecs_SetGeomLine _ANSI_ARGS_((ecs_Result *r, unsigned int lenght)); int ecs_SetGeomArea _ANSI_ARGS_((ecs_Result *r, unsigned int lenght)); int ecs_SetGeomAreaRing _ANSI_ARGS_((ecs_Result *r, int position, unsigned int length, double centroid_x, double centroid_y)); int ecs_SetGeomMatrix _ANSI_ARGS_((ecs_Result *r, int size)); int ecs_SetGeomMatrixWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array)); int ecs_SetGeomImage _ANSI_ARGS_((ecs_Result *r, int size)); int ecs_SetGeomImageWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array)); int ecs_SetObjectId _ANSI_ARGS_((ecs_Result *r,char *id)); int ecs_SetObjectAttr _ANSI_ARGS_((ecs_Result *r,char *attr)); int ecs_CleanUp _ANSI_ARGS_((ecs_Result *r)); int ecs_CleanUpObject _ANSI_ARGS_((ecs_Result *r)); int ecs_ResultInit _ANSI_ARGS_((ecs_Result *r)); int ecs_CalcObjectMBR _ANSI_ARGS_((ecs_Server *r, ecs_Result *e)); /***********************************************************************/ /* ecs_split.c declarations */ void ecs_freeSplitURL _ANSI_ARGS_((char **type,char **machine,char **path)); int ecs_SplitURL _ANSI_ARGS_((const char *url,char **machine,char **server,char **path)); /***********************************************************************/ /* ecs_list.c declarations */ char ecs_Backslash _ANSI_ARGS_((char *src, int *readPtr)); int ecs_FindElement _ANSI_ARGS_((char *list,char **elementPtr, char **nextPtr, int *sizePtr, int *bracePtr)); void ecs_CopyAndCollapse _ANSI_ARGS_((int count,char *src,char *dst)); int ecs_SplitList _ANSI_ARGS_((char *list,int *argcPtr,char ***argvPtr)); /***********************************************************************/ /* dynamic library server declarations */ ecs_Result *dyn_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request)); ecs_Result *dyn_DestroyServer _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *dyn_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls)); ecs_Result *dyn_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr)); ecs_Result *dyn_GetDictionary _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetNextObject _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetRasterInfo _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id)); ecs_Result *dyn_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord)); ecs_Result *dyn_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info)); ecs_Result *dyn_GetServerProjection _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_GetGlobalBound _ANSI_ARGS_((ecs_Server *s)); ecs_Result *dyn_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language)); ecs_Result *dyn_SetRasterConversion _ANSI_ARGS_((ecs_Server *s, ecs_RasterConversion *rc)); /***********************************************************************/ /* * client.h -- * * Control dispatch of locals client. Also control cache management and * projection changes. * * Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc. * Il est strictement interdit de publier ou de devoiler le contenu de ce * programme sans avoir prealablement obtenu la permission de L.A.S. Inc. */ #define CACHEINITSIZE 100 #define COMPARETOLERANCE 0.005 /* For projection conversion, tolerance factor during projection compare */ #define ECS_TTOS 0 /* define the conversion direction (target to source) or (source to target) */ #define ECS_STOT 1 typedef struct ecs_CtlPoint { double e1,n1,e2,n2; double errorx,errory; } ecs_CtlPoint; typedef struct ecs_CtlPoints { int nbpts; ecs_CtlPoint *pts; } ecs_CtlPoints; typedef struct ecs_Cache { ecs_LayerSelection coverage; /* coverage descriptor */ int size; /* logical cache size */ int currentpos; /* current position in cache for getnextobject */ int allocatedSize; /* physical size of cache */ ecs_Result **o; /* the cache itself */ struct ecs_Cache *next; /* linked list successor, NULL if end of list */ struct ecs_Cache *previous; /* linked list predecessor */ } ecs_Cache; typedef struct { char *url; /* Client URL, mostly used to see if a client already exist */ ecs_Cache *cache; /* linked list of all cached coverage */ ecs_Cache *selectCache; /* A pointer to the cache selected by SelectLayer */ ecs_Region cacheRegion; /* mbr region of cache */ ecs_Region currentRegion; /* mbr of current region */ ecs_Family currentSelectionFamily; /* Current layer selection type */ char *tclprocname; /* attribute callback procedure for tcl */ int isCurrentRegionSet; ecs_Server s; } ecs_Client; #define MAXCLIENT 8 /* Functions used for allocation and deallocation. */ void cln_FreeClient _ANSI_ARGS_((ecs_Client **c)); int cln_AllocClient _ANSI_ARGS_((char *URL,int *error)); /* API functions */ ecs_Result *cln_CreateClient _ANSI_ARGS_((int *ClientID,char *url)); ecs_Result *cln_DestroyClient _ANSI_ARGS_((int ClientID)); ecs_Result *cln_SelectLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); ecs_Result *cln_ReleaseLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); void cln_BroadCloseLayers(); ecs_Result *cln_SelectRegion _ANSI_ARGS_((int ClientID, ecs_Region *gr)); ecs_Result *cln_GetDictionary _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetAttributesFormat _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetNextObject _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetRasterInfo _ANSI_ARGS_((int ClientID)); ecs_Result *cln_GetObject _ANSI_ARGS_((int ClientID, char *Id)); ecs_Result *cln_GetObjectIdFromCoord _ANSI_ARGS_((int ClientID, ecs_Coordinate *coord)); ecs_Result *cln_UpdateDictionary _ANSI_ARGS_((int ClientID, char *info)); ecs_Result *cln_GetGlobalBound _ANSI_ARGS_((int ClientID)); ecs_Result *cln_SetServerLanguage _ANSI_ARGS_((int ClientID, u_int language)); ecs_Result *cln_GetServerProjection _ANSI_ARGS_((int ClientID)); void cln_SetTclProc _ANSI_ARGS_((int ClientID, char *tclproc)); char *cln_GetTclProc _ANSI_ARGS_((int ClientID)); /* Projection conversion functions */ int cln_UpdateMaxRegion _ANSI_ARGS_((int ClientID, double x, double y, ecs_Region *gr, int sens, int first)); int cln_PointValid _ANSI_ARGS_((int ClientID, double x, double y)); /* Matrix conversion functions */ int cln_CalcCtlPoint _ANSI_ARGS_((int ClientID, ecs_Region *server_region, int SI, int SJ, ecs_CtlPoint *pt)); int cln_CalcCtlPoints _ANSI_ARGS_((int ClientID, ecs_CtlPoints **pts, char **error_message)); int cln_SetRasterConversion _ANSI_ARGS_((int ClientID, ecs_CtlPoints **pts, ecs_Resampling resampling, ecs_Transformation trans, char **error_message)); /* URL manipulation */ int cln_GetClientIdFromURL _ANSI_ARGS_((char *url)); int cln_GetURLList _ANSI_ARGS_((char **urllist)); /* Cache functions */ int cln_SetRegionCaches _ANSI_ARGS_((int ClientID, ecs_Region *GR, char **error_message)); int cln_LoadCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message)); int cln_ReleaseCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message)); void cln_FreeCache _ANSI_ARGS_((ecs_Cache *cache)); ecs_Cache *cln_FoundCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls)); int cln_CopyObject _ANSI_ARGS_((ecs_Result *source, ecs_Result **copy, char **error_message)); int cln_CopyGeometry _ANSI_ARGS_((ecs_Object *source, ecs_Object *copy, char **error_message)); int cln_CopyArea _ANSI_ARGS_((ecs_Area *source, ecs_Area *copy, char **error_message)); int cln_CopyLine _ANSI_ARGS_((ecs_Line *source, ecs_Line *copy, char **error_message)); int cln_CopyPoint _ANSI_ARGS_((ecs_Point *source, ecs_Point *copy, char **error_message)); int cln_CopyText _ANSI_ARGS_((ecs_Text *source, ecs_Text *copy, char **error_message)); int cln_CopyMatrix _ANSI_ARGS_((ecs_Matrix *source, ecs_Matrix *copy, char **error_message)); int cln_CopyImage _ANSI_ARGS_((ecs_Image *source, ecs_Image *copy, char **error_message)); void cln_FreeObject _ANSI_ARGS_((ecs_Object *obj)); #endif /* ECS_UTIL */ /***********************************************************************/ /* * ecsgeo -- * * Make geometric calculations * * Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc. * Il est strictement interdit de publier ou de devoiler le contenu de ce * programme sans avoir prealablement obtenu la permission de L.A.S. Inc. */ void ecs_begin_ellipsoid_polygon_area _ANSI_ARGS_((double a, double e2)); double ecs_Q _ANSI_ARGS_((double x)); double ecs_Qbar _ANSI_ARGS_((double x)); double ecs_planimetric_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord)); double ecs_ellipsoid_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord)); double ecs_geodesic_distance _ANSI_ARGS_((double lon1, double lat1, double lon2, double lat2)); int ecs_CalculateCentroid _ANSI_ARGS_((int nb_segment, ecs_Coordinate *coord,ecs_Coordinate *centroid)); ogdi-ogdi_4_1_0/ogdi/include/sun/ecs_xdr.c000066400000000000000000000305471345660466700206010ustar00rootroot00000000000000/* * Please do not edit this file. * It was generated using rpcgen. */ #include "ecs.h" bool_t xdr_ecs_Family(xdrs, objp) register XDR *xdrs; ecs_Family *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Region(xdrs, objp) register XDR *xdrs; ecs_Region *objp; { register long *buf; if (!xdr_double(xdrs, &objp->north)) return (FALSE); if (!xdr_double(xdrs, &objp->south)) return (FALSE); if (!xdr_double(xdrs, &objp->east)) return (FALSE); if (!xdr_double(xdrs, &objp->west)) return (FALSE); if (!xdr_double(xdrs, &objp->ns_res)) return (FALSE); if (!xdr_double(xdrs, &objp->ew_res)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Resampling(xdrs, objp) register XDR *xdrs; ecs_Resampling *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Transformation(xdrs, objp) register XDR *xdrs; ecs_Transformation *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_RasterConversion(xdrs, objp) register XDR *xdrs; ecs_RasterConversion *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->coef.coef_val, (u_int *) &objp->coef.coef_len, ~0, sizeof (double), (xdrproc_t) xdr_double)) return (FALSE); if (!xdr_ecs_Resampling(xdrs, &objp->r_method)) return (FALSE); if (!xdr_ecs_Transformation(xdrs, &objp->t_method)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Coordinate(xdrs, objp) register XDR *xdrs; ecs_Coordinate *objp; { register long *buf; if (!xdr_double(xdrs, &objp->x)) return (FALSE); if (!xdr_double(xdrs, &objp->y)) return (FALSE); return (TRUE); } bool_t xdr_ecs_FeatureRing(xdrs, objp) register XDR *xdrs; ecs_FeatureRing *objp; { register long *buf; if (!xdr_ecs_Coordinate(xdrs, &objp->centroid)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Area(xdrs, objp) register XDR *xdrs; ecs_Area *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->ring.ring_val, (u_int *) &objp->ring.ring_len, ~0, sizeof (ecs_FeatureRing), (xdrproc_t) xdr_ecs_FeatureRing)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Line(xdrs, objp) register XDR *xdrs; ecs_Line *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Point(xdrs, objp) register XDR *xdrs; ecs_Point *objp; { register long *buf; if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Matrix(xdrs, objp) register XDR *xdrs; ecs_Matrix *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->x.x_val, (u_int *) &objp->x.x_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Image(xdrs, objp) register XDR *xdrs; ecs_Image *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->x.x_val, (u_int *) &objp->x.x_len, ~0, sizeof (u_int), (xdrproc_t) xdr_u_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Text(xdrs, objp) register XDR *xdrs; ecs_Text *objp; { register long *buf; if (!xdr_string(xdrs, &objp->desc, ~0)) return (FALSE); if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Node(xdrs, objp) register XDR *xdrs; ecs_Node *objp; { register long *buf; if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->containfaceid)) return (FALSE); if (!xdr_ecs_Coordinate(xdrs, &objp->c)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Edge(xdrs, objp) register XDR *xdrs; ecs_Edge *objp; { register long *buf; if (xdrs->x_op == XDR_ENCODE) { buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); } else { IXDR_PUT_LONG(buf, objp->id); IXDR_PUT_LONG(buf, objp->startnodeid); IXDR_PUT_LONG(buf, objp->endnodeid); IXDR_PUT_LONG(buf, objp->rightfaceid); IXDR_PUT_LONG(buf, objp->leftfaceid); IXDR_PUT_LONG(buf, objp->rightfedgeid); IXDR_PUT_LONG(buf, objp->leftfedgeid); } if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } else if (xdrs->x_op == XDR_DECODE) { buf = XDR_INLINE(xdrs, 7 * BYTES_PER_XDR_UNIT); if (buf == NULL) { if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); } else { objp->id = IXDR_GET_LONG(buf); objp->startnodeid = IXDR_GET_LONG(buf); objp->endnodeid = IXDR_GET_LONG(buf); objp->rightfaceid = IXDR_GET_LONG(buf); objp->leftfaceid = IXDR_GET_LONG(buf); objp->rightfedgeid = IXDR_GET_LONG(buf); objp->leftfedgeid = IXDR_GET_LONG(buf); } if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_int(xdrs, &objp->startnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->endnodeid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfaceid)) return (FALSE); if (!xdr_int(xdrs, &objp->rightfedgeid)) return (FALSE); if (!xdr_int(xdrs, &objp->leftfedgeid)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->c.c_val, (u_int *) &objp->c.c_len, ~0, sizeof (ecs_Coordinate), (xdrproc_t) xdr_ecs_Coordinate)) return (FALSE); return (TRUE); } bool_t xdr_ecs_TopoLevel(xdrs, objp) register XDR *xdrs; ecs_TopoLevel *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Face(xdrs, objp) register XDR *xdrs; ecs_Face *objp; { register long *buf; if (!xdr_int(xdrs, &objp->id)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->edgeid.edgeid_val, (u_int *) &objp->edgeid.edgeid_len, ~0, sizeof (int), (xdrproc_t) xdr_int)) return (FALSE); return (TRUE); } bool_t xdr_ecs_AreaPrim(xdrs, objp) register XDR *xdrs; ecs_AreaPrim *objp; { register long *buf; if (!xdr_ecs_TopoLevel(xdrs, &objp->level)) return (FALSE); switch (objp->level) { case Level012: if (!xdr_array(xdrs, (char **)&objp->ecs_AreaPrim_u.edgeid.edgeid_val, (u_int *) &objp->ecs_AreaPrim_u.edgeid.edgeid_len, ~0, sizeof (int), (xdrproc_t) xdr_int)) return (FALSE); break; case Level3: if (!xdr_array(xdrs, (char **)&objp->ecs_AreaPrim_u.fedgeid.fedgeid_val, (u_int *) &objp->ecs_AreaPrim_u.fedgeid.fedgeid_len, ~0, sizeof (ecs_Face), (xdrproc_t) xdr_ecs_Face)) return (FALSE); break; } return (TRUE); } bool_t xdr_ecs_Geometry(xdrs, objp) register XDR *xdrs; ecs_Geometry *objp; { register long *buf; if (!xdr_ecs_Family(xdrs, &objp->family)) return (FALSE); switch (objp->family) { case Area: if (!xdr_ecs_Area(xdrs, &objp->ecs_Geometry_u.area)) return (FALSE); break; case Line: if (!xdr_ecs_Line(xdrs, &objp->ecs_Geometry_u.line)) return (FALSE); break; case Point: if (!xdr_ecs_Point(xdrs, &objp->ecs_Geometry_u.point)) return (FALSE); break; case Matrix: if (!xdr_ecs_Matrix(xdrs, &objp->ecs_Geometry_u.matrix)) return (FALSE); break; case Image: if (!xdr_ecs_Image(xdrs, &objp->ecs_Geometry_u.image)) return (FALSE); break; case Text: if (!xdr_ecs_Text(xdrs, &objp->ecs_Geometry_u.text)) return (FALSE); break; case Node: if (!xdr_ecs_Node(xdrs, &objp->ecs_Geometry_u.node)) return (FALSE); break; case Edge: if (!xdr_ecs_Edge(xdrs, &objp->ecs_Geometry_u.edge)) return (FALSE); break; case Ring: if (!xdr_ecs_AreaPrim(xdrs, &objp->ecs_Geometry_u.ring)) return (FALSE); break; } return (TRUE); } bool_t xdr_ecs_Object(xdrs, objp) register XDR *xdrs; ecs_Object *objp; { register long *buf; if (!xdr_string(xdrs, &objp->Id, ~0)) return (FALSE); if (!xdr_ecs_Geometry(xdrs, &objp->geom)) return (FALSE); if (!xdr_string(xdrs, &objp->attr, ~0)) return (FALSE); if (!xdr_double(xdrs, &objp->xmin)) return (FALSE); if (!xdr_double(xdrs, &objp->ymin)) return (FALSE); if (!xdr_double(xdrs, &objp->xmax)) return (FALSE); if (!xdr_double(xdrs, &objp->ymax)) return (FALSE); return (TRUE); } bool_t xdr_ecs_AttributeFormat(xdrs, objp) register XDR *xdrs; ecs_AttributeFormat *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ObjAttribute(xdrs, objp) register XDR *xdrs; ecs_ObjAttribute *objp; { register long *buf; if (!xdr_string(xdrs, &objp->name, ~0)) return (FALSE); if (!xdr_ecs_AttributeFormat(xdrs, &objp->type)) return (FALSE); if (!xdr_int(xdrs, &objp->lenght)) return (FALSE); if (!xdr_int(xdrs, &objp->precision)) return (FALSE); if (!xdr_int(xdrs, &objp->nullable)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ObjAttributeFormat(xdrs, objp) register XDR *xdrs; ecs_ObjAttributeFormat *objp; { register long *buf; if (!xdr_array(xdrs, (char **)&objp->oa.oa_val, (u_int *) &objp->oa.oa_len, ~0, sizeof (ecs_ObjAttribute), (xdrproc_t) xdr_ecs_ObjAttribute)) return (FALSE); return (TRUE); } bool_t xdr_ecs_Category(xdrs, objp) register XDR *xdrs; ecs_Category *objp; { register long *buf; if (!xdr_long(xdrs, &objp->no_cat)) return (FALSE); if (!xdr_u_int(xdrs, &objp->r)) return (FALSE); if (!xdr_u_int(xdrs, &objp->g)) return (FALSE); if (!xdr_u_int(xdrs, &objp->b)) return (FALSE); if (!xdr_string(xdrs, &objp->label, ~0)) return (FALSE); if (!xdr_u_long(xdrs, &objp->qty)) return (FALSE); return (TRUE); } bool_t xdr_ecs_RasterInfo(xdrs, objp) register XDR *xdrs; ecs_RasterInfo *objp; { register long *buf; if (!xdr_long(xdrs, &objp->mincat)) return (FALSE); if (!xdr_long(xdrs, &objp->maxcat)) return (FALSE); if (!xdr_int(xdrs, &objp->width)) return (FALSE); if (!xdr_int(xdrs, &objp->height)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->cat.cat_val, (u_int *) &objp->cat.cat_len, ~0, sizeof (ecs_Category), (xdrproc_t) xdr_ecs_Category)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ResultType(xdrs, objp) register XDR *xdrs; ecs_ResultType *objp; { register long *buf; if (!xdr_enum(xdrs, (enum_t *)objp)) return (FALSE); return (TRUE); } bool_t xdr_ecs_ResultUnion(xdrs, objp) register XDR *xdrs; ecs_ResultUnion *objp; { register long *buf; if (!xdr_ecs_ResultType(xdrs, &objp->type)) return (FALSE); switch (objp->type) { case Object: if (!xdr_ecs_Object(xdrs, &objp->ecs_ResultUnion_u.dob)) return (FALSE); break; case GeoRegion: if (!xdr_ecs_Region(xdrs, &objp->ecs_ResultUnion_u.gr)) return (FALSE); break; case objAttributeFormat: if (!xdr_ecs_ObjAttributeFormat(xdrs, &objp->ecs_ResultUnion_u.oaf)) return (FALSE); break; case RasterInfo: if (!xdr_ecs_RasterInfo(xdrs, &objp->ecs_ResultUnion_u.ri)) return (FALSE); break; case AText: if (!xdr_string(xdrs, &objp->ecs_ResultUnion_u.s, ~0)) return (FALSE); break; } return (TRUE); } bool_t xdr_ecs_Result(xdrs, objp) register XDR *xdrs; ecs_Result *objp; { register long *buf; if (!xdr_int(xdrs, &objp->error)) return (FALSE); if (!xdr_string(xdrs, &objp->message, ~0)) return (FALSE); if (!xdr_ecs_ResultUnion(xdrs, &objp->res)) return (FALSE); return (TRUE); } bool_t xdr_ecs_LayerSelection(xdrs, objp) register XDR *xdrs; ecs_LayerSelection *objp; { register long *buf; if (!xdr_string(xdrs, &objp->Select, ~0)) return (FALSE); if (!xdr_ecs_Family(xdrs, &objp->F)) return (FALSE); return (TRUE); } ogdi-ogdi_4_1_0/ogdi/makefile000066400000000000000000000024021345660466700162430ustar00rootroot00000000000000# Copyright (C) 1996 Her Majesty the Queen in Right of Canada. # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of Her Majesty the Queen # in Right of Canada not be used in advertising or publicity pertaining # to distribution of the software without specific, written prior # permission. Her Majesty the Queen in Right of Canada makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. include $(TOPDIR)/config/common.mak # # Sub-directories that need to be built # subdirs = include c-api glutil attr_driver driver gltpd examples # # Default target to build everything in all sub-directories # all: $(subdirs) # # Target to allow individual sub-directories to be built # (e.g. make driver) # .PHONY: $(subdirs) $(subdirs): cd $@; $(MAKE) # # Pass specialized targets into the sub-directories # .PHONY: $(STANDARD_TARGETS) $(STANDARD_TARGETS): @for i in $(subdirs); do \ $(MAKE) --directory $$i $@; \ done ogdi-ogdi_4_1_0/ogdi/scripts/000077500000000000000000000000001345660466700162345ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/scripts/h_clean.pl000066400000000000000000000015101345660466700201570ustar00rootroot00000000000000#! /usr/bin/perl require "getopts.pl"; &Getopts('o:'); if ($#ARGV != 0) { die "Usage: $0 [-o outfile] infile\n"; } if ($opt_o) { $outfname = ">$opt_o"; } else { $outfname = '>&STDOUT'; } $infname = $ARGV[0]; open(OUTFILE, $outfname) || die "Unable to open $opt_o for writing: $!\n"; open(INFILE, $ARGV[0]) || die "Unable to open $infname for reading: $!\n"; binmode(OUTFILE); while () { push(@OUTLINES, $_); if (/^struct ecs_ResultUnion \{/) { splice(@OUTLINES, $#OUTLINES-1, 0, "typedef struct ecs_ResultUnion ecs_ResultUnion;\n"); } elsif (/^typedef struct ecs_ResultUnion ecs_ResultUnion/) { splice(@OUTLINES, $#OUTLINES, 1); } elsif (/^(.*)struct struct(.*)$/) { splice(@OUTLINES, $#OUTLINES, 1, "$1struct$2\n"); } } print OUTFILE @OUTLINES; close(OUTFILE); close(INFILE); ogdi-ogdi_4_1_0/ogdi/scripts/svc_clean.pl000066400000000000000000000073331345660466700205340ustar00rootroot00000000000000#! /usr/bin/perl require "getopts.pl"; &Getopts('o:'); if ($#ARGV != 0) { die "Usage: $0 [-o outfile] infile\n"; } if ($opt_o) { $outfname = ">$opt_o"; } else { $outfname = '>&STDOUT'; } $infname = $ARGV[0]; open(OUTFILE, $outfname) || die "Unable to open $opt_o for writing: $!\n"; open(INFILE, $ARGV[0]) || die "Unable to open $infname for reading: $!\n"; binmode(OUTFILE); while () { s/extern int _rpcpmstart/static int _rpcpmstart/; push(@OUTLINES, $_); if (/svc_freeargs/) { while () { s/extern int _rpcpmstart/static int _rpcpmstart/; push(@OUTLINES, $_); if (/^\s*\}\s*$/) { push(@OUTLINES, "\n"); push(@OUTLINES, "\tif (rqstp->rq_proc == DESTROYSERVER) {\n"); push(@OUTLINES, "#ifdef _WINDOWS\n"); push(@OUTLINES, "\t rpc_nt_exit();\n"); push(@OUTLINES, "#endif\n"); push(@OUTLINES, "\t pmap_unset(newprogramno, ECSVERS);\n"); push(@OUTLINES, "\t exit(0);\n"); push(@OUTLINES, "\t}\n\n"); last; } } } elsif (/^void start_closedown_check/) { while () { last if (/signal/); } push(@OUTLINES,$_); push(@OUTLINES, "#ifndef _WINDOWS\n"); while () { push(@OUTLINES,$_); last if (/^\}/); } push(@OUTLINES, "#endif /* ifndef _WINDOWS */\n"); } elsif (/^#include "ecs.h"/) { push(@OUTLINES, "#ifndef _WINDOWS\n"); } elsif (/^#include /) { push(@OUTLINES, "#endif /* ifndef _WINDOWS */\n"); push(@OUTLINES, "\nextern unsigned long newprogramno;\n"); } elsif (/^#include /) { push(@OUTLINES, "#if 0\n"); } elsif (/^#include /) { push(@OUTLINES, "#endif /* if 0 */\n"); } elsif (/^#include /) { push(@OUTLINES, "#if 0\n"); } elsif (/^#include /) { push(@OUTLINES, "#endif /* if 0 */\n"); } elsif (/(.*)syslog\s*\(.*,(.*)\)(.*)/) { splice(@OUTLINES, $#OUTLINES, 1); push(@OUTLINES, "$1(void) fprintf(stderr, \"%s\\n\", $2)$3\n"); } elsif (/^main\(.*\)/) { splice(@OUTLINES, $#OUTLINES-1, 2); while () { ; } } elsif (/^ecsprog_1\(/) { splice(@OUTLINES, $#OUTLINES-1, 1, "void\n"); } elsif (/^ecsproxyprog_1\(/) { splice(@OUTLINES, $#OUTLINES-1, 1, "void\n"); } elsif (/^\s*(\S*)\s*=\s*\(\*local\)/) { # Append after the line: result = (*local)(&argument, rqstp); # In the proxy, decompression occurs, but no recompression occurs push(@OUTLINES, "\tif ($1) {\n"); push(@OUTLINES, "\t\tecs_Result *tmp = (ecs_Result *) $1;\n"); if ($infname =~ /proxy/) { push(@OUTLINES, "\t\t/* Proxy to client communication is uncompressed */\n"); push(@OUTLINES, "\t\ttmp->compression.ctype = 0;\n"); push(@OUTLINES, "\t\ttmp->compression.cversion = 0;\n"); push(@OUTLINES, "\t\ttmp->compression.clevel = 0;\n"); push(@OUTLINES, "\t\ttmp->compression.cblksize = 0;\n"); push(@OUTLINES, "\t\ttmp->compression.cfullsize = 0;\n"); } else { # Is this wrong???? # push(@OUTLINES, "\t\ttmp->compression = svr_handle->compression;\n"); push(@OUTLINES, "\t\tif (svr_handle) {\n"); push(@OUTLINES, "\t\t\ttmp->compression = svr_handle->compression;\n"); push(@OUTLINES, "\t\t} else {\n"); push(@OUTLINES, "\t\t\t/* This will occur after a DESTROYSERVER call */\n"); push(@OUTLINES, "\t\t\ttmp->compression.ctype = ECS_COMPRESS_NONE;\n"); push(@OUTLINES, "\t\t\ttmp->compression.cversion = 0;\n"); push(@OUTLINES, "\t\t\ttmp->compression.clevel = 0;\n"); push(@OUTLINES, "\t\t\ttmp->compression.cblksize = 0;\n"); push(@OUTLINES, "\t\t\ttmp->compression.cfullsize = 0;\n"); push(@OUTLINES, "\t\t\ttmp->compression.cachesize = 0;\n"); push(@OUTLINES, "}\t\t\n"); } push(@OUTLINES, "\t}\n"); } } print OUTFILE @OUTLINES; close(OUTFILE); close(INFILE); ogdi-ogdi_4_1_0/ogdi/scripts/xdr_clean.pl000066400000000000000000000014601345660466700205310ustar00rootroot00000000000000#! /usr/bin/perl require "getopts.pl"; &Getopts('o:'); if ($#ARGV != 0) { die "Usage: $0 [-o outfile] infile\n"; } if ($opt_o) { $outfname = ">$opt_o"; } else { $outfname = '>&STDOUT'; } $infname = $ARGV[0]; open(OUTFILE, $outfname) || die "Unable to open $opt_o for writing: $!\n"; open(INFILE, $ARGV[0]) || die "Unable to open $infname for reading: $!\n"; binmode(OUTFILE); while () { push(@OUTLINES, $_); if (/^xdr_ecs_Result\s*\((.*)\)\s*$/) { splice(@OUTLINES, $#OUTLINES, 1, "xdr_ecs_Result_Work($1)\n"); while () { if (! /xdr_ecs_Compression/) { push(@OUTLINES, $_); } else { while () { if (/xdr_int/) { push(@OUTLINES, $_); last; } } last; } } } } print OUTFILE @OUTLINES; close(OUTFILE); close(INFILE); ogdi-ogdi_4_1_0/ogdi/tcl_interface/000077500000000000000000000000001345660466700173475ustar00rootroot00000000000000ogdi-ogdi_4_1_0/ogdi/tcl_interface/.cvsignore000066400000000000000000000000061345660466700213430ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/ogdi/tcl_interface/ecs_tcl.c000066400000000000000000001457251345660466700211450ustar00rootroot00000000000000/****************************************************************************** * * Component: OGDI Tcl Binding * Purpose: Contains all function bindings. * ****************************************************************************** * Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc * Permission to use, copy, modify and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies, that * both the copyright notice and this permission notice appear in * supporting documentation, and that the name of L.A.S. Inc not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. L.A.S. Inc. makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. ****************************************************************************** * * $Log$ * Revision 1.6 2007-02-12 16:04:21 cbalint * More warrning fixes in tcl and odbc plugins. * * Revision 1.5 2001/04/09 15:04:35 warmerda * applied new source headers * */ #include "ecs.h" #include "tcl.h" char *ecstcl_message[] = { /* 0 */ "wrong number of args: should be ", /* 1 */ "URLdescriptor", /* 2 */ "URL unknown:", /* 3 */ "Family", /* 4 */ "Request", /* 5 */ "Error: The family appears to be invalid. Must be one of \"Area, Line, Point, Matrix, Image, Text, Edge, Face, Node, Ring\".", /* 6 */ "TclArrayVariable", /* 7 */ "Region", /* 8 */ "Error: The region is invalid. It should be in the form {N S E W NS_resolution EW_resolution} where N>S and E>W.", /* 9 */ "Error: This doesn't appear to be a valid itcl_class dictionary", /* 10 */ "ID", /* 11 */ "Projection", /* 12 */ "Error: unable to get list of URLs", /* 13 */ "TclCallbackProc", /* 14 */ "Callback procedure removed.", /* 15 */ "LanguageNumber", /* 16 */ "This was an unknown return type", /* 17 */ "Cannot set the tcl array variable", /* 18 */ "DictionaryString", /* 19 */ "CompressType", /* 20 */ "CompressVersion", /* 21 */ "CompressLevel", /* 22 */ "CompressBlksize", /* 23 */ "CacheSize", }; struct ecs_UserData { int ClientID; char *ObjID; char *proc; char *tclvar; }; typedef struct ecs_UserData ecs_UserData; int ecs_SetClientProjectionList _ANSI_ARGS_((Tcl_Interp *interp,int ClientID, char *list)); int ecs_SetGeoRegionList _ANSI_ARGS_((Tcl_Interp *interp,ecs_Region *gr,char *list)); int ecs_CreateClientCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp,int argc, const char **argv)); int ecs_DestroyClientCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SelectLayerCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_ReleaseLayerCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SelectRegionCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SelectMaskCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_UnSelectMaskCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetDictionaryCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetAttributesFormatCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetNextObjectCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetRasterInfoCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetObjectCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetObjectIdFromCoordCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_UpdateDictionaryCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetServerProjectionCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetGlobalBoundCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_GetURLListCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_AssignTclFunctionCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SetCacheCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_LoadCacheCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_ReleaseCacheCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SetServerLanguageCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); int ecs_SetCompressionCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); static int _interpEcsResult _ANSI_ARGS_((Tcl_Interp *interp, ecs_Result *result, ecs_UserData *userdata)); static int _interpObject _ANSI_ARGS_((Tcl_Interp *interp, ecs_Result *result, char *buffer, ecs_UserData *userdata)); static int _interpArea _ANSI_ARGS_((Tcl_Interp *interp, ecs_Area *area, char *buffer)); static int _interpMatrix _ANSI_ARGS_((Tcl_Interp *interp, ecs_Matrix *matrix, char *buffer)); static int _interpImage _ANSI_ARGS_((Tcl_Interp *interp, ecs_Image *image, char *buffer)); static int _interpRegion _ANSI_ARGS_((Tcl_Interp *interp, ecs_Region *region, char *buffer)); static int _interpRasterInfo _ANSI_ARGS_((Tcl_Interp *interp, ecs_RasterInfo *raster, char *buffer)); static int _interpCoord _ANSI_ARGS_((Tcl_Interp *interp, ecs_Coordinate *coord, char *buffer)); static int _interpCategory _ANSI_ARGS_((Tcl_Interp *interp, ecs_Category *category, char *buffer)); static int _interpObjAttribute _ANSI_ARGS_((Tcl_Interp *interp, ecs_ObjAttribute *oa, char *buffer)); static int _interpObjAttributeFormat _ANSI_ARGS_((Tcl_Interp *interp, ecs_ObjAttributeFormat *oaf, char *buffer, ecs_UserData *userdata)); static int _GetLayer _ANSI_ARGS_((Tcl_Interp *interp, char *family, char *request, ecs_LayerSelection *layer)); static int _getObjectFromTclProc _ANSI_ARGS_((Tcl_Interp *interp, char *proc, char *ObjID, char *tclvar, int ClientID)); int _getAttributesFromTCLProc _ANSI_ARGS_((Tcl_Interp *interp, char *proc, char *tclvar, int ClientID)); int Ecs_Init(interp) Tcl_Interp *interp; /* Interpreter to add extra commands */ { Tcl_CreateCommand(interp, "ecs_CreateClient", ecs_CreateClientCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_DestroyClient", ecs_DestroyClientCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SelectLayer", ecs_SelectLayerCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_ReleaseLayer", ecs_ReleaseLayerCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SelectRegion", ecs_SelectRegionCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SelectMask", ecs_SelectMaskCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_UnSelectMask", ecs_UnSelectMaskCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetDictionary", ecs_GetDictionaryCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetNextObject", ecs_GetNextObjectCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetAttributesFormat", ecs_GetAttributesFormatCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetRasterInfo", ecs_GetRasterInfoCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetObject", ecs_GetObjectCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetObjectIdFromCoord", ecs_GetObjectIdFromCoordCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_UpdateDictionary", ecs_UpdateDictionaryCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetServerProjection", ecs_GetServerProjectionCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetURLList", ecs_GetURLListCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_GetGlobalBound", ecs_GetGlobalBoundCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_AssignTclAttributeCallback", ecs_AssignTclFunctionCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_LoadCache", ecs_LoadCacheCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_ReleaseCache", ecs_ReleaseCacheCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SetCache", ecs_SetCacheCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SetServerLanguage", ecs_SetServerLanguageCmd, (ClientData) 0, NULL); Tcl_CreateCommand(interp, "ecs_SetCompression", ecs_SetCompressionCmd, (ClientData) 0, NULL); /* globalinterp = interp; */ return TCL_OK; } int Ecs_tcl_Init(Tcl_Interp *interp ) { return Ecs_Init( interp ); } /* *---------------------------------------------------------------------- * * ecs_Init -- * * Basically an alias for Ecs_Init. The load command in the * Sun Tcl distribution wants the initialization routine to * begin with a capital letter. Oblige it without breaking * the old initialization routine. * * Results: * A standard TCL result * *---------------------------------------------------------------------- */ int ecs_Init(interp) Tcl_Interp *interp; /* Interpreter to add extra commands */ { return Ecs_Init(interp); } /********************/ /* ecs_CreateClientCmd arg1: URL Cette fonction cree le client et etablit une connection entre ce client et un serveur identifie par URL. Cette fonction s'occupe de la creation du client et lui assigne une projection geographique. */ int ecs_CreateClientCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Result *result; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); return(TCL_ERROR); } /* Creation du client */ result = cln_CreateClient(&ClientID,(char *)argv[1]); if (result->error > 0) { _interpEcsResult(interp,result,NULL); return TCL_ERROR; } Tcl_AppendResult(interp, argv[1], (char *) NULL); return TCL_OK; } /********************/ /* ecs_DestroyClientCmd arg1: URL Detruit un client et disconnecte le disconnecte du serveur correspondant */ int ecs_DestroyClientCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp,cln_DestroyClient(ClientID), NULL); } /* _GetLayer arg1: interp arg2: Family arg3: Request arg4: Layer creates an ecs_Layer from the arguments */ static int _GetLayer(interp,family,request,layer) Tcl_Interp *interp; char *family; char *request; ecs_LayerSelection *layer; { char c; size_t length; c = family[0]; length = strlen(family); layer->Select=request; /* if ((c == 'M') && (strncmp(family, "Meta", length) == 0)) { layer->F = Meta; return TCL_OK; }*/ if ((c == 'L') && (strncmp(family, "Line", length) == 0)) { layer->F = Line; return TCL_OK; } if ((c == 'P') && (strncmp(family, "Point", length) == 0)) { layer->F = Point; return TCL_OK; } if ((c == 'A') && (strncmp(family, "Area", length) == 0)) { layer->F = Area; return TCL_OK; } if ((c == 'T') && (strncmp(family, "Text", length) == 0)) { layer->F = Text; return TCL_OK; } if ((c == 'M') && (strncmp(family, "Matrix", length) == 0)) { layer->F = Matrix; return TCL_OK; } if ((c == 'I') && (strncmp(family, "Image", length) == 0)) { layer->F = Image; return TCL_OK; } if ((c == 'E') && (strncmp(family, "Edge", length) == 0)) { layer->F = Edge; return TCL_OK; } if ((c == 'F') && (strncmp(family, "Face", length) == 0)) { layer->F = Face; return TCL_OK; } if ((c == 'N') && (strncmp(family, "Node", length) == 0)) { layer->F = Node; return TCL_OK; } if ((c == 'R') && (strncmp(family, "Ring", length) == 0)) { layer->F = Ring; return TCL_OK; } Tcl_AppendResult(interp, ecstcl_message[5],(char *) NULL); layer= NULL; return TCL_ERROR; } /********************/ /* ecs_SelectLayerCmd arg 1: URL arg 2: Family arg 3-fin: Request Defini le coverage actuel pour un client donne. Ce coverage sera considere par toutes les autres fonctions. */ int ecs_SelectLayerCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { ecs_LayerSelection layer; int ClientID; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1]," ", ecstcl_message[3], " ", ecstcl_message[4], "\"", (char *) NULL); /* Tcl_AppendResult(interp, ""wrong # args: should be \"", argv[0], " URLdescriptor Family Request\"", 0);*/ return(TCL_ERROR); } ClientID = cln_GetClientIdFromURL((char *)argv[1]); if (ClientID < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if ((_GetLayer(interp, (char *)argv[2],(char *)argv[3],&layer)) != TCL_OK) { /* GetLayer appends its own error message */ return TCL_ERROR; } return _interpEcsResult(interp,cln_SelectLayer(ClientID,&layer), NULL); } /********************/ /* ecs_ReleaseLayerCmd arg 1: URL arg 2: Family arg 3-fin: Request */ int ecs_ReleaseLayerCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_LayerSelection layer; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1]," ", ecstcl_message[3], " ", ecstcl_message[4], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor Family Request ...\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if ((_GetLayer(interp, (char *)argv[2],(char *)argv[3], &layer)) != TCL_OK) { /* GetLayer returns its own error msg to the interp */ return TCL_ERROR; } return _interpEcsResult(interp,cln_ReleaseLayer(ClientID,&layer), NULL); } /********************/ /* ecs_SelectRegionCmd arg 1: URL arg 2: {Region} Met a jour la region geographique courante. Tous les objects geographiques seront contenu dans cette region. */ int ecs_SelectRegionCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int j; int ClientID; ecs_Region GR; if (argc != 3) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[7], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor Region\"", 0); */ return(TCL_ERROR); } if ((j=ecs_SetGeoRegionList(interp,&GR,(char *)argv[2])) == ECS_FAILURE) { /* region is invalid */ Tcl_AppendResult(interp,ecstcl_message[8], (char *) NULL); return TCL_ERROR; } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp,cln_SelectRegion(ClientID,&GR), NULL); /* Tcl_AppendResult(interp, argv[2]," is selected for ", argv[1], (char *) NULL); */ } /********************/ int ecs_SelectMaskCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int largc; const char **largv; int pargc; const char **pargv; ecs_FeatureRing poly; int i; int isInclusive; int ClientID; if (argc != 4) { Tcl_AppendResult(interp, "ecs_SelectMask url {isMaskInclusive (0 or 1)} {list of points {X Y} } ", (char *) NULL); return TCL_ERROR; } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if (Tcl_GetInt(interp, argv[2], &isInclusive) != TCL_OK) { return TCL_ERROR; } /* Convert the points into a ecs_FeatureRing */ Tcl_ResetResult(interp); if ((Tcl_SplitList(interp,argv[3],&largc,&largv) != TCL_OK) || (largc < 0)) { return TCL_ERROR; } poly.c.c_len = largc; poly.c.c_val = malloc(sizeof(ecs_Coordinate)*largc); if (poly.c.c_val == NULL) { ckfree((char *)largv); return TCL_ERROR; } for (i=0;ierror > 0) { _interpEcsResult(interp,result,NULL); return TCL_ERROR; } /* if (TclRegExec(itclclass,dictionary,NULL) == 0) { */ dictionary=result->res.ecs_ResultUnion_u.s; if (Tcl_RegExpExec(interp,itclclass,dictionary,NULL) <= 0) { Tcl_ResetResult(interp); Tcl_AppendResult(interp,ecstcl_message[9], (char *) NULL); return TCL_ERROR; } Tcl_RegExpRange(itclclass,0,&startp,&endp); class_len = endp - startp; if (class_len > 127) {class_len=127;} /* strncpy(class,itclclass->startp[1],class_len); */ strncpy(class,startp,class_len); class[class_len] = '\0'; Tcl_AppendElement(interp,class); Tcl_AppendElement(interp,dictionary); return TCL_OK; } /********************/ /* ecs_GetAttributesFormatCmd arg 1: URL Retourne le format des attributs d'un coverage quelconque. */ int ecs_GetAttributesFormatCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { ecs_Result *result; ecs_UserData userdata; int ClientID; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } userdata.ClientID=ClientID; userdata.ObjID=NULL; userdata.proc=cln_GetTclProc(ClientID); userdata.tclvar=NULL; result=cln_GetAttributesFormat(ClientID); /* todo: move this to ecsResult */ return(_interpEcsResult(interp,result,&userdata)); } /********************/ /* ecs_GetNextObjectCmd arg 1: URL arg 2: tclArrayVariable */ int ecs_GetNextObjectCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Result *result; ecs_UserData userdata; if (argc != 3) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[6], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor tclArrayVariable\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } userdata.ClientID=ClientID; userdata.tclvar=(char *)argv[2]; result = cln_GetNextObject(ClientID); return (_interpEcsResult(interp, result, &userdata)); } /********************/ /* ecs_GetRasterInfoCmd arg 1: URL */ int ecs_GetRasterInfoCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Result *result; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } result= cln_GetRasterInfo(ClientID); return(_interpEcsResult(interp,result,NULL)); } /*******************/ static int _getObjectFromTclProc(interp, proc, ObjID, tclvar, ClientID) Tcl_Interp *interp; char *proc; char *ObjID; char *tclvar; int ClientID; { char buffer[256]; sprintf(buffer,"%s %d %s %s", proc, ClientID, ObjID, tclvar); return (Tcl_Eval(interp, buffer)); } /*******************/ static int _getAttributesFromTclProc(interp, proc, tclvar, ClientID) Tcl_Interp *interp; char *proc; char *tclvar; int ClientID; { char buffer[256]; sprintf(buffer,"%s %d %s{} {}", proc, ClientID, tclvar); return (Tcl_Eval(interp, buffer)); } /********************/ /* ecs_GetObjectCmd arg 1: URL arg 2: */ int ecs_GetObjectCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Result *result; ecs_UserData userdata; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[10], " ", ecstcl_message[6], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor ID tclArrayVariable\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } result = cln_GetObject(ClientID,(char *)argv[2]); /* if there is an error in GetObject, return */ userdata.tclvar=(char *)argv[3]; userdata.ClientID=ClientID; userdata.ObjID=(char *)argv[2]; return (_interpEcsResult(interp, result, &userdata)); } /********************/ /* ecs_GetObjectIdFromCoordCmd arg 1: URL arg 2: X arg 3: Y Retourne l'identifiant de l'objet se trouve le plus pres du point X,Y dans le coverage courant, peu importe le type de l'objet. */ int ecs_GetObjectIdFromCoordCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Coordinate coordinate; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " X Y\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor X Y\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } coordinate.x=atof(argv[2]); coordinate.y=atof(argv[3]); return _interpEcsResult(interp, cln_GetObjectIdFromCoord(ClientID,&coordinate),NULL); } /********************/ /* ecs_UpdateDictionaryCmd arg 1: URL arg 2: ?dictionary String? Retourne une liste de toutes les coverages geographiques disponibles du cote du serveur. Le dictionnaire de donnees retourne par GetDictionary est en mesure de lire ces informations. */ int ecs_UpdateDictionaryCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; if (argc < 2 || argc > 3) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ?", ecstcl_message[18], "?\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor dictionaryString\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if (argc == 2) { return _interpEcsResult(interp,cln_UpdateDictionary(ClientID,NULL),NULL); } else { return _interpEcsResult(interp,cln_UpdateDictionary(ClientID,(char *)argv[2]),NULL); } } /********************/ /* ecs_GetServerProjectionCmd arg 1: URL Retourne la projection geographique d'un serveur donne. */ int ecs_GetServerProjectionCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp, cln_GetServerProjection(ClientID),NULL); } /********************/ /* ecs_GetGlobalBoundCmd arg 1: URL Retourne la region geographique globale des donnees contenu par le serveur. */ int ecs_GetGlobalBoundCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; if (argc != 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp,cln_GetGlobalBound(ClientID),NULL); return TCL_OK; } /********************/ /* ecs_GetURLListCmd Retourne la liste des URL valides */ int ecs_GetURLListCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int j; char *Liste; j = cln_GetURLList(&Liste); if (!j) { Tcl_AppendResult(interp,ecstcl_message[12], (char *) NULL); return TCL_ERROR; } Tcl_AppendResult(interp,Liste, (char *) NULL); return TCL_OK; } /********************/ /* ecs_AssignTclFunctionCmd arg 1: URL arg 2: tcl command Assigne une fonction TCL pour gerer les attributs pour un coverage donne. */ int ecs_AssignTclFunctionCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; if (argc < 2) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ?", ecstcl_message[13],"?\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor tclcommand \" or \"", argv[0], " URLdescriptor\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if (argc == 2) { cln_SetTclProc(ClientID, NULL); Tcl_AppendResult(interp,ecstcl_message[14], (char *) NULL); return TCL_OK; } else { cln_SetTclProc(ClientID,(char *)argv[2]); Tcl_AppendResult(interp, argv[2], (char *) NULL); return TCL_OK; } return TCL_OK; } /********************/ /* ecs_SetCacheCmd arg 1: URL arg 2: {Region} Met a jour la region que seront occupes par les caches. */ int ecs_SetCacheCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int j; int ClientID; ecs_Region GR; char *string; if (argc != 3) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[7], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor Region\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if ((j = ecs_SetGeoRegionList(interp,&GR,(char *)argv[2])) != ECS_SUCCESS) { Tcl_AppendResult(interp,ecstcl_message[8], (char *) NULL); return TCL_ERROR; } if (!cln_SetRegionCaches(ClientID,&GR,&string)) { Tcl_AppendResult(interp,string, (char *) NULL); /*"Error: ecs_SetCache failed. ", (char *) NULL); */ return TCL_ERROR; } Tcl_AppendResult(interp,argv[2], (char *) NULL); return TCL_OK; } /********************/ /* ecs_LoadCacheCmd arg 1: URL arg 2: Family arg 3-fin: Request Charge les objets geographiques d'une region quelconque dans une cache pour accelerer l'acces aux objets geographiques. */ int ecs_LoadCacheCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; int j; ecs_LayerSelection layer; char *errorMsg; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[3], " ", ecstcl_message[4], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor Family Request\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if ((_GetLayer(interp,(char *)argv[2],(char *)argv[3],&layer)) != TCL_OK) { return TCL_ERROR; } j = cln_LoadCache(ClientID,&layer,&errorMsg); if (!j) { Tcl_AppendResult(interp,errorMsg, (char *) NULL); return TCL_ERROR; } Tcl_AppendResult(interp,argv[3], (char *) NULL); return TCL_OK; } /********************/ /********************/ /* ecs_ReleaseCacheCmd arg 1: URL arg 2: Family arg 3-fin: Request Detruit une cache */ int ecs_ReleaseCacheCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; int j; ecs_LayerSelection layer; char *errorMsg; if (argc != 4) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[3], " ", ecstcl_message[4], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor Family Request\"", 0); */ return(TCL_ERROR); } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } if ((_GetLayer(interp,(char *)argv[2],(char *)argv[3],&layer)) != TCL_OK) { return TCL_ERROR; } j = cln_ReleaseCache(ClientID,&layer,&errorMsg); if (!j) { Tcl_AppendResult(interp,errorMsg, (char *) NULL); return TCL_ERROR; } return TCL_OK; } int ecs_SetServerLanguageCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID, num; if (argc != 3) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[15], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor LanguageNumber\"", 0); */ return(TCL_ERROR); } if (Tcl_GetInt(interp, argv[2], &num) != TCL_OK) { return TCL_ERROR; } if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp, cln_SetServerLanguage(ClientID, num),NULL); } /* *---------------------------------------------------------------------- * ecs_SetCompressionCmd -- * * Sets the compression parameters in the server. Parameters are: * type: 0 = none, 1 = zlib; no others supported right now * version: 0 is only version supported right now * level: 1-9 where 1 is fastest, 9 compresses best. If 0, gets * the server's default compression level. * blksize: Size of the blocks that are compressed at a time. If 0, * gets the server's default compression blocksize * * Results: * Standard Tcl result *---------------------------------------------------------------------- */ int ecs_SetCompressionCmd(clientData,interp,argc,argv) ClientData clientData; Tcl_Interp *interp; int argc; const char **argv; { int ClientID; ecs_Compression c; if (argc != 7) { Tcl_AppendResult(interp, ecstcl_message[0],"\"", argv[0], " ",ecstcl_message[1], " ", ecstcl_message[19], " ", ecstcl_message[20], " ", ecstcl_message[21], " ", ecstcl_message[22], " ", ecstcl_message[23], "\"", (char *) NULL); /* Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " URLdescriptor type version level blksize cachesize\"", 0); */ return(TCL_ERROR); } if (Tcl_GetInt(interp, argv[2],(int *) &c.ctype) != TCL_OK) { return TCL_ERROR; } if (Tcl_GetInt(interp, argv[3],(int *) &c.cversion) != TCL_OK) { return TCL_ERROR; } if (Tcl_GetInt(interp, argv[4],(int *) &c.clevel) != TCL_OK) { return TCL_ERROR; } if (Tcl_GetInt(interp, argv[5],(int *) &c.cblksize) != TCL_OK) { return TCL_ERROR; } if (Tcl_GetInt(interp, argv[6],(int *) &c.cachesize) != TCL_OK) { return TCL_ERROR; } c.cfullsize = 0; if ((ClientID = cln_GetClientIdFromURL((char *)argv[1])) < 0) { /* url unknown */ Tcl_AppendResult(interp,ecstcl_message[2], " ", argv[1], (char *) NULL); return TCL_ERROR; } return _interpEcsResult(interp, cln_SetCompression(ClientID, &c),NULL); } /********************/ /********************/ int ecs_SetGeoRegionList(interp,gr,liste) Tcl_Interp *interp; ecs_Region *gr; char *liste; { int argc; const char **argv; int code = ECS_FAILURE; if (Tcl_SplitList(interp,liste,&argc,&argv) != TCL_OK) { return ECS_FAILURE; } if (argc == 6) { gr->north = atof(argv[0]); gr->south = atof(argv[1]); gr->east = atof(argv[2]); gr->west = atof(argv[3]); gr->ns_res = atof(argv[4]); gr->ew_res = atof(argv[5]); if ((gr->north>gr->south) && (gr->east>gr->west) && (gr->ns_res > 0) && (gr->ew_res > 0)) { if (((gr->north-gr->south)> gr->ns_res) && ((gr->east-gr->west)> gr->ew_res)) code = ECS_SUCCESS; } } free((char *) argv); return code; } /********************/ /* _interpEcsResult arg 1: interp arg 2: result arg 3: userdata Convert ecs_Result into a string and give it to the interpreter given by interp. "userdata" is a ptr to a structure of miscellany that can be passed in. (if it is null, then there is no data.) */ static int _interpEcsResult(interp, result, userdata) Tcl_Interp *interp; ecs_Result *result; ecs_UserData *userdata; { char buffer[200]; Tcl_ResetResult(interp); /* check for error */ if (result->error > 0) { Tcl_AppendResult(interp,result->message,(char*) NULL); /* also set errorCode here */ sprintf(buffer,"%d",result->error); Tcl_SetErrorCode(interp,"ECS",buffer,(char*) NULL); return TCL_ERROR; } /* switch on ecs_ResultUnion */ switch (result->res.type) { case Object: _interpObject(interp,result,buffer,userdata); break; case GeoRegion: _interpRegion(interp, &(result->res.ecs_ResultUnion_u.gr),buffer); break; case objAttributeFormat: _interpObjAttributeFormat(interp, &(result->res.ecs_ResultUnion_u.oaf),buffer,userdata); break; case RasterInfo: _interpRasterInfo(interp, &(result->res.ecs_ResultUnion_u.ri),buffer); break; case AText: Tcl_AppendResult(interp,result->res.ecs_ResultUnion_u.s, (char *) NULL ); break; default: Tcl_AppendResult(interp, "OK", (char *) NULL ); break; } /* Tcl_AppendResult(interp, tmp, (char *) NULL ); */ return TCL_OK; } /********************/ /* _interpObjAttributeFormat arg 1: interp arg 2: oaf arg 3: a pointer to some space arg 4: the user's data given an ecs_ObjAttributeFormat, appends whatever is in it into interp in the form: {<_interpObjAttribute1> <_interpObjAttribute2> ...} */ static int _interpObjAttributeFormat(interp, oaf, buffer, userdata) Tcl_Interp *interp; ecs_ObjAttributeFormat *oaf; char *buffer; ecs_UserData *userdata; { u_int i; if (userdata != NULL && userdata->proc != NULL) { return(_getAttributesFromTclProc(interp, userdata->proc, userdata->tclvar, userdata->ClientID)); } for(i=0; ioa.oa_len; i++) { _interpObjAttribute(interp, &(oaf->oa.oa_val[i]),buffer); } return TCL_OK; } /********************/ /* _interpObjAttribute arg 1: interp arg 2: oa arg 3: a pointer to some space given an ecs_ObjAttribute, appends whatever is in it into interp in the form: {name type length precision nullable} */ static int _interpObjAttribute(interp, oa, buffer) Tcl_Interp *interp; ecs_ObjAttribute *oa; char* buffer; { Tcl_AppendResult(interp,"{ ",(char *) NULL); Tcl_AppendResult(interp, "\"", oa->name, "\"", (char *) NULL); switch (oa->type) { case Char: Tcl_AppendElement(interp, "CHAR"); break; case Varchar: Tcl_AppendElement(interp, "VARCHAR"); break; case Longvarchar: Tcl_AppendElement(interp, "LONGVARCHAR"); break; case Decimal: Tcl_AppendElement(interp, "DECIMAL"); break; case Numeric: Tcl_AppendElement(interp, "NUMERIC"); break; case Smallint: Tcl_AppendElement(interp, "SMALLINT"); break; case Integer: Tcl_AppendElement(interp, "INTEGER"); break; case Real: Tcl_AppendElement(interp, "REAL"); break; case Float: Tcl_AppendElement(interp, "FLOAT"); break; case Double: Tcl_AppendElement(interp, "DOUBLE"); break; default: Tcl_AppendElement(interp, "UNKNOWNTYPE"); break; } sprintf(buffer," %d %d %d } ", oa->lenght, oa->precision, oa->nullable ); Tcl_AppendResult(interp,buffer,(char *) NULL); return TCL_OK; } /********************/ /* _interpRasterInfo arg 1: interp arg 2: raster arg 3: a pointer to some space given an ecs_RasterInfo, appends whatever is in it into interp in the form: {mincat maxcat} {<_interpCategory1> <_interpCategory2> ...} */ static int _interpRasterInfo (interp, raster, buffer) Tcl_Interp *interp; ecs_RasterInfo *raster; char *buffer; { u_int i; sprintf(buffer,"{%ld %ld %d %d}", raster->mincat, raster->maxcat, raster->width, raster->height ); Tcl_AppendResult(interp, buffer, " { ", (char *) NULL); for (i=0; i< raster->cat.cat_len; i++) { _interpCategory(interp,&(raster->cat.cat_val[i]),buffer); } Tcl_AppendResult(interp, " }", (char *) NULL); return TCL_OK; } /********************/ /* _interpCategory arg 1: interp arg 2: category arg 3: a pointer to some space given an ecs_Category, appends whatever is in it into interp in the form: {no_cat r g b label qty} */ static int _interpCategory(interp, category, buffer) Tcl_Interp *interp; ecs_Category *category; char *buffer; { Tcl_AppendResult(interp,"{",(char*) NULL); sprintf(buffer, "%ld %u %u %u", category->no_cat, category->r, category->g, category->b ); Tcl_AppendResult(interp, buffer, (char *) NULL); Tcl_AppendElement(interp, category->label); sprintf(buffer," %lu",category->qty); Tcl_AppendResult(interp, buffer, (char *) NULL); Tcl_AppendResult(interp," } ",(char*) NULL); return TCL_OK; } /********************/ /********************/ /* _interpObject arg 1: interp arg 2: result arg 3: a pointer to some space Convert ecs_Result, into a tcl string of the form: {id attr {xmin ymin xmax ymax} type { }} { type Id {} {xmin ymin xmax ymax} } and adds lines of attributes into a tcl array whose name is in "tclvar" */ static int _interpObject(interp,result,buffer,userdata) Tcl_Interp *interp; ecs_Result *result; char *buffer; ecs_UserData *userdata; { u_int i; /* switch on the ecs_Geometry family type */ switch (result->res.ecs_ResultUnion_u.dob.geom.family) { case Area: /* Area */ Tcl_AppendResult (interp, "Area ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); _interpArea(interp, &(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area), buffer); break; case Line: /* Line */ Tcl_AppendResult (interp, "Line ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); Tcl_AppendResult (interp, " { ", (char *) NULL); for (i=0; ires.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_len; i++) { _interpCoord (interp,&(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[i]),buffer); } Tcl_AppendResult (interp, " } ", (char *) NULL); break; case Point: /* Point */ Tcl_AppendResult (interp, "Point ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); _interpCoord(interp, &(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.point.c), buffer); break; case Matrix: /* Matrix */ Tcl_AppendResult (interp, "Matrix ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); _interpMatrix(interp, &(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix), buffer); break; case Image: /* Image */ Tcl_AppendResult (interp, "Image ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); _interpImage(interp, &(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.image), buffer); break; case Text: /* Text */ Tcl_AppendResult (interp, "Text ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); Tcl_AppendElement (interp, result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.text.desc); _interpCoord (interp, &(result->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.text.c), buffer); break; case Edge: /* Edge */ Tcl_AppendResult (interp, "Edge ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); break; case Face: /* Face */ Tcl_AppendResult (interp, "Face ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); break; case Node: /* Node */ Tcl_AppendResult (interp, "Node ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); break; case Ring: /* Ring */ Tcl_AppendResult (interp, "Ring ", (char *) NULL); Tcl_AppendElement(interp, result->res.ecs_ResultUnion_u.dob.Id); break; default: Tcl_AppendResult(interp, ecstcl_message[16], (char *) NULL ); break; } /* the bounding box */ sprintf(buffer,"%lf %lf %lf %lf ", result->res.ecs_ResultUnion_u.dob.xmin, result->res.ecs_ResultUnion_u.dob.ymin, result->res.ecs_ResultUnion_u.dob.xmax, result->res.ecs_ResultUnion_u.dob.ymax ); Tcl_AppendElement(interp, buffer); /* Set the array - if tcl proc exists for this client, call it, else use returned attributes. */ if ((userdata->proc=cln_GetTclProc(userdata->ClientID)) != NULL) { return(_getObjectFromTclProc(interp, userdata->proc, userdata->ObjID, userdata->tclvar, userdata->ClientID)); } else { Tcl_UnsetVar(interp,userdata->tclvar, TCL_GLOBAL_ONLY); if (Tcl_SetVar2(interp,userdata->tclvar, "0", result->res.ecs_ResultUnion_u.dob.attr, TCL_GLOBAL_ONLY) == NULL) { Tcl_ResetResult(interp); /* sprintf(buffer, "Cannot set tcl array variable ""\"%s\".", userdata->tclvar); */ Tcl_AppendResult(interp, ecstcl_message[17], " ", userdata->tclvar,".", (char *) NULL); return TCL_ERROR; }; } return TCL_OK; } /********************/ /* _interpRegion arg 1: interp arg 2: region arg 3: a pointer to some space Convert ecs_Region into a tcl string of the form: {north south east west ns_res ew_res} */ static int _interpRegion(interp, region, buffer) Tcl_Interp *interp; ecs_Region *region; char *buffer; { sprintf(buffer,"%lf %lf %lf %lf %lf %lf", region->north, region->south, region->east, region->west, region->ns_res, region->ew_res ); Tcl_AppendResult(interp, buffer, (char *) NULL); return TCL_OK; } /********************/ /* _interpCoordinate arg 1: interp arg 2: coordinate arg 3: a pointer to some space Convert ecs_Coordinate into a tcl string of the form: {x y} and add to interpreter */ static int _interpCoord(interp, coord, buffer) Tcl_Interp *interp; ecs_Coordinate *coord; char *buffer; { sprintf(buffer," {%lf %lf} ", coord->x, coord->y ); Tcl_AppendResult(interp,buffer, (char *) NULL); return TCL_OK; } /********************/ /* _interpMatrix arg 1: interp arg 2: matrix arg 3: a pointer to some space Convert ecs_matrix into a tcl string of the form: {width height} {} { x1 x2 ... xn } */ static int _interpMatrix(interp, matrix, buffer) Tcl_Interp *interp; ecs_Matrix *matrix; char *buffer; { u_int i; /* sprintf(buffer,"%d %d" matrix->width, matrix->height ); Tcl_AppendElement(interp, buffer); _interpRegion(interp, &(matrix->blockbound), buffer); */ Tcl_AppendResult(interp," {", (char*) NULL); for (i=0; ix.x_len; i++) { sprintf(buffer,"%u ", matrix->x.x_val[i]); Tcl_AppendResult(interp,buffer, (char *) NULL); } Tcl_AppendResult(interp,"} ",(char*) NULL); return TCL_OK; } /********************/ /* _interpImage arg 1: interp arg 2: image arg 3: a pointer to some space Convert ecs_image into a tcl string of the form: {width height} {} { x1 x2 ... xn } */ static int _interpImage(interp, image, buffer) Tcl_Interp *interp; ecs_Image *image; char *buffer; { u_int i; /* sprintf(buffer,"%d %d", image->width, image->height ); Tcl_AppendElement(interp, buffer); _interpRegion(interp, &(image->blockbound), buffer); */ Tcl_AppendResult(interp," {", (char*) NULL); for (i=0; ix.x_len; i++) { sprintf(buffer,"%u ", image->x.x_val[i]); Tcl_AppendResult(interp,buffer, (char *) NULL); } Tcl_AppendResult(interp,"} ",(char*) NULL); return TCL_OK; } /********************/ /* _interpArea arg 1: interp arg 2: area arg 3: a pointer to some space Convert ecs_Area into a tcl string of the form: { {centroid0.x centroid0.y} {{x0 y0} {x1 y1} ...} {centroid1.x centroid1.y} {{x0 y0} {x1 y1} ...} ... } */ static int _interpArea(interp, area, buffer) Tcl_Interp *interp; ecs_Area *area; char *buffer; { u_int i,j; /* FeatureRings */ Tcl_AppendResult (interp, " {", (char *) NULL); for (i=0; i < area->ring.ring_len; i++) { Tcl_AppendResult (interp, " {", (char *) NULL); sprintf(buffer," {%lf %lf} ",area->ring.ring_val[i].centroid.x, area->ring.ring_val[i].centroid.y); Tcl_AppendResult (interp, buffer, (char *) NULL); /* Coordinates */ Tcl_AppendResult (interp, " {", (char *) NULL); for (j=0; j < area->ring.ring_val[i].c.c_len; j++) { _interpCoord(interp,&(area->ring.ring_val[i].c.c_val[j]),buffer); }; Tcl_AppendResult (interp, "} } ", (char *) NULL); }; Tcl_AppendResult (interp, "} ", (char *) NULL); return TCL_OK; } ogdi-ogdi_4_1_0/ogdi/tcl_interface/ecs_tcl.def000066400000000000000000000001601345660466700214400ustar00rootroot00000000000000LIBRARY ECS_TCL CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS ecs_Init Ecs_Init ogdi-ogdi_4_1_0/ogdi/tcl_interface/makefile000066400000000000000000000021041345660466700210440ustar00rootroot00000000000000# # Copyright (C) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc # Permission to use, copy, modify and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies, that # both the copyright notice and this permission notice appear in # supporting documentation, and that the name of L.A.S. Inc not be used # in advertising or publicity pertaining to distribution of the software # without specific, written prior permission. L.A.S. Inc. makes no # representations about the suitability of this software for any purpose. # It is provided "as is" without express or implied warranty. # TOBEGEN = ecs_tcl TARGETGEN=$(DYNAGEN) SOURCES = ecs_tcl.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(TCL_INCLUDE) $(OGDI_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) LINK_LIBS= $(OGDI_LINKLIB) $(TCL_LINKLIB) $(MATH_LINKLIB) include $(TOPDIR)/config/common.mak all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/readme.w32000066400000000000000000000061311345660466700154160ustar00rootroot00000000000000 Copyright (C) 1996 Her Majesty the Queen in Right of Canada. Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies, that both the copyright notice and this permission notice appear in supporting documentation, and that the name of Her Majesty the Queen in Right of Canada not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Her Majesty the Queen in Right of Canada makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. The configuration was tested on: - Windows 95 (standard) - Windows 95B (FAT32) - Windows NT 4.0, Workstation This file will guide you in the process of installing all necessary software and components needed to develop and compile new OGDI drivers ------------------------------------------------------------------------- ------------------------------------------------------------------------- Requirements: - OGDI sources *** Install them in the root directory of your C drive *** (c:\devdir) - GNU Tools (development package: ftp.cygnus.com/pub/gnu-win32/latest/cdk.exe, 14 Mb) *** Follow InstallShield instructions. *** It will be installed under *** 'c:\gnuwin32\b18\H-i386-cygwin32'. *** Once it is done, create a directory 'c:\usr\bin'. *** Copy the content of *** 'c:\gnuwin32\b18\H-i386-cygwin3\bin' *** in your newly created directory (c:\usr\bin). *** Create another directory 'c:\bin' and copy *** 'bash.exe' and 'sh.exe' into it. *** Bash also needs a 'tmp' directory, therefore, *** if it does not exist in the root of your C drive, *** you must create it. - Microsoft Visual C++ 5.0 (FULL installation) *** We strongly suggest to install it under *** 'c:\msvc5\DevStudio...' - 180 Mb of disk space *** 10 Mb for sources installation, *** (40 Mb after compiling) *** 15 Mb for the GNU Tools, *** 125 Mb for Visual C++, ------------------------------------------------------------------------- ------------------------------------------------------------------------- To enable Windows95 to handle all needed environment variables, you must change the size of 'initial environment' as follows: - in the menu bar, click on 'Start' - go to 'Settings' and select 'Taskbar' - click on the 'Start Menu Programs' tab - click on 'Advanced' - in the opened window, double-click on 'Programs' folder - select 'MS-DOS Prompt' with the right button of the mouse - select 'Properties' - click on the 'Memory' tab - change the 'Initial Environment' value to 1024 Upon the completion of the above steps, go to c:\devdir and edit the file 'varwin32.bat' to reflect your environment (if you followed the above instructions, no editing should be required). To start compiling, open a DOS console, go to 'c:\devdir' and execute "varwin32". Type 'make' and hit the 'enter' key! Support: pmorin@host-194.j2geo.ndhq.dnd.ca ogdi-ogdi_4_1_0/varwin32.bat000077500000000000000000000033001345660466700157650ustar00rootroot00000000000000echo off rem Copyright (C) 1996 Her Majesty the Queen in Right of Canada. rem Permission to use, copy, modify and distribute this software and rem its documentation for any purpose and without fee is hereby granted, rem provided that the above copyright notice appear in all copies, that rem both the copyright notice and this permission notice appear in rem supporting documentation, and that the name of Her Majesty the Queen rem in Right of Canada not be used in advertising or publicity pertaining rem to distribution of the software without specific, written prior rem permission. Her Majesty the Queen in Right of Canada makes no rem representations about the suitability of this software for any purpose. rem It is provided "as is" without express or implied warranty. rem rem Visual Developer Studio files. rem set MSDevDir=C:\msvc5\DevStudio\SharedIDE rem rem Visual C++ files. rem set MSVCDir=C:\msvc5\DevStudio\VC rem rem Installation disk. rem set INSTALLDISK=C: rem rem Path to GNU tools. rem set GNUTOOLS=%INSTALLDISK%\usr\bin rem rem The shell. rem set shell=%INSTALLDISK%\bin\sh.exe rem rem Root of the sources. rem set TOPDIR=%INSTALLDISK%/devdir rem rem Target environment. rem set TARGET=win32 rem rem Special flag for the b19 version number of the GNUTools. rem set MAKE_MODE=UNIX echo Setting environment variables, then starting BASH. set PATH="%MSDevDir%\BIN;%MSVCDir%\BIN";"%MSVCDir%\BIN\%VcOsDir%";%MSDevDir%\BIN;%MSVCDir%\BIN;%MSVCDir%\BIN\%VcOsDir%;"%GNUTOOLS%";%GNUTOOLS%;"%TOPDIR%"\bin\"%TARGET%";%PATH% set INCLUDE=%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%MSVCDir%\ATL\INCLUDE;%INCLUDE% set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% %GNUTOOLS%\bash.exe ogdi-ogdi_4_1_0/vpflib/000077500000000000000000000000001345660466700151055ustar00rootroot00000000000000ogdi-ogdi_4_1_0/vpflib/.cvsignore000066400000000000000000000000061345660466700171010ustar00rootroot00000000000000OBJ.* ogdi-ogdi_4_1_0/vpflib/coorgeom.c000066400000000000000000000603471345660466700170750ustar00rootroot00000000000000 /*************************************************************************** * *N Module COORGEOM.C * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Coordinate Geometry Module * * Contains functions for performing general purpose coordinate * geometry operations. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Sep 1992 * Dan Maddux Jan 1994 *E **************************************************************************/ #include #include #include #ifdef _MSDOS #include #define MAXFLOAT FLT_MAX #endif #ifdef _MAC #undef MAXFLOAT #define MAXFLOAT 3.37E+38 #endif #ifndef MISSING_FLOAT_H #include #define MAXFLOAT FLT_MAX #endif #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif /************************************************************************* * *N gc_distance * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function computes the distance between two points on the * surface of the (spherical) earth. The points are specified in * geographic coordinates (lat1,lon1) and (lat2,lon2). The algorithm * used here is taken directly from ELEMENTS OF CARTOGRAPHY, 4e. - * Robinson, Sale, Morrison - John Wiley & Sons, Inc. - pp. 44-45. * Geometrically, the function computes the arc distance dtheta on * the sphere between two points A and B by the following formula: * * cos dtheta = (sin a sin b) + (cos a cos b cos p) * * where: * * dtheta = arc distance between A and B * a = latitude of A * b = latitude of B * p = degrees of longitude between A and B * * Once the arc distance is determined, it is converted into miles by * taking the ratio between the circumference of the earth (2*PI*R) and * the number of degrees in a circle (360): * * distance in miles (d) arc distance in degrees (dtheta) * ------------------------------ = -------------------------------- * earth's circumference in miles earth's circumference in degrees * * or * * d = (dtheta * (2*PI*R)) / 360 => * d = (dtheta*PI*R)/180 * * The calculated distance is referred to as the Great Circle Distance. * *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * lat1 == (double) latitude of point A. * lon1 == (double) longitude of point A. * lat2 == (double) latitude of point B. * lon2 == (double) longitude of point B. * units == (int32) flag to indicate output distance units. * Must be one of the coord_units_type enumerations. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels November 1990 Original Version DOS Turbo C * September 1992 UNIX Port - Additional Units *E *************************************************************************/ #ifdef PROTO double gc_distance( double lat1, double lon1, double lat2, double lon2, int32 units) #else double gc_distance (lat1, lon1, lat2, lon2, units) double lat1, lon1, lat2, lon2; int32 units; #endif { double a,b,p,dtheta,d; #ifndef PI double PI=3.141592654; #endif double DEG2RAD=(PI/180.0), RAD2DEG=(180.0/PI); static double R[] = { 3958.754, 6370997.0, 1.00000, 2090221.12, 250826653.44 , 6370.997 }; /* miles meters degrees feet inches kilometers */ if ((unitsKilometers)) units = Miles; if (lat1 > 90.0) lat1 -= 180.0; if (lat2 > 90.0) lat2 -= 180.0; a = lat1*DEG2RAD; /* Degrees must be converted to radians */ b = lat2*DEG2RAD; p = fabs(lon1-lon2)*DEG2RAD; dtheta = (sin(a)*sin(b)) + (cos(a)*cos(b)*cos(p)); dtheta = acos(dtheta)*RAD2DEG; /* Compute arc distance in degrees */ d = (dtheta*PI*R[units])/180.0; /* Compute distance in miles or km */ return d; } /*************************************************************************/ /* geo_intersect */ /* This function determines if any portion of an input */ /* rectangular "fextent1' is contained within another rectangular */ /* 'fextent2'. It returns either TRUE of FALSE */ /* DGM 21 Jan 94 */ /*************************************************************************/ #ifdef PROTO int32 geo_intersect (fextent_type fextent1, fextent_type fextent2) #else int32 geo_intersect (fextent1, fextent2) fextent_type fextent1, fextent2; #endif { float merid_180; /* Check for crossing the 180 meridian */ if (fextent1.x1 < -180.0) merid_180 = -1.0; else if (fextent1.x2 > 180.0) merid_180 = 1.0; else merid_180 = 0.0; if (fextent2.x1 > 0.0 && fextent2.x2 < 0.0 && fextent1.x1 > 0.0) merid_180 = 1.0; else if (fextent2.x1 > 0.0 && fextent2.x2 < 0.0 && fextent1.x1 < 0.0) merid_180 = -1.0; if ((fextent2.x1 >= fextent1.x1 && fextent2.x1 <= fextent1.x2) || (fextent2.x2 >= fextent1.x1 && fextent2.x2 <= fextent1.x2)) merid_180 = 0.0; if (merid_180 == -1.0) { if (fextent2.x1 > 0.0) fextent2.x1 = fextent2.x1 + merid_180 * 360.0; if (fextent2.x2 > 0.0) fextent2.x2 = fextent2.x2 + merid_180 * 360.0; } else if (merid_180 == 1.0) { if (fextent2.x1 < 0.0) fextent2.x1 = fextent2.x1 + merid_180 * 360.0; if (fextent2.x2 < 0.0) fextent2.x2 = fextent2.x2 + merid_180 * 360.0; } /* 1 intersects 2 from the top */ if ((fextent1.y1 >= fextent2.y1) && (fextent1.y1 < fextent2.y2) && (fextent1.x1 < fextent2.x2) && (fextent1.x2 > fextent2.x1)) return (TRUE); /* 1 intersects 2 from the bottom */ if ((fextent1.y2 <= fextent2.y2) && (fextent1.y2 > fextent2.y1) && (fextent1.x1 < fextent2.x2) && (fextent1.x2 > fextent2.x1)) return (TRUE); /* 1 intersects 2 from the right */ if ((fextent1.x1 >= fextent2.x1) && (fextent1.x1 < fextent2.x2) && (fextent1.y2 > fextent2.y1) && (fextent1.y1 < fextent2.y2)) return (TRUE); /* 1 intersects 2 from the left */ if ((fextent1.x2 <= fextent2.x2) && (fextent1.x2 > fextent2.x1) && (fextent1.y2 > fextent2.y1) && (fextent1.y1 < fextent2.y2)) return (TRUE); /* 1 contains 2 */ if ((fextent1.x1 <= fextent2.x1) && (fextent1.x2 >= fextent2.x2) && (fextent1.y2 >= fextent2.y2) && (fextent1.y1 <= fextent2.y1)) return (TRUE); /* 1 is contained by 2 */ if ((fextent1.x1 >= fextent2.x1) && (fextent1.x2 <= fextent2.x2) && (fextent1.y2 <= fextent2.y2) && (fextent1.y1 >= fextent2.y1)) return (TRUE); return (FALSE); } /************************************************************************* * *N contained * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether any portion of an input rectangular * 'extent1' is contained within another rectangular 'extent2'. It * returns either TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * extent1 == (extent_type) rectangular area to be tested within. * extent2 == (extent_type) rectangular area to be tested against. * contained == (int32) boolean: * TRUE if extent2 contains extent1 * FALSE if extent2 does not contain extent1 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1990 Original Version DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 contained (extent_type extent1, extent_type extent2) #else int32 contained (extent1, extent2) extent_type extent1, extent2; #endif { /* 1 intersects 2 from the top */ if ((extent1.y1 >= extent2.y1) && (extent1.y1 < extent2.y2) && (extent1.x1 < extent2.x2) && (extent1.x2 > extent2.x1)) return (TRUE); /* 1 intersects 2 from the bottom */ if ((extent1.y2 <= extent2.y2) && (extent1.y2 > extent2.y1) && (extent1.x1 < extent2.x2) && (extent1.x2 > extent2.x1)) return (TRUE); /* 1 intersects 2 from the right */ if ((extent1.x1 >= extent2.x1) && (extent1.x1 < extent2.x2) && (extent1.y2 > extent2.y1) && (extent1.y1 < extent2.y2)) return (TRUE); /* 1 intersects 2 from the left */ if ((extent1.x2 <= extent2.x2) && (extent1.x2 > extent2.x1) && (extent1.y2 > extent2.y1) && (extent1.y1 < extent2.y2)) return (TRUE); /* 1 contains 2 */ if ((extent1.x1 <= extent2.x1) && (extent1.x2 >= extent2.x2) && (extent1.y2 >= extent2.y2) && (extent1.y1 <= extent2.y1)) return (TRUE); /* 1 is contained by 2 */ if ((extent1.x1 >= extent2.x1) && (extent1.x2 <= extent2.x2) && (extent1.y2 <= extent2.y2) && (extent1.y1 >= extent2.y1)) return (TRUE); return (FALSE); } /************************************************************************* * *N completely_within * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether extent1 is completely within * extent2. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * extent1 ==(extent_type) first extent to compare. * extent2 ==(extent_type) second extent to compare. * return ==(int32) 1 if extent1 is completely within extent2, * 0 if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 completely_within (extent_type extent1, extent_type extent2) #else int32 completely_within (extent1, extent2) extent_type extent1, extent2; #endif { if (extent1.x1 < extent2.x1) return 0; if (extent1.y1 < extent2.y1) return 0; if (extent1.x2 > extent2.x2) return 0; if (extent1.y2 > extent2.y2) return 0; return 1; } /************************************************************************* * *N fwithin * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether the given (floating point) * coordinate is contained within the specified extent. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * x ==(double) X coordiante. * y ==(double) Y coordiante. * extent ==(extent_type) extent to compare. * return ==(int32) TRUE if the coordinate is contained within * the extent; FALSE if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C * Sep 1992 UNIX Port *E *************************************************************************/ #ifdef PROTO int32 fwithin (double x, double y, extent_type extent) #else int32 fwithin (x, y, extent) double x, y; extent_type extent; #endif { if ( x >= extent.x1 && x <= extent.x2 && y >= extent.y1 && y <= extent.y2 ) return TRUE; else return FALSE; } /* Check if the value n0 is in between n1 and n2 */ #define BETWEEN(n0,n1,n2) ((n0>=n1 && n0<=n2) || (n0<=n1 && n0>=n2)) /************************************************************************** * *N intersect * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Test whether line segment l1 intersects line segment l2 *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * l1 == (line_segment_type) line segment one. * l2 == (line_segment_type) line segment two. * xint == (double *) intersection point x coordinate. * yint == (double *) intersection point y coordinate. * intersect == (int32) boolean: * 1 --> line segments intersect * 0 --> line segments do not intersect *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 intersect (line_segment_type l1, line_segment_type l2, double *xint, double *yint) #else int32 intersect (l1, l2, xint, yint) line_segment_type l1, l2; double *xint, *yint; #endif { double m1,m2,b1=0,b2=0; double tempy1,tempy2; if ( (l1.x1==l1.x2) && (l2.y1==l2.y2) ) { /* l1 is vertical and l2 is horizontal */ if ( ( ((l2.x1 <= l1.x1) && (l1.x1 <= l2.x2)) || /* X coordinate */ ((l2.x2 <= l1.x1) && (l1.x1 <= l2.x1)) ) && /* intersects */ ( ((l1.y1 <= l2.y1) && (l2.y1 <= l1.y2)) || /* Y coordinate */ ((l1.y2 <= l2.y1) && (l2.y1 <= l1.y1)) ) ) /* intersects */ { *xint = l1.x1; *yint = l2.y1; return 1; } } else return 0; if ( (l2.x1==l2.x2) && (l1.y1==l1.y2) ) { /* l2 is vertical and l1 is horizontal */ if ( ( ((l1.x1 <= l2.x1) && (l2.x1 <= l1.x2)) || /* X coordinate */ ((l1.x2 <= l2.x1) && (l2.x1 <= l1.x1)) ) && /* intersects */ ( ((l2.y1 <= l1.y1) && (l1.y1 <= l2.y2)) || /* Y coordinate */ ((l2.y2 <= l1.y1) && (l1.y1 <= l2.y1)) ) ) /* intersects */ { *xint = l2.x1; *yint = l1.y1; return 1; } } else return 0; if ( (l1.x1==l2.x1) && (l1.y1==l2.y1) ) { *xint = l1.x1; *yint = l1.y1; return 1; } if ( (l1.x2==l2.x2) && (l1.y2==l2.y2) ) { *xint = l1.x2; *yint = l1.y2; return 1; } if ( (l1.x1==l2.x2) && (l1.y1==l2.y2) ) { *xint = l1.x1; *yint = l1.y1; return 1; } if ( (l1.x2==l2.x1) && (l1.y2==l2.y1) ) { *xint = l1.x2; *yint = l1.y2; return 1; } if (l1.x1 != l1.x2) { m1 = (l1.y2-l1.y1)/(l1.x2-l1.x1); b1 = -1.0*m1*l1.x1 + l1.y1; } else { /* l1 is a vertical line */ m1 = MAXFLOAT; } if (l2.x1 != l2.x2) { m2 = (l2.y2-l2.y1)/(l2.x2-l2.x1); b2 = -1.0*m2*l2.x1 + l2.y1; } else { /* l2 is a vertical line */ m2 = MAXFLOAT; } /* Find intersection point of lines */ if ((m1 == m2) && (m1 != MAXFLOAT)) { if (b1 == b2) { /* Slopes are equal (and not vertical). */ /* Check end points for overlap. */ if (BETWEEN(l1.x1,l2.x1,l2.x2)) { *xint = l1.x1; *yint = l1.y1; return 1; } if (BETWEEN(l1.x2,l2.x1,l2.x2)) { *xint = l1.x2; *yint = l1.y2; return 1; } if (BETWEEN(l2.x1,l1.x1,l1.x2)) { *xint = l2.x1; *yint = l2.y1; return 1; } if (BETWEEN(l2.x2,l1.x1,l1.x2)) { *xint = l2.x2; *yint = l2.y2; return 1; } } /* Endpoints don't overlap - no intersection */ return 0; } if ( (m1 != MAXFLOAT) && (m2 != MAXFLOAT) ) { /* neither line is a vertical line */ *xint = (b2-b1)/(m1-m2); if (m1 == 0) /* if l1 is a horizontal line */ *yint = l1.y1; else { if (m2 == 0) /* if l2 is a horizontal line */ *yint = l2.y1; else *yint = m1*(*xint)+b1; } } else { /* At least one vertical line */ if (m1==m2) { /* Both vertical lines */ if (l1.x1==l2.x1) { /* Coincident vertical lines */ *xint = l1.x1; tempy1 = (double) min( l1.y1, l1.y2 ); tempy2 = (double) min( l2.y1, l2.y2 ); *yint = (double) max( tempy1, tempy2 ); } else { /* Non-coincident vertical lines */ return 0; } } else if (m1==MAXFLOAT) { /* l1 is vertical */ if ( ((l2.x1 <= l1.x1) && (l2.x2 >= l1.x1)) || ((l2.x2 <= l1.x1) && (l2.x1 >= l1.x1)) ) { *yint = m2*l1.x1 + b2; /* l2 intersects l1 */ *xint = l1.x1; } else return 0; /* l2 does not intersect l1 */ } else { /* l2 is vertical */ if ( ((l1.x1 <= l2.x1) && (l1.x2 >= l2.x1)) || ((l1.x2 <= l2.x1) && (l1.x1 >= l2.x1)) ) { *yint = m1*l2.x1 + b1; /* l1 intersects l2 */ *xint = l2.x1; } else return 0; /* l1 does not intersect l2 */ } } /* See if intersection point lies on both line segments */ return ( (*xint >= (double)min(l1.x1,l1.x2)) && (*xint <= (double)max(l1.x1,l1.x2)) && (*yint >= (double)min(l1.y1,l1.y2)) && (*yint <= (double)max(l1.y1,l1.y2)) && (*xint >= (double)min(l2.x1,l2.x2)) && (*xint <= (double)max(l2.x1,l2.x2)) && (*yint >= (double)min(l2.y1,l2.y2)) && (*yint <= (double)max(l2.y1,l2.y2)) ); } /************************************************************************** * *N perpendicular_intersection * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Test whether a perpendicular to a line segment intersects a search * point. lseg must be of a type similar to line_segment_type. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * lseg == (line_segment_type) line segment. * xsearch == (double) search point x coordinate. * ysearch == (double) search point y coordinate. * xint == (double *) intersection point x coordinate. * yint == (double *) intersection point y coordinate. * return == (int32) TRUE if a perpendicular to the line * segment intersects the search point; * FALSE if there is no intersection. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels, DOS Turbo C 1991 * Ronald Rozensky, vertical and horizontal line handlers. * Barry Michaels Sep 1992 UNIX Port - double precision *E *************************************************************************/ #ifdef PROTO int32 perpendicular_intersection (line_segment_type lseg, double xsearch, double ysearch, double *xint, double *yint) #else int32 perpendicular_intersection (lseg, xsearch, ysearch, xint, yint) line_segment_type lseg; double xsearch, ysearch, *xint, *yint; #endif { double m1,mp,b1=0,bp; /* m's are for slopes, b's are for y intersections */ /* for the old y=mx+b point slope formula. */ if (lseg.y1 == lseg.y2) if (((lseg.x1 <= xsearch) && (xsearch <= lseg.x2)) || ((lseg.x2 <= xsearch) && (xsearch <= lseg.x1))) { *xint = xsearch; *yint = lseg.y1; return 1; } if (lseg.x1 == lseg.x2) if (((lseg.y1 <= ysearch) && (ysearch <= lseg.y2)) || ((lseg.y2 <= ysearch) && (ysearch <= lseg.y1))) { *xint = lseg.x1; *yint = ysearch; return 1; } if ( (lseg.x1==xsearch) && (lseg.y1==ysearch) ) { *xint = xsearch; *yint = ysearch; return 1; } if ( (lseg.x2==xsearch) && (lseg.y2==ysearch) ) { *xint = xsearch; *yint = ysearch; return 1; } if (lseg.x1 != lseg.x2) { m1 = (lseg.y2-lseg.y1)/(lseg.x2-lseg.x1); b1 = -1*m1*lseg.x1 + lseg.y1; if (m1 != 0.0) { mp = -1.0/m1; /* perpendicular */ } else { mp = MAXFLOAT; } } else { m1 = MAXFLOAT; mp = 0.0; } if (fabs(mp) < 1000000.0) { bp = ysearch - mp*xsearch; } else { bp = MAXFLOAT; } /* Find intersection point of lseg and its perpendicular */ if ( (m1 != MAXFLOAT) && (mp != MAXFLOAT) ) { *xint = (bp-b1)/(m1-mp); *yint = m1*(*xint)+b1; } else { /* At least one vertical line */ if (m1==MAXFLOAT) { /* lseg is vertical */ *yint = ysearch; *xint = lseg.x1; } else { /* perp is vertical */ *yint = lseg.y1; *xint = xsearch; } } /* See if intersection point lies on both line segments */ return ( (*xint >= (float)min(lseg.x1,lseg.x2)) && (*xint <= (float)max(lseg.x1,lseg.x2)) && (*yint >= (float)min(lseg.y1,lseg.y2)) && (*yint <= (float)max(lseg.y1,lseg.y2)) ); } /************************************************************************* * *N float_to_dms * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function converts a floating point lat lon coordinate to * degrees-minutes-seconds format. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * coord == (double) floating point lat lon coordinate. * return == (dms_type) degrees-minutes-seconds coordinate. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1990 Original Version DOS Turbo C *E *************************************************************************/ #ifdef PROTO dms_type float_to_dms (double coord) #else dms_type float_to_dms (coord) double coord; #endif { dms_type dms_coord; dms_coord.degrees = (int32)coord; dms_coord.minutes = (int32)((double)(coord-(int32)coord)*60.0); dms_coord.seconds = (float)(((double)(coord-(int32)coord)* 60.0) - (double)dms_coord.minutes) * 60.0; dms_coord.minutes = (int32)abs ((short)dms_coord.minutes); dms_coord.seconds = (float)fabs (dms_coord.seconds); if (dms_coord.seconds >= 60.0) { dms_coord.minutes++; dms_coord.seconds -= (float)60.0; } if (dms_coord.minutes == 60) { if (dms_coord.degrees >= 0) dms_coord.degrees++; else dms_coord.degrees--; dms_coord.minutes = 0; } if ((dms_coord.degrees == 0)&&(coord < 0.0)) dms_coord.minutes *= -1; return dms_coord; } /************************************************************************* * *N dms_to_float * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function converts a coordinate in degrees-minutes-seconds * format to a (double precision) floating point decimal degree value. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * coord == (dms_type) degrees-minutes-seconds coordinate. * return == (double) floating point lat lon coordinate. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1990 Original Version DOS Turbo C *E *************************************************************************/ #ifdef PROTO double dms_to_float (dms_type dms_coord) #else double dms_to_float (dms_coord) dms_type dms_coord; #endif { double fcoord; if (dms_coord.degrees >= 0) fcoord = (double)dms_coord.degrees + (((double)dms_coord.minutes)/60.0) + (dms_coord.seconds/3600.0); else fcoord = (double)dms_coord.degrees - (((double)dms_coord.minutes)/60.0) - (dms_coord.seconds/3600.0); return fcoord; } ogdi-ogdi_4_1_0/vpflib/coorgeom.h000066400000000000000000000043401345660466700170710ustar00rootroot00000000000000 #ifndef __COORGEOM_H__ #define __COORGEOM_H__ 1 #include "machine.h" /* Geographic extent or line segment structure of type double */ typedef struct { double x1, y1, x2, y2; } extent_type, line_segment_type; /* Geographic extent structure of type float */ typedef struct { float x1, y1, x2, y2; } fextent_type; typedef enum { Miles, Meters, Degrees, Feet, Inches, Kilometers } coord_units_type; /* For latitude-longitude */ typedef struct { int32 degrees; int32 minutes; float seconds; } dms_type; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Cartesian distance formula. */ /* All parameters must be float or double. */ #define DISTANCE( x1, y1, x2, y2 ) \ sqrt( ((x2-x1)*(x2-x1)) + ((y2-y1)*(y2-y1)) ) #ifndef _WINDOWS #ifndef max #define max(a,b) ((a > b) ? a : b) #endif #ifndef min #define min(a,b) ((a < b) ? a : b) #endif #endif #define MILES_TO_KM(x) (x*1.6093) #define MILES_TO_METERS(x) (1000.0*x*1.6093) #define MILES_TO_FEET(x) (x*5280.0); #define MILES_TO_INCHES(x) (x*5280.0*12.0) #define KM_TO_MILES(x) (x*0.6214) #define METERS_TO_MILES(x) (x*0.0006214) #define FEET_TO_MILES(x) (x/5280.0) #define INCHES_TO_MILES(x) (x/63360.0) /* Functions */ #ifdef PROTO double gc_distance (double lat1, double lon1, double lat2, double lon2, int32 units); int32 contained( extent_type extent1, extent_type extent2 ); int32 geo_intersect (fextent_type extent1, fextent_type extent2); int32 completely_within( extent_type extent1, extent_type extent2 ); int32 fwithin( double x, double y, extent_type extent ); int32 intersect( line_segment_type l1, line_segment_type l2, double *xint, double *yint ); int32 perpendicular_intersection( line_segment_type lseg, double xsearch, double ysearch, double *xint, double *yint ); dms_type float_to_dms( double coordinate ); #else double dms_to_float (); double gc_distance (); int32 contained (); int32 geo_intersect (); int32 completely_within (); int32 fwithin (); int32 intersect (); int32 perpendicular_intersection (); dms_type float_to_dms (); double dms_to_float (); #endif /* If PROTO */ #endif ogdi-ogdi_4_1_0/vpflib/get_feat.c000066400000000000000000000374521345660466700170420ustar00rootroot00000000000000/**********************************************************************/ /* GET_FEATURE.C */ /**********************************************************************/ #ifndef INCL_XVTH #include #endif #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __VPFPRIM_H__ #include "vpfprim.h" #endif #ifndef GET_FEATURE_H #include "get_feat.h" #endif /* Global Variables */ /*extern vpf_projection_type NOPROJ; */ vpf_projection_type NOPROJ = {DDS, 0.0, 0.0, 0.0, 0.0, 0, 0.0, 0.0, NULL, NULL, "Decimal Degrees "}; /**********************************************************************/ /* GET_LINE_FEATURE */ /**********************************************************************/ #ifdef PROTO void get_line_feature (LINE_FEATURE *line, row_type row, vpf_table_type table) #else void get_line_feature (line, row, table) LINE_FEATURE *line; row_type row; vpf_table_type table; #endif { int32 pos, id, count; /* Go ahead and set up code to handle compound line features */ line->nr_segs = 1; line->segs = (SEGMENT**)xvt_zmalloc ((size_t)line->nr_segs * sizeof (SEGMENT*)); if (line->segs == NULL) xvt_fatal ("GET_LINE_FEATURE:1 Out of memory!"); line->segs[0] = (SEGMENT*)xvt_zmalloc (sizeof (SEGMENT)); if (line->segs[0] == NULL) xvt_fatal ("GET_LINE_FEATURE:2 Out of memory!"); pos = table_pos ("ID", table); get_table_element (pos, row, table, &id, &count); line->segs[0]->id = id; pos = table_pos ("COORDINATES", table); line->segs[0]->coords = (COORDINATE*)get_xy (table, row, pos, &count); line->segs[0]->nr_coords = count; return; } /**********************************************************************/ /* GET_TEXT_FEATURE */ /**********************************************************************/ #ifdef PROTO void get_text_feature (TEXT_FEATURE *text, row_type row, vpf_table_type table) #else void get_text_feature (text, row, table) TEXT_FEATURE *text; row_type row; vpf_table_type table; #endif { int32 pos, id, count; pos = table_pos ("ID", table); get_table_element (pos, row, table, &id, &count); text->id = id; pos = table_pos ("STRING", table); text->string = (char*)get_table_element (pos, row, table, NULL, &count); pos = table_pos ("SHAPE_LINE", table); text->coords = (COORDINATE*)get_xy (table, row, pos, &count); text->nr_coords = count; return; } /**********************************************************************/ /* GET_POINT_FEATURE */ /* Derived from draw_point_row [vpfdraw.c] */ /**********************************************************************/ #ifdef PROTO void get_point_feature (POINT_FEATURE *point, row_type row, vpf_table_type table) #else void get_point_feature (point, row, table) POINT_FEATURE *point; row_type row; vpf_table_type table; #endif { int32 pos, id, count; pos = table_pos ("ID", table); get_table_element (pos, row, table, &id, &count); point->id = id; pos = table_pos ("COORDINATE", table); point->coord = (COORDINATE*)get_xy (table, row, pos, &count); return; } /**********************************************************************/ /* GET_AREA_FEATURE */ /* Derived from outline_face [vpfdraw.c] */ /**********************************************************************/ #ifdef PROTO void get_area_feature (AREA_FEATURE *area, int32 face_id, vpf_table_type facetable, vpf_table_type ringtable, vpf_table_type edgetable) #else void get_area_feature (area, face_id, facetable, ringtable, edgetable) AREA_FEATURE *area; int32 face_id; vpf_table_type facetable, ringtable, edgetable; #endif { int32 n=0; face_rec_type face_rec; ring_rec_type ring_rec; RING **temp; face_rec = read_face (face_id, facetable); ring_rec = read_ring (face_rec.ring, ringtable); /* Allocate space to store addresses of all the ring structures */ area->rings = (RING**)xvt_zmalloc (MAXRINGS * sizeof (RING*)); if (area->rings == NULL) xvt_fatal ("GET_AREA_FEATURE: Out of memory!"); /* Get the outer ring coords */ area->rings[n] = (RING*)xvt_zmalloc (sizeof (RING)); if (area->rings[n] == NULL) xvt_fatal ("GET_AREA_FEATURE: Out of memory!"); area->rings[n]->id = n+1; get_ring_coords (area->rings[n], face_id, ring_rec.edge, edgetable); n++; /* Get the coords for any inner rings that exist */ while (ring_rec.face == face_id) { ring_rec = read_next_ring (ringtable); if (feof (ringtable.fp)) break; if (ring_rec.face == face_id) { area->rings[n] = (RING*)xvt_zmalloc (sizeof (RING)); if (area->rings[n] == NULL) xvt_fatal ("GET_AREA_FEATURE: Out of memory!"); area->rings[n]->id = n+1; get_ring_coords (area->rings[n], face_id, ring_rec.edge, edgetable); n++; } } area->nr_rings = n; /* Realloc rings array to the required size */ temp = (RING**)xvt_zmalloc (area->nr_rings * sizeof (RING*)); if (temp == (RING**)NULL) xvt_fatal ("GET_AREA_FEATURE: Out of memory!"); else { memcpy (temp, area->rings, (area->nr_rings * sizeof (RING*))); xvt_free ((char*)area->rings); area->rings = temp; } return; } /**********************************************************************/ /* GET_RING_COORDS */ /* Derived from outline_face_ring [vpfdraw.c] */ /**********************************************************************/ #ifdef PROTO void get_ring_coords (RING *ring, int32 face_id,int32 start_edge, vpf_table_type edgetable) #else void get_ring_coords (ring, face_id, start_edge, edgetable) RING *ring; int32 face_id, start_edge; vpf_table_type edgetable; #endif { edge_rec_type edge_rec; int32 next_edge, prevnode, i, n=0; boolean done=FALSE; vpf_projection_type proj; double_coordinate_type dcoord; SEGMENT **temp; proj = NOPROJ; edge_rec = read_edge (start_edge, edgetable, proj.inverse_proj); edge_rec.dir = '+'; prevnode = edge_rec.start_node; if (edge_rec.start_node == edge_rec.end_node) done = TRUE; next_edge = next_face_edge (&edge_rec, &prevnode, face_id); /* Allocate plenty of space for array of segment addresses */ ring->segs = (SEGMENT**)xvt_zmalloc (MAXSEGS * sizeof (SEGMENT*)); if (ring->segs == NULL) xvt_fatal ("GET_RING_COORDS:1 Out of memory!"); /* Load the first segment of the ring */ ring->segs[n] = (SEGMENT*)xvt_zmalloc (sizeof (SEGMENT)); if (ring->segs[n] == NULL) xvt_fatal ("GET_RING_COORDS:2 Out of memory!"); ring->segs[n]->nr_coords = edge_rec.npts; ring->segs[n]->id = n+1; /* Allocate space for the coordinates of the first segment */ ring->segs[n]->coords = (COORDINATE*)xvt_zmalloc ((size_t)edge_rec.npts * sizeof (COORDINATE)); if (ring->segs[n]->coords == NULL) xvt_fatal ("GET_RING_COORDS:3 Out of memory!"); /* If the direction is - load in reverse order */ if (edge_rec.dir == '-') { for (i=(edge_rec.npts-1); i>=0; i--) { dcoord = next_edge_coordinate (&edge_rec); ring->segs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } else { for (i=0; isegs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } n++; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); while (!done) { if (next_edge < 0) { xvt_note ( "topology error! Edge: %d face: %d left: %d right: %d\n", edge_rec.id,face_id,edge_rec.left_face,edge_rec.right_face); done = TRUE; } if (next_edge == 0) { xvt_note ("Next edge(%d) = 0\n",(int)edge_rec.id); done = TRUE; } if (next_edge == start_edge) done = TRUE; if (!done) { edge_rec = read_edge( next_edge, edgetable, NOPROJ.inverse_proj); next_edge = next_face_edge( &edge_rec, &prevnode, face_id ); /* Allocate space for the next segment */ ring->segs[n] = (SEGMENT*)xvt_zmalloc (sizeof (SEGMENT)); if (ring->segs[n] == NULL) xvt_fatal ("GET_RING_COORDS:4 Out of memory!"); /* Allocate space for the segment coordinates */ ring->segs[n]->coords = (COORDINATE*)xvt_zmalloc ((size_t)edge_rec.npts * sizeof (COORDINATE)); if (ring->segs[n]->coords == NULL) xvt_fatal ("GET_RING_COORDS:5 Out of memory!"); ring->segs[n]->nr_coords = edge_rec.npts; ring->segs[n]->id = n+1; /* If the direction is - load in reverse order */ if (edge_rec.dir == '-') { for (i=(edge_rec.npts-1); i>=0; i--) { dcoord = next_edge_coordinate (&edge_rec); ring->segs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } else { for (i=0; isegs[n]->coords[i].x = (float)dcoord.x; ring->segs[n]->coords[i].y = (float)dcoord.y; } } n++; if (edge_rec.coords) xvt_free ((char*)edge_rec.coords); } /* if (!done) */ } /* while */ ring->nr_segs = n; /* Realloc the segs array to free unused memory */ temp = (SEGMENT**)xvt_zmalloc (ring->nr_segs * sizeof (SEGMENT*)); if (temp == (SEGMENT**)NULL) xvt_fatal ("GET_RING_COORDS:6 Out of memory!"); else { memcpy (temp, ring->segs, (ring->nr_segs * sizeof (SEGMENT*))); xvt_free ((char*)ring->segs); ring->segs = temp; } return; } /**********************************************************************/ /* NEXT_FACE_EDGE */ /* Derived from next_face_edge [vpfdraw.c] */ /**********************************************************************/ #ifdef PROTO int32 next_face_edge (edge_rec_type *edge_rec, int32 *prevnode, int32 face_id) #else int32 next_face_edge (edge_rec, prevnode, face_id) edge_rec_type *edge_rec; int32 *prevnode, face_id; #endif { int32 next; if ((edge_rec->right_face == face_id) && (edge_rec->left_face == face_id)) { /* Dangle - go the opposite dir to continue along the boundary */ if (*prevnode == edge_rec->start_node) { edge_rec->dir = '-'; next = edge_rec->left_edge; *prevnode = edge_rec->start_node; } else if (*prevnode == edge_rec->end_node) { edge_rec->dir = '+'; next = edge_rec->right_edge; *prevnode = edge_rec->end_node; } else next = -1; } else if (edge_rec->right_face == face_id) { /* The face is on the right - take the right forward edge */ next = edge_rec->right_edge; edge_rec->dir = '+'; *prevnode = edge_rec->end_node; } else if (edge_rec->left_face == face_id) { /* The face is on the left - take the left forward edge */ next = edge_rec->left_edge; edge_rec->dir = '-'; *prevnode = edge_rec->start_node; } else next = -1; return next; } /*****************************************************************************/ /* GET_XY */ /*****************************************************************************/ #ifdef PROTO COORDINATE *get_xy (vpf_table_type table, row_type row, int32 pos, int32 *count) #else COORDINATE *get_xy (table, row, pos, count) vpf_table_type table; row_type row; int32 pos; int32 *count; #endif { int32 i; COORDINATE *coord = NULL; switch (table.header[pos].type) { case 'C': { coordinate_type temp, *ptr; ptr = get_table_element (pos, row, table, &temp, count); if ((*count == 1) && (ptr == (coordinate_type*)NULL)) { coord = (COORDINATE*)xvt_zmalloc (sizeof (COORDINATE)); if (coord == (COORDINATE*)NULL) xvt_fatal ("GET_XY:1 Out of memory!"); coord->x = temp.x; coord->y = temp.y; } else coord = (COORDINATE*)ptr; break; } case 'Z': { tri_coordinate_type temp, *ptr; ptr = get_table_element (pos, row, table, &temp, count); coord = (COORDINATE*)xvt_zmalloc (sizeof (COORDINATE) * (size_t)*count); if (coord == (COORDINATE*)NULL) xvt_fatal ("GET_XY:2 Out of memory!"); if ((*count == 1) && (ptr == (tri_coordinate_type*)NULL)) { coord->x = temp.x; coord->y = temp.y; } else { for (i=0; i<*count; i++) { coord[i].x = ptr[i].x; coord[i].y = ptr[i].y; } } if (ptr) xvt_free ((char*)ptr); break; } case 'B': { double_coordinate_type temp, *ptr; ptr = get_table_element (pos, row, table, &temp, count); coord = (COORDINATE*)xvt_zmalloc (sizeof (COORDINATE) * (size_t)*count); if (coord == (COORDINATE*)NULL) xvt_fatal ("GET_XY:3 Out of memory!"); if ((*count == 1) && (ptr == (double_coordinate_type*)NULL)) { coord->x = (float)temp.x; coord->y = (float)temp.y; } else { for (i=0; i<*count; i++) { coord[i].x = (float)ptr[i].x; coord[i].y = (float)ptr[i].y; } } if (ptr) xvt_free ((char*)ptr); break; } case 'Y': { double_tri_coordinate_type temp, *ptr; ptr = get_table_element (pos, row, table, &temp, count); coord = (COORDINATE*)xvt_zmalloc (sizeof (COORDINATE) * (size_t)*count); if (coord == (COORDINATE*)NULL) xvt_fatal ("GET_XY:4 Out of memory!"); if ((*count == 1) && (ptr == (double_tri_coordinate_type*)NULL)) { coord->x = (float)temp.x; coord->y = (float)temp.y; } else { for (i=0; i<*count; i++) { coord[i].x = (float)ptr[i].x; coord[i].y = (float)ptr[i].y; } } if (ptr) xvt_free ((char*)ptr); break; } default: xvt_note ("GET_XY: no such type %c", table.header[pos].type); break; } /* switch type */ return (coord); } ogdi-ogdi_4_1_0/vpflib/get_feat.h000066400000000000000000000016251345660466700170400ustar00rootroot00000000000000/* GET_FEATURE.H */ #ifndef GET_FEATURE_H #define GET_FEATURE_H #ifndef H_VEC_D #include "../vec_d.h" #endif /* Prototype Definitions */ #ifdef PROTO void get_point_feature (POINT_FEATURE*, row_type, vpf_table_type); void get_text_feature (TEXT_FEATURE*, row_type, vpf_table_type); void get_line_feature (LINE_FEATURE*, row_type, vpf_table_type); void get_area_feature (AREA_FEATURE*, int32, vpf_table_type, vpf_table_type, vpf_table_type); void get_ring_coords (RING*, int32, int32, vpf_table_type); int32 next_face_edge (edge_rec_type*, int32*, int32); COORDINATE *get_xy (vpf_table_type, row_type, int32, int32*); #else void get_point_feature (); void get_text_feature (); void get_line_feature (); void get_area_feature (); void get_ring_coords (); int32 next_face_edge (); COORDINATE *get_xy (); #endif #endif /* GET_FEATURE_H */ ogdi-ogdi_4_1_0/vpflib/include/000077500000000000000000000000001345660466700165305ustar00rootroot00000000000000ogdi-ogdi_4_1_0/vpflib/include/arc.h000066400000000000000000000002021345660466700174400ustar00rootroot00000000000000#ifndef H_ARC #define H_ARC #ifndef H_ARC_DEF #include "arcdef.h" #endif #ifndef H_ARC_FUNC #include "arcfunc.h" #endif #endif ogdi-ogdi_4_1_0/vpflib/include/arc_d.h000066400000000000000000000061471345660466700177610ustar00rootroot00000000000000#ifndef H_ARC_D #define H_ARC_D /************************************************/ /* Header file for ARC projection software. */ /* Author: Jeff Buck (JB) */ /* Company: Spatial Data Sciences (SDS) */ /************************************************/ #include /* * #include */ #include #include #include #include #define PI 3.14159265358979323 #define RADIAN(x) (x * (PI / 180.)) #define DEGREES(x) (x * (180. / PI)) #define ROUND(x) ((int32)(x + .5)) #define ARC_FILE "arc.dat" /* name of file containing ARC parameters */ /* * File offsets used by read_arc_parms() */ #define SCALE_OFFSET 1760 /* file offset to scale * string */ #define LAMBDA_OFFSET 1793 /* file offset to origin longitude * string */ #define PHI_OFFSET 1804 /* file offset to origin * latitude string */ #define TILE_SIZE_OFFSET 1909 /* file offset to tile size string */ #define ROW1_OFFSET 1879 /* file offset to row upper * left string */ #define COL1_OFFSET 1897 /* file offset to column * upper left string */ #define ROW2_OFFSET 1891 /* file offset to row lower * right string */ #define COL2_OFFSET 1885 /* file offset to column * lowerright string */ #define ZONE_OFFSET 1769 /* file offset to image zone * number */ /* * Length of strings to be read in by read_arc_parms() */ #define SCALE_LEN 9 /* length of scale * string */ #define LAMBDA_LEN 11 /* length of longitude string */ #define PHI_LEN 10 /* length of latitude string */ #define TILE_SIZE_LEN 6 /* length of tile size string */ #define ROW_LEN 6 /* length of row string */ #define COL_LEN 6 /* length of column string */ #define ZONE_LEN 2 /* length of zone string */ /* * Error codes returned by arc() */ #define NO_ERROR 0 #define BAD_ZONE 34 #define BAD_SCALE 35 #define BAD_TILE_SIZE 36 /* * Data structures used by ARC routines */ typedef struct lpoint { int32 row; int32 col; } LPOINT; typedef struct latlon { double lat; double lon; } LATLON; typedef struct tile_info { int tile_row; /* row number of the tile in the image */ int tile_col; /* column number of the tile in the image */ int row; /* coordinate's row number relative to the * tile */ int col; /* coordinate's column number relative to the * tile */ } TILE_INFO; #if 0 typedef struct arc_parms { int32 scale; /* scale of the map */ LATLON origin; /* lat/lon of map origin (upper left corner) */ LPOINT ul; /* image upper left row and column */ LPOINT lr; /* image lower right row and column */ int tile_size; /* size of a tile in pixels */ int zone; /* zone number of upper-left of image */ } ARC_PARMS; #endif extern double fmod(); extern double fabs(); #endif /* H_ARC_D */ ogdi-ogdi_4_1_0/vpflib/include/arc_f.h000066400000000000000000000021471345660466700177570ustar00rootroot00000000000000#ifndef H_ARC_F #define H_ARC_F #ifndef H_ARC_D #include "arc_d.h" #endif /* * Prototypes for functions in arc.c */ #if XVT_CC_PROTO int arc(int, double *, double *, int32 *, int32 *, ARC_PARMS *, TILE_INFO *); void arc_to_lat(int32, int32, double, double, double, double, int, double *, double *); double dms2dec(char *); void get_ab(int, double *, double *); int get_arc_zone(double); int get_overlap_coords(ARC_PARMS * parms, int32 *north_row, int32 *south_row); void lat_to_arc(double, double, double, double, int, double, double, int32 *, int32 *); int read_arc_parms(ARC_PARMS *); void scale_adjust(double *a, double *b, int32 scale); char *strip_str(char *, char); #else int arc(); void arc_to_lat(); double dms2dec(); void get_ab(); int get_arc_zone(); int get_overlap_coords(); void lat_to_arc(); int read_arc_parms(); void scale_adjust(); char *strip_str(); #endif #endif /* H_ARC_F */ ogdi-ogdi_4_1_0/vpflib/include/arcdef.h000066400000000000000000000061551345660466700201340ustar00rootroot00000000000000#ifndef H_ARC_DEF #define H_ARC_DEF /************************************************/ /* Header file for ARC projection software. */ /* Author: Jeff Buck (JB) */ /* Company: Spatial Data Sciences (SDS) */ /************************************************/ #include /* * #include */ #include #include #include #include #define PI 3.14159265358979323 #define RADIAN(x) (x * (PI / 180.)) #define DEGREES(x) (x * (180. / PI)) #define ROUND(x) ((int32)(x + .5)) #define ARC_FILE "arc.dat" /* name of file containing ARC parameters */ /* * File offsets used by read_arc_parms() */ #define SCALE_OFFSET 1760 /* file offset to scale * string */ #define LAMBDA_OFFSET 1793 /* file offset to origin longitude * string */ #define PHI_OFFSET 1804 /* file offset to origin * latitude string */ #define TILE_SIZE_OFFSET 1909 /* file offset to tile size string */ #define ROW1_OFFSET 1879 /* file offset to row upper * left string */ #define COL1_OFFSET 1897 /* file offset to column * upper left string */ #define ROW2_OFFSET 1891 /* file offset to row lower * right string */ #define COL2_OFFSET 1885 /* file offset to column * lowerright string */ #define ZONE_OFFSET 1769 /* file offset to image zone * number */ /* * Length of strings to be read in by read_arc_parms() */ #define SCALE_LEN 9 /* length of scale * string */ #define LAMBDA_LEN 11 /* length of longitude string */ #define PHI_LEN 10 /* length of latitude string */ #define TILE_SIZE_LEN 6 /* length of tile size string */ #define ROW_LEN 6 /* length of row string */ #define COL_LEN 6 /* length of column string */ #define ZONE_LEN 2 /* length of zone string */ /* * Error codes returned by arc() */ #define NO_ERROR 0 #define BAD_ZONE 34 #define BAD_SCALE 35 #define BAD_TILE_SIZE 36 /* * Data structures used by ARC routines */ typedef struct lpoint { int32 row; int32 col; } LPOINT; typedef struct latlon { double lat; double lon; } LATLON; typedef struct tile_info { int tile_row; /* row number of the tile in the image */ int tile_col; /* column number of the tile in the image */ int row; /* coordinate's row number relative to the * tile */ int col; /* coordinate's column number relative to the * tile */ } TILE_INFO; #if 0 typedef struct arc_parms { int32 scale; /* scale of the map */ LATLON origin; /* lat/lon of map origin (upper left corner) */ LPOINT ul; /* image upper left row and column */ LPOINT lr; /* image lower right row and column */ int tile_size; /* size of a tile in pixels */ int zone; /* zone number of upper-left of image */ } ARC_PARMS; #endif extern double fmod(); extern double fabs(); #endif /* H_ARC_DEF */ ogdi-ogdi_4_1_0/vpflib/include/arcfunc.h000066400000000000000000000021051345660466700203200ustar00rootroot00000000000000#ifndef H_ARC_FUNC #define H_ARC_FUNC /* * Prototypes for functions in arc.c */ #if XVT_CC_PROTO int arc(int, double *, double *, int32 *, int32 *, ARC_PARMS *, TILE_INFO *); void arc_to_lat(int32, int32, double, double, double, double, int, double *, double *); double dms2dec(char *); void get_ab(int, double *, double *); int get_arc_zone(double); int get_overlap_coords(ARC_PARMS * parms, int32 *north_row, int32 *south_row); void lat_to_arc(double, double, double, double, int, double, double, int32 *, int32 *); int read_arc_parms(ARC_PARMS *); void scale_adjust(double *a, double *b, int32 scale); char *strip_str(char *, char); #else int arc(); void arc_to_lat(); double dms2dec(); void get_ab(); int get_arc_zone(); int get_overlap_coords(); void lat_to_arc(); int read_arc_parms(); void scale_adjust(); char *strip_str(); #endif #endif /* H_ARC_FUNC */ ogdi-ogdi_4_1_0/vpflib/include/bmp.h000066400000000000000000000044661345660466700174710ustar00rootroot00000000000000#ifndef H_BMP #ifndef INCL_XVTH #include "xvt.h" #endif #if XVT_OS == XVT_OS_WIN3 #ifndef __WINDOWS_H #include "windows.h" #endif #else typedef short WORD; typedef int32 DWORD; #define BI_RGB 0 #define BI_RLE8 1 #define BI_RLE4 2 #endif typedef char BYTE1; /* BITMAPFILEHEADER structure */ typedef struct tag_BITMAP_FILEHEADER { WORD bfType; /* The type of bitmap */ DWORD bfSize; /* The size in DWORDS of the file */ WORD bfReserved1; /* Reserved zero */ WORD bfReserved2; /* Reserved zero */ DWORD bfOffBits; /* The offset in bytes from the BITMAPFILEHEADER to the actual bitmap */ } BITMAP_FILEHEADER; /* BITMAPINFOHEADER structure */ typedef struct tag_BITMAP_INFOHEADER { DWORD biSize; /* The size of the structure */ DWORD biWidth; /* The width of the bitmap */ DWORD biHeight; /* The height of the bitmap */ WORD biPlanes; /* The number of planes = 1 */ WORD biBitCount; /* The number of bits per pixel 1 4 8 24 */ DWORD biCompression; /* The compression type BI_RGB(0) = not compressed BI_RLE8(1)= run length encoded 8 bitsperpix BI_RLE4(2)= run length encoded 4 bitsperpix */ DWORD biSizeImage; /* The size in bytes of the image */ DWORD biXPelsPerMeter; /* The horiz resolution in pixels per meter */ DWORD biYPelsPerMeter; /* The vert resolution in pixels per meter */ DWORD biClrUsed; /* The number of color indexes in the LUT if = 0 use maximum for bit count if not = 0 use actual number */ DWORD biClrImportant; /* The number of important colors */ } BITMAP_INFOHEADER; /* RGBQUAD structure */ typedef struct tag_RGB_QUAD { BYTE1 rgbBlue; /* The blue value */ BYTE1 rgbGreen; /* The green value */ BYTE1 rgbRed; /* The Red value */ BYTE1 rgbReserved; /* The Reserved value */ } RGB_QUAD; /* BITMAPINFO structure */ typedef struct tag_BITMAP_INFO { BITMAP_INFOHEADER bmiHeader; RGB_QUAD *bmiColors; } BITMAP_INFO; #endif ogdi-ogdi_4_1_0/vpflib/include/cb_d.h000066400000000000000000000004271345660466700175730ustar00rootroot00000000000000#ifndef H_CB_DEF #define H_CB_DEF #define AUTO_COORD 10 #define GUI_COORD 11 #define AUTO_DATUM 20 #define GUI_DATUM 21 #define AUTO_ELLIPS 30 #define GUI_ELLIPS 31 #define GET_POINT 40 #define GET_CHILD 88 #define TERMINATE 99 #endif /* H_CB_DEF */ ogdi-ogdi_4_1_0/vpflib/include/cb_f.h000066400000000000000000000004271345660466700175750ustar00rootroot00000000000000#ifndef H_CB_DEF #define H_CB_DEF #define AUTO_COORD 10 #define GUI_COORD 11 #define AUTO_DATUM 20 #define GUI_DATUM 21 #define AUTO_ELLIPS 30 #define GUI_ELLIPS 31 #define GET_POINT 40 #define GET_CHILD 88 #define TERMINATE 99 #endif /* H_CB_DEF */ ogdi-ogdi_4_1_0/vpflib/include/cc1_f.h000066400000000000000000000016461345660466700176630ustar00rootroot00000000000000 #ifndef H_CC1_F #define H_CC1_F #ifndef H_UNIT_DEF #include "unit_d.h" #endif #ifndef H_COORD_DEF #include "coord_d.h" #endif #if XVT_CC_PROTO ERRSTATUS coord_2_gp_radian(POINT_UNITS *user_pt, POINT_DD *radian_pt, COORD_SYS *params, char *err_message); #else ERRSTATUS coord_2_gp_radian(); #endif #if XVT_CC_PROTO ERRSTATUS gp_radian_2_coord(POINT_UNITS *user_pt, POINT_DD *radian_pt, COORD_SYS *params, char *err_message); #else ERRSTATUS gp_radian_2_coord(); #endif #if XVT_CC_PROTO ERRSTATUS input_pt_2_output_pt( COORD_SYS *in_sys, COORD_SYS *out_sys, POINT_UNITS *in_pt, DTCC_OUTPUT *out_info ); #else ERRSTATUS input_pt_2_output_pt( ); #endif #if XVT_CC_PROTO void convert_pt_to_user_str(COORD_SYS *coord_in, POINT_UNITS *upoint, char *output); #else void convert_pt_to_user_str(); #endif #if XVT_CC_PROTO void conv_lon_to_180_scale(double *rad_lon); #else void convert_pt_to_user_str(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/cli_sr_d.h000066400000000000000000000004331345660466700204570ustar00rootroot00000000000000#ifndef H_CLI_SR_D #define H_CLI_SR_D #define AUTO_COORD 10 #define GUI_COORD 11 #define AUTO_DATUM 20 #define GUI_DATUM 21 #define AUTO_ELLIPS 30 #define GUI_ELLIPS 31 #define GET_POINT 40 #define GET_CHILD 88 #define TERMINATE 99 #endif /* CLI_SR_D */ ogdi-ogdi_4_1_0/vpflib/include/cli_sr_f.h000066400000000000000000000023031345660466700204570ustar00rootroot00000000000000 #ifndef H_CLI_SR_F #define H_CLI_SR_F #ifndef INCL_XVTH #include "xvt.h" #endif extern WINDOW dlg_wait_eh XVT_CC_ARGS((WINDOW xdWindow, EVENT *xdEvent)); /*************************************************************** @ dlg_wait_open() **************************************************************** Invoke dialog that displays wait message while client is waiting for information form server */ #if XVT_CC_PROTO void dlg_wait_open(WINDOW xdWindow, char *child_str, char *parent_str); #else void dlg_wait_open(); #endif /* Description: */ /*************************************************************** @ dlg_wait_close() **************************************************************** Close dialog that displays wait message while client is waiting for information form server */ #if XVT_CC_PROTO void dlg_wait_close( WINDOW xdWindow ); #else void dlg_wait_close(); #endif /* Description: */ /*************************************************************** @ do_menu_item_quit() **************************************************************** */ #if XVT_CC_PROTO void do_menu_item_quit(WINDOW xdWindow); #else void do_menu_item_quit(); #endif /* Description: */ #endif /* H_CLI_SR_F */ ogdi-ogdi_4_1_0/vpflib/include/color_d.h000066400000000000000000000152231345660466700203250ustar00rootroot00000000000000#ifndef H_COLOR_D #define H_COLOR_D #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_MUSE1 #include "muse1.h" #endif /*************************************************************** @ RGB_BITS **************************************************************** The default number of bits used to store RGB color values */ #define RGB_BITS 16 /* * Description: RGB values usually are stored as 16 bit unsigned shorts: (0 - * 65545). */ /*************************************************************** @ RGB_MAX **************************************************************** The maximum value used to store RGB. */ #define RGB_MAX 65535L /* * Description: RGB values are stored as 16 bit unsigned shorts: (0 - 65545). */ /*************************************************************** @ MAX_COLORS **************************************************************** Miximum number of colors allowed */ #define MAX_COLORS 256 /* * Description: MUSE uses 8 bit indirect color which allows 256 colors. Some * of these colors are reserved by the windowing system and some are reserved * by MUSE-PHIGS. Only 216 colors are available for use in raster displays. */ /*************************************************************** @ MAX_LUT **************************************************************** Number of look-up-table ranges */ #define MAX_LUT 6 /* * Description: Since MAX_LUT is used to dimension the LUT data structure, * changing it may cause problems with existing LUT files and maps. */ /************************************************************** @ COLOR_PREF **************************************************************** Preference for reconciling lut and palette */ typedef enum { ALL_PURPOSE, /* Both image and terrain use default */ FAVOR_IMAGE, /* Lut is mapped to image palette */ FAVOR_TERRAIN /* Lut generates the palette */ } COLOR_PREF; /* * Description: If all map windows use ALL_PURPOSE, the map windows will all * use the same default palette and will not compete for the system palette. * The FAVOR_IMAGE setting will result in the terrain look-up-table colors * being mapped to the closest existing palette color. The FAVOR_TERRAIN * setting will generate a new palette to match the lut. */ /*************************************************************** @ PAL_TYPE **************************************************************** Types of palettes */ typedef enum { PAL_UNKNOWN, /* non-algorithmic palette- use min dist */ PAL_BIT_BINS, /* #bits for R,G, and B */ PAL_NUM_BINS, /* #bins for R, G, and B */ PAL_GREY /* equal R, G, B */ } PAL_TYPE; /* * Description: PAL_TYPE indicates the algorithm by which it was constructed * and thus how it can be used. PAL_UNKNOWN palettes have an unknown origin. * Colors are classified into unknown palettes using minimum distance. * PAL_BIT_BINS and PAL_NUM_BINS palettes are constructed as a 3D matrix of * color with red, green, and blue on the three axes. Colors may be * classified into the PAL_BIT_BINS palettes using fast bit operations. * Colors may be classified into the PAL_NUM_BINS palettes using slightly * slower integer math. */ /*************************************************************** @ PALETTE_USAGE **************************************************************** Controls use of gray and rgb palette sections */ typedef enum { PAL_BOTH, PAL_RGB_ONLY, PAL_GRAY_ONLY, PAL_NATIVE } PALETTE_USAGE; /*************************************************************** @ RGB24 **************************************************************** Structure to contain 24 bit RGB pixel */ typedef struct { BYTE r; BYTE g; BYTE b; } RGB24; /* * Description: The red, green, and blue values are stored as BYTE (unsigned * char) with a range of 0-255. */ /*************************************************************** @ RGB **************************************************************** Structure to contain 48 bit RGB data */ typedef struct { unsigned short r; unsigned short g; unsigned short b; } RGB; /* * Description: The red, green, and blue vbalues range from 0-65535. */ /*************************************************************** @ PALETTE **************************************************************** Structure for a color palette */ typedef struct { int32 magic; /* structure id */ PAL_TYPE type; /* how it was generated and used */ RGB bins; /* # bins if type is PAL_RGB_BINS */ USHORT first_color;/* index of first valid palette color */ USHORT num_colors; /* # of valid colors */ RGB rgb[MAX_COLORS]; /* RGBs range 0 - 65535 (16bit) */ FILE_SPEC palette_file; /* where it is stored */ } PALETTE; /* * Description: These objects may be created and read using * palette_construct(). They may be destroyed and written using * palette-destruct(). */ /*************************************************************** @ SHADE **************************************************************** A structure containing a color saturation and value */ typedef struct { GFLOAT sat; /* 0.0 - 1.0 range */ GFLOAT val; /* 0.0 - 1.0 range */ } SHADE; /* * Description: */ /*************************************************************** @ LUT_DESC **************************************************************** A look-up-table descriptor */ typedef struct { int32 num_hues; /* number of color bands */ int32 num_shades; /* number of shades of each color */ GFLOAT data_range[2]; GFLOAT hue_range[2]; SHADE shade_range[3]; } LUT_DESC; /* * Description: */ /*************************************************************** @ LUT **************************************************************** A look-up-table */ typedef struct { int32 magic; /* LUT version id */ LUT_DESC lut_desc[MAX_LUT]; /* The lut descriptors */ /* USHORT map[MAX_COLORS]; *//* map to nearest pal color */ BOOLEAN stretch; /* Fit Colors to LUT range */ FILE_SPEC lut_file; /* File name */ } LUT; /* * Description: Each LUT_DESCriptor defines the data, hue, saturation, and * value ranges for a data range. Lut2pal() generates a palette from a lut. * Lut_lookup() looks a data value up in the lut to determine its color. */ typedef struct { int lr, tb, nh, ns; } global_sq_size; #endif /* H_COLOR_D */ ogdi-ogdi_4_1_0/vpflib/include/color_f.h000066400000000000000000000215721345660466700203330ustar00rootroot00000000000000#ifndef H_COLOR_F #define H_COLOR_F #ifndef H_COLOR_D #include "color_d.h" #endif #ifndef H_MAPDOC_D #include "mapdoc_d.h" #endif /*************************************************************** @ add_color_bias() **************************************************************** Adds PAL_OFFSET to the raster bitmap. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API add_color_bias(GHANDLE bitmap); #else ERRSTATUS MUSE_API add_color_bias(); #endif /* * Description: */ /*************************************************************** @ color_dist() **************************************************************** Computes distance between two RGB colors. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API color_dist(RGB x, RGB y, int32 *distance); #else ERRSTATUS MUSE_API color_dist(); #endif /* * Description: A simple cartesian 3D distance is computed. */ /*************************************************************** @ decode_palette() **************************************************************** Convert palette structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_palette( unsigned char *buffer, PALETTE * palette); #else ERRSTATUS MUSE_API decode_palette(); #endif /* * Description: The palette structure information in the character buffer * (binary portable Intel format) is placed into the palette structure in * local binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ decode_lut() **************************************************************** Convert lut structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_lut( unsigned char *record, LUT * lut); #else ERRSTATUS MUSE_API decode_lut(); #endif /* * Description: The lut structure information in the character buffer (binary * portable Intel format) is placed into the lut structure in local binary. * Used by the constructor functions while loading in a map document. */ /*************************************************************** @ encode_lut() **************************************************************** Convert lut structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_lut( unsigned char *buffer, LUT * lut); #else ERRSTATUS MUSE_API encode_lut(); #endif /* * Description: The lut structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ encode_palette() **************************************************************** Convert palette structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_palette( unsigned char *buffer, PALETTE * palette); #else ERRSTATUS MUSE_API encode_palette(); #endif /* * Description: The palette structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ hsv2rgb() **************************************************************** Invoke a user interface dialog or window */ #if XVT_CC_PROTO ERRSTATUS MUSE_API hsv2rgb(GFLOAT hue, GFLOAT sat, GFLOAT val, GFLOAT * r, GFLOAT * g, GFLOAT * b); #else ERRSTATUS MUSE_API hsv2rgb(); #endif /* * Description: * */ /*************************************************************** @ lut_construct() **************************************************************** Create a look-up-table. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lut_construct( FILE * file, PALETTE * pal, LUT ** lut); #else ERRSTATUS MUSE_API lut_construct(); #endif /* * Description: If the file argument is not NULL, the look_up_table will be * read in from the file. Otherwise a default lut will be created. Lut's * define the relationship between data values and the colors used to display * them on the map. */ /*************************************************************** @ lut_destruct() **************************************************************** Frees up the lut memory. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lut_destruct( FILE * file, BOOLEAN destruct, LUT ** lut); #else ERRSTATUS MUSE_API lut_destruct(); #endif /* * Description: If the file argument is not NULL the lut is written into the * file using fwrite. If the destruct argument is true the lut is removed * from memory. */ /*************************************************************** @ lut_lookup() **************************************************************** Look up a data value in a look-up-table */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lut_lookup( LUT * lut, PALETTE * pal, GFLOAT data, GFLOAT delta, RENDER_INFO * render_info, USHORT * index); /* int32 *color */ #else ERRSTATUS MUSE_API lut_lookup(); #endif /* * Description: Looks up the data value and delta in the lut and returns the * color index. * */ #if 0 /*************************************************************** @ lut2pal() **************************************************************** Generates a palette from a look-up-table */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lut2pal( LUT * lut, COLOR_PREF color_pref, PALETTE * pal); #else ERRSTATUS MUSE_API lut2pal(); #endif /* * Description: The color information contained in the lut in the form of * hue, saturation, and value is used to generate the palette. */ #endif /*************************************************************** @ palette_construct() **************************************************************** Construct a color palette. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API palette_construct( FILE * file, PALETTE ** palette); #else ERRSTATUS MUSE_API palette_construct(); #endif /* * Description: If the file argument is not NULL the palette is loaded from * the file. Otherwise, a default palette is created. */ /*************************************************************** @ palette_destruct() **************************************************************** Destroy the color palette */ #if XVT_CC_PROTO ERRSTATUS MUSE_API palette_destruct( FILE * file, BOOLEAN destruct, PALETTE ** palette); #else ERRSTATUS MUSE_API palette_destruct(); #endif /* * Description: If the file argument is not NULL, the palette is read from * the file, otherwise a default palette is created. */ /*************************************************************** @ palette_rgbcube_construct() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API palette_rgbcube_construct(PALETTE ** pointer); #else ERRSTATUS MUSE_API palette_rgbcube_construct(); #endif /* * Description: */ /*************************************************************** @ pal_nearest_color() **************************************************************** Gets a palette color from an RGB color */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pal_nearest_color( PALETTE * palette, PALETTE_USAGE palette_usage, RGB rgb, USHORT * color_index); #else ERRSTATUS MUSE_API pal_nearest_color(); #endif /* * Description: Maps the input RGB color into the palette. The method used * depends on the palette type. * */ /*************************************************************** @ pal_rgb_bins_construct() **************************************************************** Construct a palette of RGB bins */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pal_gen( PALETTE * palette); #else ERRSTATUS MUSE_API pal_gen(); #endif /* * Description: Constructs a palette as a 3D matrix of color with red, green, * and blue on the 3 axes. The palette structure must have been initialized * with the desired PAL_TYPE and the bin counts for red, green, and blue. The * total number of bins must not exceed 256. */ /*************************************************************** @ remove_color_bias() **************************************************************** Removes PAL_OFFSET from the raster bitmap. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API remove_color_bias(GHANDLE bitmap); #else ERRSTATUS MUSE_API remove_color_bias(); #endif /* * Description: */ /*************************************************************** @ rgb2uvw() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API rgb2uvw(int32 r, int32 g, int32 b, int32 *u, int32 *v, int32 *w); #else ERRSTATUS MUSE_API rgb2uvw(); #endif /* * Description: */ /*************************************************************** @ uvw2rgb() **************************************************************** Sets windows and cursors during a map update. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API uvw2rgb(int32 u, int32 v, int32 w, int32 *r, int32 *g, int32 *b); #else ERRSTATUS MUSE_API uvw2rgb(); #endif /* * Description: * */ #endif /* H_COLOR_F */ ogdi-ogdi_4_1_0/vpflib/include/coord_d.h000066400000000000000000000567371345660466700203340ustar00rootroot00000000000000#ifndef H_COORD_DEF #define H_COORD_DEF #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_DATUM_DEF #include "datum_d.h" #endif /*#include "math.h"*/ #define SZ_COORD_SYS 651 /* not used */ /*************************************************************** @ Misc. Constants **************************************************************** */ #define NORTH_HEMI 0 #define SOUTH_HEMI 1 #define EAST_HEMI 0 #define WEST_HEMI 1 #define USER_DEFINED 0 #define GET_USER_POINT 20000 #define MAX_COORD_NAME_SIZE 60 #define MAX_COORD_RECORD_SIZE 315 #define MAX_NO_OF_COORD_TYPES 50 #define MAX_COORD_UNIT_NAME_SIZE /*10*/ 20 /* 02/22/94 */ #define MAX_COORD_PROJ_NAME_SIZE 30 #define PNT_LABEL_LEN 13 /*************************************************************** @ MISCELLANEOUS DEFINES **************************************************************** */ #define MUSE_ERROR(n) xvt_error(n) #define MUSE_LOG_CHECK /* enables check for negative log argument */ /*************************************************************** @ COORD_ENUM **************************************************************** */ typedef enum { COORD_GP, COORD_UTM, COORD_UPS, COORD_MGRS, COORD_XYZ, COORD_AE, COORD_AKRSO, COORD_GEOREF, COORD_LAM, COORD_MADL, COORD_MER, COORD_MRSO, COORD_NZMG, COORD_OBM, COORD_TM } COORD_ENUM; /* Description: User's choice for type of point coordinates. */ /*************************************************************** @ PROJ_ENUM **************************************************************** */ typedef enum { UNIT_METERS, UNIT_FEET, UNIT_YARDS, UNIT_INMS, UNIT_MMMS, UNIT_PIXMS } PROJ_ENUM; /* Description: User's choice for type of point coordinates. */ /*************************************************************** @ GP_ENUM **************************************************************** */ typedef enum { UNIT_RAD, UNIT_GRAD, UNIT_DD, UNIT_DM, UNIT_DMS } GP_ENUM; /* Description: User's choice for type of point coordinates. */ /*************************************************************** @ UNIT_ENUM **************************************************************** */ typedef struct { BOOLEAN gp ; GP_ENUM gp_enum ; PROJ_ENUM proj_enum; BOOLEAN uses_paris_merid; } UNIT_ENUM; /* Description: User's choice for type of point coordinates. */ /*************************************************************** @ USER_CONTROL **************************************************************** */ typedef enum { USER_DEFINABLE, INTERNALLY_DEFINED, NOT_APPLICABLE } USER_CONTROL; /* Description: Control dialog interface for each instance */ /*************************************************************** @ DATUM_REF **************************************************************** */ typedef struct { char index[6]; USER_CONTROL user_control; } DATUM_REF; /* Description: */ /*************************************************************** @ ELLIPS_REF **************************************************************** */ typedef struct { char index[3]; USER_CONTROL user_control; } ELLIPS_REF; /* Description: */ /*************************************************************** @ COORD_UNIT **************************************************************** */ typedef struct { UNIT_ENUM unit_enum; char name[MAX_COORD_UNIT_NAME_SIZE]; USER_CONTROL user_control; } COORD_UNIT; /* Description: */ /*************************************************************** @ FN **************************************************************** */ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } FN; /* Description: */ /*************************************************************** @ FE **************************************************************** */ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } FE; /* Description: */ /*************************************************************** @ COORD_PROJ **************************************************************** */ typedef struct { COORD_ENUM coord_enum; char name[MAX_COORD_PROJ_NAME_SIZE]; USER_CONTROL user_control; } COORD_PROJ; /* Description: */ /*************************************************************** @ COORD_DMS **************************************************************** A geo-coordinate in deg, min, sec */ typedef struct { short d; /* degrees */ short m; /* minutes */ GFLOAT s; /* seconds */ } COORD_DMS; /* * Description: */ /*************************************************************** @ POINT_DMS **************************************************************** A point id deg, min, sec */ typedef struct { COORD_DMS lon; COORD_DMS lat; } POINT_DMS; /* * Description: */ /*************************************************************** @ ORIGIN_LAT **************************************************************** */ typedef struct { COORD_DMS point; USER_CONTROL user_control; BOOLEAN valid; } ORIGIN_LAT; /* Description: */ /*************************************************************** @ ORIGIN_LON **************************************************************** */ typedef struct { COORD_DMS point; USER_CONTROL user_control; BOOLEAN valid; } ORIGIN_LON; /* Description: */ /*************************************************************** @ SP1 **************************************************************** */ typedef struct { COORD_DMS point; USER_CONTROL user_control; BOOLEAN valid; } SP1; /* Description: */ /*************************************************************** @ SP2 **************************************************************** */ typedef struct { COORD_DMS point; USER_CONTROL user_control; BOOLEAN valid; } SP2; /* Description: */ /*************************************************************** @ CENTRAL_AZIMUTH **************************************************************** */ typedef struct { COORD_DMS point; USER_CONTROL user_control; BOOLEAN valid; } CENTRAL_AZIMUTH; /* Description: */ /*************************************************************** @ CENTRAL_SCALE **************************************************************** */ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } CENTRAL_SCALE; /* Description: */ /*************************************************************** @ EXTENTS **************************************************************** */ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } EXTENTS; /* Description: */ /*************************************************************** @ SCALE_RECIP *****************************************************************/ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } SCALE_RECIP; /* Description: */ /*************************************************************** @ SCREEN_PPI *****************************************************************/ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } SCREEN_PPI; /* Description: */ /*************************************************************** @ COORD_EXTENT *****************************************************************/ typedef struct { double value; USER_CONTROL user_control; BOOLEAN valid; } COORD_EXTENT; /* Description: */ /*************************************************************** @ COORD_DM **************************************************************** A geo-coordinate in deg, min, sec */ typedef struct { short d; /* degrees */ GFLOAT m; /* minutes */ } COORD_DM; /* * Description: */ /*************************************************************** @ POINT_DD **************************************************************** A Point in decimal degrees */ typedef struct { GFLOAT lon; GFLOAT lat; GFLOAT height; } POINT_DD; /* * Description: */ /*************************************************************** @ POINT_XY **************************************************************** Any point POINT_DD structure */ typedef struct { GFLOAT x; GFLOAT y; } POINT_XY; /* * Description: */ /*************************************************************** @ POINT_XYZ **************************************************************** A Point in decimal degrees */ typedef struct { GFLOAT x; GFLOAT y; GFLOAT z; } POINT_XYZ; /* * Description: */ /*************************************************************** @ POINT_DM **************************************************************** A geo-coordinate in deg, min */ typedef struct { COORD_DM lon; COORD_DM lat; GFLOAT height; } POINT_DM; /*************************************************************** @ POINT_GEOREF **************************************************************** A point in GEOREF */ typedef struct { char quad_15deg[3]; char quad_1deg[3]; int32 lonminutes; int32 latminutes; char georef[20]; /* string representation of above */ GFLOAT height; } POINT_GEOREF; /* * Description: */ /*************************************************************** @ POINT_MGRS **************************************************************** A point in Military Grid reference System This is struct is to be determined */ typedef struct { char mgrs[30]; GFLOAT height; } POINT_MGRS; /* * Description: */ /*************************************************************** @ POINT_UTM **************************************************************** A point in Universal Transverse Mercator projection */ typedef struct { int zone; GFLOAT northing; GFLOAT easting; GFLOAT height; } POINT_UTM; /* * Description: */ /*************************************************************** @ POLAR_PARAMS **************************************************************** Parameters for the ADRG Polar projection */ typedef struct { GFLOAT lat0; GFLOAT lon0; GFLOAT brv; } POLAR_PARAMS; /* * Description: */ /*************************************************************** @ POINT_UNITS **************************************************************** Union of available types of point-oriented user units. */ typedef union { POINT_DD gpoint; /* changed from MUSE structure */ POINT_DM dm; /* added to MUSE structure */ POINT_DMS dms; POINT_UTM utm; POINT_MGRS mgrs; POINT_GEOREF georef; POINT_XYZ otherpnt; } POINT_UNITS; /*** Description: Used in the conversion functions for geographic units. ***/ /*************************************************************** @ POINT_TYPE **************************************************************** Union of available types of point-oriented user units. */ typedef struct { char promptstr[40]; /*needed by Fusion */ POINT_UNITS point; BOOLEAN valid; char label[PNT_LABEL_LEN]; int gp_enum; double north_extent, south_extent, east_extent, west_extent; } POINT_TYPE; /*** Description: Used in the conversion functions for geographic units. ***/ /*************************************************************** @ GEO_EXTENT *****************************************************************/ typedef struct { POINT_UNITS point; USER_CONTROL user_control; BOOLEAN valid; } GEO_EXTENT; /* Description: */ /*************************************************************** @ COORD_PREF *****************************************************************/ typedef enum { OFFSET_AND_SCALE, CENTER_POINT_SCALE_IMAGE_EXTENT, GEO_EXTENT_SCALE, GEO_AND_IMAGE_EXTENT } COORD_PREF; /* Description: */ /*************************************************************** @ COORD_TYPE ****************************************************************/ typedef struct { /* THESE VALUES ARE RETRIEVED FROM THE COORDSYS.DAT FILE. */ char name[MAX_COORD_NAME_SIZE]; BOOLEAN valid; BOOLEAN uses_ellipsoid; DATUM_REF datum_ref; ELLIPS_REF ellips_ref; COORD_UNIT coord_unit; FN fn; FE fe; COORD_PROJ coord_proj; ORIGIN_LAT origin_lat; ORIGIN_LON origin_lon; SP1 sp1; SP2 sp2; CENTRAL_AZIMUTH central_azimuth; CENTRAL_SCALE central_scale; EXTENTS north,south,east,west; SCALE_RECIP scale_reciprocal; /* THESE VALUES ARE RETRIEVED FROM THE CLIENT CALLING THIS PROGRAM. */ SCREEN_PPI screen_ppi; COORD_EXTENT height,width; GEO_EXTENT geo_upper_right,geo_lower_left,geo_center; COORD_PREF coord_pref; /* THESE VALUES ARE DERIVED BY THE "ORIGIN FUNCTIONS" OF THE COORDINATE TYPES (EG TMORIG.C) */ double ophi, olam; /* origin lat and lon in radians */ double b, e, es; /* additional ellipsoid parameters */ double ogam; /* origin meridian convergence angle in radians */ double oaz; /* central azimuth in radians */ double ta, tb, te; /* projection constants for Oblique Mercator */ int32 method, kodor; /* setup codes for Oblique Mercator */ } COORD_TYPE; /* Description: Structure for storing one record from the ellipsoids file. Fields are the ellipsoid name, semi-major axis, flattening, and eccentricity squared. */ /*************************************************************** @ COORD_FILE_INFO **************************************************************** */ typedef struct { COORD_TYPE coord[MAX_NO_OF_COORD_TYPES]; int coord_read; } COORD_FILE_INFO; /* Description: Structure for storing all pre-defined ellipsoids parameters from ellipsoids file, as well as total number of ellipsoids read, index of current local ellipsoid, and flag indicating whether parameters have been entered for the user-specified ellipsoid. ellipsoid_selected is the same value as datum_info->datums[datum_info->datum_selected].ellips_num. */ /*************************************************************** @ ARCPOINT **************************************************************** ARC map projection parameters */ typedef struct { int32 row; int32 col; } ARCPOINT; /* * Description: */ /*************************************************************** @ ASPECT **************************************************************** Aspect of a map projection */ typedef struct { GFLOAT plon; GFLOAT plat; GFLOAT plat1; GFLOAT plat2; } ASPECT; /* * Description: Plon and plat are the points of tangency of the developable * surface. Plat1 and Plat2 are the standard parallels for the Lambert * Conformal Conic. */ /*************************************************************** @ DIR_ENUM **************************************************************** Transformation direction */ typedef enum { TO_WGS84, FROM_WGS84 } DIR_ENUM; /* * Description: */ /*************************************************************** @ GEOGRAPHIC **************************************************************** Geographic coordinates are stored internally in DD. */ typedef enum { DD, DMS, GEOREF, MGRS, MIN, SEC, UTM } GEOGRAPHIC; /* * Description: */ /*************************************************************** @ GRID_PARAMS **************************************************************** */ typedef struct { double a; double b; double e; double es; double fe; double fn; double oaz; double ogam; double ok; double olam; double slam; double ta; double tb; double te; } GRID_PARAMS; /* * Description: */ /*************************************************************** @ HOR_DATUM **************************************************************** Horizontal datums */ typedef enum { NDEFINED, HD_WGS84, HD_WGS72, HD_NAD27, HD_EUD50 } HOR_DATUM; /* * Description: */ /*************************************************************** @ LAMBER_PARAMS **************************************************************** Lambert Conformal Conic map projection parameters */ typedef struct { GFLOAT n; GFLOAT F; GFLOAT rho0; } LAMBER_PARAMS; /* * Description: */ /*************************************************************** @ LINEAR_PARAMS **************************************************************** Linear (Platt-Carree) map projection parameters */ typedef struct { GFLOAT dummy; } LINEAR_PARAMS; /* * Description: */ /*************************************************************** @ MERCAT_PARAMS **************************************************************** Mercator map projection parameters */ typedef struct { GFLOAT dummy; } MERCAT_PARAMS; /* * Description: */ /*************************************************************** @ DTCC_OUTPUT **************************************************************** Data returned by main coordinate conversion and datum transformation routine */ typedef struct { POINT_UNITS output_pt; POINT_DD out_gp_rad_pt; POINT_XYZ trans_error; char err_message[80]; } DTCC_OUTPUT; /* * Description: */ /*************************************************************** @ PROJ_DIR **************************************************************** Map projection direction */ typedef enum { PROJ_FORWARD, PROJ_REVERSE } PROJ_DIR; /* * Description: PROJ_FORWARD tells map_it() to convert from grographic * coordinates to PHIGS graphics coordinates. PROJ_REVERSE tells map_it() to * convert from PHIGS graphics coordinates back to geographic coordinates. */ /*************************************************************** @ PROJ_NAME_LEN **************************************************************** Limit on length of a projection name */ #define PROJ_NAME_LEN 30 /* * Description: */ /*************************************************************** @ PROJECTION **************************************************************** Map projections */ typedef enum { PROJ_UNDEFINED, PROJ_LAMBERT1, PROJ_LAMBERT2, PROJ_LINEAR, PROJ_MERCATOR, PROJ_UPS, PROJ_UTM, PROJ_GRAPH, PROJ_POLAR, PROJ_ARC, PROJ_TS } PROJECTION; /* * Projections to be added in the future: PROJ_BONNE, PROJ_MOLLWEIDE, * PROJ_ORTHOGRAPHIC, PROJ_STEREOGRAPHIC, PROJ_TRANSVERSE_MERCATOR, * * Description: */ /*************************************************************** @ STEREO_PARAMS **************************************************************** Stereographic map projection parameters */ typedef struct { GFLOAT dummy; } STEREO_PARAMS; /* * Description: */ /*************************************************************** @ TRANSFORM_PARAMS **************************************************************** */ typedef struct { char from_ellips[3]; /* isph in FORTRAN; nnfr in NT MADTRAN */ double from_a; double from_f; double from_e_sq; double da; double df; int dx; int dy; int dz; int ex; int ey; int ez; } TRANSFORM_PARAMS; /* Description: Structure used to store all parameters needed by the transformation algorithm. */ /*************************************************************** @ TRANSM_PARAMS **************************************************************** Transverse Mercator map projection parameters */ typedef struct { int32 izone; } TRANSM_PARAMS; /* * Description: */ /*************************************************************** @ TS_PARAMS **************************************************************** Tessellated Spheroid map projection parameters */ typedef struct { short ts_zone; short ts_scale; } TS_PARAMS; /* * Description: */ /*************************************************************** @ UNITS_TYPE **************************************************************** List of available types of units. */ typedef union { GFLOAT dd2; COORD_DMS dms; POINT_UTM utm; POINT_MGRS mgrs; POINT_GEOREF georef; GFLOAT mn; GFLOAT sec; } UNITS_TYPE; /* * Description: */ /*************************************************************** @ VER_DATUM **************************************************************** */ typedef enum { UDEFINED, VD_ELIPSOID, VD_MSL } VER_DATUM; /* * Description: */ /*************************************************************** @ ARC_PARMS **************************************************************** */ typedef struct { int32 scale; POINT_DD origin; ARCPOINT ul; ARCPOINT lr; int tile_size; int zone; } ARC_PARMS; /* * Description: */ /*************************************************************** @ DATUM **************************************************************** Structure to contain the horizontal and vertical datums */ typedef struct { HOR_DATUM hor_datum; VER_DATUM ver_datum; } DATUM; /* * Description: */ /*************************************************************** @ MAP_POINT **************************************************************** Data needed when getting a new user point */ typedef struct { char prompt_str[80]; /* char *user_pt_str[40]; */ POINT_UNITS user_pt; POINT_DD dd_pt; } MAP_POINT; /* * Description: Data that is either needed by the dialog box that prompts * user to enter a new data point, or is returned by the box. */ /*************************************************************** @ PARAMS **************************************************************** The union of projection-specific parameters */ typedef union { LINEAR_PARAMS linear_params; LAMBER_PARAMS lamber_params; MERCAT_PARAMS mercat_params; TRANSM_PARAMS transm_params; ARC_PARMS arc_params; TS_PARAMS ts_params; POLAR_PARAMS polar_params; } PARAMS; /* * Description: */ /*************************************************************** @ COORD_SYS **************************************************************** */ typedef struct { COORD_TYPE coord; DATUM_TYPE datum; ELLIPS_PARAMS ellips; BOOLEAN valid; } COORD_SYS ; /* * Description: */ #endif /* H_COORD */ ogdi-ogdi_4_1_0/vpflib/include/coord_f.h000066400000000000000000000355261345660466700203270ustar00rootroot00000000000000#ifndef H_COORD_FUNC #define H_COORD_FUNC #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_COORD_DEF #include "coord_d.h" #endif #if XVT_CC_PROTO void coord_sys_construct ( FILE *file , COORD_SYS **pointer ); #else void coord_sys_construct (); #endif /*SR 08/07 changed argument types for geographic units to points */ /*************************************************************** @ dd_from_dd() **************************************************************** Decimal degrees from decimal degrees */ #if XVT_CC_PROTO ERRSTATUS dd_from_dd( POINT_DD *dd1, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_dd(); #endif /* Description: */ /*************************************************************** @ dd_from_dms() **************************************************************** Decimal degrees from degrees, minutes, and seconds */ #if XVT_CC_PROTO ERRSTATUS dd_from_dms( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_dms(); #endif /* Description: */ /*************************************************************** @ dd_from_georef() **************************************************************** Decmial degrees from GEOREF point */ #if XVT_CC_PROTO ERRSTATUS dd_from_georef( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_georef(); #endif /* Description: */ /*************************************************************** @ dd_from_mgrs() **************************************************************** Decimal degrees from MGRS */ #if XVT_CC_PROTO ERRSTATUS dd_from_mgrs( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_mgrs(); #endif /* Description: */ /*************************************************************** @ dd_from_min() **************************************************************** Decimal degrees from minutes */ #if XVT_CC_PROTO ERRSTATUS dd_from_min( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_min(); #endif /* Description: */ /*************************************************************** @ dd_from_sec() **************************************************************** Decimal degrees from seconds */ #if XVT_CC_PROTO ERRSTATUS dd_from_sec( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_sec(); #endif /* Description: */ /*************************************************************** @ dd_from_utm() **************************************************************** Decimal degrees from UTM */ #if XVT_CC_PROTO ERRSTATUS dd_from_utm( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_from_utm(); #endif /* Description: */ /*************************************************************** @ dd_to_dd() **************************************************************** Decimal degrees to decimal degrees */ #if XVT_CC_PROTO ERRSTATUS dd_to_dd( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_dd(); #endif /* Description: */ /*************************************************************** @ dd_to_dms(); **************************************************************** Decimal degrees to degrees, minutes, and seconds */ #if XVT_CC_PROTO ERRSTATUS dd_to_dms( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_dms(); #endif /* Description: */ /*************************************************************** @ dd_to_georef() **************************************************************** Decimal degree to GEOREF point */ #if XVT_CC_PROTO ERRSTATUS dd_to_georef( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_georef(); #endif /* Description: */ /*************************************************************** @ dd_to_mgrs() **************************************************************** Decimal degree to MGRS */ #if XVT_CC_PROTO ERRSTATUS dd_to_mgrs( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_mgrs(); #endif /* Description: */ /*************************************************************** @ dd_to_min() **************************************************************** Decimal degrees to minutes */ #if XVT_CC_PROTO ERRSTATUS dd_to_min( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_min(); #endif /* Description: */ /*************************************************************** @ dd_to_sec() **************************************************************** Decimal degrees to seconds */ #if XVT_CC_PROTO ERRSTATUS dd_to_sec( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_sec(); #endif /* Description: */ /*************************************************************** @ dd_to_utm() **************************************************************** Decimal degrees to UTM */ #if XVT_CC_PROTO ERRSTATUS dd_to_utm( POINT_DD *dd, POINT_UNITS *user_unit); #else ERRSTATUS dd_to_utm(); #endif /* Description: */ /*************************************************************** @ hm_from_as() **************************************************************** Horizontal meters from arc seconds */ #if XVT_CC_PROTO ERRSTATUS hm_from_as( GFLOAT *hm, GFLOAT as); #else ERRSTATUS hm_from_as(); #endif /* Description: */ /*************************************************************** @ hm_from_hf() **************************************************************** Horizontal meters from horizontal feet */ #if XVT_CC_PROTO ERRSTATUS hm_from_hf( GFLOAT *hm, GFLOAT hf); #else ERRSTATUS hm_from_hf(); #endif /* Description: */ /*************************************************************** @ hm_from_hkm() **************************************************************** Horizontal meters from horizontal kilometers */ #if XVT_CC_PROTO ERRSTATUS hm_from_hkm( GFLOAT *hm, GFLOAT hkm); #else ERRSTATUS hm_from_hkm(); #endif /* Description: */ /*************************************************************** @ hm_from_hl() **************************************************************** Horizontal meters from horizontal leagues */ #if XVT_CC_PROTO ERRSTATUS hm_from_hl( GFLOAT *hm, GFLOAT hl); #else ERRSTATUS hm_from_hl(); #endif /* Description: */ /*************************************************************** @ hm_from_hm() **************************************************************** Horizontal meters from horizontal meters */ #if XVT_CC_PROTO ERRSTATUS hm_from_hm( GFLOAT *hm1, GFLOAT hm2); #else ERRSTATUS hm_from_hm(); #endif /* Description: */ /*************************************************************** @ hm_from_hnm() **************************************************************** Horizontal meters from horizontal nautical miles */ #if XVT_CC_PROTO ERRSTATUS hm_from_hnm( GFLOAT *hm, GFLOAT hnm); #else ERRSTATUS hm_from_hnm(); #endif /* Description: */ /*************************************************************** @ hm_from_hsm() **************************************************************** Horizontal meters from horizontal statute miles */ #if XVT_CC_PROTO ERRSTATUS hm_from_hsm( GFLOAT *hm, GFLOAT hsm); #else ERRSTATUS hm_from_hsm(); #endif /* Description: */ /*************************************************************** @ hm_from_hy() **************************************************************** Horizontal meters from horizontal yards */ #if XVT_CC_PROTO ERRSTATUS hm_from_hy( GFLOAT *hm, GFLOAT hy); #else ERRSTATUS hm_from_hy(); #endif /* Description: */ /*************************************************************** @ hm_to_as() **************************************************************** Horizontal meters to arc seconds */ #if XVT_CC_PROTO ERRSTATUS hm_to_as( GFLOAT hm, GFLOAT *as); #else ERRSTATUS hm_to_as(); #endif /* Description: */ /*************************************************************** @ hm_to_hf() **************************************************************** Horizontal meters to horizontal feet */ #if XVT_CC_PROTO ERRSTATUS hm_to_hf( GFLOAT hm, GFLOAT *hf); #else ERRSTATUS hm_to_hf(); #endif /* Description: */ /*************************************************************** @ hm_to_hkm() **************************************************************** Horizontal meters to horizontal kilometers */ #if XVT_CC_PROTO ERRSTATUS hm_to_hkm( GFLOAT hm, GFLOAT *hkm); #else ERRSTATUS hm_to_hkm(); #endif /* Description: */ /*************************************************************** @ hm_to_hl() **************************************************************** Horizontal meters to horizontal leagues */ #if XVT_CC_PROTO ERRSTATUS hm_to_hl( GFLOAT hm, GFLOAT *hl); #else ERRSTATUS hm_to_hl(); #endif /* Description: */ /*************************************************************** @ hm_to_hm() **************************************************************** Horizontal meters to horizontal meters */ #if XVT_CC_PROTO ERRSTATUS hm_to_hm( GFLOAT hm1, GFLOAT *hm2); #else ERRSTATUS hm_to_hm(); #endif /* Description: */ /*************************************************************** @ hm_to_hnm() **************************************************************** Horizontal meters to horizontal nautical miles */ #if XVT_CC_PROTO ERRSTATUS hm_to_hnm( GFLOAT hm, GFLOAT *hnm); #else ERRSTATUS hm_to_hnm(); #endif /* Description: */ /*************************************************************** @ hm_to_hsm() **************************************************************** Horizontal meters to horizontal statute miles */ #if XVT_CC_PROTO ERRSTATUS hm_to_hsm( GFLOAT hm, GFLOAT *hsm); #else ERRSTATUS hm_to_hsm(); #endif /* Description: */ /*************************************************************** @ invoke_point_dd **************************************************************** */ #if XVT_CC_PROTO WINDOW invoke_point_dd(int32 data, WINDOW parent_win, RCT *rct); #else WINDOW invoke_point_dd(); #endif /* Description: */ /*************************************************************** @ invoke_point_dm **************************************************************** */ #if XVT_CC_PROTO WINDOW invoke_point_dm(int32 data, WINDOW parent_win, RCT *rct); #else WINDOW invoke_point_dm(); #endif /* Description: */ /*************************************************************** @ invoke_point_dms **************************************************************** */ #if XVT_CC_PROTO WINDOW invoke_point_dms(int32 data, WINDOW parent_win, RCT *rct); #else WINDOW invoke_point_dms(); #endif /* Description: */ /*************************************************************** @ invoke_point_mgrs **************************************************************** */ #if XVT_CC_PROTO WINDOW invoke_point_mgrs(int32 data, WINDOW parent_win, RCT *rct); #else WINDOW invoke_point_mgrs(); #endif /* Description: */ /*************************************************************** @ invoke_point_utm **************************************************************** */ #if XVT_CC_PROTO WINDOW invoke_point_utm(int32 data, WINDOW parent_win, RCT *rct); #else WINDOW invoke_point_utm(); #endif /* Description: */ /*************************************************************** @ hm_to_hy() **************************************************************** Horizontal meters to horizontal yards */ #if XVT_CC_PROTO ERRSTATUS hm_to_hy( GFLOAT hm, GFLOAT *hy); #else ERRSTATUS hm_to_hy(); #endif /* Description: */ /*************************************************************** @ mgrs_to_dd() **************************************************************** Converts Military Grid Reference System to Decimal Deg. */ #if XVT_CC_PROTO ERRSTATUS mgrs_to_dd(POINT_MGRS mgrs, POINT_DD dd); #else ERRSTATUS mgrs_to_dd(); #endif /* Description: */ /*************************************************************** @ sr_from_sipd() **************************************************************** Scale reciprocal from scale inches per degree */ #if XVT_CC_PROTO ERRSTATUS sr_from_sipd( GFLOAT *sr, GFLOAT sipd); #else ERRSTATUS sr_from_sipd(); #endif /* Description: */ /*************************************************************** @ sr_from_sr() **************************************************************** Scale reciprocal from scale reciprocal */ #if XVT_CC_PROTO ERRSTATUS sr_from_sr( GFLOAT *sr1, GFLOAT sr2); #else ERRSTATUS sr_from_sr(); #endif /* Description: */ /*************************************************************** @ sr_to_sipd() **************************************************************** Scale reciprocal to scale inches per degree */ #if XVT_CC_PROTO ERRSTATUS sr_to_sipd( double sr, double *user_unit); #else ERRSTATUS sr_to_sipd(); #endif /* Description: */ /*************************************************************** @ sr_to_sr() **************************************************************** Scale reciprocal to scale reciprocal */ #if XVT_CC_PROTO ERRSTATUS sr_to_sr( double sr1, double *user_unit); #else ERRSTATUS sr_to_sr(); #endif /* Description: */ /*************************************************************** @ utm_to_dd() **************************************************************** Converts Universal Transverse Mercator to Decimal Deg. */ #if XVT_CC_PROTO ERRSTATUS utm_to_dd(POINT_UTM utm, POINT_DD dd); #else ERRSTATUS utm_to_dd(); #endif /* Description: */ /*************************************************************** @ vm_from_vf() **************************************************************** Vertical meters from vertical fathoms */ #if XVT_CC_PROTO ERRSTATUS vm_from_vf( GFLOAT *vm, GFLOAT vf); #else ERRSTATUS vm_from_vf(); #endif /* Description: */ /*************************************************************** @ vm_from_vft() **************************************************************** Vertical meters from vertical feet */ #if XVT_CC_PROTO ERRSTATUS vm_from_vft( GFLOAT *vm, GFLOAT vft); #else ERRSTATUS vm_from_vft(); #endif /* Description: */ /*************************************************************** @ vm_from_vm() **************************************************************** Vertical meters from vertical meters */ #if XVT_CC_PROTO ERRSTATUS vm_from_vm( GFLOAT *vm1, GFLOAT vm2); #else ERRSTATUS vm_from_vm(); #endif /* Description: */ /*************************************************************** @ vm_to_vf() **************************************************************** Vertical meters to vertical fathoms */ #if XVT_CC_PROTO ERRSTATUS vm_to_vf( GFLOAT vm, GFLOAT *user_unit); #else ERRSTATUS vm_to_vf(); #endif /* Description: */ /*************************************************************** @ vm_to_vft() **************************************************************** Vertical meters to vertical feet */ #if XVT_CC_PROTO ERRSTATUS vm_to_vft( GFLOAT vm, GFLOAT *user_unit); #else ERRSTATUS vm_to_vft(); #endif /* Description: */ /*************************************************************** @ vm_to_vm() **************************************************************** Vertical meters to vertical meters */ #if XVT_CC_PROTO ERRSTATUS vm_to_vm( GFLOAT vm1, GFLOAT *user_unit); #else ERRSTATUS vm_to_vm(); #endif /* Description: */ #endif /* H_COORD */ ogdi-ogdi_4_1_0/vpflib/include/datum_d.h000066400000000000000000000040751345660466700203240ustar00rootroot00000000000000#ifndef H_DATUM_DEF #define H_DATUM_DEF #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_ELLIPS_DEF #include "ellips_d.h" #endif /*************************************************************** @ Max Constants **************************************************************** */ #define MAX_DATUM_AREA_SIZE 55 #define MAX_DATUM_NAME_SIZE 45 #define MAX_DATUM_RECORD_SIZE 250 #define MAX_NO_OF_DATUMS 300 /* Description: First three constants are used to declare strings for storing datum country\area, datum name, and ellipsoid name. Next two are for declaring strings to read in each line of datum.dat and ellips.dat. Last two are used to declare the arrays which store the information in the datum and ellipsoid input files */ /*************************************************************** @ DATUM_TYPE **************************************************************** */ typedef struct { char name[MAX_DATUM_NAME_SIZE]; char ellips_num[3]; int dx; int dy; int dz; char area[MAX_DATUM_AREA_SIZE]; int ex; int ey; int ez; int n_points; char index[6]; BOOLEAN valid; } DATUM_TYPE; /* Description: Structure for storing one record from the datums file. Fields are datum name, index into ellipsoid array for the datum's ellipsoid, ellipsoid center translations, country/ area name, and transformation sigmas. */ /*************************************************************** @ DATUM_FILE_INFO **************************************************************** */ typedef struct { DATUM_TYPE datums[MAX_NO_OF_DATUMS]; int datums_read; int input_datum; /* new--replaces datum_selected */ int output_datum; /* new */ BOOLEAN need_user_info; } DATUM_FILE_INFO; /* Description: Structure for storing all pre-defined datums parameters from datums file, as well as total number of datums read, index of current local datum, and flag indicating whether parameters have been entered for the user-specified datum. */ #endif /* H_DATUM_DEF */ ogdi-ogdi_4_1_0/vpflib/include/datum_f.h000066400000000000000000000041371345660466700203250ustar00rootroot00000000000000 #ifndef H_DATUM_F #define H_DATUM_F #include "stdlib.h" #if XVT_OS == XVT_OS_WIN #include "float.h" #endif #ifndef H_MUSE1 #include "muse1.h" #endif /*************************************************************** @ datum_transform(); **************************************************************** Driver for calling various datum transformation routines */ #if XVT_CC_PROTO ERRSTATUS datum_transform(POINT_DD *from_gp_radian_pt, POINT_DD *to_gp_radian_pt, POINT_XYZ *error, DATUM_TYPE *loc_datum, ELLIPS_PARAMS *loc_ellips, int transform_dir); #else ERRSTATUS datum_transform(); #endif /* Prototypes formerly in madfunc.h */ /*************************************************************** @ molerror(); **************************************************************** Calculates transformation uncertainty */ #if XVT_CC_PROTO void molerror( POINT_DD *pt, TRANSFORM_PARAMS *params, POINT_XYZ *error); #else void molerror(); #endif /* Description: Based on the translation sigmas and the coordinates of the transformation point, calculates uncertainty of latitude, longitude and height in meters. The error equations are derived by geometric projection of x, y and z vectors to latitude, longitude and height. */ /*************************************************************** @ molod(); **************************************************************** Performs Molodensky datum transformation */ #if XVT_CC_PROTO void molod( POINT_DD *from_pt, POINT_DD *delta, TRANSFORM_PARAMS *params); #else void molod(); #endif /* Description: Performs Molodensky datum transformation in all cases except for WGS72. See DMA TR 8350.2. */ /*************************************************************** @ wgs72(); **************************************************************** Performs datum transformation for the special case when the local datum is WGS 1972. */ #if XVT_CC_PROTO void wgs72( POINT_DD *from_pt, POINT_DD *delta, TRANSFORM_PARAMS *params); #else void wgs72(); #endif /* Description: Transforms WGS 72 coordinates to WGS 84 and the reverse. */ #endif ogdi-ogdi_4_1_0/vpflib/include/dtcc_d.h000066400000000000000000000003431345660466700201210ustar00rootroot00000000000000#ifndef H_DTCC_D #define H_DTCC_D #ifndef H_COORD_DEF #include "coord_d.h" #endif #ifndef H_DATUM_DEF #include "datum_d.h" #endif #ifndef H_ELLIPS_DEF #include "ellips_d.h" #endif /*#include "unit_d.h"*/ #endif /*H_DTCC_D*/ ogdi-ogdi_4_1_0/vpflib/include/dtcc_dn.h000066400000000000000000000001271345660466700202770ustar00rootroot00000000000000#ifndef H_DTCC_DN #define H_DTCC_DN #ifndef H_MGM_D #include "mgm_d.h" #endif #endif ogdi-ogdi_4_1_0/vpflib/include/dtcc_f.h000066400000000000000000000066401345660466700201310ustar00rootroot00000000000000#ifndef H_DTCC_F #define H_DTCC_F #ifndef H_COORD_DEF #include "coord_d.h" #endif #ifndef H_COORD_FUNC #include "coord_f.h" #endif /*************************************************************** @ check_for_ups(); **************************************************************** */ #if XVT_CC_PROTO BOOLEAN check_for_ups(double sphi, int32 *izone, double *y, double *x, char *mgrs, int32 *iarea, double degrad); #else BOOLEAN check_for_ups(); #endif /*************************************************************** @ check_for_zone_and_100kms_error(); **************************************************************** */ #if XVT_CC_PROTO BOOLEAN check_for_zone_and_100kms_error(int iset, char *string); #else BOOLEAN check_for_zone_and_100kms_error(); #endif /*************************************************************** @ coord_2_gp_radian(); **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS coord_2_gp_radian(POINT_UNITS *user_pt, POINT_DD *radian_pt, COORD_SYS *params, char *err_message); #else ERRSTATUS coord_2_gp_radian(); #endif /*************************************************************** @ gp_radian_2_coord(); **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS gp_radian_2_coord(POINT_UNITS *user_pt, POINT_DD *radian_pt, COORD_SYS *params, char *err_message); #else ERRSTATUS gp_radian_2_coord(); #endif /*************************************************************** @ datum_transform(); **************************************************************** Driver for calling various datum transformation routines */ #if XVT_CC_PROTO ERRSTATUS datum_transform(POINT_DD *from_gp_radian_pt, POINT_DD *to_gp_radian_pt, POINT_XYZ *error, DATUM_TYPE *loc_datum, ELLIPS_PARAMS *loc_ellips, int transform_dir); #else ERRSTATUS datum_transform(); #endif /* Prototypes formerly in madfunc.h */ /*************************************************************** @ molerror(); **************************************************************** Calculates transformation uncertainty */ #if XVT_CC_PROTO void molerror( POINT_DD *pt, TRANSFORM_PARAMS *params, POINT_XYZ *error); #else void molerror(); #endif /* Description: Based on the translation sigmas and the coordinates of the transformation point, calculates uncertainty of latitude, longitude and height in meters. The error equations are derived by geometric projection of x, y and z vectors to latitude, longitude and height. */ /*************************************************************** @ molod(); **************************************************************** Performs Molodensky datum transformation */ #if XVT_CC_PROTO void molod( POINT_DD *from_pt, POINT_DD *delta, TRANSFORM_PARAMS *params); #else void molod(); #endif /* Description: Performs Molodensky datum transformation in all cases except for WGS72. See DMA TR 8350.2. */ /*************************************************************** @ wgs72(); **************************************************************** Performs datum transformation for the special case when the local datum is WGS 1972. */ #if XVT_CC_PROTO void wgs72( POINT_DD *from_pt, POINT_DD *delta, TRANSFORM_PARAMS *params); #else void wgs72(); #endif /* Description: Transforms WGS 72 coordinates to WGS 84 and the reverse. */ #endif /* H_DTCC_F */ ogdi-ogdi_4_1_0/vpflib/include/dtcc_fn.h000066400000000000000000000522731345660466700203120ustar00rootroot00000000000000#ifndef H_DTCC_FN #define H_DTCC_FN /*#include "fusion_d.h"*/ #ifndef H_MGM_FUNC #include "mgm_f.h" #endif #ifndef H_ARC_F #include "arc_f.h" #endif #ifndef H_TS_F #include "ts_f.h" #endif #if XVT_CC_PROTO ERRSTATUS MUSE_API polar_geo_to_cr(double *geo, double *cr, double *geo0, double brv); ERRSTATUS MUSE_API polar_cr_to_geo(double *cr, double *geo, double *geo0, double brv); #else ERRSTATUS MUSE_API polar_geo_to_cr(); ERRSTATUS MUSE_API polar_cr_to_geo(); #endif /*************************************************************** @ bit_to_geo() **************************************************************** Converts a bit map coordinate to geographic */ #if XVT_CC_PROTO ERRSTATUS MUSE_API bit_to_geo(MGM * mgm, GFLOAT bitx, GFLOAT bity, GFLOAT * londd, GFLOAT * latdd); #else ERRSTATUS MUSE_API bit_to_geo(); #endif /* * Description: Using the map geometry in the first argument, the bitx and * bity are inverse map projected to decimal degrees (last 2 args). Bitmap * coordinates are the indices into the raster basemap files and images. */ /*************************************************************** @ bit_to_win() **************************************************************** Converts a bitmap coordinate to a window coordinate. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API bit_to_win(WINDOW xvt_win, GFLOAT bitx, GFLOAT bity, GFLOAT * winx, GFLOAT * winy); #else ERRSTATUS MUSE_API bit_to_win(); #endif /* * Description: Bitmap coordinates are indices into the raster objects. Their * origin is at the lower left. Window coordinates are returned in mouse * event records. Their origin is at the upper left. */ /*************************************************************** @ cot() **************************************************************** cotangent function */ #if XVT_CC_PROTO double cot(double a); #else double cot(); #endif /* * Description: * */ /*************************************************************** @ geo_to_bit() **************************************************************** Convert the geographic coordinate to a bit map or raster coord. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_to_bit(MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * bitx, GFLOAT * bity); #else ERRSTATUS MUSE_API geo_to_bit(); #endif /* * Description: * */ /*************************************************************** @ geo_to_user_str() **************************************************************** Convert the geographic coordinate to user formatted string */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_to_user_str(short geo_units, POINT_DD * value, char *output); #else ERRSTATUS MUSE_API geo_to_user_str(); #endif #if XVT_CC_PROTO ERRSTATUS MUSE_API user_str_to_geo(short geo_units, POINT_DD * value, char *output); #else ERRSTATUS MUSE_API user_str_to_geo(); #endif /* * Description: * */ /*************************************************************** @ geo_to_win() **************************************************************** Convert the geographic coordinate to a window coordinate */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_to_win(MGM * mgm, WINDOW xvt_win, GFLOAT londd, GFLOAT latdd, GFLOAT * winx, GFLOAT * winy); #else ERRSTATUS MUSE_API geo_to_win(); #endif /* * Description: * */ /*************************************************************** @ geo_to_view() **************************************************************** Convert the geographic coordinate to a view coordinate */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_to_view(MGM * mgm, WINDOW xvt_win, GFLOAT londd, GFLOAT latdd, GFLOAT * viewx, GFLOAT * viewy); #else ERRSTATUS MUSE_API geo_to_view(); #endif /* * Description: The input geographic coordinate is in decimal degrees. The * output is a view coordinate which is a window coordinate which may have * been zoomed and scrolled. */ /*********************************************************** @ get_user_pt() ************************************************************ Invoke a dialog box that allows entry of a map point in user units */ #if XVT_CC_PROTO ERRSTATUS MUSE_API get_user_pt ( MAP_POINT * map_point, GEOGRAPHIC user_units ); #else ERRSTATUS MUSE_API get_user_pt(); #endif /*************************************************************** @ lamber_config() **************************************************************** Configure the Lambert Conformal Conic projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lamber_config(MGM * mgm); #else ERRSTATUS MUSE_API lamber_config(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into the image bitmap. * */ /*************************************************************** @ lamber_map() **************************************************************** Forward Lambert Conformal Conic projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lamber_map( MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * x, GFLOAT * y); #else ERRSTATUS MUSE_API lamber_map(); #endif /* * Description: Converts the geo-coordinate into a map image coordinate. * */ /*************************************************************** @ lamber_unmap() **************************************************************** Reverse Lambert Conformal Conic projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lamber_unmap( MGM * mgm, GFLOAT * londd, GFLOAT * latdd, GFLOAT x, GFLOAT y); #else ERRSTATUS MUSE_API lamber_unmap(); #endif /* * Description: Converts the map image coordinate into a geo-coordinate. * */ /*************************************************************** @ linear_config() **************************************************************** Configure the linear map projction */ #if XVT_CC_PROTO ERRSTATUS MUSE_API linear_config(MGM * mgm); #else ERRSTATUS MUSE_API linear_config(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into the image bitmap. * */ /*************************************************************** @ linear_map() **************************************************************** Forward linear projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API linear_map( MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * x, GFLOAT * y); #else ERRSTATUS MUSE_API linear_map(); #endif /* * Description: Converts the geo-coordinate into a map image coordinate. * */ /*************************************************************** @ lon180() **************************************************************** Convert longitude to +-180 */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lon180(double *longitude); #else ERRSTATUS MUSE_API lon180(); #endif /* * Description: Longitude in decimal degrees is converted to the range -180 * to +180. * */ /*************************************************************** @ lon360() **************************************************************** Convert longitude to 0-360 */ #if XVT_CC_PROTO ERRSTATUS MUSE_API lon360(double *longitude); #else ERRSTATUS MUSE_API lon360(); #endif /* * Description: Longitude in decimal degrees is converted to the range 0 to * 360. * */ /*************************************************************** @ linear_unmap() **************************************************************** Reverse linear projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API linear_unmap( MGM * mgm, GFLOAT * londd, GFLOAT * latdd, GFLOAT x, GFLOAT y); #else ERRSTATUS MUSE_API linear_unmap(); #endif /* * Description: Converts the map image coordinate into a geo-coordinate. * */ /*************************************************************** @ map() **************************************************************** Map the geographic coordinate into a bit map and PHIGS coord */ #if XVT_CC_PROTO ERRSTATUS MUSE_API map( MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * x, GFLOAT * y); #else ERRSTATUS MUSE_API map(); #endif /* * Description: Converts the geo-coordinate into a map image coordinate. * */ /*************************************************************** @ mercat_config() **************************************************************** Configure Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mercat_config(MGM * mgm); #else ERRSTATUS MUSE_API mercat_config(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into the image bitmap. * */ /*************************************************************** @ mercat_map() **************************************************************** Forward Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mercat_map( MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * x, GFLOAT * y); #else ERRSTATUS MUSE_API mercat_map(); #endif /* * Description: Converts the geo-coordinate into a map image coordinate. * */ /*************************************************************** @ mercat_unmap() **************************************************************** Reverse Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mercat_unmap( MGM * mgm, GFLOAT * londd, GFLOAT * latdd, GFLOAT x, GFLOAT y); #else ERRSTATUS MUSE_API mercat_unmap(); #endif /* * Description: Converts the map image coordinate into a geo-coordinate. * */ /*************************************************************** @ mgm_adjust() **************************************************************** Adjust the map geometry */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_adjust( MGM * mgm); #else ERRSTATUS MUSE_API mgm_adjust(); #endif /* * Description: Adjusts mgm parameters according to the CONFIG_PREF. * */ /*************************************************************** @ mgm_config() **************************************************************** Configure an MGM object. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_config(MGM * mgm); #else ERRSTATUS MUSE_API mgm_config(); #endif /* * Description: * */ /*************************************************************** @ mgm_construct() **************************************************************** Allocates space for a map MGM object. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_construct( FILE * file, MGM ** mgm, DEFAULTS * defaults); #else ERRSTATUS MUSE_API mgm_construct(); #endif /* * Description: * */ /*************************************************************** @ mgm_defaults() **************************************************************** Assigns default parameters for the map geometry. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_defaults( MGM * mgm, DEFAULTS * defaults); #else ERRSTATUS MUSE_API mgm_defaults(); #endif /* * Description: * */ /*************************************************************** @ mgm_destruct() **************************************************************** Destroys the MGM object. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_destruct( FILE * file, BOOLEAN destruct, MGM ** mgm); #else ERRSTATUS MUSE_API mgm_destruct(); #endif /* * Description: * */ /*************************************************************** @ mgm_fit() **************************************************************** Fit the geographic area to the bit map image */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_fit( MGM * mgm); #else ERRSTATUS MUSE_API mgm_fit(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into an arbitrary output coordinate range. * */ /*************************************************************** @ map_it() **************************************************************** Performs map projection, both forward and reverse */ #if XVT_CC_PROTO ERRSTATUS MUSE_API map_it(MGM * mgm, PROJ_DIR forward_or_reverse, GFLOAT * londd, GFLOAT * latdd, GFLOAT * phigs_x, GFLOAT * phigs_y); #else ERRSTATUS MUSE_API map_it(); #endif /* * Description: The map geometry object mgm is used project in the direction * given by forward_or_reverse. Note that forward_or_reverse determine * whether the GP is computed based on the xy or vice versa, so bad things * will happen with no error messages if this function is misused. */ /*************************************************************** @ mgm_is_ok() **************************************************************** Check the MGM structure for DMA legal usage */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_is_ok(MGM * mgm, char *what_is_wrong); #else ERRSTATUS MUSE_API mgm_is_ok(); #endif /* * Description: If the mgm object is valid according to the DMA rules of map * projection usage, STAT_SUCCESS is returned. If the mgm object is not * legal, then STAT_INV_PROJ is returned and the string argument * what_is_wrong contains a description of the problem. */ /*************************************************************** @ mgm_setup() **************************************************************** Setup the map geometry */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_set ( int proj, PROJECTION * projection ); #else ERRSTATUS MUSE_API mgm_set(); #endif /* * Description: * */ /*************************************************************** @ mgm_setup() **************************************************************** Setup the map geometry */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_setup( MGM * mgm); #else ERRSTATUS MUSE_API mgm_setup(); #endif /* * Description: Configures the map geometry object according to the mode * specified by MGM->CONFIG_PREF * */ /*************************************************************** @ mgm_subclass() **************************************************************** Sub-class the map geometry object to a particular projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API mgm_subclass( MGM * mgm); #else ERRSTATUS MUSE_API mgm_subclass(); #endif /* * Description: Assigns the generic map, unmap, and mgm_config pointers to a * specific projection. * */ /*************************************************************** @ stereo_config() **************************************************************** Configure the stereographic map projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API stereo_config( MGM * mgm); #else ERRSTATUS MUSE_API stereo_config(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into the image bitmap. * */ /*************************************************************** @ transm_config() **************************************************************** Configure transverse Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API transm_config( MGM * mgm); #else ERRSTATUS MUSE_API transm_config(); #endif /* * Description: Performs the necessary calculations to fit the requested * geo-area into the image bitmap. * */ /*************************************************************** @ transm_map() **************************************************************** Forward transverse Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API transm_map( MGM * mgm, GFLOAT londd, GFLOAT latdd, GFLOAT * x, GFLOAT * y); #else ERRSTATUS MUSE_API transm_map(); #endif /* * Description: Converts the geo-coordinate into a map image coordinate. * */ /*************************************************************** @ transm_unmap() **************************************************************** Reverse transverse Mercator projection */ #if XVT_CC_PROTO ERRSTATUS MUSE_API transm_unmap( MGM * mgm, GFLOAT * londd, GFLOAT * latdd, GFLOAT x, GFLOAT y); #else ERRSTATUS MUSE_API transm_unmap(); #endif /* * Description: Converts the map image coordinate into a geo-coordinate. * */ /*************************************************************** @ unmap() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API unmap( MGM * mgm, GFLOAT * londd, GFLOAT * latdd, GFLOAT x, GFLOAT y); #else ERRSTATUS MUSE_API unmap(); #endif /* * Description: Converts the display coordinate to the equivalent geographic * coordinate. * */ /******************************************************************** @ upnset() ********************************************************************* Set MGRS info for northern polar zone */ #if XVT_CC_PROTO void upnset( int32 n, int32 *ltrlow, int32 *ltrhi, double *feltr, double *fnltr, int32 *ltrhy); #else void upnset(); #endif /* * Description: * */ /******************************************************************** @ upsset() ********************************************************************* Set MGRS info for southern polar zone */ #if XVT_CC_PROTO void upsset( int32 n, int32 *ltrlow, int32 *ltrhi, double *feltr, double *fnltr, int32 *ltrhy); #else void upsset(); #endif /* * Description: * */ /******************************************************************** @ utmlim() ********************************************************************* UTM lim */ #if XVT_CC_PROTO void utmlim( int32 *n, double sphi, int32 izone, double *spsou, double *spnor, double *sleast, double *slwest); #else void utmlim(); #endif /* * Description: * */ /******************************************************************** @ shiftr ********************************************************************* Shiftr */ #if XVT_CC_PROTO void shiftr( char *mgrs, int P1, int32 n, int32 *nchar); #else void shift(); #endif /* * Description: * */ /******************************************************************** @ dmsh ********************************************************************* Radians to degrees, minutes, seconds (????) */ #if XVT_CC_PROTO void dmsh( int32 khem, double radian, int32 *id, int32 *im, double *rs, char *ah, int P1); #else void dmsh(); #endif /* * Description: * */ /********************************************************************* @ utmtgp ********************************************************************** Universal Transverse Mercator to GP */ #if XVT_CC_PROTO void utmtgp( double a, double recf, double *sphi, double *slam, int32 izone, double *y, double x); #else void utmtgp(); #endif /* * Description: * */ /********************************************************************* @ fifdint ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO double fifdint( double a); #else double fifdint(); #endif /* * Description: * */ /******************************************************************** @ fifdnint ********************************************************************* Source code from the Promula.Fortran library */ #if XVT_CC_PROTO double fifdnint( double a); #else double fifdnint(); #endif /* * Description: * */ /********************************************************************** @ fifichar *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int fifichar( unsigned char *c1); #else int fifichar(); #endif /* * Description: * */ /******************************************************************** @ fifidint ********************************************************************* Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifidint( double a); #else int32 fifidint(); #endif /* * Description: * */ /********************************************************************* @ fifmod ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifmod( int32 num, int32 dem); #else int32 fifmod(); #endif /* * Description: * */ /********************************************************************* @ fifnint ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifnint( double a); #else int32 fifnint(); #endif /* * Description: * */ /********************************************************************** @ ftncms *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int ftncms( char *s1, int n1, char *s2, int n2); #else int ftncms(); #endif /* * Description: * */ /********************************************************************** @ ftnsac *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO void ftnsac( char *s1, int n1, char *s2, int n2); #else void ftnsac(); #endif /* * Description: * */ #endif /* H_DTCC_FN */ ogdi-ogdi_4_1_0/vpflib/include/ellips_d.h000066400000000000000000000067561345660466700205120ustar00rootroot00000000000000#ifndef H_ELLIPS_DEF #define H_ELLIPS_DEF #ifndef INCL_XVTH #include "xvt.h" #endif /*************************************************************** @ WGS 84 ellipsoid parameters **************************************************************** */ #define WGS84_A 6378137.0 #define WGS84_F 1.0 / 298.257223563 #define WGS84_E_SQ 2.0 * WGS84_F - WGS84_F * WGS84_F #define WGS84_ELLIPS_INDEX 21 /* Description: Semi-major axis, flattening, eccentricity squared, and index in the ellipsoids array */ /*************************************************************** @ Max Constants **************************************************************** */ #define MAX_ELLIPS_NAME_SIZE 60 #define MAX_ELLIPS_RECORD_SIZE 100 #define MAX_NO_OF_ELLIPSOIDS 30 /* Description: First three constants are used to declare strings for storing datum country\area, datum name, and ellipsoid name. Next two are for declaring strings to read in each line of datum.dat and ellips.dat. Last two are used to declare the arrays which store the information in the datum and ellipsoid input files */ /* API */ /* TEMP: move #define and IPC to a more suitable location */ #define SIZE_FILENAME SZ_FNAME /*************************************************************** @ IPC ***************************************************************/ typedef struct { char client_name[SIZE_FILENAME]; short server_id; } IPC; /* Description: Structure for storing identifiers used in interprocess communication between a client program and a server program. */ /*************************************************************** @ ELLIPS_PARAMS ***************************************************************/ typedef struct { char name[MAX_ELLIPS_NAME_SIZE]; double a_in_meters; /* semi-major axis in meters */ double f; /* flattening */ double e_sq; /* eccentricity squared */ char code[3] ; /* alphanumeric code identifier */ IPC ipc; /* info for inter-process, client-server communication */ BOOLEAN valid; } ELLIPS_PARAMS; /* Description: Structure for storing one record, containing the parameters for one ellipsoid, from the ellipsoids file, "xellips.dat". */ #if 0 /*************************************************************** @ ELLIPS_TYPE **************************************************************** */ typedef struct { char name[MAX_ELLIPS_NAME_SIZE]; double a_in_meters; double f; double e_sq; char index[3] ; BOOLEAN valid; } ELLIPS_TYPE; /* Description: Structure for storing one record from the ellipsoids file. Fields are the ellipsoid name, semi-major axis, flattening, and eccentricity squared. */ #endif /*************************************************************** @ ELLIPS_FILE_INFO **************************************************************** */ typedef struct { ELLIPS_PARAMS ellipsoids[MAX_NO_OF_ELLIPSOIDS]; int ellipsoids_read; int input_ellipsoid; /*new--replaces ellips_selected */ int output_ellipsoid;/* new */ BOOLEAN need_user_info; } ELLIPS_FILE_INFO; /* Description: Structure for storing all pre-defined ellipsoids parameters from ellipsoids file, as well as total number of ellipsoids read, index of current local ellipsoid, and flag indicating whether parameters have been entered for the user-specified ellipsoid. ellipsoid_selected is the same value as datum_info->datums[datum_info->datum_selected].ellips_num. */ #endif /* H_ELLIPS_DEF */ ogdi-ogdi_4_1_0/vpflib/include/ellips_f.h000066400000000000000000000011041345660466700204720ustar00rootroot00000000000000#ifndef H_ELLIPS_FUNC #define H_ELLIPS_FUNC #ifndef INCL_XVTH #include "xvt.h" #endif /*************************************************************** @ Add new ELLIPS functions, use shell below **************************************************************** */ /*************************************************************** @ () **************************************************************** Add short description */ #if XVT_CC_PROTO ERRSTATUS func(void); #else ERRSTATUS func(); #endif /* Description: Add long description here. */ #endif /* H_ELLIPS_FUNC */ ogdi-ogdi_4_1_0/vpflib/include/help_f.h000066400000000000000000000003001345660466700201270ustar00rootroot00000000000000 void #if XVT_CC_PROTO context_sensitive_help(FILE_SPEC * help_file_spec, char *topic); #else context_sensitive_help(); FILE_SPEC *help_file_spec; char *topic; #endif ogdi-ogdi_4_1_0/vpflib/include/i_stat.h000066400000000000000000000005121345660466700201620ustar00rootroot00000000000000/* I_STAT.H */ #ifndef i_stat_h #define i_stat_h #include "xvt.h" extern BOOLEAN iCreateStatus XVT_CC_ARGS((char *,char *)); extern BOOLEAN iUpdateStatus XVT_CC_ARGS((char *,char *)); extern void iDestroyStatus XVT_CC_ARGS((void)); extern BOOLEAN iCheckCancel XVT_CC_ARGS((void)); #endif /* i_stat_h */ ogdi-ogdi_4_1_0/vpflib/include/ibrowse.h000066400000000000000000000017641345660466700203630ustar00rootroot00000000000000/* ** iBrowse.H Header for iBrowse functions. */ #define NUM_ITEMS 20 /* number items on Windows menu */ #define M_WINDOWS 300 /* Windows menu tag */ #define PLACEHOLDER (M_WINDOWS + NUM_ITEMS + 1) /* tag for dummy Win menu item */ #ifndef STANDALONE extern void ibrowse_init XVT_CC_ARGS((void)); extern void ibrowse_destroy XVT_CC_ARGS((void)); extern void ibrowse_file XVT_CC_ARGS((char *, FILE_SPEC *)); extern void ibrowse_slist XVT_CC_ARGS((char *, SLIST)); #else static int32 task_eh XVT_CC_ARGS((WINDOW, EVENT *)); #endif #define MAGIC 25931 /* magic number */ #define GRANULE 100 /* allocation granule for lines array */ #define MGN 2 /* margin (pixels) */ #define HINTERVAL 50 /* horizontal scrolling interval (pixels) */ #define VRANGE 10000 /* vertical scrolling range */ ogdi-ogdi_4_1_0/vpflib/include/inifunc.h000066400000000000000000000007631345660466700203420ustar00rootroot00000000000000/* INIFUNC.H */ #ifndef INIFUNC_H #define INIFUNC_H #if XVT_CC_PROTO extern FILE *ini_open(char *type); extern int32 get_ini_string(FILE *fp, char *section, char *entry, char *def, char *string, size_t sizestr); extern int32 start_ini_section(char *ini_file, char *section); extern int32 section_exist(FILE *fp, char *section); #else extern FILE *ini_open(); extern int32 get_ini_string(); extern int32 start_ini_section(); extern int32 section_exist(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/link.h000066400000000000000000000071761345660466700176510ustar00rootroot00000000000000#ifndef LINK_H #define LINK_H /***************************************************************************** From "Motif Programming, The Essentials...and More" by Marshall Brain. Published by Digital Press, ISBN 1-55558-089. This is the header file for the link library. ******************************************************************************/ /* link.h */ /* Link module.v1.1, 2/6/92 by Marshal Brain */ /*This module allows a program to form links to other separately executing programs and communicate with them. Links can be opened and closed, and the program using this library can write to and read from the other program over the link. */ /*Warning--This module will not link with all programs. If the program does anything weird with stdout, or if it fails to flush stdout correctly, then this module will fail. If you are creating a stand-alone program that you wish to link to another program with this library, then you MUST make sure that stdout is flushed correctly. Either call "fflush(stdout)" after every printf, or call setbuf(stdout,NULL)" at the beginning of the pr9ogram to eliminate buffering. */ #include "xvt.h" #if XVT_OS_ISUNIX == TRUE /* only on SUN */ #include #include #include #include typedef struct /* holds all info relevant to one link */ { int pipefd1[2], pipefd2[2]; int pid; FILE *fpin, *fpout; } LinkHandle; /* Open a link to another program named name, passing a param to the program if desired. This routine will execute name in parallel and you can start communicating with it with LinkRead and LinkWrite. Note - convert over to argv/argc format for long parameter lists -- DONE 24AUG93-sdc . */ extern LinkOpen( #if XVT_CC_PROTO LinkHandle *l, char *argList[] #endif ); /* Close the link to a program that has terminated. Use linkkill if the program needs to be terminated as well. */ extern LinkClose ( #if XVT_CC_PROTO LinkHandle *l #endif ); /* Close the link to a program that has terminated. Use linkkill if the program needs to be terminated as well. */ extern LinkCloseNoWait ( #if XVT_CC_PROTO LinkHandle *l #endif ); /* Read from the program started with linkopen. Returns a 0 if there was stuff to read, or a 1 if the linked program terminated. */ extern int LinkRead ( #if XVT_CC_PROTO LinkHandle *l, char s[] #endif ); /* Returns the number of bytes waiting in the input buffer. If 0, then linkread will block if it is called. */ extern int LinkInputWaiting ( #if XVT_CC_PROTO LinkHandle *l #endif ); /* Write a char, without a newline, to the program. */ extern LinkWriteChar ( #if XVT_CC_PROTO LinkHandle *l, int c #endif ); /* Write a string to the program, with a newline. */ extern LinkWrite ( #if XVT_CC_PROTO LinkHandle *l, char s[] #endif ); /* Write a string to the program, without a newline. */ extern LinkWriteNoEOL ( #if XVT_CC_PROTO LinkHandle *l, char s[] #endif ); /* Kill the program and close the link. If the program has terminated on its own use LinkClose instead. */ extern LinkKill ( #if XVT_CC_PROTO LinkHandle *l #endif ); /* Quit the program and close the link. If the program has terminated on its own use LinkClose instead. */ extern LinkQuit ( #if XVT_CC_PROTO LinkHandle *l #endif ); /* Stop the program and close the link. If the program has terminated on its own use LinkClose instead. */ extern LinkStop ( #if XVT_CC_PROTO LinkHandle *l #endif ); #endif #endif /* LINK_H */ ogdi-ogdi_4_1_0/vpflib/include/machine.h000066400000000000000000000015761345660466700203160ustar00rootroot00000000000000#ifndef _MACHINE_ #define _MACHINE_ 1 #ifndef INCL_XVTH #include "xvt.h" #endif #define LEAST_SIGNIFICANT 0 #define MOST_SIGNIFICANT 1 typedef struct { long machine; long input; long output; } xBYTE_ORDER; #if SYS_BIG_ENDIAN == 1 #define MACHINE_BYTE_ORDER MOST_SIGNIFICANT #else #define MACHINE_BYTE_ORDER LEAST_SIGNIFICANT #endif #ifdef _WINDOWS # define DOS 1 #else /* Not _WINDOWS */ # define strcmpi(s1,s2) strcasecmp(s1,s2) # define stricmp(s1,s2) strcasecmp(s1,s2) # define strnicmp(s1,s2, len) strncasecmp(s1,s2, len) #endif /* endif _WINDOWS */ #ifndef __INT32DEF__ #define __INT32DEF__ #ifdef _MSC_VER typedef signed int int32; typedef unsigned int uint32; #elif defined(_ALPHA) typedef int32_t int32; typedef uint32_t uint32; #else typedef int32_t int32; typedef uint32_t uint32; #endif #endif #endif /* endif _MACHINE */ ogdi-ogdi_4_1_0/vpflib/include/mapdoc_d.h000066400000000000000000000313231345660466700204510ustar00rootroot00000000000000#ifndef H_MAPDOC_D #define H_MAPDOC_D 1 #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_MGM_D #include "mgm_d.h" #endif #ifndef H_PHIGS_D #include "phigs_d.h" #endif #ifndef H_UNIT_DEF #include "unit_d.h" #endif #ifndef H_RASTER_D #include "raster_d.h" #endif /* * @#Defines */ /*************************************************************** @ SZ_* **************************************************************** SZ_* is size of structure "*" in the map data file. */ #define SZ_PRODUCTS 3072 #define SZ_GRAT_DATA 512 #define SZ_BASEMAP 512 #define SZ_RASTER 1024 #define SZ_UNITS 512 #define SZ_MGM 512 #define SZ_PALETTE 2048 #define SZ_LUT 2048 #define SZ_MAP_DOC 512 #define SZ_VECTOR 512 #define SZ_VEC_DATA 256 #define SZ_SQL_DATA 2048 /*************************************************************** @ Magic Numbers **************************************************************** Record structure type and version */ #define MAGIC_MGM 10000000L #define MAGIC_UNITS 20000000L #define MAGIC_LUT 30000000L #define MAGIC_PALETTE 40000000L #define MAGIC_PRODUCTS 50000001L #define MAGIC_VIEW 60000000L #define MAGIC_BASEMAP 70000000L #define MAGIC_RASTER 80000000L #define MAGIC_MAP_DOC 90080892L #define MAGIC_DEFAULTS 100000000L #define MAGIC_VECTOR 110000000L #define MAGIC_VEC_DATA 120000001L #define MAGIC_GRAT_DATA 130000001L #define MAGIC_SQL_DATA 14000000L /* * Description: These magic numbers are placed into the first 4 bytes of * their respective structures to give the programmer an easy way to verify * that a structure is valid. They may also be used as structure version * identifiers for structures saved in files. */ /*************************************************************** @ MAX_PRODUCTS **************************************************************** Limits the number of open data products */ #define MAX_PRODUCTS 10 /* * Description: */ /*************************************************************** @ STRUCTURE ID'S **************************************************************** */ #define BASEMAP_STRUCT 1 #define GRAT_STRUCT 2 /* * Description: */ /*************************************************************** @ TOTAL_OVERLAYS **************************************************************** Limit on number of overlays */ #define TOTAL_OVERLAYS 8 /* * Description: */ /*************************************************************** @ __V_HDR__ **************************************************************** A vector data header structure */ #ifndef __V_HDR__ #define __V_HDR__ #define DATA_HDR_EXTENT (X) ((X)->extent) #define DATA_HDR_LEFT (x) EXTENT_LEFT (DATA_HDR_EXTENT(x)) #define DATA_HDR_RIGHT (x) EXTENT_RIGHT (DATA_HDR_EXTENT(x)) #define DATA_HDR_TOP (x) EXTENT_TOP (DATA_HDR_EXTENT(x)) #define DATA_HDR_BOTTOM (x) EXTENT_BOTTOM(DATA_HDR_EXTENT(x)) #define EXTENT_LEFT (x) ((x)->left) #define EXTENT_RIGHT (x) ((x)->right) #define EXTENT_BOTTOM (x) ((x)->bottom) #define EXTENT_TOP (x) ((x)->top) #define V_HDR_DATA_HDR (x) ((x)->v_hdr) #define V_HDR_TOP (X) DATA_HDR_TOP (V_HDR_DATA_HDR(x)) #define V_HDR_BOTTOM (x) DATA_HDR_BOTTOM (V_HDR_DATA_HDR(x)) #define V_HDR_LEFT (x) DATA_HDR_LEFT (V_HDR_DATA_HDR(x)) #define V_HDR_RIGHT (x) DATA_HDR_RIGHT (V_HDR_DATA_HDR(x)) #endif /* * Description: */ /*************************************************************** @ VER_NUM **************************************************************** Current saved file revision number */ #define VER_NUM = 0x01; /* * Description: */ /* * @Enumerated Data Types */ /*************************************************************** @ PRODUCTS bit flag masks **************************************************************** */ #define OVERLAYS_NEED_REDRAW_MASK 0x0002 #define OVERLAYS_USE_TIMER_MASK 0x0003 /* * Description: */ /*************************************************************** @ BASEMAP_TYPE **************************************************************** Type of basemap products */ typedef enum { BM_NONE, BM_SURFACE, BM_GEOIMAGE, BM_RGB_IMAGE, BM_INDIRECT_IMAGE, BM_DATA } BASEMAP_TYPE; /* * Description: DTED and DBDB5 are BM_SURFACE products. ADRG and CAC are * BM_GEOIMAGE products. */ /* * Description: * */ /*************************************************************** @ OVERLAY_TYPE **************************************************************** Types of overlays */ typedef enum { GRAT, VECT, SQL, AUTOMATE, NONE } OVERLAY_TYPE; /* * Description: * */ /*************************************************************** @ PRODUCT **************************************************************** Basemap products */ typedef enum { BASE_NONE, BASE_ADRG, BASE_ADRI, BASE_CAC, BASE_CADRG, BASE_CIB, BASE_CRG, BASE_DTED, BASE_DBDB5, BASE_DATA, BASE_OTHER, BASE_ASRP, BASE_USRP, BASE_SRG } PRODUCT; /* * Description: */ /*************************************************************** @ BASEMAP_PRODUCT **************************************************************** Info about a basemap product */ typedef struct { char name[30]; BASEMAP_TYPE type; char prompt[48]; BOOLEAN warpable; FILE_SPEC file_spec; } BASEMAP_PRODUCT; /* * Description: */ /*************************************************************** @ Grat_Data bit flag masks **************************************************************** */ #define GRAT_VALID_MASK 0x0001 #define GRAT_NEEDS_REDRAW_MASK 0x0002 /* * Description: GRAT_DATA contains a long variable "bit_flags" whose bits can * be set to show the current status of the structure. Currently, bit 0 is * set to show the structure contains valid data, and bit 1 is set if the * grat overlay needs to be redrawn. */ /*************************************************************** @ MARKER **************************************************************** Marker types for PHIGS */ #if 0 typedef enum { DOT, PLUS, ASTERICK, CIRCLE, CROSS, SOLID_LINE, DASH_LINE, DOT_LINE } #endif typedef Pmarker MARKER; /* * Description: */ /*************************************************************** @ GRAT_DATA **************************************************************** Structure to define a graticule */ typedef struct { int32 color; int32 magic; /* SR 10/02 */ int32 bit_flags; BOOLEAN contains_valid_data; BOOLEAN border_enable; BOOLEAN border_major_enable; GFLOAT border_major_lat; GEOGRAPHIC border_major_lat_unit; GFLOAT border_major_lon; GEOGRAPHIC border_major_lon_unit; int32 border_major_color; BOOLEAN border_minor_enable; GFLOAT border_minor_lat; GEOGRAPHIC border_minor_lat_unit; GFLOAT border_minor_lon; GEOGRAPHIC border_minor_lon_unit; int32 border_minor_color; BOOLEAN border_labels_enable; GFLOAT border_labels_lat; GEOGRAPHIC border_labels_lat_unit; GFLOAT border_labels_lon; GEOGRAPHIC border_labels_lon_unit; int32 border_labels_color; BOOLEAN grat_enable; BOOLEAN grat_major_enable; MARKER grat_major; BYTE grat_major_ascii_code; GFLOAT grat_major_lat; GEOGRAPHIC grat_major_lat_unit; GFLOAT grat_major_lon; GEOGRAPHIC grat_major_lon_unit; int32 grat_major_color; BOOLEAN grat_minor_enable; MARKER grat_minor; BYTE grat_minor_ascii_code; GFLOAT grat_minor_lat; GEOGRAPHIC grat_minor_lat_unit; GFLOAT grat_minor_lon; GEOGRAPHIC grat_minor_lon_unit; int32 grat_minor_color; } GRAT_DATA; /* * Description: */ /*************************************************************** @ OVERLAYS **************************************************************** The list of overlays */ typedef struct { OVERLAY_TYPE type; char name[64]; void *product_pointer; } OVERLAYS; /* * Description: */ /*************************************************************** @ BASEMAP **************************************************************** Struct to contain the basemap information */ typedef struct BASEMAP { int32 magic; PRODUCT product; /* which product */ RASTER *area; /* product dependent */ RASTER *bit_map; /* plotable image */ RENDER_INFO render_info;/* NULL unless its a DATA product */ GFLOAT zoom; /* 0.01.0=replication */ BASEMAP_TYPE type; /* Product type */ BOOLEAN needs_refresh; /* true if needs any work */ BOOLEAN needs_redraw; /* true if it needs redrawing */ BOOLEAN needs_reload; /* true if it needs to be reloaded */ BOOLEAN warp; /* true ifit supports projection warp */ FILE_SPEC file_spec; /* where in the file system */ } BASEMAP; /* * Description: */ /*************************************************************** @ PRODUCTS **************************************************************** The list of products */ typedef struct { int32 magic; int32 bit_flags; short count; short order; short current; OVERLAYS overlays[MAX_PRODUCTS]; BASEMAP *basemap; } PRODUCTS; /* * Description: */ /*************************************************************** @ MAPDOC **************************************************************** The map document structure */ typedef struct { int32 magic; /* for programmer's sanity check */ MGM *mgm; /* the map geometry */ UNITS *units; /* the selected display units */ LUT *lut; /* the look-up-table */ PALETTE *palette; /* the palette */ PRODUCTS *products; /* the list of products displayed */ VIEW *view; /* the viewing parameters, scrool, zoom */ /* items below here are not written into the map files */ BOOLEAN needs_update; /* TRUE if display is not current */ BOOLEAN needs_save; /* TRUE if file is not current */ BOOLEAN auto_update;/* TRUE for automatic map updates */ CURSOR map_cursor; /* map window cursor type */ FILE_SPEC file_spec; /* the map document's file */ } MAP_DOC; /* * Description: Contains all the information associated with a map document. * mapdoc_construct() and mapdoc_destruct() are used to create and destroy * and also to read and write. */ /*************************************************************** @ TEXT **************************************************************** A text structure */ typedef struct { uint32 length; char *string; } TEXT; /* * Description: These are returned by the product meta-data constructors. */ /*************************************************************** @ USER_LEVEL **************************************************************** Levels of user experience. */ typedef enum { NOVICE, EXPERIENCED, AUTOMATIC } USER_LEVEL; /* * Description: */ /*************************************************************** @ DEFAULTS **************************************************************** The structure of program defaults */ typedef struct { int32 magic; /* magic number to id structure */ DATA_MATRIX bitmap_matrix; /* default bit_map size and type */ GFLOAT center_lon; /* default map center, DD */ GFLOAT center_lat; /* default map center, DD */ int red; int green; int blue; COLOR_PREF color_pref; /* default color_pref */ USER_LEVEL user_level; /* NOVICE, EXPERIENCED, EXPERT */ char map_file_dir[SZ_FNAME]; /* default map directory SR */ BOOLEAN needs_save; /* true if needs to be saved */ BOOLEAN auto_update;/* if FALSE, the user has to push the Update * Map button */ UNITS units; /* user units */ FILE_SPEC map_file_spec; /* default map file */ FILE_SPEC def_file_spec; /* where the defaults file is stored */ CURSOR map_cursor; /* map windows cursor shape */ } DEFAULTS; /* * Description: */ #endif /* ifndef H_MAPDOC_D */ ogdi-ogdi_4_1_0/vpflib/include/mapdoc_f.h000066400000000000000000000255701345660466700204620ustar00rootroot00000000000000#ifndef H_MAPDOC_F #define H_MAPDOC_F #ifndef H_VECTOR #include "vector.h" #endif /*************************************************************** @ basemap_construct() **************************************************************** Constructs the basemap */ #if XVT_CC_PROTO ERRSTATUS MUSE_API basemap_construct( FILE * file, BASEMAP ** basemap); #else ERRSTATUS MUSE_API basemap_construct(); #endif /* * Description: Constructs a basemap object. IF file is not NULL the basemap * is read in from the file. /*************************************************************** * @ basemap_destruct() *************************************************************** * * Destroys the basemap structure */ #if XVT_CC_PROTO ERRSTATUS MUSE_API basemap_destruct( FILE * file, BOOLEAN destruct, BASEMAP ** basemap); #else ERRSTATUS MUSE_API basemap_destruct(); #endif /* * Description: If file is not NULL the basemap is written to the file. If * destruct is TRUE the basemap memory is released. */ /*************************************************************** @ basemap_new_bitmap() **************************************************************** Get a new bit_map raster */ #if XVT_CC_PROTO ERRSTATUS MUSE_API basemap_new_bitmap(int32 width, int32 height, int32 bits_per_pixel, RASTER ** bit_map, DEFAULTS *defaults); #else ERRSTATUS MUSE_API basemap_new_bitmap(); #endif /* * Description: If the bit_map already exists, it is deleted. A new bit_map * object of type RASTER is created according to the specified dimensions. */ /*************************************************************** @ basemap_match_geometry() **************************************************************** Sets up the map geometry to match the basemap geometry */ #if XVT_CC_PROTO ERRSTATUS MUSE_API basemap_match_geometry(BASEMAP * basemap, MGM * mgm); #else ERRSTATUS MUSE_API basemap_match_geometry(); #endif /* * Description: The map geometry object mgm is adjusted to the basemap's * projection and geographic extent, so that vector overlays, and the cursor * readout will be correct. * * /*************************************************************** @ * basemap_setup() *************************************************************** * * Sets up the basemap */ #if XVT_CC_PROTO ERRSTATUS MUSE_API basemap_setup( BASEMAP * basemap, MGM * mgm); #else ERRSTATUS MUSE_API basemap_setup(); #endif /* * Description: Sets up the basemap by calling any needed product * constructors and setup functions. * */ /*************************************************************** @ decode_basemap() **************************************************************** Convert basemap structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_basemap( unsigned char *buffer, BASEMAP * basemap); #else ERRSTATUS MUSE_API decode_basemap(); #endif /* * Description: The basemap structure information in the character buffer * (binary portable Intel format) is placed into the basemap structure in * local binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ decode_grat() **************************************************************** Convert grat structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_grat(unsigned char *buffer, GRAT_DATA * grat, int32 version); #else ERRSTATUS MUSE_API decode_grat(); #endif /* * Description: The grat structure information in the character buffer * (binary portable Intel format) is placed into the grat structure in local * binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ decode_mapdoc() **************************************************************** Convert map_doc structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_mapdoc( unsigned char *buffer, MAP_DOC * map_doc); #else ERRSTATUS MUSE_API decode_mapdoc(); #endif /* * Description: The map_doc structure information in the character buffer * (binary portable Intel format) is placed into the map_doc structure in * local binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ decode_mgm() **************************************************************** Convert mgm structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_mgm( unsigned char *buffer, MGM * mgm); #else ERRSTATUS MUSE_API decode_mgm(); #endif /* * Description: The mgm structure information in the character buffer (binary * portable Intel format) is placed into the mgm structure in local binary. * Used by the constructor functions while loading in a map document. */ /*************************************************************** @ decode_products() **************************************************************** Convert products structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_products( unsigned char *buffer, PRODUCTS * products); #else ERRSTATUS MUSE_API decode_products(); #endif /* * Description: The products structure information in the character buffer * (binary portable Intel format) is placed into the products structure in * local binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ encode_basemap() **************************************************************** Convert basemap structure to external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_basemap( unsigned char *buffer, BASEMAP * basemap); #else ERRSTATUS MUSE_API encode_basemap(); #endif /* * Description: The basemap structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ encode_grat() **************************************************************** Convert grat structure to external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_grat(unsigned char *buffer, GRAT_DATA * grat); #else ERRSTATUS MUSE_API encode_grat(); #endif /* * Description: The grat structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ encode_mapdoc() **************************************************************** Convert map_doc structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_mapdoc( unsigned char *buffer, MAP_DOC * map_doc); #else ERRSTATUS MUSE_API encode_mapdoc(); #endif /* * Description: The map_doc structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ encode_mgm() **************************************************************** Convert mgm structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_mgm( unsigned char *buffer, MGM * mgm); #else ERRSTATUS MUSE_API encode_mgm(); #endif /* * Description: The mgm structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ encode_products() **************************************************************** Convert products structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_products( unsigned char *buffer, PRODUCTS * products); #else ERRSTATUS MUSE_API encode_products(); #endif /* * Description: The products structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ grat() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API grat(WINDOW map_win, short count, MGM * mgm); #else ERRSTATUS MUSE_API grat(); #endif /* * Description: * */ /*************************************************************** @ grat_construct() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API grat_construct(FILE * file, GRAT_DATA ** pointer, int32 version); #else ERRSTATUS MUSE_API grat_construct(); #endif /* * Description: */ /*************************************************************** @ grat_destruct() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API grat_destruct(FILE * file, BOOLEAN destruct, GRAT_DATA ** grat); #else ERRSTATUS MUSE_API grat_destruct(); #endif /* * Description: * */ /*************************************************************** @ map_doc_construct() **************************************************************** Create a map document */ #if XVT_CC_PROTO ERRSTATUS MUSE_API map_doc_construct( FILE * file, MAP_DOC ** pointer, BYTE_ORDER * byte_order, DEFAULTS *defaults); #else ERRSTATUS MUSE_API map_doc_construct(); #endif /* * Description: Calls the constructors for the sub-structures to allocate a * new map document. If the file argument is not NULL, the map document is * read in from the file. */ /*************************************************************** @ map_doc_destruct() **************************************************************** Destroy the map document */ #if XVT_CC_PROTO ERRSTATUS MUSE_API map_doc_destruct( FILE * file, BOOLEAN destruct, MAP_DOC ** map_doc, BYTE_ORDER * bo); #else ERRSTATUS MUSE_API map_doc_destruct(); #endif /* * Description: If the file argument is not NULL, the map document is written * to the file. If the destruct argument is TRUE, the map document is removed * from memory. * */ /*************************************************************** @ products_construct() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API products_construct(FILE * file, PRODUCTS ** pointer, BYTE_ORDER * bo); #else ERRSTATUS MUSE_API products_construct(); #endif /* * Description: */ /*************************************************************** @ products_destruct() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API products_destruct ( FILE * file, BOOLEAN destruct, PRODUCTS ** products, BYTE_ORDER * bo ); #else ERRSTATUS MUSE_API products_destruct(); #endif /* * Description: */ #endif /* H_MAPDOC_F */ ogdi-ogdi_4_1_0/vpflib/include/mgm_d.h000066400000000000000000000051751345660466700177740ustar00rootroot00000000000000#ifndef H_MGM_D #define H_MGM_D #ifndef H_DTCC_D #include "dtcc_d.h" #endif /*************************************************************** @ CONFIG_PREF **************************************************************** Ways of configuring map geometry */ typedef enum { CONFIG_GEO_EXTENT_AND_DEV_EXTENT, CONFIG_CENTER_AND_SCALE, CONFIG_CENTER_AND_POST_SPACING } CONFIG_PREF; /* * Description: The map geometry module supports these preferences when * mgm_setup is called. */ /*************************************************************** @ MGM **************************************************************** The map geometry structure */ typedef struct MGM { int32 magic; PROJECTION projection; /* the objects projection */ HOR_DATUM hor_datum; /* an enum type */ VER_DATUM ver_datum; /* an enum type */ CONFIG_PREF config_pref;/* how to resolve inconsistent params */ POINT_DD map_center; /* geocoord of map center, DD */ GFLOAT scale_reciprocal; /* 250000 for scale of 1:250,000 */ GFLOAT pixel_size_on_screen; /* meters */ GFLOAT pixel_size_on_ground; /* meters */ GFLOAT pixel_size_lon; /* size in decimal degrees */ GFLOAT pixel_size_lat; /* size in decimal degrees */ EXTENT dev_extent; /* bounding device rectangle */ GFLOAT dev_ymin; /* smallest y on map */ GFLOAT dev_ymax; /* largest y on map */ int32 xpixels; /* width in pixels */ int32 ypixels; /* height in pixels */ int32 bit_map_depth; /* bits per pixel 1, 4, 8, or 24 */ EXTENT geo_extent; /* bounding geographic rectangle, DD */ GFLOAT pixasp; /* aspect ratio of pixel, (Y/X) */ GFLOAT horizontal_accuracy; /* of most inaccurate * product, meters */ GFLOAT vertical_accuracy; /* of most inaccurate product, meters */ BOOLEAN user_aspect;/* If true user aspect used, else default */ ASPECT aspect; /* aspect of projection */ PARAMS params; /* projection dependent params */ BOOLEAN valid; /* FALSE indicates an invalid projection * object */ GFLOAT sx; /* empirical x scale */ GFLOAT sy; /* empirical y scale */ GFLOAT tx; /* empirical x shift */ GFLOAT ty; /* empirical y shift */ BOOLEAN is_locked; /* true when locked to basemap */ } MGM; /* * Description: The sx,sy, tx, ty items fit the projection space to the * bitmap space. */ #endif /* H_MGM_D */ ogdi-ogdi_4_1_0/vpflib/include/mgm_f.h000066400000000000000000000125431345660466700177730ustar00rootroot00000000000000#ifndef H_MGM_FUNC #define H_MGM_FUNC #include "math.h" /* JLL#include "tx.h" */ #ifndef H_ARC /* JLL#include "arc.h" */ #endif /* * The only reason for including XVT.H is to define XVT_CC_PROTO properly for * the compiler in use. XVT_CC_PROTO should be defined if the compiler uses * ANSII prototypes. */ #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_UNIT_FUNC #include "unit_f.h" #endif #ifndef ERRSTATUS #define ERRSTATUS short #endif /*************************************************************** @ gptlam() **************************************************************** GP to Lambert Conformal Conic map projection 2 standard parallels */ #if XVT_CC_PROTO void gptlam( double a, double recf, double ophi, double olam, double fn, double fe, double ok, double sphi, double slam, double *y, double *x); #else void gptlam(); #endif /* * Description: * */ /*************************************************************** @ gptotm() **************************************************************** GP to transverse Mercator map projection */ #if XVT_CC_PROTO void gptotm( double a, double recf, double ophi, double olam, double fn, double fe, double ok, double sphi, double slam, double *y, double *x); #else void gptotm(); #endif /* * Description: * */ /*************************************************************** @ gptups() **************************************************************** GP to UPS map projection */ #if XVT_CC_PROTO void gptups( double a, double recf, double sphi, double slam, double *y, double *x); #else void gptups(); #endif /* * Description: * */ /*************************************************************** @ lamb() **************************************************************** Lambert Conformal Conic map projection 2 standard parallels */ #if XVT_CC_PROTO void lamb( double *p, double *l, int32 dir, double *a, double f, double op, double ol, double *fn, double *fe, double *ok, double *y, double *x, int32 *ierr); #else void lamb(); #endif /* * Description: * */ /*************************************************************** @ merc() **************************************************************** Mercator map projection */ #if XVT_CC_PROTO void merc( double *p, double *l, int32 dir, double *a, double f, double op, double ol, double *fn, double *fe, double *ok, double *y, double *x, int32 *ierr); #else void merc(); #endif /* * Description: * */ /*************************************************************** @ mertgp() **************************************************************** Mercator map projection to geog posn * #if XVT_CC_PROTO void mertgp( double a, double recf, double ophi, double olam, double fn, double fe, double ok, double *sphi, double *slam, double y, double x); #else void mertgp(); #endif /* * Description: * */ /*************************************************************** @ tmtogp() **************************************************************** Transverse Mercator map projection to geog posn */ #if XVT_CC_PROTO void tmtogp( double a, double recf, double ophi, double olam, double fn, double fe, double ok, double *sphi, double *slam, double y, double x); #else void tmtogp(); #endif /* * Description: * */ /*************************************************************** @ upstgp() **************************************************************** UPS map projection to geog posn */ #if XVT_CC_PROTO void upstgp( double a, double recf, double *sphi, double *slam, double *y, double x); #else void mertgp(); #endif /* * Description: * */ /*************************************************************** @ upolar() **************************************************************** Universal Polar Stereographic map projection */ #if XVT_CC_PROTO void upolar( double *p, double *l, int32 dir, double *a, double f, double *y, double *x, int32 *ierr); #else void upolar(); #endif /* * Description: * */ /*************************************************************** @ utm() **************************************************************** Universal Transverse Mercator map projection */ #if XVT_CC_PROTO void utm( double *p, double *l, int32 dir, int32 *izone, double *a, double f, double *ok, double *y, double *x, int32 zflag, int32 *ierr); #else void utm(); #endif /* * Description: * */ /*************************************************************** @ unflow() **************************************************************** Universal Transverse Mercator map projection */ #if XVT_CC_PROTO void unflow( double *value, int32 kode); #else void unflow(); #endif /* * Description: * */ #endif ogdi-ogdi_4_1_0/vpflib/include/muse.h000066400000000000000000000033541345660466700176570ustar00rootroot00000000000000 #ifndef H_MUSE #define H_MUSE #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_SYSTEM_D #include "system_d.h" #endif #ifndef H_COLOR_DEF #include "color_d.h" #endif #ifndef H_DTCC_D #include "dtcc_d.h" #endif #ifndef H_PHIGS_D #include "phigs_d.h" #endif #ifndef H_UNIT_DEF #include "unit_d.h" #endif #ifndef H_MAPDOC_D #include "mapdoc_d.h" #endif #ifndef H_SUNR_DEF #include "sunras_d.h" #endif #ifndef H_SQLLIB_D #include "sqllib_d.h" #endif #ifndef H_CLI_SR_D #include "cli_sr_d.h" #endif #ifndef H_COORD_DEF #include "coord_d.h" #endif #ifndef H_ELLIPS_DEF #include "ellips_d.h" #endif #ifndef H_DATUM_DEF #include "datum_d.h" #endif #ifndef H_COORD_FUNC #include "coord_f.h" #endif #ifndef H_ELLIPS_FUNC #include "ellips_f.h" #endif #ifndef H_DATUM_F #include "datum_f.h" #endif #ifndef H_MUSE_IPC #include "muse_ipc.h" #endif #ifndef H_MUSE_SQL #include "muse_sql.h" #endif #ifndef H_SYSTEM_F #include "system_f.h" #endif #ifndef H_COLOR_F #include "color_f.h" #endif #ifndef H_DTCC_F #include "dtcc_f.h" #endif #ifndef H_DTCC_FN #include "dtcc_fn.h" /* DT&CC functions pulled from old MUSEDEF.H */ #endif #ifndef H_PHIGS_F #include "phigs_f.h" #endif #ifndef H_RASTER_F #include "raster_f.h" #endif #ifndef H_SUNR_FUNC #include "sunras_f.h" #endif #ifndef H_UNIT_FUNC #include "unit_f.h" #endif #ifndef H_VIEW_FUNC #include "view_f.h" #endif #ifndef H_MAPDOC_F #include "mapdoc_f.h" #endif #ifndef H_VEC_D #include "vec_d.h" #endif #ifndef H_VEC_F #include "vec_f.h" #endif #ifndef H_VECTOR #include "vector.h" #endif #ifndef XVTCM_INCL #include "xvtcm.h" #endif #ifndef H_SQLLIB_F #include "sqllib_f.h" #endif #ifndef H_CLI_SR_F #include "cli_sr_f.h" #endif #endif /* H_MUSE */ ogdi-ogdi_4_1_0/vpflib/include/muse1.h000066400000000000000000000060111345660466700177310ustar00rootroot00000000000000#ifndef H_MUSE1 #define H_MUSE1 /*************************************************************** @ MUSE_API **************************************************************** Define the parameter _API at the compilers command line to have all API functions compiled for use in Windows DLLs. */ #ifdef _API #define MUSE_API FAR _export #else #define MUSE_API #endif /*************************************************************** @ Misc. Constants **************************************************************** */ #define ANIOTA 1.0E-4 /*************************************************************** @ BYTE **************************************************************** */ #ifdef BYTE #undef BYTE #endif typedef unsigned char BYTE; /* Description: */ /*************************************************************** @ ERRSTATUS **************************************************************** */ typedef short ERRSTATUS; /* Description: */ /*************************************************************** @ GFLOAT **************************************************************** */ typedef double GFLOAT; /* Description: */ /*************************************************************** @ pHMEM **************************************************************** pointer to High MEMory */ #ifndef _WINDOWS #if 0 # if XVT_OS == XVT_OS_WIN # define pHMEM _huge * # else # endif #endif # define pHMEM * #else # define pHMEM * #endif /* Description: PC's require programming backflips in order to use the installed hardware memory. A pHMEM is the pointer you get when you lock down an item on the global heap. See XVT functions galloc, glock, gfree. */ /*************************************************************** @ USHORT **************************************************************** */ typedef unsigned short USHORT; /* Description: */ /* * @ Multiples of Pi */ #define PXPI 3.14159265358979323846 #define PX2_PI 6.28318530717958647693 #define PXPI_OVER_2 1.57079632679489661923 #define PXDEGREES_TO_RADIANS 0.0174532925199432957692 /* * Description: */ /*************************************************************** @ NULL **************************************************************** A long 0 */ #ifndef NULL #define NULL 0L #endif /* Description: */ /* #ifndef BOOLEAN typedef int BOOLEAN; #endif */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /*************************************************************** @ EXTENT **************************************************************** The bounds of something */ typedef struct { GFLOAT left; /* Leftmost extent of the dataset in DD */ GFLOAT right; /* Rightmost extent of the dataset in DD */ GFLOAT bottom; /* Bottommost extent of the dataset in DD */ GFLOAT top; /* Topmost extent of the dataset in DD */ } EXTENT; /* * Description: */ #endif /* H_MUSE1 */ ogdi-ogdi_4_1_0/vpflib/include/muse_ask.h000066400000000000000000000037771345660466700205260ustar00rootroot00000000000000#include "xvt.h" #if (XVT_CC == XVT_CC_SUNB) #include #else #include #endif #ifndef MUSE_ASK #define MUSE_ASK 103 #endif #ifndef M_RESP_DEFAULT #define M_RESP_DEFAULT 1 #endif #ifndef M_RESP_2 #define M_RESP_2 2 #endif #ifndef M_RESP_3 #define M_RESP_3 3 #endif #ifndef M_RESP_4 #define M_RESP_4 4 #endif #ifndef M_RESP_5 #define M_RESP_5 5 #endif #ifndef M_RESP_6 #define M_RESP_6 6 #endif #ifndef M_RESP_7 #define M_RESP_7 7 #endif #ifndef M_RESP_8 #define M_RESP_8 8 #endif #ifndef M_RESP_9 #define M_RESP_9 9 #endif #ifndef M_RESP_10 #define M_RESP_10 10 #endif #ifndef M_MSG #define M_MSG 11 #endif #if XVTWS == PMWS #ifndef URL_SRC_WIDTH #define URL_SRC_WIDTH 6 #endif #ifndef URL_SRC_HEIGHT #define URL_SRC_HEIGHT 16 #endif #else #ifndef URL_SRC_WIDTH #define URL_SRC_WIDTH 8 #endif #ifndef URL_SRC_HEIGHT #define URL_SRC_HEIGHT 16 #endif #endif #if XVTWS == WINWS || XVTWS == PMWS #define UNITS U_SEMICHARS #undef URL_DEST_WIDTH #define URL_DEST_WIDTH 4 #undef URL_DEST_HEIGHT #define URL_DEST_HEIGHT 8 #elif XVTWS == WMWS #define UNITS U_CHARS #undef URL_DEST_WIDTH #define URL_DEST_WIDTH 1 #undef URL_DEST_HEIGHT #define URL_DEST_HEIGHT 1 #else #define UNITS U_PIXELS #ifndef URL_DEST_WIDTH #define URL_DEST_WIDTH URL_SRC_WIDTH #endif #ifndef URL_DEST_HEIGHT #define URL_DEST_HEIGHT URL_SRC_HEIGHT #endif #endif /* define utility macros */ #define X_OFF(x) ((x)*URL_DEST_WIDTH)/URL_SRC_WIDTH #define Y_OFF(y) ((y)*URL_DEST_HEIGHT)/URL_SRC_HEIGHT #define WIDTH(w) ((w)*URL_DEST_WIDTH)/URL_SRC_WIDTH #define HEIGHT(h) ((h)*URL_DEST_HEIGHT)/URL_SRC_HEIGHT /* get control window in dialog */ #define CTL_WIN(id) get_ctl_window(win,(id)) STATICFCN int32 dlg_eh XVT_CC_ARGS((WINDOW win, EVENT *ep)); STATICFCN void do_control XVT_CC_ARGS((WINDOW win, short id, CONTROL_INFO *cip)); #if (XVT_CC == XVT_CC_SUNB) extern int32 muse_ask XVT_CC_ARGS((char* msgbuf, int num_buttons, va_list arg_ptr )); #else extern int32 muse_ask XVT_CC_ARGS((char* msgbuf, int num_buttons, ... )); #endif ogdi-ogdi_4_1_0/vpflib/include/muse_ipc.h000066400000000000000000000100521345660466700205030ustar00rootroot00000000000000#ifndef H_MUSE_IPC #define H_MUSE_IPC /* * Function prototypes */ #if XVT_OS == XVT_OS_MAC /*************************************************************** @ my_event_hook(int dlg_id, BOOLEAN is_modal, EventRecord *my_event); **************************************************************** */ #if XVT_CC_PROTO BOOLEAN my_event_hook(WINDOW dlg_id, BOOLEAN is_modal, EventRecord *my_event); #else BOOLEAN my_event_hook(); #endif /*************************************************************** @ xvtmi_init(void) **************************************************************** */ void #if XVT_CC_PROTO xvtmi_init(void); #else xvtmi_init(); #endif #if XVT_CC_PROTO VOID get_message(int task_id); #else VOID get_message( ); #endif #if XVT_CC_PROTO VOID look_for_message(int task_id); #else VOID look_for_message( ); #endif #endif /* end of mac specific prototypes */ /* * The communications buffer size */ #define COMM_BUFFER_SIZE 4096 #define COMM_DATA_SIZE (COMM_BUFFER_SIZE-4) /* * Function prototypes */ #if XVT_CC_PROTO int muse_ipc_spawn (char *program); VOID muse_ipc_send (int task_id, int status); VOID muse_ipc_command (int task_id, int command); int muse_ipc_receive (int task_id); int muse_ipc_peek (int task_id); VOID muse_ipc_init_child (int *argc, char **argv); VOID muse_ipc_call_back (int task_id, VOID (*f)(int) ); int muse_ipc_setup_client (char *host, char *program, int port); int muse_ipc_setup_server (int port); int muse_ipc_echo (VOID); VOID muse_ipc_close (int taskid); VOID muse_ipc_init_send(int task_id); VOID muse_ipc_add_string (int task_id, char *s); VOID muse_ipc_add_bytes (int task_id, VOID *b, int n); VOID muse_ipc_add_char (int task_id, int c); VOID muse_ipc_add_short (int task_id, int n); VOID muse_ipc_add_int (int task_id, int n); VOID muse_ipc_add_long (int task_id, int32 n); VOID muse_ipc_add_float (int task_id, double n); VOID muse_ipc_add_double (int task_id, double n); VOID muse_ipc_add_shorts (int task_id, int n, short *array ); VOID muse_ipc_add_ints (int task_id, int n, int *array ); VOID muse_ipc_add_longs (int task_id, int n, int32 *array ); VOID muse_ipc_add_floats (int task_id, int n, float *array ); VOID muse_ipc_add_doubles (int task_id, int n, double *array ); VOID muse_ipc_get_string (int task_id, char *s); VOID muse_ipc_get_bytes (int task_id, VOID *b, int n); VOID muse_ipc_get_char (int task_id, char *c); VOID muse_ipc_get_short (int task_id, short *n); VOID muse_ipc_get_int (int task_id, int *n); VOID muse_ipc_get_long (int task_id, int32 *n); VOID muse_ipc_get_float (int task_id, float *n); VOID muse_ipc_get_double (int task_id, double *n); VOID muse_ipc_get_shorts (int task_id, int n, short *array ); VOID muse_ipc_get_ints (int task_id, int n, int *array ); VOID muse_ipc_get_longs (int task_id, int n, int32 *array ); VOID muse_ipc_get_floats (int task_id, int n, float *array ); VOID muse_ipc_get_doubles (int task_id, int n, double *array ); #else int muse_ipc_spawn (); VOID muse_ipc_send (); VOID muse_ipc_command (); int muse_ipc_receive (); int muse_ipc_peek (); VOID muse_ipc_init_child (); VOID muse_ipc_call_back (); int muse_ipc_setup_client (); int muse_ipc_setup_server (); int muse_ipc_echo (); VOID muse_ipc_close (); VOID muse_ipc_init_send(); VOID muse_ipc_add_string (); VOID muse_ipc_add_bytes (); VOID muse_ipc_add_char (); VOID muse_ipc_add_short (); VOID muse_ipc_add_int (); VOID muse_ipc_add_long (); VOID muse_ipc_add_float (); VOID muse_ipc_add_double (); VOID muse_ipc_add_shorts (); VOID muse_ipc_add_ints (); VOID muse_ipc_add_longs (); VOID muse_ipc_add_floats (); VOID muse_ipc_add_doubles (); VOID muse_ipc_get_string (); VOID muse_ipc_get_bytes (); VOID muse_ipc_get_char (); VOID muse_ipc_get_short (); VOID muse_ipc_get_int (); VOID muse_ipc_get_long (); VOID muse_ipc_get_float (); VOID muse_ipc_get_double (); VOID muse_ipc_get_shorts (); VOID muse_ipc_get_ints (); VOID muse_ipc_get_longs (); VOID muse_ipc_get_floats (); VOID muse_ipc_get_doubles (); #endif #endif /* H_MUSE_IPC */ ogdi-ogdi_4_1_0/vpflib/include/muse_sql.h000066400000000000000000000064051345660466700205360ustar00rootroot00000000000000#ifndef H_MUSE_SQL #define H_MUSE_SQL /* * Symbolic constants for C data types related to database data types */ #define MUSE_SQL_CHAR 1 #define MUSE_SQL_SHORT 2 #define MUSE_SQL_INT 3 #define MUSE_SQL_LONG 4 #define MUSE_SQL_FLOAT 5 #define MUSE_SQL_DOUBLE 6 #define MUSE_SQL_CHAR_ARRAY 11 #define MUSE_SQL_SHORT_ARRAY 12 #define MUSE_SQL_INT_ARRAY 13 #define MUSE_SQL_LONG_ARRAY 14 #define MUSE_SQL_FLOAT_ARRAY 15 #define MUSE_SQL_DOUBLE_ARRAY 16 #define MUSE_SQL_CHAR_ARRAY2 21 #define MUSE_SQL_SHORT_ARRAY2 22 #define MUSE_SQL_INT_ARRAY2 23 #define MUSE_SQL_LONG_ARRAY2 24 #define MUSE_SQL_FLOAT_ARRAY2 25 #define MUSE_SQL_DOUBLE_ARRAY2 26 #define MUSE_SQL_CHAR_ARRAY3 31 #define MUSE_SQL_SHORT_ARRAY3 32 #define MUSE_SQL_INT_ARRAY3 33 #define MUSE_SQL_LONG_ARRAY3 34 #define MUSE_SQL_FLOAT_ARRAY3 35 #define MUSE_SQL_DOUBLE_ARRAY3 36 /* * Symbolic constants to represent API calls * */ #define MUSE_SQL_CONNECT 1 #define MUSE_SQL_LOGIN 2 #define MUSE_SQL_CURSOR_OPEN 3 #define MUSE_SQL_PREPARE 4 #define MUSE_SQL_SET_PARAM 5 #define MUSE_SQL_BIND 6 #define MUSE_SQL_EXECUTE 7 #define MUSE_SQL_FETCH 8 #define MUSE_SQL_CURSOR_CLOSE 9 #define MUSE_SQL_TABLES 10 #define MUSE_SQL_DESCRIBE_TABLE 11 #define MUSE_SQL_DESCRIBE_COLUMNS 12 #define MUSE_SQL_COMMIT 13 #define MUSE_SQL_ROLLBACK 14 #define MUSE_SQL_LOGOUT 15 #define MUSE_SQL_DISCONNECT 16 #define MUSE_SQL_FOREIGN_TABLES 17 #define MUSE_SQL_DESCRIBE_FOREIGN_TABLE 18 #define MUSE_SQL_GET_VARRAY 19 #define MUSE_SQL_SET_VARRAY 20 /* * Functions */ #if XVT_CC_PROTO int muse_sql_connect( char *dbname, char *host ); int muse_sql_login( int db, char *login, char *passwd, char *database ); int muse_sql_get_varray( int db, char *pathname ); int muse_sql_set_varray( int db, char *pathname ); int muse_sql_cursor_open( int db, char *cursor_name ); int muse_sql_cursor_close( int db, int cursor ); int muse_sql_prepare( int db, int cursor, char *sql_stmt ); int muse_sql_set_param( int db, int cursor, int param, int type, VOID *address, int length, int *var_length ); int muse_sql_bind( int db, int cursor, int column, int type, VOID *address, int length, int *ret_length ); int muse_sql_execute( int db, int cursor ); int muse_sql_fetch( int db, int cursor ); int muse_sql_tables( int db, int cursor ); int muse_sql_describe_table( int db, int cursor, char *table ); int muse_sql_describe_columns( int db, int cursor1, int cursor2 ); int muse_sql_commit( int db, int cursor ); int muse_sql_rollback( int db, int cursor ); int muse_sql_logout( int db ); int muse_sql_disconnect( int db ); int muse_sql_foreign_tables( int db, int cursor ); int muse_sql_describe_foreign_table( int db, int cursor, char *table ); #else int muse_sql_connect( ); int muse_sql_login( ); int muse_sql_get_varray( ); int muse_sql_set_varray( ); int muse_sql_cursor_open( ); int muse_sql_cursor_close( ); int muse_sql_prepare( ); int muse_sql_set_param( ); int muse_sql_bind( ); int muse_sql_execute( ); int muse_sql_fetch( ); int muse_sql_tables( ); int muse_sql_describe_table( ); int muse_sql_describe_columns( ); int muse_sql_commit( ); int muse_sql_rollback( ); int muse_sql_logout( ); int muse_sql_disconnect( ); int muse_sql_foreign_tables( ); int muse_sql_describe_foreign_table( ); #endif #endif /* H_MUSE_SQL */ ogdi-ogdi_4_1_0/vpflib/include/museapi.h000066400000000000000000000004551345660466700203500ustar00rootroot00000000000000#ifndef H_MUSEAPI #define H_MUSEAPI #ifndef H_MUSECONV #include "museconv.h" #endif #ifndef H_MUSEPACY #include "musepacy.h" #endif #ifndef H_MUSEPHIG #include "musephig.h" #endif #ifndef H_MUSESYS #include "musesys.h" #endif #ifndef H_MUSERAS #include "museras.h" #endif #endif /* H_MUSEAPI */ ogdi-ogdi_4_1_0/vpflib/include/museconv.h000066400000000000000000000063171345660466700205470ustar00rootroot00000000000000#ifndef H_MUSECONV #define H_MUSECONV #ifndef H_VECTOR #include "vector.h" #endif #if XVT_CC_PROTO MUSE_API encode_raster_hdr(unsigned char *record, RASTER * raster); MUSE_API decode_raster_hdr(unsigned char *record, RASTER * raster); MUSE_API encode_lut(unsigned char *record, LUT * lut); MUSE_API decode_lut(unsigned char *record, LUT * lut); MUSE_API encode_palette(unsigned char *record, PALETTE * palette); MUSE_API decode_palette(unsigned char *record, PALETTE * palette); MUSE_API encode_mapdoc(unsigned char *record, MAP_DOC * mapdoc); MUSE_API decode_mapdoc(unsigned char *record, MAP_DOC * mapdoc); MUSE_API encode_mgm(unsigned char *record, MGM * mgm); MUSE_API decode_mgm(unsigned char *record, MGM * mgm); MUSE_API encode_units(unsigned char *record, UNITS * units); MUSE_API decode_units(unsigned char *record, UNITS * units); MUSE_API encode_products(unsigned char *record, PRODUCTS * products); MUSE_API decode_products(unsigned char *record, PRODUCTS * products); MUSE_API encode_view(unsigned char *record, VIEW * view); MUSE_API decode_view(unsigned char *record, VIEW * view); MUSE_API encode_defaults(unsigned char *record, DEFAULTS * defaults); MUSE_API decode_defaults(unsigned char *record, DEFAULTS * defaults); MUSE_API encode_basemap(unsigned char *record, BASEMAP * basemap); MUSE_API decode_basemap(unsigned char *record, BASEMAP * basemap); MUSE_API encode_grat(unsigned char *record, GRAT_DATA * grat); MUSE_API decode_grat(unsigned char *record, GRAT_DATA * grat, int32 version); MUSE_API encode_vec_data(unsigned char *record, VEC_DATA * vec_data); MUSE_API decode_vec_data(unsigned char *record, VEC_DATA * vec_data); MUSE_API long_to_char(unsigned char *record, int32 *l, short big_endian, int32 *c); MUSE_API short_to_char(unsigned char *record, short *s, short big_endian, int32 *c); MUSE_API char_to_double(unsigned char *record, double *d, short big_endian, int32 *c); MUSE_API char_to_long(unsigned char *record, int32 *l, short big_endian, int32 *c); MUSE_API char_to_short(unsigned char *record, short *s, short big_endian, int32 *c); #else MUSE_API encode_raster_hdr(); MUSE_API decode_raster_hdr(); MUSE_API encode_lut(); MUSE_API decode_lut(); MUSE_API encode_palette(); MUSE_API decode_palette(); MUSE_API encode_mapdoc(); MUSE_API decode_mapdoc(); MUSE_API encode_mgm(); MUSE_API decode_mgm(); MUSE_API encode_units(); MUSE_API decode_units(); MUSE_API encode_products(); MUSE_API decode_products(); MUSE_API encode_view(); MUSE_API decode_view(); MUSE_API encode_defaults(); MUSE_API decode_defaults(); MUSE_API encode_basemap(); MUSE_API decode_basemap(); MUSE_API encode_grat(); MUSE_API decode_grat(); MUSE_API encode_vec_data(); MUSE_API decode_vec_data(); MUSE_API long_to_char(); MUSE_API short_to_char(); MUSE_API char_to_double(); MUSE_API char_to_long(); MUSE_API char_to_short(); #endif #endif /* H_MUSECONV */ ogdi-ogdi_4_1_0/vpflib/include/musedfun.h000066400000000000000000000007671345660466700205410ustar00rootroot00000000000000#ifndef H_MUSED_FUNC #define H_MUSED_FUNC #ifndef H_MUSEDEF #include "musedef.h" #endif #ifndef H_MUSED_DEF #include "museddef.h" #endif #if XVT_OS != XVT_OS_MAC #if XVT_CC_PROTO ERRSTATUS muse_dll_link(char *parent_program, char *dll_filename, FARPROC * function_ptr); ERRSTATUS muse_dll_unlink(void); ERRSTATUS muse_dll_error(char *user_message); #else ERRSTATUS muse_dll_link(); ERRSTATUS muse_dll_unlink(); ERRSTATUS muse_dll_error(); #endif #endif #endif ogdi-ogdi_4_1_0/vpflib/include/musedir.h000066400000000000000000000024271345660466700203560ustar00rootroot00000000000000/* MUSEDIR.H */ #ifndef H_MUSEDIR #define H_MUSEDIR #ifndef INCL_XVTH #include "xvt.h" #endif #ifdef _UNIX #include #endif #ifndef _WINDOWS #ifdef _MAC #define FILE_SEP ':' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #ifdef _MSDOS #define FILE_SEP '\\' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #ifdef _UNIX #define FILE_SEP '/' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #if XVT_OS == XVT_OS_HPUX #define FILE_SEP '/' #endif #else #define FILE_SEP '\\' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #define ERRSTATUS short #ifndef STAT_SUCCESS #define STAT_SUCCESS 0 #endif #if PROTO ERRSTATUS dir_create (char*); ERRSTATUS dir_pop(char *); ERRSTATUS dir_push(char *, char *); ERRSTATUS dir_restore (char *); ERRSTATUS dir_save(char *); ERRSTATUS dir_current(char *); /* ERRSTATUS file_spec_to_string (FILE_SPEC *, char *);*/ FILE *file_open (char*, char*); int muse_access (char *, int); int32 muse_filelength (char *); void muse_check_path (char*); #else ERRSTATUS dir_create (); ERRSTATUS dir_pop(); ERRSTATUS dir_push(); ERRSTATUS dir_restore (); ERRSTATUS dir_save(); ERRSTATUS dir_current(); ERRSTATUS file_spec_to_string (); FILE *file_open (); int muse_access (); int32 muse_filelength (); void muse_check_path (); #endif #endif /* H_MUSEDIR */ ogdi-ogdi_4_1_0/vpflib/include/musepacy.h000066400000000000000000000003341345660466700205270ustar00rootroot00000000000000#ifndef H_MUSEPACY #if XVT_CC_PROTO MUSE_API set_pac_win(WINDOW task, WINDOW pac); MUSE_API pacify(char *dummy_message, short dummy_percent_complete); #else MUSE_API set_pac_win(); MUSE_API pacify(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/museras.h000066400000000000000000000033451345660466700203650ustar00rootroot00000000000000#ifndef H_MUSERAS #define H_MUSERAS #if XVT_CC_PROTO MUSE_API raster_construct(FILE * file, RASTER ** pointer); MUSE_API raster_destruct(FILE * file, BOOLEAN destruct, RASTER ** raster); MUSE_API raster_xform(RASTER * in, RASTER * out, RENDER_INFO * render_info, LUT * default_lut, PALETTE * default_palette); MUSE_API palette_construct(FILE * file, PALETTE ** pointer); MUSE_API palette_destruct(FILE * file, BOOLEAN destruct, PALETTE ** palette); MUSE_API lut_construct(FILE * file, PALETTE * pal, LUT ** pointer); MUSE_API lut_destruct(FILE * file, BOOLEAN destruct, LUT ** lut); MUSE_API raster_draw(RASTER * raster, WINDOW map_window); MUSE_API pal_nearest_color(PALETTE * pal, RGB rgb, USHORT * pal_color); MUSE_API file_spec_to_string(FILE_SPEC * file_spec, char *string); MUSE_API string_to_file_spec(FILE_SPEC * file_spec, char *string); MUSE_API add_color_bias(GHANDLE bitmap); MUSE_API remove_color_bias(GHANDLE bitmap); MUSE_API muse_error(ERRSTATUS status); MUSE_API hsv2rgb(GFLOAT h, GFLOAT s, GFLOAT v, GFLOAT * r, GFLOAT * g, GFLOAT * b); MUSE_API pal_gen(PALETTE * pal); #else MUSE_API raster_construct(); MUSE_API raster_destruct(); MUSE_API raster_xform(); MUSE_API palette_construct(); MUSE_API palette_destruct(); MUSE_API lut_construct(); MUSE_API lut_destruct(); MUSE_API raster_draw(); MUSE_API pal_nearest_color(); MUSE_API file_spec_to_string(); MUSE_API string_to_file_spec(); MUSE_API add_color_bias(); MUSE_API remove_color_bias(); MUSE_API muse_error(); MUSE_API hsv2rgb(); MUSE_API pal_gen(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/musesys.h000066400000000000000000000006271345660466700204160ustar00rootroot00000000000000#ifndef H_MUSESYS #define H_MUSESYS #if XVT_CC_PROTO int32 muse_filelength(char *path); FILE * file_open(char *path, char *mode); MUSE_API dir_restore(char *path); MUSE_API dir_push(char *sub_dir, char *path); MUSE_API dir_create(char *path); #else int32 muse_filelength(); FILE * file_open(); MUSE_API dir_restore(); MUSE_API dir_push(); MUSE_API dir_create(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/phigs.h000066400000000000000000000002341345660466700200120ustar00rootroot00000000000000/* @Phigs */ #ifndef H_PHIGS #define H_PHIGS #ifndef H_PHIGS_DEF #include "phigs_d.h" #endif #ifndef H_PHIGS_FUNC #include "phigs_f.h" #endif #endif ogdi-ogdi_4_1_0/vpflib/include/phigs_d.h000066400000000000000000000154331345660466700203240ustar00rootroot00000000000000#ifndef H_PHIGS_D #define H_PHIGS_D #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_VIEW_DEF #include "view_d.h" #endif /*************************************************************** @PHIGS #Defines **************************************************************** */ /*************************************************************** @ PHIGS Line Primitives **************************************************************** PHIGS polyline definitions. */ #define PLINE_SOLID 1 #define PLINE_DASH 2 #define PLINE_DOT 3 #define PLINE_DOT_DASH 4 /* Description: Definitions for PHIGS line styles. */ /*************************************************************** @ PHIGS Marker Primitives **************************************************************** PHIGS polymarker definitions. */ #define PMARKER_DOT 1 #define PMARKER_PLUS 2 #define PMARKER_ASTERICK 3 #define PMARKER_CIRCLE 4 #define PMARKER_CROSS 5 /* Description: Definitions for PHIGS marker styles. */ /*************************************************************** @ PHIGS Color Primitive **************************************************************** PHIGS color definitions. */ #define BLACK 0 #define WHITE 1 #define RED 2 #define GREEN 3 #define BLUE 4 #define YELLOW 5 #define CYAN 6 #define MAGENTA 7 /* Description: Definitions for PHIGS color primitives for lines, markers and text. */ /*************************************************************** @ PHIGS Primitives **************************************************************** PHIGS primitive definitions. */ #define PLINE 0 #define PMARKER 1 #define PTEXT 2 #define PEDGE 3 #define PAREA 4 /* Description: */ /*************************************************************** @ Pconnid **************************************************************** A PHIGS connection id. */ typedef char* Pconnid; /* Description: */ /*************************************************************** @ Pfloat **************************************************************** A PHIGS float. */ typedef double Pfloat; /* Description: */ /*************************************************************** @ Pint **************************************************************** A PHIGS integer. */ typedef int32 Pint; /* Description: */ /************************************************************** @ Pmatrix **************************************************************** A PHIGS matrix. */ typedef Pfloat Pmatrix[3][3]; /* Description: */ /*************************************************************** @ PMARKER **************************************************************** Marker types for PHIGS */ typedef enum { DOT, PLUS, ASTERICK, CIRCLE, CROSS, SOLID_LINE, DASH_LINE, DOT_LINE } Pmarker; /* * Description: */ /*************************************************************** @ Pedge_flag **************************************************************** The PHIGS edge flag. */ typedef enum { PEDGE_ON, PEDGE_OFF } Pedge_flag; /* Description: Display fill area edges on or off. */ /*************************************************************** @ Pint_size **************************************************************** A PHIGS size structure. */ typedef struct { Pint size_x; Pint size_y; } Pint_size; /* Description: */ /*************************************************************** @ Pint_style **************************************************************** The PHIGS interior style structure. */ typedef enum { PSTYLE_HOLLOW, PSTYLE_SOLID, PSTYLE_PAT, PSTYLE_HATCH, PSTYLE_EMPTY } Pint_style; /* Description: The current PHIGS update state. */ /*************************************************************** @ Pint_list **************************************************************** A PHIGS integer list structure. */ typedef struct { Pint num_ints; Pint *ints; } Pint_list; /* Description: */ /*************************************************************** @ Plimit **************************************************************** A PHIGS bounding limit structure. */ typedef struct { Pfloat x_min; Pfloat x_max; Pfloat y_min; Pfloat y_max; } Plimit; /* Description: */ /*************************************************************** @ Ppat_rep **************************************************************** A PHIGS pattern representative structure. */ typedef struct { Pint_size dims; unsigned char pHMEM colr_array; Pint pix_per_byte; } Ppat_rep; /* Description: A structure containing a stretchable image. */ /*************************************************************** @ Ppoint **************************************************************** A PHIGS point structure. */ typedef struct { Pfloat x; Pfloat y; } Ppoint; /* Description: */ /*************************************************************** @ Ppoint_list **************************************************************** A list of PHIGS points list structure. */ typedef struct { Pint num_points; #ifndef _WINDOWS Ppoint *points; #else Ppoint *points; #endif } Ppoint_list; /* Description: */ /*************************************************************** @ Ppoint_list_list **************************************************************** A list of PHIGS point list structures. */ typedef struct { Pint num_point_lists; Ppoint_list *point_lists; } Ppoint_list_list; /* Description: Used for displaying fill area sets. */ /*************************************************************** @ Prect **************************************************************** A PHIGS rectangle structure. */ typedef struct { Ppoint p; Ppoint q; } Prect; /* Description: */ /*************************************************************** @ Pregen_flag **************************************************************** A PHIGS regeneration flag enumerater. */ typedef enum { PFLAG_PERFORM, PFLAG_POSTPONE } Pregen_flag; /* Description: The PGLAG_POSTPONE value will defer updates to the PHIGS workstation. */ /*************************************************************** @ Pupd_st **************************************************************** The PHIGS update state structure. */ typedef enum { PUPD_NOT_PEND, PUPD_PEND } Pupd_st; /* Description: The current PHIGS update state. */ /*************************************************************** @ Pvec **************************************************************** A PHIGS vector position structure. */ typedef struct { Pfloat delta_x; Pfloat delta_y; } Pvec; /* Description: A PHIGS relative position. */ #endif /* H_PHIGS_D */ ogdi-ogdi_4_1_0/vpflib/include/phigs_f.h000066400000000000000000000340541345660466700203260ustar00rootroot00000000000000/* @PHIGS Functions */ #ifndef H_PHIGS_F #define H_PHIGS_F #ifndef H_PHIGS_D #include "phigs_d.h" #endif /* H_PHIGS_DEF */ #ifndef H_COLOR_D #include "color_d.h" #endif /*************************************************************** @ pcell_array() **************************************************************** Draw PHIGS Cell Array. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pcell_array(Prect *rectangle, Ppat_rep colr_array); #else ERRSTATUS MUSE_API pcell_array(); #endif /* Description: The image contained in colr_array is stretched to fit the rectangle. */ /*************************************************************** @ pclose_phigs() **************************************************************** Close PHIGS Graphics. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pclose_phigs(void); #else ERRSTATUS MUSE_API pclose_phigs(); #endif /* Description: Terminate PHIGS graphics. */ /*************************************************************** @ pclose_structure() **************************************************************** Close a PHIGS structure. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pclose_struct(void); #else ERRSTATUS MUSE_API pclose_struct(); #endif /* Description: Close a PHIGS graphics structurte. */ /*************************************************************** @ pclose_ws() **************************************************************** Close a PHIGS Workstation. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pclose_ws(Pint ws_id); #else ERRSTATUS MUSE_API pclose_ws(); #endif /* Description: A workstation is a XVT window. */ /*************************************************************** @ pdel_struct() **************************************************************** Delete PHIGS structure. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pdel_struct(Pint struct_id); #else ERRSTATUS MUSE_API pdel_struct(); #endif /* Description: Delete a PHIGS graphics structure. */ /*************************************************************** @ pemergency_close_phigs() **************************************************************** Emergency PHIGS close. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pemergency_close_phigs(void); #else ERRSTATUS MUSE_API pemergency_close_phigs(); #endif /* Description: Emergency program terminitation. */ /*************************************************************** @ pfill_area_set() **************************************************************** PHIGS fill area set. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pfill_area_set(Ppoint_list_list *sets); #else ERRSTATUS MUSE_API pfill_area_set(); #endif /* Description: Display a set of fill areas. This has the capability to display holes in fill areas. */ /*************************************************************** @ pinq_bitmap() **************************************************************** Inquire bitmap from operating system. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pinq_bitmap(Pint ws_id , GHANDLE bitmap, PALETTE_USAGE palette_usage ); #else ERRSTATUS MUSE_API pinq_bitmap(); #endif /* Description: This function will return a bitmap of the screen from the underlying graphics system. */ /*************************************************************** @ pinq_open_wss() **************************************************************** Inquire open workstation setup. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pinq_open_wss(Pint length, Pint start, Pint *error, Pint_list *ws_id_list, Pint *total_length); #else ERRSTATUS MUSE_API pinq_open_wss(); #endif /* Description: This function will determine whether a workstation is open or not. */ /*************************************************************** @ pinq_wss_trans() **************************************************************** Inquire current PHIGS transformation. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pinq_wss_trans(Pint ws, Pint *error_ind, Pupd_st *upd_st, Plimit *cur_win_lim, Plimit *cur_vp_lim, Pvec *scale_vector, Pvec *trans_vector); #else ERRSTATUS MUSE_API pinq_wss_trans(); #endif /* Description: Returns the current setup of the display transformation. */ /*************************************************************** @ popen_phigs() **************************************************************** Open PHIGS graphics. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API popen_phigs(char *error_file, size_t memory); #else ERRSTATUS MUSE_API popen_phigs(); #endif /* Description: Must be the first PHIGS call to initialize PHIGS. */ /*************************************************************** @ popen_struct() **************************************************************** Open PHIGS graphics structure. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API popen_struct(Pint struct_id); #else ERRSTATUS MUSE_API popen_struct(); #endif /* Description: Open an existing structure or create a new one. */ /*************************************************************** @ popen_ws() **************************************************************** Open PHIGS Workstation. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API popen_ws(Pint ws_id, Pconnid *conn_id, Pint ws_type); #else ERRSTATUS MUSE_API popen_ws(); #endif /* Description: A PHIGS workstation is a XVT window. */ /*************************************************************** @ ppolyline() **************************************************************** Draw PHIGS polyline. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ppolyline(Ppoint_list *point_list); #else ERRSTATUS MUSE_API ppolyline(); #endif /* Description: Point_list contains the points to be connected using the current line style and color. */ /*************************************************************** @ ppolymarker() **************************************************************** Draw PHIGS polymakers. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ppolymarker(Ppoint_list *point_list); #else ERRSTATUS MUSE_API ppolymarker(); #endif /* Description: Point_list contains the points at which to place the markers. */ /*************************************************************** @ ppost_struct() **************************************************************** Post a PHIGS graphics structure. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ppost_struct(Pint ws_id, Pint struct_id, Pfloat priority); #else ERRSTATUS MUSE_API ppost_struct(); #endif /* Description: Sends the PHIGS structure to a workstation. PHIGS structures are created by opening, drawing into , and closing them. */ /*************************************************************** @ pput_pal() **************************************************************** Put a PHIGS palette. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pput_pal(Pint ws_id, PALETTE *palette); #else ERRSTATUS MUSE_API pput_pal(); #endif /* Description: Assigns the palette argument to the currently open phigs workstation. (A window is a PHIGS workstation.) */ /*************************************************************** @ pscale() **************************************************************** PHIGS scale transformation. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pscale(Pvec scale_vector, Pint error_id, Pmatrix m); #else ERRSTATUS MUSE_API pscale(); #endif /* Description: Used to zoom the image. */ /*************************************************************** @ pset_char_ht() **************************************************************** Set PHIGS character height. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_char_ht(Pfloat height); #else ERRSTATUS MUSE_API pset_char_ht(); #endif /* Description: Sets character height scale factor. */ /*************************************************************** @ pset_edge_colr_ind() **************************************************************** Set PHIGS edge line colour index. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_edge_colr_ind (Pint index); #else ERRSTATUS MUSE_API pset_edge_colr_ind(); #endif /* Description: Sets the edge line colour to one of the defined line types. */ /*************************************************************** @ pset_edge_flag() **************************************************************** Set to display PHIGS edges on or off. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_edge_flag(Pedge_flag edge_flag); #else ERRSTATUS MUSE_API pset_edge_flag(); #endif /* Description: When diplaying fill areas this function determines whether the edges are visible or not. */ /*************************************************************** @ pset_edgetype() **************************************************************** Set PHIGS edge line type. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_edgetype(Pint edgetype); #else ERRSTATUS MUSE_API pset_edgetype(); #endif /* Description: Sets the edge line type to one of the defined line types. */ /*************************************************************** @ pset_edgewidth() **************************************************************** Set PHIGS edge width. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_edgewidth(Pfloat width); #else ERRSTATUS MUSE_API pset_edgewidth(); #endif /* Description: Sets edge line width. */ /*************************************************************** @ pset_int_style() **************************************************************** Set PHIGS fill area interior style. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_int_style (Pint_style style); #else ERRSTATUS MUSE_API pset_int_style(); #endif /* Description: Sets the fill area interior style to line one of the defined types. */ /*************************************************************** @ pset_int_colr_ind() **************************************************************** Set PHIGS fill area interior colour index. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_int_colr_ind(Pint index); #else ERRSTATUS MUSE_API pset_int_colr_ind(); #endif /* Description: Sets the fill area interior color to one of the defined types. */ /*************************************************************** @ pset_line_colr_ind() **************************************************************** Set PHIGS line colour index. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_line_colr_ind (Pint index); #else ERRSTATUS MUSE_API pset_line_colr_ind(); #endif /* Description: Sets the line colour to one of the defined types. */ /*************************************************************** @ pset_linetype() **************************************************************** Set PHIGS line type. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_linetype(Pint linetype); #else ERRSTATUS MUSE_API pset_linetype(); #endif /* Description: Sets the line type to one of the defined types. */ /*************************************************************** @ pset_linewidth() **************************************************************** Set PHIGS line width. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_linewidth(Pfloat width); #else ERRSTATUS MUSE_API pset_linewidth(); #endif /* Description: Sets polyline line width. */ /*************************************************************** @ pset_marker_colr_ind() **************************************************************** Set PHIGS marker colour index. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_marker_colr_ind (Pint index); #else ERRSTATUS MUSE_API pset_marker_colr_ind(); #endif /* Description: Sets the marker colour to one of the defined types. */ /*************************************************************** @ pset_marker_size() **************************************************************** Set PHIGS marker size. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_marker_size(Pfloat size); #else ERRSTATUS MUSE_API pset_maker_size(); #endif /* Description: Sets marker scale factor. */ /*************************************************************** @ pset_marker_type() **************************************************************** Set PHIGS Set Marker Type. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_marker_type(Pint markertype); #else ERRSTATUS MUSE_API pset_marker_type(); #endif /* Description: Sets the marker type to one of the defined types. */ /*************************************************************** @ pset_text_colr_ind() **************************************************************** Set PHIGS Text Colour Index. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_text_colr_ind (Pint index); #else ERRSTATUS MUSE_API pset_text_colr_ind(); #endif /* Description: Sets the text colour to one of the defined types. */ /*************************************************************** @ pset_ws_vp() **************************************************************** Set PHIGS workstation viewport. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pset_ws_vp (Pint ws_id, Plimit *viewport); #else ERRSTATUS MUSE_API pset_ws_vp(); #endif /* Description: Changes the area of the drawing surface. */ /*************************************************************** @ ptext() **************************************************************** Draw PHIGS text. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ptext(Ppoint *text_pt, char *text); #else ERRSTATUS MUSE_API ptext(); #endif /* Description: Plots text at the text_pt position using the current color and style. */ /*************************************************************** @ ptranslate() **************************************************************** PHIGS translation transformation. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ptranslate(Pvec trans_vector, Pint error_id, Pmatrix m); #else ERRSTATUS MUSE_API ptranslate(); #endif /* Description: Scrolls the display. */ /*************************************************************** @ pupd_ws() **************************************************************** Update the PHIGS workstation */ #if XVT_CC_PROTO ERRSTATUS MUSE_API pupd_ws(Pint ws, Pregen_flag regen_flag); #else ERRSTATUS MUSE_API pupd_ws(); #endif /* Description: Updates lastest additions to graphics structures to the screen. */ /*************************************************************** @ ws_is_open() **************************************************************** Is PHIGS workstation is open. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ws_is_open(Pint ws); #else ERRSTATUS MUSE_API ws_is_open(); #endif /* Description: Commonly used non-phigs function to test to see if workstation is open. */ #endif /* #ifndef H_PHIGS_F */ ogdi-ogdi_4_1_0/vpflib/include/pnt_f.h000066400000000000000000000260251345660466700200140ustar00rootroot00000000000000 #ifndef H_PNT_F #define H_PNT_F #ifndef H_COORD_DEF #include "coord_d.h" #endif #ifndef H_VALIDFUN #include "valid_f.h" #endif /*************************************************************** @ check_for_ltr_x_error() **************************************************************** Check for invalid zones when latitude band is X */ #if XVT_CC_PROTO BOOLEAN check_for_ltr_x_error(char *mgrs); #else BOOLEAN check_for_ltr_x_error(); #endif /* Description: In MGRS, zones 32, 34, and 36 do not exist in latitude band X. If user has entered one of these zones followed by an X, return an error message in the MGRS string. */ /*************************************************************** @ check_for_zone_and_100kms_error() **************************************************************** Check for incompatibility between the MGRS zone and the first letter of the 100,000-meter square designation */ #if XVT_CC_PROTO BOOLEAN check_for_zone_and_100kms_error(int iset, char *string); #else BOOLEAN check_for_zone_and_100kms_error(); #endif /* Description: An MGRS zone belongs to one of six zone sets, and the set determines which letters are valid for the first character of the 100,000-meter square. This function returns TRUE if incompatiibility is found. See Appendix B of DMA TM 8358.1. */ /*************************************************************** @ check_for_zone_and_100kms_error() **************************************************************** Check for incompatibility between the MGRS zone and the first letter of the 100,000-meter square designation */ #if XVT_CC_PROTO BOOLEAN check_for_zone_and_100kms_error(int iset, char *string); #else BOOLEAN check_for_zone_and_100kms_error(); #endif /* Description: An MGRS zone belongs to one of six zone sets, and the set determines which letters are valid for the first character of the 100,000-meter square. This function returns TRUE if incompatiibility is found. See Appendix B of DMA TM 8358.1. */ /*************************************************************** @ check_integer() **************************************************************** Check that edit field contains a valid integer with no more than the given number of digits */ #if XVT_CC_PROTO BOOLEAN check_integer(short length, char *string, BOOLEAN negs_ok, int *caret_pos); #else BOOLEAN check_integer(); #endif /* Description: Checks each character in a string and returns TRUE if a non-digit or too many digits are found. This method is used for dialog box fields because E_CHAR events are not sent or are not portable. */ /*************************************************************** @ check_real() **************************************************************** Check that edit field contains a valid real number with no more than the given total number of digits and the given number of digits to the right of the decimal place */ #if XVT_CC_PROTO BOOLEAN check_real(short width, short precision, char *string, int *caret_pos); #else BOOLEAN check_real(); #endif /* Description: checks each character in a string and returns TRUE if a non-digit or too many digits are found. This method is used for dialog box fields because E_CHAR events are not sent or are not portable. */ /*************************************************************** @ get_input_pt(); **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS get_input_pt( COORD_TYPE *coord_type, POINT_TYPE *point, int *pt_task_id, char *client_name ); #else ERRSTATUS get_input_pt( ); #endif /*************************************************************** @ notify_inv_UTM_easting(); **************************************************************** Displays error message for out-of-range easting value */ #if XVT_CC_PROTO BOOLEAN notify_inv_UTM_easting(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_UTM_easting(); #endif /* Description: In UTM point-entry screen, displays message and returns focus to the easting field if field is blank or value is not in the range 100000 to 900000. */ /*************************************************************** @ notify_inv_lat_band() **************************************************************** Displays error message for blank latitude band field */ #if XVT_CC_PROTO BOOLEAN notify_inv_lat_band(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_lat_band(); #endif /* Description: In MGRS point-entry screen, displays message and returns focus to the latitude band field if it is blank */ /*************************************************************** @notify_inv_lat_deg() **************************************************************** Displays error message for out-of-range GP latitude value */ #if XVT_CC_PROTO BOOLEAN notify_inv_lat_deg(BOOLEAN *flag, WINDOW win, int control_id, double maxval); #else BOOLEAN notify_inv_lat_deg(); #endif /* Description: In point-entry screen, displays message and returns focus to the latitude degrees field if value > 90. */ /*************************************************************** @notify_inv_lon_deg() **************************************************************** Displays error message for out-of-range GP longitude value */ #if XVT_CC_PROTO BOOLEAN notify_inv_lon_deg(BOOLEAN *flag, WINDOW win, int control_id, double maxval); #else BOOLEAN notify_inv_lon_deg(); #endif /* Description: In point-entry screen, displays message and returns focus to the longitude degrees field if value > 180. */ /*************************************************************** @notify_inv_lat_min_sec() **************************************************************** Displays error message for out-of-range latitude minutes or seconds value */ #if XVT_CC_PROTO BOOLEAN notify_inv_lat_min_sec(BOOLEAN *flag, WINDOW win, int control_id, int deg_control_id); #else BOOLEAN notify_inv_lat_min_sec(); #endif /* Description: In GP point-entry screen, displays message and returns focus to a field with an out-of-range value for minutes or seconds; */ /*************************************************************** @notify_inv_lon_min_sec() **************************************************************** Displays error message for out-of-range longitude minutes or seconds value */ #if XVT_CC_PROTO BOOLEAN notify_inv_lon_min_sec(BOOLEAN *flag, WINDOW win, int control_id, int deg_control_id); #else BOOLEAN notify_inv_lon_min_sec(); #endif /* Description: In GP point-entry screen, displays message and returns focus to a field with an out-of-range value for minutes or seconds; */ /*************************************************************** @ notify_inv_MGRS_zone() **************************************************************** Displays error message for out-of-range zone value */ #if XVT_CC_PROTO BOOLEAN notify_inv_MGRS_zone(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_MGRS_zone(); #endif /* Description: In MGRS point-entry screen, displays error message and returns focus to field if zone is invalid */ /*************************************************************** @ notify_inv_UTM_northing() **************************************************************** Displays error message for out-of-range northing value */ #if XVT_CC_PROTO BOOLEAN notify_inv_UTM_northing(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_UTM_northing(); #endif /* Description: In UTM point-entry screen, displays error message and returns focus to field if northing > 10000000 */ /*************************************************************** @ notify_inv_UPS_northing() **************************************************************** Displays error message for out-of-range northing value */ #if XVT_CC_PROTO BOOLEAN notify_inv_UPS_northing(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_UPS_northing(); #endif /* Description: In UPS point-entry screen, displays error message and returns focus to field if northing is bad. */ /*************************************************************** @ notify_inv_UPS_easting() **************************************************************** Displays error message for out-of-range easting value */ #if XVT_CC_PROTO BOOLEAN notify_inv_UPS_easting(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_UPS_easting(); #endif /* Description: In UPS point-entry screen, displays error message and returns focus to field if easting is bad. */ /*************************************************************** @ notify_inv_UTM_zone() **************************************************************** Displays error message for out-of-range zone value */ #if XVT_CC_PROTO BOOLEAN notify_inv_UTM_zone(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_UTM_zone(); #endif /* Description: In UTM and MGRS point-entry screen, displays message and returns focus to field with an out-of-range value for zone; ie value < 1 or > 60. */ /*************************************************************** @ notify_inv_100kms() **************************************************************** Displays error message for invalid 100,000-meter square value */ #if XVT_CC_PROTO BOOLEAN notify_inv_100kms(BOOLEAN *flag, WINDOW win, int control_id); #else BOOLEAN notify_inv_100kms(); #endif /* Description: In MGRS point-entry screen, displays message and returns focus to 100,000-meter square field if value has less than two characters. */ /*************************************************************** @ notify_invalid_dm_fields() **************************************************************** Displays error messages for all invalid DM edit fields */ #if XVT_CC_PROTO BOOLEAN notify_invalid_dm_fields(WINDOW xdWindow); #else BOOLEAN notify_invalid_dm_fields(); #endif /* Description: Calls individual notify functions for each of the GP DM point-entry edit controls */ /*************************************************************** @ notify_invalid_dms_fields() **************************************************************** Displays error messages for all invalid DMS edit fields */ #if XVT_CC_PROTO BOOLEAN notify_invalid_dms_fields(WINDOW win); #else BOOLEAN notify_invalid_dms_fields(); #endif /* Description: Calls individual notify functions for each of the GP DMS point-entry edit controls */ /*************************************************************** @ notify_inv_x() **************************************************************** Displays error message for invalid value in grid easting edit field */ #if XVT_CC_PROTO BOOLEAN notify_inv_x(BOOLEAN *flag, WINDOW win, int control_id, double east_extent, double west_extent); #else BOOLEAN notify_inv_x(); #endif /*************************************************************** @ notify_inv_y() **************************************************************** Displays error message for invalid value in grid easting edit field */ #if XVT_CC_PROTO BOOLEAN notify_inv_y(BOOLEAN *flag, WINDOW win, int control_id, double north_extent, double south_extent); #else BOOLEAN notify_inv_y(); #endif #endif /* H_PNT_F */ ogdi-ogdi_4_1_0/vpflib/include/pntappl.h000066400000000000000000000010731345660466700203600ustar00rootroot00000000000000#ifndef H_PNTAPPL #define H_PNTAPPL #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_COORD_DEF #include "coord_d.h" #endif #ifndef H_UNIT_DEF #include "unit_d.h" #endif #ifndef H_ELLIPS_DEF #include "ellips_d.h" #endif #ifndef H_DATUM_DEF #include "datum_d.h" #endif #ifndef H_CB_DEF #include "cb_d.h" #endif #ifndef H_PNT_F #include "pnt_f.h" #endif #ifndef H_PNTGUI_F #include "pntgui_f.h" #endif #ifndef H_VALIDFUN #include "valid_f.h" #endif #ifndef H_UNIT_FUNC #include "unit_f.h" #endif #ifndef H_MUSEIPC #include "muse_ipc.h" #endif #endif /* H_PNTAPPL */ ogdi-ogdi_4_1_0/vpflib/include/pntgui_f.h000066400000000000000000000457011345660466700205230ustar00rootroot00000000000000#ifndef H_PNTGUI_F #define H_PNTGUI_F #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef INCL_XVTH #include "xvt.h" #endif /*************************************************************** @ pnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern void pnt_call_back(int task_id); #else extern void pnt_call_back(); #endif /* Description: */ /*************************************************************** @ send_pnt **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS send_pnt(void *point); #else ERRSTATUS send_pnt(); #endif /* Description: */ /*************************************************************** @ dmpnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int dmpnt_call_back(int task_id); #else extern int dmpnt_call_back(); #endif /* Description: */ /*************************************************************** @ dmspnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int dmspnt_call_back(int task_id); #else extern int dmspnt_call_back(); #endif /* Description: */ /*************************************************************** @ georfpnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int georfpnt_call_back(int task_id); #else extern int georfpnt_call_back(); #endif /* Description: */ /*************************************************************** @ mgrspnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int mgrspnt_call_back(int task_id); #else extern int mgrspnt_call_back(); #endif /* Description: */ /*************************************************************** @ otherpnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int otherpnt_call_back(int task_id); #else extern int otherpnt_call_back(); #endif /* Description: */ /*************************************************************** @ utmpnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int utmpnt_call_back(int task_id); #else extern int utmpnt_call_back(); #endif /* Description: */ /*************************************************************** @ upspnt_call_back **************************************************************** */ #if XVT_CC_PROTO extern int upspnt_call_back(int task_id); #else extern int upspnt_call_back(); #endif /* Description: */ /*************************************************************** @ do_menu_item_quit **************************************************************** do_menu_item_quit */ #if XVT_CC_PROTO void do_menu_item_quit(WINDOW xdWindow); #else void do_menu_item_quit(); #endif /* Description: */ /*************************************************************** @ do_e_close **************************************************************** do_e_close */ #if XVT_CC_PROTO void do_e_close( void ); #else void do_e_close(); #endif /*************************************************************** @ do_menu_item_enter_point **************************************************************** do_menu_item_enter_point */ #if XVT_CC_PROTO void do_menu_item_enter_point(WINDOW xdWindow); #else void do_menu_item_test_enter_point(); #endif /* Description: */ /*************************************************************** @ do_d101_e_create **************************************************************** do_d101_e_create */ #if XVT_CC_PROTO void do_d101_e_create(WINDOW xdWindow); #else void do_d101_e_create(); #endif /* Description: */ /*************************************************************** @ do_d101_lost_focus **************************************************************** do_d101_lost_focus */ #if XVT_CC_PROTO void do_d101_lost_focus(WINDOW xdWindow); #else void do_d101_lost_focus(); #endif /* Description: */ /*************************************************************** @ do_d101_cancel **************************************************************** do_d101_cancel */ #if XVT_CC_PROTO void do_d101_cancel(WINDOW xdWindow); #else void do_d101_cancel(); #endif /* Description: */ /*************************************************************** @ do_d101_pb_cancel **************************************************************** do_d101_cancel */ #if XVT_CC_PROTO void do_d101_pb_cancel(WINDOW xdWindow); #else void do_d101_pb_cancel(); #endif /* Description: */ /*************************************************************** @ do_d101_pb_done **************************************************************** do_d101_pb_done */ #if XVT_CC_PROTO void do_d101_pb_done(WINDOW xdWindow); #else void do_d101_pb_done(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lat_changed **************************************************************** do_d101_ed_lat_changed */ #if XVT_CC_PROTO void do_d101_ed_lat_changed(WINDOW xdWindow); #else void do_d101_ed_lat_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_pb_ed_lat_changed **************************************************************** do_d101_pb_ed_lat_changed */ #if XVT_CC_PROTO void do_d101_pb_ed_lat_changed(WINDOW xdWindow); #else void do_d101_pb_ed_lat_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latd_changed **************************************************************** do_d101_pb_ed_latd_changed */ #if XVT_CC_PROTO void do_d101_ed_latd_changed(WINDOW xdWindow); #else void do_d101_ed_latd_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latm_changed **************************************************************** do_d101_pb_ed_latm_changed */ #if XVT_CC_PROTO void do_d101_ed_latm_changed(WINDOW xdWindow); #else void do_d101_ed_latm_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lats_changed **************************************************************** do_d101_pb_ed_lats_changed */ #if XVT_CC_PROTO void do_d101_ed_lats_changed(WINDOW xdWindow); #else void do_d101_ed_lats_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lon_changed **************************************************************** do_d101_ed_lon_changed */ #if XVT_CC_PROTO void do_d101_ed_lon_changed(WINDOW xdWindow); #else void do_d101_ed_lon_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lond_changed **************************************************************** do_d101_pb_ed_lond_changed */ #if XVT_CC_PROTO void do_d101_ed_lond_changed(WINDOW xdWindow); #else void do_d101_ed_lond_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lonm_changed **************************************************************** do_d101_pb_ed_lonm_changed */ #if XVT_CC_PROTO void do_d101_ed_lonm_changed(WINDOW xdWindow); #else void do_d101_ed_lonm_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lons_changed **************************************************************** do_d101_pb_ed_lons_changed */ #if XVT_CC_PROTO void do_d101_ed_lons_changed(WINDOW xdWindow); #else void do_d101_ed_lons_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_rb_n **************************************************************** do_d101_rb_n */ #if XVT_CC_PROTO void do_d101_rb_n(WINDOW xdWindow); #else void do_d101_rb_n(); #endif /* Description: */ /*************************************************************** @ do_d101_rb_s **************************************************************** do_d101_rb_s */ #if XVT_CC_PROTO void do_d101_rb_s(WINDOW xdWindow); #else void do_d101_rb_s(); #endif /* Description: */ /*************************************************************** @ do_d101_rb_e **************************************************************** do_d101_rb_e */ #if XVT_CC_PROTO void do_d101_rb_e(WINDOW xdWindow); #else void do_d101_rb_e(); #endif /* Description: */ /*************************************************************** @ do_d101_rb_w **************************************************************** do_d101_rb_w */ #if XVT_CC_PROTO void do_d101_rb_w(WINDOW xdWindow); #else void do_d101_rb_w(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lat_focus_active **************************************************************** do_d101_ed_lat_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lat_focus_active(WINDOW xdWindow); #else void do_d101_ed_lat_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latd_focus_active **************************************************************** do_d101_ed_lat_focus_active */ #if XVT_CC_PROTO void do_d101_ed_latd_focus_active(WINDOW xdWindow); #else void do_d101_ed_latd_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latm_focus_active **************************************************************** do_d101_ed_latm_focus_active */ #if XVT_CC_PROTO void do_d101_ed_latm_focus_active(WINDOW xdWindow); #else void do_d101_ed_latm_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lats_focus_active **************************************************************** do_d101_ed_lats_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lats_focus_active(WINDOW xdWindow); #else void do_d101_ed_lats_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lon_focus_active **************************************************************** do_d101_ed_lon_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lon_focus_active(WINDOW xdWindow); #else void do_d101_ed_lon_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lond_focus_active **************************************************************** do_d101_ed_lon_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lond_focus_active(WINDOW xdWindow); #else void do_d101_ed_lond_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lonm_focus_active **************************************************************** do_d101_ed_lonm_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lonm_focus_active(WINDOW xdWindow); #else void do_d101_ed_lonm_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lons_focus_active **************************************************************** do_d101_ed_lons_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lons_focus_active(WINDOW xdWindow); #else void do_d101_ed_lons_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lonmin_changed **************************************************************** do_d101_ed_lonmin_changed */ #if XVT_CC_PROTO void do_d101_ed_lonmin_changed(WINDOW xdWindow); #else void do_d101_ed_lonmin_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latmin_changed **************************************************************** do_d101_ed_latmin_changed */ #if XVT_CC_PROTO void do_d101_ed_latmin_changed(WINDOW xdWindow); #else void do_d101_ed_latmin_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_latmin_focus_active **************************************************************** do_d101_ed_latmin_focus_active */ #if XVT_CC_PROTO void do_d101_ed_latmin_focus_active(WINDOW xdWindow); #else void do_d101_ed_latmin_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lonmin_focus_active **************************************************************** do_d101_ed_lonmin_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lonmin_focus_active(WINDOW xdWindow); #else void do_d101_ed_lonmin_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_quad15_changed **************************************************************** do_d101_ed_quad15_changed */ #if XVT_CC_PROTO void do_d101_ed_quad15_changed(WINDOW xdWindow); #else void do_d101_ed_quad15_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_quad1_changed **************************************************************** do_d101_ed_quad1_changed */ #if XVT_CC_PROTO void do_d101_ed_quad1_changed(WINDOW xdWindow); #else void do_d101_ed_quad1_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_quad1_focus_active **************************************************************** do_d101_ed_quad1_focus_active */ #if XVT_CC_PROTO void do_d101_ed_quad1_focus_active(WINDOW xdWindow); #else void do_d101_ed_quad1_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_quad15_focus_active **************************************************************** do_d101_ed_quad15_focus_active */ #if XVT_CC_PROTO void do_d101_ed_quad15_focus_active(WINDOW xdWindow); #else void do_d101_ed_quad15_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_zone_changed **************************************************************** do_d101_ed_zone_changed */ #if XVT_CC_PROTO void do_d101_ed_zone_changed(WINDOW xdWindow); #else void do_d101_ed_zone_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_zone_focus_active **************************************************************** do_d101_ed_zone_focus_active */ #if XVT_CC_PROTO void do_d101_ed_zone_focus_active(WINDOW xdWindow); #else void do_d101_ed_zone_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lb_changed **************************************************************** do_d101_ed_lb_changed */ #if XVT_CC_PROTO void do_d101_ed_lb_changed(WINDOW xdWindow); #else void do_d101_ed_lb_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_lb_focus_active **************************************************************** do_d101_ed_lb_focus_active */ #if XVT_CC_PROTO void do_d101_ed_lb_focus_active(WINDOW xdWindow); #else void do_d101_ed_lb_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_sq_changed **************************************************************** do_d101_ed_sq_changed */ #if XVT_CC_PROTO void do_d101_ed_sq_changed(WINDOW xdWindow); #else void do_d101_ed_sq_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_sq_focus_active **************************************************************** do_d101_ed_sq_focus_active */ #if XVT_CC_PROTO void do_d101_ed_sq_focus_active(WINDOW xdWindow); #else void do_d101_ed_sq_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_easting_changed **************************************************************** do_d101_ed_easting_changed */ #if XVT_CC_PROTO void do_d101_ed_easting_changed(WINDOW xdWindow); #else void do_d101_ed_easting_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_easting_focus_active **************************************************************** do_d101_ed_easting_focus_active */ #if XVT_CC_PROTO void do_d101_ed_easting_focus_active(WINDOW xdWindow); #else void do_d101_ed_easting_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_northing_changed **************************************************************** do_d101_ed_northing_changed */ #if XVT_CC_PROTO void do_d101_ed_northing_changed(WINDOW xdWindow); #else void do_d101_ed_northing_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_northing_focus_active **************************************************************** do_d101_ed_northing_focus_active */ #if XVT_CC_PROTO void do_d101_ed_northing_focus_active(WINDOW xdWindow); #else void do_d101_ed_northing_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_x_changed **************************************************************** do_d101_ed_x_changed */ #if XVT_CC_PROTO void do_d101_ed_x_changed(WINDOW xdWindow); #else void do_d101_ed_x_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_x_focus_active **************************************************************** do_d101_ed_x_focus_active */ #if XVT_CC_PROTO void do_d101_ed_x_focus_active(WINDOW xdWindow); #else void do_d101_ed_x_focus_active(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_y_changed **************************************************************** do_d101_ed_y_changed */ #if XVT_CC_PROTO void do_d101_ed_y_changed(WINDOW xdWindow); #else void do_d101_ed_y_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_y_focus_active **************************************************************** do_d101_ed_y_focus_active */ #if XVT_CC_PROTO void do_d101_ed_y_focus_active(WINDOW xdWindow); #else void do_d101_ed_y_focus_active(); #endif /* Description: */ /*template*/ #if 0 /*************************************************************** @ do_d101_ed_zzz_changed **************************************************************** do_d101_ed_zzz_changed */ #if XVT_CC_PROTO void do_d101_ed_zzz_changed(WINDOW xdWindow); #else void do_d101_ed_zzz_changed(); #endif /* Description: */ /*************************************************************** @ do_d101_ed_zzz_focus_active **************************************************************** do_d101_ed_zzz_focus_active */ #if XVT_CC_PROTO void do_d101_ed_zzz_focus_active(WINDOW xdWindow); #else void do_d101_ed_zzz_focus_active(); #endif /* Description: */ #endif #endif /*H_PNTGUI_F*/ ogdi-ogdi_4_1_0/vpflib/include/print_f.h000066400000000000000000000004461345660466700203460ustar00rootroot00000000000000#ifndef H_PRINT_FUNC #define H_PRINT_FUNC #ifndef INCL_XVTH #include "xvt.h" #endif void #if XVT_CC_PROTO get_printer_size(PRINT_RCD *pr, int32 *height, int32 *width); #else get_printer_size(); #endif #if XVT_CC_PROTO BOOLEAN print_path( void ); #else BOOLEAN print_path(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/raster_d.h000066400000000000000000000121001345660466700204760ustar00rootroot00000000000000#ifndef H_RASTER_D #define H_RASTER_D #ifndef H_COLOR_D #include "color_d.h" #endif /* * Description: These are the number types that can be stored in RASTER's. */ /*************************************************************** @ DATA_MATRIX **************************************************************** A structure for matrix data */ typedef struct { int32 width; /* Num of columns */ int32 height; /* Num of rows */ int32 bits_per_pixel; /* Num bits for each matrix value */ int32 bytes_per_row; /* All rows must be word(16 bit) * alligned */ NUM_TYPE num_type; /* Numeric type and size */ DATA_TYPE data_type; /* Data or color type */ GHANDLE ghandle; /* Global handle defined by XVT */ } DATA_MATRIX; /* * Description: To allow portable big arrays, the global heap is used. See * the XVT User's Guide, Chap 15, Memory Allocation. If you are not using XVT * you may need to redefine GHANDLE to void *. */ /* * Description: */ /*************************************************************** @ ACCURACY **************************************************************** */ typedef struct { GFLOAT rel_hor; /* relative horizontal accuracy */ GFLOAT abs_hor; /* absolute horizontal accuracy */ GFLOAT rel_ver; /* relative data value accuracy */ GFLOAT abs_ver; /* absolute data value accuracy */ } ACCURACY; /* * Description: */ /*************************************************************** @ DATE **************************************************************** Date structure */ typedef struct { char year[3]; char month[3]; char day[3]; char hour[3]; char minute[3]; char second[3]; } DATE; /* * Description: */ /*************************************************************** @ DATA_HDR STRUCTURE **************************************************************** A header structure for all extracted data */ typedef struct { char source[30]; /* Source of the data */ GEOGRAPHIC h_units; /* Horizonal units of measurement */ VER_DISTANCE v_units; /* Vertical units of measurement */ GFLOAT x_res; /* X resoultion of the data in h_units */ GFLOAT y_res; /* Y Resolution of the data in h_units */ PROJECTION projection; /* Projection name of the data */ POINT_DD center; /* Center of the data in geographics */ EXTENT extent; /* Bounding geocoordinates of the data */ DATUM datum; /* Horizonal and vertical datum */ ACCURACY accuracy; /* Accuricy of the data */ DATE date; /* Date the data was created/extracted */ GFLOAT zoom; /* 0->1 for downsampling, >1 for * interpolation */ GFLOAT data_min; /* minimum data value */ GFLOAT data_max; /* maximum data value */ } DATA_HDR; /* * Description: */ /*************************************************************** @ RASTER **************************************************************** Contains a grid of image or other data */ typedef struct { int32 magic; DATA_HDR data_hdr; DATA_MATRIX data_matrix; LUT *lut; /* NULL unless data_type is DATA */ PALETTE *palette; /* NULL unless data_type is COLOR_INDIRECT */ } RASTER; /* * Description: The functions raster_construct() ans raster_destruct are used * to create and destroy these, as well as read and write them from files. */ /*************************************************************** @ RENDER_INFO **************************************************************** Info to render a DATA raster into a COLOR_INDIRECT raster */ typedef struct { GFLOAT shade_threshold; GFLOAT precision; int32 sunx; int32 suny; PALETTE_USAGE palette_usage; } RENDER_INFO; /* * Description: The shade_threshold is the data differencebetween the data * value and the one located at relative position sunx, suny within the data * raster that is needed to move the color a shade lighter or darker * (depending on sign). The precision can be increased to make the rendering * faster. If the the previous data value and delta are within precision of * the last data value and delta, the last color is used. */ /*************************************************************** @ MATRIX **************************************************************** A data matrix of any kind */ typedef struct { int32 width; /* of data matrix */ int32 height; /* of data matrix */ GHANDLE gh; short pHMEM data; /* Row major, bottom to top (short data) */ } MATRIX; /* * Description: A major component of the RASTER structure */ #endif /* H_RASTER_D */ ogdi-ogdi_4_1_0/vpflib/include/raster_f.h000066400000000000000000000155641345660466700205210ustar00rootroot00000000000000#ifndef H_RASTER_F #define H_RASTER_F /*************************************************************** @ decode_raster_hdr() **************************************************************** Convert raster_hdr structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_raster_hdr( unsigned char *buffer, RASTER * raster); #else ERRSTATUS MUSE_API decode_raster_hdr(); #endif /* * Description: The raster structure information in the character buffer * (binary portable Intel format) is placed into the raster structure in * local binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ encode_raster_hdr() **************************************************************** Convert raster_hdr structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_raster_hdr( unsigned char *buffer, RASTER * raster); #else ERRSTATUS MUSE_API encode_raster_hdr(); #endif /* * Description: The raster structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ is_raster_ok() **************************************************************** Check for a good raster magic number. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API is_raster_ok(FILE * file); #else ERRSTATUS MUSE_API is_raster_ok(); #endif /* * Description: Check to see if there a * good raster by checking the raster number. */ /*************************************************************** @ raster_construct() **************************************************************** Construct a RASTER object */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_construct( FILE * file, RASTER ** pointer); #else ERRSTATUS MUSE_API raster_construct(); #endif /* * Description: If the file argument is not NULL, the raster is read in from * the file, otherwise a default raster is created. */ /*************************************************************** @ raster_construct_data() **************************************************************** Allocates memory for the raster data */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_construct_data( RASTER * raster); #else ERRSTATUS MUSE_API raster_construct_data(); #endif /* * Description: Once the raster has been created (using raster-construct()) * and the width, height, and bits_per_pixel initialized, this function may * be called to allocate global heap space for the data. */ /*************************************************************** @ raster_copy() **************************************************************** Copy an object of type RASTER */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_copy( RASTER * in, RASTER * out); #else ERRSTATUS MUSE_API raster_copy(); #endif /* * Description: * */ /*************************************************************** @ raster_data_to_indirect() **************************************************************** Convert a raster containing non-image data into a color image */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_data_to_indirect( RASTER * in, RASTER * out, RENDER_INFO * render_info, LUT * default_lut, PALETTE * default_palette); #else ERRSTATUS MUSE_API raster_data_to_indirect(); #endif /* * Description: Pseudocoloring using a look-up-table is used to produce the * image raster. * */ /*************************************************************** @ raster_destruct() **************************************************************** Destroy the object of type RASTER */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_destruct( FILE * file, BOOLEAN destruct, RASTER ** pointer); #else ERRSTATUS MUSE_API raster_destruct(); #endif /* * Description: If the file argument is not NULL, the raster is written to * the file. If destruct is TRUE the object of type RASTER is removed from * memory. * */ /*************************************************************** @ raster_draw() **************************************************************** Draw the (drawable) raster to the map window */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_draw( RASTER * raster, WINDOW map_window); #else ERRSTATUS MUSE_API raster_draw(); #endif /* * Description: The raster must be in drawable form. To be drawable, a * raster must contain data of type COLOR_INDIRECT. Rraster_xform() is used * to convert the various data rasters to a drawable form. * */ /*************************************************************** @ raster_indirect_to_indirect() **************************************************************** Convert the indirect raster to a new palette */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_indirect_to_indirect( RASTER * in, RASTER * out, PALETTE * new_palette, RENDER_INFO * render_info); #else ERRSTATUS MUSE_API raster_indirect_to_indirect(); #endif /* * Description: * */ /*************************************************************** @ raster_indirect_to_rgb() **************************************************************** Convert the indirect raster containing an RGB raster */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_indirect_to_rgb( RASTER * in, RASTER * out); #else ERRSTATUS MUSE_API raster_indirect_to_rgb(); #endif /* * Description: * */ /*************************************************************** @ raster_rgb_to_indirect() **************************************************************** Convert the raster containing an RGB image to a color map image */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_rgb_to_indirect( RASTER * in, RASTER * out, PALETTE * default_palette, RENDER_INFO * render_info); #else ERRSTATUS MUSE_API raster_rgb_to_indirect(); #endif /* * Description: * */ /*************************************************************** @ raster_setup() **************************************************************** Setup the object of type RASTER */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_setup( BASEMAP * basemap, MGM * mgm); #else ERRSTATUS MUSE_API raster_setup(); #endif /* * Description: * */ /*************************************************************** @ raster_xform() **************************************************************** Convert a raster to a displayable image form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_xform ( RASTER * in, RASTER * out, RENDER_INFO * render_info, LUT * default_lut, PALETTE * default_palette ); #else ERRSTATUS MUSE_API raster_xform(); #endif /* * Description: Rasters containing non-image data are rendered. RGB images * rasters are converted to color map rasters. */ #endif /* H_RASTER_F */ ogdi-ogdi_4_1_0/vpflib/include/reduce2.h000066400000000000000000000012671345660466700202400ustar00rootroot00000000000000#ifndef THIN_DIG_H #define THIN_DIG_H typedef struct { double x; double y; } COORDS; /* Prototype Definitions */ #ifdef __STDC__ void Reduca (COORDS*, int32*, COORDS*, int32*, double*, int32*); void Reduc1 (COORDS*, int32*, COORDS*, int32*, double*, int32*); void Reduc2 (COORDS*, int32*, COORDS*, int32*, double*, int32*); void Xcheck (int32*, double*, double*, int32*, double*, double*, int32*, int32*, double*, double*, int32*, int32*); void Plnit (double*, double*, double*, double*, double*, double*, int32*, int32*); #else void Reduca (); void Reduc1 (); void Reduc2 (); void Xcheck (); void Plnit (); #endif #endif /* THIN_DIG_H */ ogdi-ogdi_4_1_0/vpflib/include/setup.h000066400000000000000000000010571345660466700200440ustar00rootroot00000000000000/* SETUP_H */ #ifndef SETUP_H #define SETUP_H #include "vpf.h" /* Output format types */ typedef enum {M_VEC=1, VPF, ASCII, DIG} format_type; typedef struct { char *db_path; char *db_name; char *lib_name; char *cov_name; char *fclass; char *expression; vpf_feature_type feature_type; format_type output_format; double x_min; double x_max; double y_min; double y_max; } SEL_THEME; #endif /* SETUP_H */ ogdi-ogdi_4_1_0/vpflib/include/sql_f.h000066400000000000000000000000531345660466700200030ustar00rootroot00000000000000#ifndef H_MUSE #include "muse.h" #endif ogdi-ogdi_4_1_0/vpflib/include/sqllib_d.h000066400000000000000000000032011345660466700204660ustar00rootroot00000000000000#ifndef H_SQLLIB_D #define H_SQLLIB_D #ifndef H_VEC_D #include "vec_d.h" #endif #ifndef ERRSTATUS #define ERRSTATUS short #endif #ifndef MUSE_API #define MUSE_API #endif #define MAX_QUERY_NAME_LEN 80 #define MAX_SQL_STMT_LEN 1000 #define MAX_NAME_LEN 32 #define MAX_LINE_LEN 1000 #define MAX_COLUMNS 100 #define MAX_VALUE_LEN 512 /*#define MAX_FIELDS 50 */ /*#define MAX_FIELD_LEN 512*/ #define RR_COUNT 18 /* number of points to approx a circle */ #define COMMA '\,' #define TAB '\ ' #define MUSE_SQL_TEXT_DELIM '\'' #define IMPORT_TEXT_DELIM '\"' #define NULL_CHAR '\0' typedef union { char char_val [MAX_VALUE_LEN]; short short_val; int int_val; int32 long_val; float float_val; double double_val; } SQL_VALUE; typedef struct { char name[MAX_NAME_LEN + 1]; int type; int length; SQL_VALUE value; } CELL; typedef struct { char name[MAX_NAME_LEN + 1]; short num_columns; CELL cell[MAX_COLUMNS]; } TUPLE; typedef struct { char name[MAX_QUERY_NAME_LEN]; char sql_stmt[MAX_SQL_STMT_LEN]; char host[MAX_NAME_LEN]; char server[MAX_NAME_LEN]; char database[MAX_NAME_LEN]; char username[MAX_NAME_LEN]; char password[MAX_NAME_LEN]; } SQL_QUERY; /*************************************************************** @ SQL_DATA **************************************************************** Defines a vector data structure */ typedef struct { int32 magic; BOOLEAN needs_setup; BOOLEAN needs_execute; BOOLEAN needs_redraw; BOOLEAN needs_refresh; SQL_QUERY sql_query; VEC *vec; } SQL_DATA; #endif ogdi-ogdi_4_1_0/vpflib/include/sqllib_f.h000066400000000000000000000147151345660466700205040ustar00rootroot00000000000000#ifndef H_SQLLIB_F #define H_SQLLIB_F #ifndef H_MUSE #include "muse.h" #endif #if XVT_CC_PROTO BOOLEAN MUSE_API is_update_stmt(char *sql_stmt); #else BOOLEAN MUSE_API is_update_stmt(); #endif #if XVT_CC_PROTO BOOLEAN MUSE_API is_select_stmt(char *sql_stmt); #else BOOLEAN MUSE_API is_select_stmt(); #endif #if XVT_CC_PROTO ERRSTATUS freshen_muse_tables ( int db ); #else ERRSTATUS freshen_muse_tables (); #endif #if XVT_CC_PROTO ERRSTATUS MUSE_API muse_str_trim(char *a, char *b); #else ERRSTATUS MUSE_API muse_str_trim(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_paste_into_table(SQL_DATA *sql_data, char *output_table); #else ERRSTATUS sqllib_paste_into_table(); #endif #if XVT_CC_PROTO int32 sqllib_tuple_find ( TUPLE *tuple, char *column_name); #else int32 sqllib_tuple_find (); #endif #if XVT_CC_PROTO ERRSTATUS MUSE_API sqllib_do_group_fuction(int db, char *group_function, char *column_name, int column_type, char *table_name, void *return_value); #else ERRSTATUS MUSE_API sqllib_do_group_fuction(); #endif #if XVT_CC_PROTO int32 MUSE_API muse_str_locate(char *a, char *b); #else int32 MUSE_API muse_str_locate(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_bind_select(int db, int cursor, TUPLE *tuple); #else ERRSTATUS sqllib_bind_select(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_describe_table(int db, char *table_name, TUPLE *tuple); #else ERRSTATUS sqllib_describe_table(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_describe_select(int db, int select_cursor, TUPLE *tuple); #else ERRSTATUS sqllib_describe_select(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_map_tuples(TUPLE *tuple_in, TUPLE *tuple_out, int32 tuple_map[]); #else ERRSTATUS sqllib_map_tuples(); #endif #if XVT_CC_PROTO ERRSTATUS sqllib_read_definitions ( FILE *fp, TUPLE *tuple, char *primary_key); #else ERRSTATUS sqllib_read_definitions (); #endif /* loads tuple structure from a definition file format: column_name column_type column_length initial value Column names beginning with * will become PRIMARY KEYS. Lines beginning with # are ignored. */ #if XVT_CC_PROTO ERRSTATUS sqllib_units_dms_to_dd(char *point, double *latdd, double *londd); ERRSTATUS dmsdd(double dms, double *dd); #else ERRSTATUS sqllib_units_dms_to_dd(); ERRSTATUS dmsdd(); #endif /*************************************************************** @ sql_data_construct() **************************************************************** function to costruct sql_data structure */ #if XVT_CC_PROTO ERRSTATUS sql_data_construct(FILE * file, SQL_DATA ** sql_data, BYTE_ORDER * bo); #else ERRSTATUS sql_data_costruct(); #endif /*************************************************************** @ sql_data_destruct() **************************************************************** function to destruct sql_data structure */ #if XVT_CC_PROTO ERRSTATUS sql_data_destruct(FILE * file, BOOLEAN destruct, SQL_DATA ** sql_data, BYTE_ORDER * bo); #else ERRSTATUS sql_data_destruct(); #endif /*************************************************************** @ decode_sql_data() **************************************************************** function to decode sql_data structure */ #if XVT_CC_PROTO ERRSTATUS decode_sql_data(unsigned char *record, SQL_DATA * sql_data); #else ERRSTATUS decode_sql_data(); #endif /*************************************************************** @ encode_sql_data() **************************************************************** function to encode sql_data structure */ #if XVT_CC_PROTO ERRSTATUS encode_sql_data(unsigned char *record, SQL_DATA * sql_data); #else ERRSTATUS encode_sql_data(); #endif /*************************************************************** @ sqllib_generate_vec() **************************************************************** Execute the SQL query drawing into a VEC */ #if XVT_CC_PROTO ERRSTATUS sqllib_generate_vec(SQL_DATA *sql_data); #else ERRSTATUS sqllib_generate_vec(); #endif /* Description: */ /*************************************************************** @ sqllib_close() **************************************************************** Close and disconnect from the MUSE SQL database */ #if XVT_CC_PROTO ERRSTATUS sqllib_close(SQL_QUERY *sql_query, int *db_handle); #else ERRSTATUS sqllib_close(); #endif /* Description: */ /*************************************************************** @ sqllib_import() **************************************************************** Import ASCII table into the MUSE SQL database */ #if XVT_CC_PROTO ERRSTATUS sqllib_import(int db_handle, char *filename); #else ERRSTATUS sqllib_import(); #endif /* Description: The table must be comma delimited ASCII with the first line coantaining field names. It must be in the default directory, */ /*************************************************************** @ sqllib_open() **************************************************************** Connect and login to the MUSE SQL database */ #if XVT_CC_PROTO ERRSTATUS sqllib_open(SQL_QUERY *sql_query, int *db_handle); #else ERRSTATUS sqllib_open(); #endif /* Description: */ /*************************************************************** @ sqllib_units_dms_to_dd() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS sqllib_units_dms_to_dd(char *point, double *latdd, double *londd); #else ERRSTATUS sqllib_units_dms_to_dd(); #endif /* Description: */ /*************************************************************** @ sqllib_test_connection() **************************************************************** */ #if XVT_CC_PROTO BOOLEAN sqllib_test_connection(SQL_QUERY *sql_query); #else BOOLEAN sqllib_test_connection(); #endif /* Description: Returns TRUE if the connection fails. Returns FALSE if the connection succeeds. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqllib_parse_CDA_column_names(char *line, TUPLE *tuple); ERRSTATUS MUSE_API sqllib_parse_CDA_column_types(char *line, TUPLE *tuple); ERRSTATUS MUSE_API sqllib_parse_CDA_values(char *line, TUPLE *tuple); ERRSTATUS MUSE_API sqllib_create_table(int db, TUPLE *tuple, char *primary_key); ERRSTATUS MUSE_API sqllib_insert_tuple(int db, TUPLE *tuple); ERRSTATUS MUSE_API sqllib_cell_value_set(char *value, CELL *cell); #else ERRSTATUS MUSE_API sqllib_parse_CDA_column_names(); ERRSTATUS MUSE_API sqllib_parse_CDA_column_types(); ERRSTATUS MUSE_API sqllib_parse_CDA_values(); ERRSTATUS MUSE_API sqllib_create_table(); ERRSTATUS MUSE_API sqllib_insert_tuple(); ERRSTATUS MUSE_API sqllib_cell_value_set(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/sunras_d.h000066400000000000000000000036731345660466700205300ustar00rootroot00000000000000#ifndef H_SUNR_DEF #define H_SUNR_DEF struct rasterfile { int32 ras_magic; /* magic number */ int32 ras_width; /* width (pixels) of image */ int32 ras_height; /* height (pixels) of image */ int32 ras_depth; /* depth (1, 8, or 24 bits) of pixel */ int32 ras_length; /* length (bytes) of image */ int32 ras_type; /* type of file; see RT_* below */ int32 ras_maptype;/* type of colormap; see RMT_* below */ int32 ras_maplength; /* length (bytes) of following map */ /* color map follows for ras_maplength bytes, followed by image */ }; #define RAS_MAGIC 0x59a66a95 /* Sun supported ras_type's */ #define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ #define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ #define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ #define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */ #define RT_FORMAT_TIFF 4 /* tiff <-> standard rasterfile */ #define RT_FORMAT_IFF 5 /* iff (TAAC format) <-> standard rasterfile */ #define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ /* Sun registered ras_maptype's */ #define RMT_RAW 2 /* Sun supported ras_maptype's */ #define RMT_NONE 0 /* ras_maplength is expected to be 0 */ #define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ /* * NOTES: Each line of the image is rounded out to a multiple of 16 bits. * This corresponds to the rounding convention used by the memory pixrect * package (/usr/include/pixrect/memvar.h) of the SunWindows system. The * ras_encoding field (always set to 0 by Sun's supported software) was * renamed to ras_length in release 2.0. As a result, rasterfiles of type 0 * generated by the old software claim to have 0 length; for compatibility, * code reading rasterfiles must be prepared to compute the true length from * the width, height, and depth fields. */ #endif /* !H_SUNR_DEF */ ogdi-ogdi_4_1_0/vpflib/include/sunras_f.h000066400000000000000000000015071345660466700205240ustar00rootroot00000000000000/* * @Contents SUNRFUNC.H includes definitions commonly used in MUSE * applications. */ #ifndef H_SUNR_FUNC /* * @#Defines Press the Next button to view. H_SUNR_FUNC H_SUNR_FUNC is * defined to indicate that the SUNRFUNC.H header has been included. */ #define H_SUNR_FUNC /* * @#Includes */ /* * JLL #ifndef H_MUSEDEF #include "musedef.h" #endif */ #ifndef H_MUSE1 #include "muse1.h" #endif /* * @Functions */ /* * @ raster_to_sunraster */ #if XVT_CC_PROTO ERRSTATUS MUSE_API raster_to_sunraster(RASTER * raster, FILE_SPEC file_spec); #else ERRSTATUS MUSE_API raster_to_sunraster(); #endif /* * @ lan_to_raster */ #if 0 #if XVT_CC_PROTO ERRSTATUS MUSE_API sunraster_to_raster(FILE_SPEC file_spec, RASTER * raster); #else ERRSTATUS MUSE_API sunraster_to_raster(); #endif #endif #endif /* end H_SUNR_FUNC */ ogdi-ogdi_4_1_0/vpflib/include/sunrast.h000066400000000000000000000002161345660466700203770ustar00rootroot00000000000000#ifndef H_SUNRAST #define H_SUNRAST #ifndef H_SUNR_DEF #include "sunrdef.h" #endif #ifndef H_SUNR_FUNC #include "sunrfunc.h" #endif #endif ogdi-ogdi_4_1_0/vpflib/include/sunrdef.h000066400000000000000000000036731345660466700203600ustar00rootroot00000000000000#ifndef H_SUNR_DEF #define H_SUNR_DEF struct rasterfile { int32 ras_magic; /* magic number */ int32 ras_width; /* width (pixels) of image */ int32 ras_height; /* height (pixels) of image */ int32 ras_depth; /* depth (1, 8, or 24 bits) of pixel */ int32 ras_length; /* length (bytes) of image */ int32 ras_type; /* type of file; see RT_* below */ int32 ras_maptype;/* type of colormap; see RMT_* below */ int32 ras_maplength; /* length (bytes) of following map */ /* color map follows for ras_maplength bytes, followed by image */ }; #define RAS_MAGIC 0x59a66a95 /* Sun supported ras_type's */ #define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ #define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ #define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ #define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */ #define RT_FORMAT_TIFF 4 /* tiff <-> standard rasterfile */ #define RT_FORMAT_IFF 5 /* iff (TAAC format) <-> standard rasterfile */ #define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ /* Sun registered ras_maptype's */ #define RMT_RAW 2 /* Sun supported ras_maptype's */ #define RMT_NONE 0 /* ras_maplength is expected to be 0 */ #define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ /* * NOTES: Each line of the image is rounded out to a multiple of 16 bits. * This corresponds to the rounding convention used by the memory pixrect * package (/usr/include/pixrect/memvar.h) of the SunWindows system. The * ras_encoding field (always set to 0 by Sun's supported software) was * renamed to ras_length in release 2.0. As a result, rasterfiles of type 0 * generated by the old software claim to have 0 length; for compatibility, * code reading rasterfiles must be prepared to compute the true length from * the width, height, and depth fields. */ #endif /* !H_SUNR_DEF */ ogdi-ogdi_4_1_0/vpflib/include/sunrfunc.h000066400000000000000000000013751345660466700205520ustar00rootroot00000000000000/* * @Contents SUNRFUNC.H includes definitions commonly used in MUSE * applications. */ #ifndef H_SUNR_FUNC /* * @#Defines Press the Next button to view. H_SUNR_FUNC H_SUNR_FUNC is * defined to indicate that the SUNRFUNC.H header has been included. */ #define H_SUNR_FUNC /* * @#Includes */ #ifndef H_MUSE #include "muse.h" #endif /* * @Functions */ /* * @ raster_to_sunraster */ #if XVT_CC_PROTO ERRSTATUS raster_to_sunraster(RASTER * raster, FILE_SPEC file_spec); #else ERRSTATUS raster_to_sunraster(); #endif /* * @ lan_to_raster */ #if 0 #if XVT_CC_PROTO ERRSTATUS sunraster_to_raster(FILE_SPEC file_spec, RASTER * raster); #else ERRSTATUS sunraster_to_raster(); #endif #endif #endif /* end H_SUNR_FUNC */ ogdi-ogdi_4_1_0/vpflib/include/system_d.h000066400000000000000000000336061345660466700205400ustar00rootroot00000000000000/* SYSTEM_D.H */ #ifndef H_SYSTEM_D #define H_SYSTEM_D #include #ifndef INCL_XVTH #include "xvt.h" /* to define the conditional compilation * constants */ #endif /* INCL_XVTH */ #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif /*************************************************************** @ DATA_TYPE **************************************************************** Type of data contained in a RASTER object */ typedef enum { COLOR_INDIRECT, /* color index numbers */ COLOR_RGB, /* rgb values */ DATA, /* non-color data values */ GRAY_SCALE /* gray scale values */ } DATA_TYPE; /* * Description: COLOR_INDIRECT rasters contain a matrix of color-map indices. * COLOR_RGB rasters contain an RGB true-color image. DATA rasters contain * data which must be rendered before being displayed. */ /*************************************************************** @ NUM_TYPE **************************************************************** Types of numbers */ typedef enum { ONEBIT, /* binary data (0 or 1) */ UINT_4BIT, /* unsigned 4 bit data (0 -> 15) */ SINT_8BIT, /* signed 8 bit data (-128 -> 127) */ UINT_8BIT, /* unsigned 8 bit data (0 -> 255) */ SINT_16BIT, /* signed 16 bit (-32768 -> 32767) */ UINT_16BIT, /* unsigned 16 bit ( 0 -> 64K) */ DTED_16BIT, /* Univac signed magnitude */ RGB_24BIT, /* RGB (0 -> 255) interleaved by pixel */ RGB_48BIT, /* RGB (0 -> 65535) interleaved by pixel */ SINT_32BIT, /* signed 32 bit */ UINT_32BIT, /* unsigned 32 bit */ IEEE_32BIT, /* same as float */ IEEE_64BIT /* same as double */ } NUM_TYPE; /****************************************************************/ /* THINK C for the Macintosh II running MAC OS */ /****************************************************************/ #if XVT_OS == XVT_OS_MAC /* Standard THINK C libraries */ #include #include #include #include #include #define DTED_EXT ".DT1;1" #define PAL_OFFSET 0 #endif /* if XVT_OS == XVT_OS_MAC */ /****************************************************************/ /* TURBO C for the IBM PC running MS-DOS */ /****************************************************************/ #if XVT_OS == XVT_OS_WIN /* Standard TURBO C header files */ #include #include #include #include #include #include #include #include /* Other useful macros */ #define TRUE 1 #define FALSE 0 #define DLongSwap(a,b) #define DTED_EXT ".DT1" #define PAL_OFFSET 0 #endif /* if XVT_OS == XVT_OS_WIN */ /****************************************************************/ /* Sun Workstation */ /****************************************************************/ #if XVT_OS_IS_SUNOS /* Standard SUN C headers */ #include #include #include /* Other useful SUN macros and typedefs */ #define TRUE 1 #define FALSE 0 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #define O_BINARY 0 /* typedef unsigned short size_t; */ #define DTED_EXT ".dt1" #define PAL_OFFSET 38 #endif /****************************************************************/ /* SGI Workstation */ /****************************************************************/ #if XVT_OS == XVT_OS_IRIX /* Standard IRIX C headers */ #include #include #include /* Other useful SGI macros and typedefs */ #define TRUE 1 #define FALSE 0 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #define O_BINARY 0 /* typedef unsigned short size_t; */ #define DTED_EXT ".dt1" #define PAL_OFFSET 38 #endif /****************************************************************/ /* HP Workstation */ /****************************************************************/ #if XVT_OS == XVT_OS_HPUX /* Standard HP headers */ #include #include #include /* Other useful HP macros and typedefs */ #define TRUE 1 #define FALSE 0 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #define O_BINARY 0 #define DTED_EXT ".dt1" #define PAL_OFFSET 38 #endif /****************************************************************/ /* SCO Workstation */ /****************************************************************/ #if XVT_OS == XVT_OS_SCOUNIX /* Standard SCO headers */ #include #include #include /* Other useful SCO macros and typedefs */ #define TRUE 1 #define FALSE 0 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #define O_BINARY 0 #define DTED_EXT ".dt1" #define PAL_OFFSET 38 typedef unsigned int size_t; #endif /****************************************************/ /* SPECIFY FILE TYPES */ /****************************************************/ #define FT_LUT "lut" #define FT_MAP "map" #define FT_PAL "pal" #define FT_RAS "ras" #define FT_RAS_ADRG "adr" #define FT_RAS_ADRI "adi" #define FT_RAS_CAC "cac" #define FT_RAS_CIB "cib" #define FT_RAS_CADRG "cad" #define FT_RAS_CRG "crg" #define FT_RAS_DATA "ima" #define FT_RAS_DBDB5 "dbd" #define FT_RAS_ASRP "asr" #define FT_RAS_USRP "usr" #define FT_RAS_SRG "srg" #define FT_DTC "dtc" #define FT_TXT "txt" #define FT_RAS_DTED "dte" #define FT_VEC "vec" #define FT_UNKNOWN "\0" /****************************************************/ /* PROCESSOR BYTE ORDER DEPENDENCIES */ /****************************************************/ #if (XVT_OS == XVT_OS_MAC) || (XVT_OS_IS_SUNOS) || (XVT_OS == XVT_OS_IRIX) /* Motorola, Sparc, or other BigEndian processors */ #define BigEndianToShortArray(byteCount,shortPtr) #define BigEndianToLongArray(byteCount,longPtr) #if XVT_CC_PROTO void LittleEndianToLongArray(int32 byteCount, int32 *longPtr); void LittleEndianToShortArray(int32 byteCount, short *shortPtr); void SignedMagnitudeToShortArray(int32 byteCount, short *shortPtr); #else void LittleEndianToLongArray(); void LittleEndianToShortArray(); void SignedMagnitudeToShortArray(); #endif #endif #if (XVT_OS == XVT_OS_WIN) || (XVT_OS == XVT_OS_SCOUNIX) || (XVT_OS == XVT_OS_HPUX) /* Intel, or LittleEndian processor */ #define LittleEndianToLongArray(s,d) #define LittleEndianToShortArray(s,d) #define BigEndianToShortArray(s, d) swab((char *)(d), (char *)(d), (int)(s)) #define TwosComplimentToShortArray(s,d) #if XVT_CC_PROTO void BigEndianToLongArray(int32 size, int32 *data); void SignedMagnitudeToShortArray(int32 size, short *data); #else void BigEndianToLongArray(); void SignedMagnitudeToShortArray(); #endif #endif #if XVT_OS_IS_SUNOS #include #endif #if XVT_OS == XVT_OS_MAC #define FILE_SEP ':' #elif XVT_OS == XVT_OS_WIN #define FILE_SEP '\\' #elif XVT_OS_ISUNIX || XVT_OS == XVT_OS_IRIX || XVT_OS == XVT_OS_HPUX #define FILE_SEP '/' #endif #ifndef MUSE_DEBUG #define muse_malloc(a, b) malloc(a) #define muse_free(a, b) free(a) #endif /*************************************************************** @ Sign **************************************************************** */ #define Sign(x) ( (x) < 0.0 ? -1 : 1 ) /* * Description: */ /*************************************************************** @ DivBy **************************************************************** A set of bit shifting divide macros */ #define DivBy2(i) ( (i) >> 1 ) #define DivBy4(i) ( (i) >> 2 ) #define DivBy8(i) ( (i) >> 3 ) /* * Description: * */ /*************************************************************** @ Flip **************************************************************** Byte fliping macros */ #define Flip(a) ( sizeof(a) == 4 ? Flip4(a) : Flip2(a) ) #define Flip2(a) ( ( ( (a) & 0x0000FF ) << 8 ) | \ ( ( (a) & 0x00FF00 ) >> 8 ) ) #define Flip4(a) ( ( ( (a) & 0x000000FF ) << 24 ) | \ ( ( (a) & 0x0000FF00 ) << 8 ) | \ ( ( (a) & 0x00FF0000 ) >> 8 ) | \ ( ( (a) & 0xFF000000 ) >> 24 ) ) /* * Description: These macros are used by the "Endian" functions that * rearrange the bytes to allow integer data written on Motorola style * computers to be read on Intel style computers, and vice versa. */ /*************************************************************** @ ERROR CODES **************************************************************** Error code values */ /* * Error Code Masks */ #define STAT_MASK_SEV 0xE000 #define STAT_MASK_GRP 0x1F00 #define STAT_MASK_COD 0x00FF /* * Severity Codes */ #define STAT_SEV_NO_ERR 0x0000 #define STAT_SEV_MESSAGE 0x2000 #define STAT_SEV_WARNING 0x4000 #define STAT_SEV_ERROR 0x6000 #define STAT_SEV_FATAL 0x8000 #define STAT_SEV_CRITICAL 0xA000 /* * Group Codes */ #define STAT_GRP_NO_ERR 0x0000 #define STAT_GRP_SYSTEM 0x0100 #define STAT_GRP_FILE 0x0200 #define STAT_GRP_MATH 0x0300 #define STAT_GRP_DATA 0x0400 #define STAT_GRP_PARAM 0x0500 /* * No Error Group Error Codes */ #define STAT_SUCCESS ( STAT_GRP_NO_ERR | \ STAT_SEV_NO_ERR | \ 0x0000 ) /* Error allocating memory */ /* * System Group Error Codes */ #define STAT_MEM_ALLOC_ERR ( STAT_GRP_SYSTEM | \ STAT_SEV_CRITICAL | \ 0x0001 ) /* Error allocating memory */ #define STAT_OS_ERROR ( STAT_GRP_SYSTEM | \ STAT_SEV_CRITICAL | \ 0x0002 ) /* An unknown operating system error */ #define STAT_SOFTWARE_BUG ( STAT_GRP_SYSTEM | \ STAT_SEV_CRITICAL | \ 0x0003 ) /* A possible bug in the software was found */ /* Abort condition */ #define STAT_ABORT ( STAT_GRP_SYSTEM | \ STAT_SEV_MESSAGE | \ 0x0004) /* * File Group Error Codes */ #define STAT_FILE_CREAT_ERR ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0001 ) /* Unable to create file */ #define STAT_FILE_CLOSE_ERR ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0002 ) /* Unable to close file */ #define STAT_FILE_NOT_FOUND ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0003 ) /* Could not open file */ #define STAT_FILE_READ_ERR ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0004 ) /* Error reading from file */ #define STAT_FILE_TYPE_ERR ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0005 ) /* The specified file is of the wrong type */ #define STAT_FILE_WRITE_ERR ( STAT_GRP_FILE | \ STAT_SEV_ERROR | \ 0x0006 ) /* Error writing to a file */ /* * Math Group Error Codes */ #define STAT_DIV_BY_ZERO ( STAT_GRP_MATH | \ STAT_SEV_ERROR | \ 0x0001 ) /* Attempt to divide by zero */ /* * Data Group Error Codes */ #define STAT_DATA_ERR ( STAT_GRP_DATA | \ STAT_SEV_FATAL | \ 0x0001 ) /* Data index or corrupt data error */ #define STAT_NO_DATA ( STAT_GRP_DATA | \ STAT_SEV_WARNING | \ 0x0002 ) /* No data for given location */ /* * Parameter Group Error Codes */ #define STAT_INV_PROJ ( STAT_GRP_PARAM | \ STAT_SEV_FATAL | \ 0x0001 ) /* Invalid projection */ #define STAT_BAD_PARM ( \ STAT_GRP_PARAM | \ STAT_SEV_ERROR | \ 0x0002 \ ) #define STAT_PARM_OVERFLOW ( \ STAT_GRP_PARAM | \ STAT_SEV_ERROR | \ 0x0003 \ ) #define STAT_BAD_CLR_NAME ( STAT_GRP_PARAM | \ STAT_SEV_FATAL | \ 0x0004 ) /* Unknown color name */ /* * Description: All MUSE functions return an error status code. The status * code STAT_SUCCESS is zero so a boolean test map be performed. The function * muse_error() can be called to handle the error code. */ /*************************************************************** @ FILE_CREATOR **************************************************************** Associates data exchange files with FUSION program */ #define FILE_CREATOR "MUSE" /* * Description: The data extractor programs should call the XVT function * set_file_type() to set the extracted file's creator to this value. */ /*************************************************************** @ GetErr **************************************************************** */ #define GerErrCode(status) (status & STAT_MASK_COD) #define GetErrGroup(status) (status & STAT_MASK_GRP) #define GetErrSeverity(status) (status & STAT_MASK_SEV) /* * Description: */ /*************************************************************** @ BITS_PER_BYTE **************************************************************** All supported systems have an 8 bit byte. */ #define BITS_PER_BYTE 8L /* * Description: * */ /*************************************************************** @ pHMEM_NULL **************************************************************** */ #define pHMEM_NULL ((pvHMEM) 0L) typedef void pHMEM pvHMEM; /* * Description: */ #endif /* H_SYSTEM_D */ ogdi-ogdi_4_1_0/vpflib/include/system_f.h000066400000000000000000000311721345660466700205360ustar00rootroot00000000000000/* SYSTEM_F.H */ #ifndef H_SYSTEM_F #define H_SYSTEM_F #include /* * JLL #if XVT_OS_IS_SUNOS #include #endif */ #ifndef H_MUSE1 #include "muse1.h" #endif #if XVT_CC_PROTO ERRSTATUS MUSE_API muse_error(ERRSTATUS status); #else ERRSTATUS MUSE_API muse_error(); #endif #if XVT_CC_PROTO void lowercase(char *); void eol(char *, char *); #else void lowercase(); void eol(); #endif /*************************************************************** @ big_fread() **************************************************************** Reads in an arbitrarily large chunk of data */ #if XVT_CC_PROTO ERRSTATUS MUSE_API big_fread( FILE * file, GHANDLE handle, uint32 length_in_bytes, NUM_TYPE num_type, DATA_TYPE data_type); #else ERRSTATUS MUSE_API big_fread(); #endif /* * Description: Big_fread allows reading of blocks of data larger than 64K * bytes on all systems, including DOS. */ /*************************************************************** @ big_fwrite() **************************************************************** Writes an arbitrarily large chunk of data */ #if XVT_CC_PROTO ERRSTATUS MUSE_API big_fwrite( FILE * file, GHANDLE handle, uint32 length_in_bytes, NUM_TYPE num_type, DATA_TYPE data_type); #else ERRSTATUS MUSE_API big_fwrite(); #endif /* * Description: Big_fwrite allows writing of blocks of data larger than 64K * bytes on all systems, including DOS. */ /*************************************************************** @ char_to_double() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API char_to_double(unsigned char *record, double *d, short big_endian, int32 *c); #else ERRSTATUS MUSE_API char_to_double(); #endif /*************************************************************** @ char_to_long() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API char_to_long(unsigned char *record, int32 *l, short big_endian, int32 *c); #else ERRSTATUS MUSE_API char_to_long(); #endif /*************************************************************** @ char_to_short() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API char_to_short(unsigned char *record, short *s, short big_endian, int32 *c); #else ERRSTATUS MUSE_API char_to_short(); #endif /*************************************************************** @ char_to_ushort() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API char_to_ushort(unsigned char *record, USHORT * s, short big_endian, int32 *c); #else ERRSTATUS MUSE_API char_to_ushort(); #endif /*************************************************************** @ context_sensitive_help() **************************************************************** Invokes the MUSE context sensitive help */ #if XVT_CC_PROTO void context_sensitive_help( FILE_SPEC * help_file_spec, char *help_topic); #else void context_sensitive_help(); #endif /* * Description: This extension of the XVT help facility (provided by XVT as * \xvt\source\vhelp.c) is to be called when the user pushes the HELP button * in a dialog. The first argument is the XVT FILE_SPEC of the help file. * The second argument is the specific help topic that relates to dialog that * contains the help button. The help_topic given as the second argument * must contain no leading or trailing spaces. */ /*************************************************************** @ convert_double() **************************************************************** Converts among double machine formats */ #if XVT_CC_PROTO void convert_double( unsigned char *the_double, int32 type); #else void convert_double(); #endif /* * Description: This function converts the_double number between different * local double number formats. * * The type argument determines the type of conversion performed. The following * are supported * * TYPE CONVERSION * * 1 = IEEE to VAX 2 = VAX to IEEE 3 = IEEE to SUN 4 = SUN to IEEE 5 = SUN to * VAX 6 = VAX to SUN 7 = IEEE to MAC 8 = MAC to IEEE * */ /*************************************************************** @dir_create() **************************************************************** Create a new directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_create(char *); #else ERRSTATUS MUSE_API dir_create(); #endif /* * Description: */ /*************************************************************** @dir_pop() **************************************************************** Move to the parent directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_pop(char *); #else ERRSTATUS MUSE_API dir_pop(); #endif /* * Description: Call this function to change to a parent directory. If * chg_def_flag is TRUE then operating system calls will be made. In any * case the last argument path will be set to a non-portable string * representation of the path. */ /*************************************************************** @dir_push() **************************************************************** Move to the subdirectory directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_push(char *, char *); #else ERRSTATUS MUSE_API dir_push(); #endif /* * Description: */ /*************************************************************** @dir_restore() **************************************************************** Restores the saved directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_restore(char *); #else ERRSTATUS MUSE_API dir_restore(); #endif /* * Description: * /*************************************************************** @dir_save() *************************************************************** * * Save the current directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_save(char *); #else ERRSTATUS MUSE_API dir_save(); #endif /* * Description: * /*************************************************************** * @dir_current() *************************************************************** * * Get the current directory */ #if XVT_CC_PROTO ERRSTATUS MUSE_API dir_current(char *); #else ERRSTATUS MUSE_API dir_current(); #endif /*************************************************************** @ double_to_char() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API double_to_char( unsigned char *record, double *l, short big_endian, int32 *c); #else ERRSTATUS MUSE_API double_to_char(); #endif /*************************************************************** @ file_spec_to_string() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API file_spec_to_string ( FILE_SPEC * file_spec, char *string ); #else ERRSTATUS MUSE_API file_spec_to_string(); #endif /* * Description: * */ /*************************************************************** @ get_ini_string() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API get_ini_string( FILE * ini_file, char *section_name, char *item_name, char *default_value, char *value, size_t len); #else ERRSTATUS MUSE_API get_ini_string(); #endif /* * Description: Opens the file MUSE.INI in the staartup directory. Retuns a * file pointer on success or NULL on failure. */ /*************************************************************** @ ini_open() **************************************************************** */ #if XVT_CC_PROTO FILE *ini_open(char *); #else FILE *ini_open(); #endif /* * Description: Opens the file MUSE.INI in the staartup directory. Retuns a * file pointer on success or NULL on failure. */ /*************************************************************** @ muse_open_file_dlg() **************************************************************** Get a file spec for opening. */ #if XVT_CC_PROTO FL_STATUS MUSE_API muse_open_file_dlg( FILE_SPEC *temp_file_spec, char *message); #else FL_STATUS MUSE_API muse_open_file_dlg(); #endif /* * Description: Modifies XVT's open_file_dlg on the Macintosh * to filter based on the three letters following a period in * file name. It makes the Mac see files more like * Motif and Win. */ /*************************************************************** @ long_to_char() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API long_to_char(unsigned char *record, int32 *l, short big_endian, int32 *c); #else ERRSTATUS MUSE_API long_to_char(); #endif /*************************************************************** @ short_to_char() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API short_to_char(unsigned char *record, short *s, short big_endian, int32 *c); #else ERRSTATUS MUSE_API short_to_char(); #endif /*************************************************************** @ start_ini_section() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API start_ini_section( char *ini_file_name, char *section_name); #else ERRSTATUS MUSE_API start_ini_section(); #endif /* * Description: */ /*************************************************************** @ string_to_file_spec() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API string_to_file_spec(FILE_SPEC * file_spec, char *string); #else ERRSTATUS MUSE_API string_to_file_spec(); #endif /* * Description: */ /*************************************************************** @ ushort_to_char() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API ushort_to_char(unsigned char *record, USHORT * l, short big_endian, int32 *c); #else ERRSTATUS MUSE_API ushort_to_char(); #endif /**************************************************************************/ /* FILE_OPEN */ /**************************************************************************/ #if XVT_CC_PROTO FILE *file_open(char *, char *); #else FILE *file_open(); #endif /**************************************************************************/ /* MUSE_ACCESS */ /**************************************************************************/ #if XVT_CC_PROTO int muse_access(char *, int); #else int muse_access(); #endif /**************************************************************************/ /* MUSE_FILELENGTH */ /**************************************************************************/ #if XVT_CC_PROTO int32 muse_filelength(char *); #else int32 muse_filelength(); #endif #if MUSE_DEBUG #if XVT_CC_PROTO void *muse_malloc(size_t size, char *string); #else void *muse_malloc(); #endif #endif #if MUSE_DEBUG #if XVT_CC_PROTO void muse_free(void *block, char *string); #else void muse_free(); #endif #endif #if XVT_CC_PROTO void *Talloc(size_t size, int32 *index, char *str); #else void *Talloc(); #endif #if XVT_CC_PROTO void Tfree(unsigned char *block, int32 *index, char *str); #else void Tfree(); #endif #if XVT_CC_PROTO void muse_log(char *string); #else void muse_log(); #endif /*************************************************************** @ EndTalloc() **************************************************************** */ #if XVT_CC_PROTO void EndTalloc(void); #else void EndTalloc(); #endif void #if XVT_CC_PROTO context_sensitive_help(FILE_SPEC * help_file_spec, char *topic); #else context_sensitive_help(); FILE_SPEC *help_file_spec; char *topic; #endif /*************************************************************** @ pacify() **************************************************************** Inform user of program status */ #if XVT_CC_PROTO BOOLEAN MUSE_API pacify( char *message, short percent_complete); #else BOOLEAN MUSE_API pacify(); #endif /* * Description: The message and percent_complete are displayed in the status * window. The status window has a cancel button Pacify returns TRUE if the * user has pressed this cancel button. In this case you should terminate the * operation and call pacify with a "Ready" message and a NULL * percent_complete. */ #endif /* H_SYSTEM_F */ ogdi-ogdi_4_1_0/vpflib/include/tifffunc.h000066400000000000000000000014321345660466700205050ustar00rootroot00000000000000/* @Contents TIFFFUNC.H includes definitions commonly used in MUSE applications. */ #ifndef H_TIFFFUNC /* @#Includes */ #include #include #ifndef H_MUSE #include "muse.h" #endif #ifndef _TIFFIO_ #include "tiffio.h" #endif /* @#Defines Press the Next button to view. H_TIFFFUNC H_TIFFFUNC is defined to indicate that the TIFFFUNC.H header has been included. */ #define H_TIFFFUNC /* @Enumerated Data Types Press the Next button to view. @ */ /* @Simple Types Push the Next button to view. @ */ /* @Complex Data Types Press the Next button to view. */ /* @Functions Press the Next button to view. @ raster_to_tiff */ #if XVT_CC_PROTO ERRSTATUS raster_to_tiff(RASTER *raster, FILE_SPEC file_spec); #else ERRSTATUS raster_to_tiff(); #endif #endif /* end h_TIFFFUNC */ ogdi-ogdi_4_1_0/vpflib/include/ts_d.h000066400000000000000000000120351345660466700176330ustar00rootroot00000000000000/****************************************************************************** *++ * MAP DATA FORMATTING FACILITY * ****************************************************************************** * * TITLE: m4_const.h * * DESCRIPTION: Constants defining the Model 4 Tesselated Spheriod projection. * * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * * * Any modification made to this module MUST be made to M4_CONSTANTS.INC also. * * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * * * SYNTAX: * * ARGUMENTS: * * REQUIRED SUBROUTINES: * * HISTORY: * Written: P.B.Wischow (NOARL) November 1990, Written to provide * Model 4 TS projection constants in "C". * * Modified: S.A.Myrick (NRL), 22 January 1992. Added TS zone segment * boundaries and integer constants (for each TS zone) * *== ****************************************************************************** */ #ifndef H_TS_D #define H_TS_D 1 /* Number of zones in the Model 4 TS projection system */ #define NUM_ZONES 5 /* Zone constants in Model 4 TS projection system */ /* * static int SP_ZONE = 0; static int ST_ZONE = 1; static int EQ_ZONE = 2; * static int NT_ZONE = 3; static int NP_ZONE = 4; */ /* Number of tesselations in any latitude */ static int nbr_tess_lat = 195; /* Number of columns per zone at 1:2M scale, half hemisphere */ static int nbr_tess[5] = { 190, 152, 190, 152, 190}; /* Number of columns per zone at 1:2M scale, for the entire globe */ /* static int nbr_tess2[5] = {380,304,380,304,380}; */ /* Latitude boundary between model 4 temperate and equator zone */ /* static double zborder_tempequ = 31.38461538; */ /* Latitude boundary between model 4 polar and temperate zone */ /* static double zborder_polartemp = 51.69230769; */ /****** NOTE ******************************************************************/ /* If point falls on a boundary, then the point is in the next northern zone. */ /****** NOTE ******************************************************************/ static double bot_zone_lat_tbl[5] = /* Bottom zone latitude table */ { -90.0, -51.69230769, -31.38461538, 31.38461538, 51.69230769}; /***** The following are used as descriptive indeces for ZONE_SEG_BOUND ***** #define ZONE_TOP 1 /* Top of zone boundry */ #define ZONE_BOT 2 /* Bottom of zone boundry */ /***** The following are the Max/Min rows for each scale and *****/ /***** non-polar zone. Because the polar zone row/column *****/ /***** boundaries are by definition undefined, they are *****/ /***** zeroed here. These bounds EXCLUDE the two segment *****/ /***** overlap. *****/ /* Note that array dimensions are: scale, zone, top/bottom rows. */ /* Due to language differences, this C program uses array dimensions */ /* that differ from the FORTRAN version of this file! Currently, */ /* there are six scales and five zones. */ /* * static int zone_seg_bound [6][5][2] = { 0, 0, * Top, Bottom, SP * Scale = TLM * -1361, -2240, * ST * * 1359, -1360, * EQ * 2239, 1360, * * NT * 0, 0, * NP * 0, * 0, * Top, Bottom, SP Scale = 100k * -681, -1120, * * ST * 679, -680, * EQ * * 1119, 680, * NT * 0, 0, * * NP * 0, 0, * Top, Bottom SP Scale = JOG * * -273, -448, * ST * 271, -272, * * EQ * 447, 272, * NT * 0, * 0, * NP * 0, 0, * Top, Bottom SP * Scale = TPC * -137, -224, * ST * * 135, -136, * EQ * 223, 136, * * NT * 0, 0, * NP * 0, * 0, * Top, Bottom SP Scale = ONC * -69, -112, * ST * * 67, -68, * EQ * 111, 68, * * NT * 0, 0, * NP * 0, * 0, * Top, Bottom SP Scale = JNC * -35, -56, * * ST * 33, -34, * EQ * 55, * 34, * NT * 0, 0 * NP * * }; */ #define TABLE_OFFSET 9 /* Model 4 TS zones */ /* static char *zone_table[5]={"SP","ST","EQ","NT","NP"}; */ /* Number of tesselations in each Model 4 zone */ /* where, MSCALE_Number * scale = 2 million */ static int mscale[TABLE_OFFSET] = { 40, 20, 8, 4, 2, 1, 0, 200, 25}; /* * static char *scale_table[TABLE_OFFSET]={ "50K ","100K","250K","500K","1M * ","2M ", "5M ","10K ","80K" }; static char *chart_series[TABLE_OFFSET]={ * "TLM","XXX","JOG","TPC","ONC","JNC","GNC","CG ","H2 " }; static char * *scale_codes[18]={ "TL","XX","JA","TP","ON","JN","GN","CG","H2", * "XX","XX","JC","XX","XX","XX","XX","XX","XX" }; */ #endif /* H_TS_D */ ogdi-ogdi_4_1_0/vpflib/include/ts_f.h000066400000000000000000000017511345660466700176400ustar00rootroot00000000000000#ifndef H_TS_F #define H_TS_F #ifndef H_MUSE1 #include "muse1.h" #endif #if XVT_CC_PROTO short find_zone(char[]); void rc_calc(double *, double *, short *, short *, double *, double *); void latlon_calc(short *, short *, double *, double *, double *, double *); void eq2pol(double *, double *, double *, double *, short *); void pol2eq(double *, double *, double *, double *); short calczone(double, int); ERRSTATUS cac_zone_compute(double latitude, int32 *zone); void ts(double *p, double *l, int32 dir, short ts_scale, short ts_zone, double *y, double *x, int32 *ierr); ERRSTATUS ts_config(MGM * mgm); #else /* CAC reading function prototypes */ short find_zone(); void rc_calc(); void latlon_calc(); void eq2pol(); void pol2eq(); short calczone(); ERRSTATUS cac_zone_compute(); void ts(); ERRSTATUS ts_config(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/unit_d.h000066400000000000000000000057601345660466700201730ustar00rootroot00000000000000#ifndef H_UNIT_DEF #define H_UNIT_DEF #ifndef H_COORD_DEF #include "coord_d.h" #endif /*************************************************************** @ UNIT_LIST **************************************************************** List of available units of measure. */ typedef struct { char label[30]; short count; short setting; char list[20][30]; /*Change: 20 strings instead of 10 */ char help_topic[49]; } UNIT_LIST; /* * Description: */ /*************************************************************** @ UNITS_LIST **************************************************************** The list of lists of available units */ typedef struct { char label[30]; short count; short setting; char list[7][15]; UNIT_LIST units[8]; } UNITS_LIST; /* * Description: */ /*************************************************************** @ AREA **************************************************************** Area is stored internally in SQ_METERS */ typedef enum { SQ_METERS, SQ_FEET, SQ_KM, SQ_NM, SQ_SM } UAREA; /* * Description: * */ /*************************************************************** @ VOLUME **************************************************************** Volume is stored internally in CU_METERS */ typedef enum { CU_METERS, CU_FT, CU_KM, CU_NM, CU_SM } VOLUME; /*************************************************************** @ HOR_DISTANCE **************************************************************** Horizontal distance is stored internally in meters. */ typedef enum { HOR_METERS, HOR_FEET, HOR_KILOMETERS, HOR_LEAGUES, HOR_NAUTICAL_MILES, HOR_STATUTE_MILES, HOR_SEC_OF_ARC, HOR_YARDS } HOR_DISTANCE; /* * Description: * */ /*************************************************************** @ SCALE **************************************************************** Scale is stored internally as SCALE_RECIPROCAL. */ typedef enum { SCALE_RECIPROCAL, SCALE_IN_PER_DEG } SCALE; /* * Description: */ /*************************************************************** @ VER_DISTANCE **************************************************************** Vertical distance is stored internally in meters. */ typedef enum { VER_METERS, VER_FATHOMS, VER_FEET } VER_DISTANCE; /* * Description: */ /*************************************************************** @ UNITS **************************************************************** Structure to contain the users units selections */ typedef struct { int32 magic; SCALE scale; HOR_DISTANCE hor_distance; VER_DISTANCE ver_distance; UAREA area; VOLUME volume; GEOGRAPHIC geographic; } UNITS; #endif /* H_UNIT_DEF */ ogdi-ogdi_4_1_0/vpflib/include/unit_f.h000066400000000000000000001044631345660466700201750ustar00rootroot00000000000000 #ifndef H_UNIT_FUNC #define H_UNIT_FUNC #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_CC1_F #include "cc1_f.h" #endif #include "math.h" /**************************************************************** @ aemtgp() ***************************************************************** Azimuthal Equidistant to Geodetic */ #if XVT_CC_PROTO void aemtgp(double a, double recf, double ophi, double olam, double fn, double fe, double *sphi, double *slam, double y, double x); #else void aemtgp(); #endif /**************************************************************** @ aeorig() ***************************************************************** Validate system origin parameters for Azimuthal Equidistant to/from Geodetic */ #if XVT_CC_PROTO ERRSTATUS aeorig( int32 itype, COORD_TYPE *coord_type ); #else ERRSTATUS aeorig(); #endif /**************************************************************** @ convergence_and_scale_factor() ***************************************************************** Calls the appropriate function to calculate convergence and scale factor for the current coordinate system */ ERRSTATUS #if XVT_CC_PROTO convergence_and_scale_factor(POINT_UNITS *user_pt, POINT_DD *radian_pt, COORD_SYS *coord_sys, COORD_DMS *convergence, double *scale_factor); #else convergence_and_scale_factor( ); #endif /**************************************************************** @ deg_to_degmin() ***************************************************************** Convert decimal degrees to degrees and minutes */ #if XVT_CC_PROTO void deg_to_degmin( double dd, short *deg, double *mn); #else void deg_to_degmin(); #endif /**************************************************************** @ deg_to_degminsec() ***************************************************************** Convert decimal degrees to degrees, minutes, and seconds */ #if XVT_CC_PROTO void deg_to_degminsec( double dd, short *deg, short *mn, double *sec); #else void deg_to_degminsec(); #endif /* Description: */ /*************************************************************** @ geo_conv_from() **************************************************************** Geo. conversion functions from user units to internal units */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_conv_from(short tag, POINT_DD * dd, POINT_UNITS * user_unit); #else ERRSTATUS MUSE_API geo_conv_from(); #endif /* * Description: * */ /*************************************************************** @ geo_conv_to() **************************************************************** Geo. conversion functions from internal units to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO geo_conv_to(short tag, POINT_DD * dd, POINT_UNITS * user_unit); #else geo_conv_to(); #endif /* * Description: * */ /**************************************************************** @ gptaem() ***************************************************************** Geodetic to Azimuthal Equidistant */ #if XVT_CC_PROTO void gptaem( double a, double recf, double ophi, double olam, double fn, double fe, double sphi, double slam, double *y, double *x); #else void gptaem(); #endif /* Description: */ /**************************************************************** @ gpgref() ***************************************************************** Geodetic to GEOREF */ #if XVT_CC_PROTO void gpgref(char *georef, /*int P1,*/ double *sphi, double *slam, int32 ndec); #else void gpgref(); #endif /* Description: */ /*************************************************************** @ ftnblkd() **************************************************************** Initialize block data */ #if XVT_CC_PROTO void ftnblkd(void); #else void ftnblkd(); #endif /* Description: */ /**************************************************************** @ gptlam() ***************************************************************** GP to LAMBERT */ #if XVT_CC_PROTO void gptlam(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double sphi, double slam, double *y, double *x); #else void gptlam(); #endif /**************************************************************** @ gptmer() ***************************************************************** GP to MERCATOR */ #if XVT_CC_PROTO ERRSTATUS gptmer(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double sphi, double slam, double *y, double *x); #else ERRSTATUS gptmer(); #endif /* Description: */ /**************************************************************** @ gptmgr() ***************************************************************** GP to MGRS and UTM grids */ #if XVT_CC_PROTO void gptmgr( double *a, double *recf, double *sphi, double *slam, int32 *izone, double *y, double *x, char *mgrs, int P1, char *azone, int P2, /*int32 *isph,*/char *isph, int32 *igrpin); #else void gptmgr(); #endif /* Description: */ /**************************************************************** @ gptobm() ***************************************************************** GP to Oblique Mercator Projection */ #if XVT_CC_PROTO ERRSTATUS gptobm(int32 *isolut, int32 kodor, double sphi, double slam, double *u, double *v, double *y, double *x, double e, double es, double fn, double fe, double ogam, double olam, double oaz, double ta, double tb, double te); #else ERRSTATUS gptobm(); #endif /**************************************************************** @ gptoyx() ***************************************************************** GP to TRANSVERSE MERCATOR map projection */ #if XVT_CC_PROTO void gptoyx(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double sphi, double slam, double *y, double *x); #else void gptoyx(); #endif /* Description: */ /*************************************************************** @ gptups() **************************************************************** GP to UPS map projection */ #if XVT_CC_PROTO void gptups( double a, double recf, double sphi, double slam, double *y, double *x); #else void gptups(); #endif /* Description: */ /****************************************************************** @ gptutm() ******************************************************************* GP to UTM grid */ #if XVT_CC_PROTO void gptutm( double a, double recf, double sphi, double slam, int32 *izone, double *y, double *x, int32 ifixz); #else void gptutm(); #endif /* Description: */ /**************************************************************** @ gpgref() ***************************************************************** GEOREF to GP */ #if XVT_CC_PROTO void grefgp(char *georef, /*int P1,*/ double *sphi, double *slam, int32 *ierr); #else void grefgp(); #endif /* Description: */ /**************************************************************** @ iset_from_zone_str() ***************************************************************** GEOREF to GP */ #if XVT_CC_PROTO short iset_from_zone_str(char *string); #else short iset_from_zone_str(); #endif /* Description: */ /******************************************************************* @ lamorg() ******************************************************************** VALIDATION OF INPUT ORIGIN PARAMETERS AND CONVERSION TO RADIANS, AND DERIVATION OF OTHER ORIGIN PARAMETERS FOR LAMBERT TO GP AND GP TO LAMBERT */ #if XVT_CC_PROTO ERRSTATUS lamorg(double a, double recf, COORD_TYPE *coord_type); #else ERRSTATUS lamorg(); #endif /****************************************************************** @ lamtgp() ******************************************************************* LAMBERT to GP */ #if XVT_CC_PROTO ERRSTATUS lamtgp(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double *sphi, double *slam, double y, double x); #else ERRSTATUS lamtgp(); #endif /******************************************************************* @ merorg() ******************************************************************** VALIDATION OF ORIGIN PARAMETERS, CONVERSION OF ORIGIN TO RADIANS, AND SCALE FACTOR CALCULATION FOR MERCATOR TO GP AND GP TO MERCATOR */ #if XVT_CC_PROTO ERRSTATUS merorg(double a, double recf, COORD_TYPE *coord_type ); #else ERRSTATUS merorg(); #endif /******************************************************************* @ mertgp() ******************************************************************** Mercator to GP */ #if XVT_CC_PROTO void mertgp(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double *sphi, double *slam, double y, double x); #else void mertgp(); #endif /******************************************************************* @ milref() ******************************************************************** GP to MGRS */ #if XVT_CC_PROTO void milref( int32 *iarea, double *a, double *recf, double *sphi, double slam, int32 *izone, double y, double x, char *mgrs, int P2, char *azone, int P1, /*int32 *isph,*/ char *isph, int32 *igrpin); #else void milref(); #endif /* Description: */ /******************************************************************** @ nzmggp() ********************************************************************* Convert New Zealand Map Grid coordinates to GP radians */ #if XVT_CC_PROTO void nzmggp(double a, double ophi, double olam, double fn, double fe, double *sphi, double *slam, double y, double x); #else void nzmggp(); #endif /******************************************************************** @ obmorg() ********************************************************************* VALIDATION OF USER-ENTERED ORIGIN PARAMETERS, CONVERSION TO RADIANS, AND DERIVATION OF ADDITIONAL ORIGIN PARAMETERS FOR OBLIQUE MERCATOR TO GP AND GP TO OBLIQUE MERCATOR */ #if XVT_CC_PROTO ERRSTATUS obmorg( double a, double recf, COORD_TYPE *coord_type, int32 itype ); #else ERRSTATUS obmorg(); #endif /******************************************************************** @ obmtgp() ********************************************************************* Convert from Oblique Mercator to GP */ #if XVT_CC_PROTO void obmtgp(int32 method, int32 kodor, double *sphi, double *slam, double *u, double *v, double *y, double *x, double es, double fn, double fe, double ogam, double olam, double oaz, double ta, double tb, double te); #else void obmtgp(); #endif /******************************************************************** @ savmgr() ********************************************************************* Save MGRS */ #if XVT_CC_PROTO void savmgr( char *mgrs, int P1, int32 nchar, double xltr, double yltr, int32 ltrnum[], double spsou, double spnor, double sleast, double slwest, double ylow, double yslow, int32 iarea, int32 izone, int32 ltrlow, int32 ltrhi, int32 ltrhy, double fnltr, double feltr, char *azone, int P2); #else void savmgr(); #endif /* Description: */ /*************************************************************** @ scale_conv_from() **************************************************************** Scale conversion functions from user units to internal units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO scale_conv_from(short user_unit_index, double *recip, double user_unit); #else scale_conv_from(); #endif /* * Description: This is the declaration of an array of pointers to functions. * The user unit is represented by set of enumerated constants for this unit. * This constant is used as the index into the array of pointers to * functions, so as to call the particular conversion function. * * Ex: GFLOAT scale_in_per_deg, scale_reciprocal; status = * (*scale_conf_from[SCALE_IN_PER_DEG]) (scale_in_per_deg, * &scale_reciprocal); */ /*************************************************************** @ scale_conv_to() **************************************************************** Scale conversion functions from internal units to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO scale_conv_to(short user_unit_index, double recip, double *user_unit); #else scale_conv_to(); #endif /* * Description: * */ /*************************************************************** @ scale_to_user_str **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API scale_to_user_str ( UNITS * units, GFLOAT scale_reciprocal, char *output ); #else ERRSTATUS MUSE_API scale_to_user_str(); #endif /* * Description: * */ /******************************************************************* @ tmorig() ******************************************************************** VALIDATION OF ORIGIN PARAMETERS FOR TRANSVERSE MERCATOR TO GP AND GP TO TRANSVERSE MERCATOR AND CONVERSION OF ORIGIN TO RADIANS */ #if XVT_CC_PROTO ERRSTATUS tmorig( COORD_TYPE *coord_type ); #else ERRSTATUS tmorig(); #endif /*************************************************************** @ units_construct() **************************************************************** Construct the units object */ #if XVT_CC_PROTO ERRSTATUS MUSE_API units_construct( FILE * file, UNITS ** pointer); #else ERRSTATUS MUSE_API units_construct(); #endif /* * Description: The units object contains a list of the user selected map * units. */ /*************************************************************** @ units_destruct() **************************************************************** Destroy the object of type UNITS */ #if XVT_CC_PROTO ERRSTATUS MUSE_API units_destruct( FILE * file, BOOLEAN destruct, UNITS ** pointer); #else ERRSTATUS MUSE_API units_destruct(); #endif /* * Description: * */ /*************************************************************** @ ver_conv_from() **************************************************************** Converts from user vertical distance units to internal (meters) */ ERRSTATUS MUSE_API #if XVT_CC_PROTO ver_conv_from(short user_unit_index, double *mtr_1, double mtr_2 ); #else ver_conv_from(); #endif /* * Description: * */ /*************************************************************** @ ver_conv_to() **************************************************************** Converts from internal vertical distance to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO ver_conv_to(short user_unit_index, double mtr_1, double *mtr_2); #else ver_conv_to(); #endif /* * Description: * */ /*************************************************************** @ yxtogp() **************************************************************** Transverse Mercator map projection to GP */ #if XVT_CC_PROTO void yxtogp(double a, double recf, double ophi, double olam, double fn, double fe, double ok, double *sphi, double *slam, double y, double x); #else void yxtogp(); #endif /* Description: */ /*************************************************************** @ unflow() **************************************************************** Check for underflow */ #if XVT_CC_PROTO void unflow( double *value, int32 kode); #else void unflow(); #endif /* Description: */ /******************************************************************** @ upnset() ********************************************************************* Set MGRS info for northern polar zone */ #if XVT_CC_PROTO void upnset( int32 n, int32 *ltrlow, int32 *ltrhi, double *feltr, double *fnltr, int32 *ltrhy); #else void upnset(); #endif /* Description: */ /******************************************************************** @ upsset() ********************************************************************* Set MGRS info for southern polar zone */ #if XVT_CC_PROTO void upsset( int32 n, int32 *ltrlow, int32 *ltrhi, double *feltr, double *fnltr, int32 *ltrhy); #else void upsset(); #endif /* Description: */ /*************************************************************** @ upstgp() **************************************************************** UPS map projection to geog posn */ #if XVT_CC_PROTO void upstgp( double a, double recf, double *sphi, double *slam, double *y, double x); #else void upstgp(); #endif /* Description: */ /******************************************************************** @ utmlim() ********************************************************************* UTM lim */ #if XVT_CC_PROTO void utmlim( int32 *n, double sphi, int32 izone, double *spsou, double *spnor, double *sleast, double *slwest); #else void utmlim(); #endif /* Description: */ /********************************************************************* @ utmset ********************************************************************** UTM set */ #if XVT_CC_PROTO void utmset( int32 izone, int32 *ltrlow, int32 *ltrhi, double *fnltr, char *isph, int32 igrpin); #else void utmset(); #endif /* Description: */ /******************************************************************** @ mgrtgp ********************************************************************* MGRS to GP */ #if XVT_CC_PROTO void mgrtgp( char *mgrs, int P1, char *azone, int P2, /*int32 *isph,*/ char *isph, int32 *igrpin, double *a, double *recf, double *sphi, double *slam, int32 *izone, double *y, double *x, int32 *ierr); #else void mgrtgp(); #endif /* Description: */ /******************************************************************** @ radian ********************************************************************* Radian */ #if XVT_CC_PROTO void radian(double *rad, double rd, double rm, double rs); #else void radian(); #endif /* Description: */ /******************************************************************** @ radian_and_dd ********************************************************************* Radian */ #if XVT_CC_PROTO void radian_and_dd(double *rad, double *rd, double rm, double rs); #else void radian_and_dd(); #endif /* Description: */ /******************************************************************** @ shiftr ********************************************************************* Shiftr */ #if XVT_CC_PROTO void shiftr( char *mgrs, int P1, int32 n, int32 *nchar); #else void shiftr(); #endif /* Description: */ /******************************************************************** @ dmsh ********************************************************************* Radians to degrees, minutes, seconds (????) */ #if XVT_CC_PROTO void dmsh( int32 khem, double radian, int32 *id, int32 *im, double *rs, char *ah, int P1); #else void dmsh(); #endif /* Description: */ /********************************************************************* @ utmtgp ********************************************************************** Universal Transverse Mercator to GP */ #if XVT_CC_PROTO void utmtgp( double a, double recf, double *sphi, double *slam, int32 izone, double *y, double x); #else void utmtgp(); #endif /* Description: */ /********************************************************************** @ yxtmgr *********************************************************************** UTM to MGRS and UTM */ #if XVT_CC_PROTO void yxtmgr( double *a, double *recf, double *sphi, double *slam, int32 *izone, double *y, double *x, char *mgrs, int P1, char *azone, int P2, /*int32 *isph,*/char *isph, int32 *igrpin, int32 *ierr); #else void yxtmgr(); #endif /* Description: */ #if XVT_CC_PROTO ERRSTATUS horiz_conv_from_user_units ( short tag , double *hor_1 , double hor_2, double scale_recip, double screen_PPI ); #else ERRSTATUS horiz_conv_from_user_units ( ); #endif #if XVT_CC_PROTO ERRSTATUS horiz_conv_to_user_units ( short tag , double hor_1 , double *hor_2, double scale_recip, double screen_PPI ); #else ERRSTATUS horiz_conv_to_user_units ( ); #endif /* Prototypes for functions related to Promula.Fortran library */ typedef struct { double cr; double ci; } DCOMPLEX; /********************************************************************* @ dpxadd ********************************************************************** Returns the double complex sum of two double complex arguments */ #if XVT_CC_PROTO DCOMPLEX dpxadd( DCOMPLEX a, DCOMPLEX b); #else DCOMPLEX dpxadd(); #endif /********************************************************************* @ dpxdbl ********************************************************************** Converts a double precision number to a double complex whose real part is the double precsion argument, and whose imaginary part is zero. */ #if XVT_CC_PROTO DCOMPLEX dpxdbl( double dbl ); #else DCOMPLEX dpxdbl(); #endif /********************************************************************* @ dpxdiv ********************************************************************** Returns the double complex quotient of two double complex arguments. Based on Cdiv() in Numerical Recipes in C by Press, et alii. */ #if XVT_CC_PROTO DCOMPLEX dpxdiv( DCOMPLEX a, DCOMPLEX b); #else DCOMPLEX dpxdiv(); #endif /********************************************************************* @ dpxdpx ********************************************************************** Converts the two double arguments to a double complex number, which is returned */ #if XVT_CC_PROTO DCOMPLEX dpxdpx( double d1, double d2); #else DCOMPLEX dpxdpx( ); #endif /********************************************************************* @ dpxima ********************************************************************** Returns the imaginary part of the double complex argument */ #if XVT_CC_PROTO double dpxima( DCOMPLEX a ); #else double dpxima( ); #endif /********************************************************************* @ dpxlongpow ********************************************************************** Raises the double complex argument to the long argument power and returns the double complex result */ /***DO: Switch to formula using polar coordinates if this isn't accurate enough */ #if XVT_CC_PROTO DCOMPLEX dpxlongpow( DCOMPLEX a, int32 b); #else DCOMPLEX dpxlongpow(); #endif /********************************************************************* @ dpxmul ********************************************************************** Returns the double complex product of two double complex arguments. */ #if XVT_CC_PROTO DCOMPLEX dpxmul( DCOMPLEX a, DCOMPLEX b); #else DCOMPLEX dpxmul(); #endif /********************************************************************* @ dpxreal ********************************************************************** Returns the real part of the double complex argument */ #if XVT_CC_PROTO double dpxreal( DCOMPLEX a ); #else double dpxreal( ); #endif /********************************************************************* @ fifdint ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO double fifdint( double a); #else double fifdint(); #endif /* Description: */ /******************************************************************** @ fifdnint ********************************************************************* Source code from the Promula.Fortran library */ #if XVT_CC_PROTO double fifdnint( double a); #else double fifdnint(); #endif /* Description: */ /********************************************************************** @ fifdsign *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO double fifdsign( double mag, double sgn ); #else double fifdsign( ); #endif /********************************************************************** @ fifichar *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int fifichar( unsigned char* c1); #else int fifichar(); #endif /* Description: */ /******************************************************************** @ fifidint ********************************************************************* Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifidint( double a); #else int32 fifidint(); #endif /* Description: */ /********************************************************************* @ fifmod ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifmod( int32 num, int32 dem); #else int32 fifmod(); #endif /* Description: */ /********************************************************************* @ fifnint ********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int32 fifnint( double a); #else int32 fifnint(); #endif /* Description: */ /********************************************************************** @ ftncms *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO int ftncms( char* s1, int n1, char* s2, int n2); #else int ftncms(); #endif /* Description: */ /********************************************************************** @ ftnsac *********************************************************************** Source code from the Promula.Fortran library */ #if XVT_CC_PROTO void ftnsac( char* s1, int n1, char* s2, int n2); #else void ftnsac(); #endif /* Description: */ /********************************************************************** @ dd_to_dm_formatted *********************************************************************** */ void #if XVT_CC_PROTO dd_to_dm_formatted( double dd, short *deg, double *mn); #else dd_to_dm_formatted( ); #endif /********************************************************************** @ dd_to_dms_formatted *********************************************************************** */ void #if XVT_CC_PROTO dd_to_dms_formatted( double dd, short *deg, short *mn, double *sec); #else dd_to_dms_formatted( ); #endif /********************************************************************** @ hor_m_from_m *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_from_m(double *hor_mtr1, double hor_mtr2); #else hor_m_from_m( ); #endif ERRSTATUS #if XVT_CC_PROTO hor_m_from_ft(double *hor_meter, double hor_feet); #else hor_m_from_ft( ); #endif /********************************************************************** @ hor_m_from_yd *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_from_yd(double *hor_meter, double hor_yard); #else hor_m_from_yd( ); #endif /********************************************************************** @ hor_m_from_in_at_map_scale *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_from_in_at_map_scale(double *hor_meter, double hor_in, double scale_recip); #else hor_m_from_in_at_map_scale( ); #endif /********************************************************************** @ hor_m_from_mm_at_map_scale *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_from_mm_at_map_scale(double *hor_meter, double hor_mm, double scale_recip); #else hor_m_from_mm_at_map_scale( ); #endif /********************************************************************** @ hor_m_from_pixels *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_from_pixels ( double *hor_meter , double hor_pix, double scale_recip, double screen_PPI ); #else hor_m_from_pixels ( ); #endif /********************************************************************** @ hor_m_to_m *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_m(double hor_mtr1, double *hor_mtr2); #else hor_m_to_m( ); #endif /********************************************************************** @ hor_m_to_ft *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_ft(double hor_meter, double *hor_feet); #else hor_m_to_ft( ); #endif /********************************************************************** @ hor_m_to_yd *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_yd(double hor_meter, double *hor_yard); #else hor_m_to_yd( ); #endif /********************************************************************** @ hor_m_to_in_at_map_scale *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_in_at_map_scale ( double hor_meter, double *hor_in, double scale_recip ); #else hor_m_to_in_at_map_scale( ); #endif /********************************************************************** @ hor_m_to_mm_at_map_scale *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_mm_at_map_scale( double hor_meter, double *hor_mm, double scale_recip ); #else hor_m_to_mm_at_map_scale( ); #endif /********************************************************************** @ hor_m_to_pixels *********************************************************************** */ ERRSTATUS #if XVT_CC_PROTO hor_m_to_pixels ( double hor_meter , double *hor_pix, double scale_recip, double screen_PPI ); #else hor_m_to_pixels ( ); #endif /********************************************************************** @ madlgp *********************************************************************** */ #if XVT_CC_PROTO ERRSTATUS madlgp(double a,double recf,double *sphi,double *slam,double y,double x, double *ygs,double *xgs,double ophi,double ophis,double olam, double fn,double fe,double ok,double al,double Const,double r, double ca, double cb, double cc, double cd); #else ERRSTATUS madlgp( ); #endif /********************************************************************** @ madlor *********************************************************************** */ #if XVT_CC_PROTO ERRSTATUS madlor(COORD_TYPE *coord_type, double a,double recf,double *parism, double *ophi, double *ophis, double *olam, /*double *fn,double *fe,double *ok, */ double *al,double *Const, double *r,double *ca, double *cb, double *cc, double *cd); #else ERRSTATUS madlor( ); #endif /********************************************************************** @ convert_user_str_to_pt *********************************************************************** */ #if XVT_CC_PROTO ERRSTATUS convert_user_str_to_pt(COORD_SYS *coord_in, POINT_UNITS *upoint, char *pntstr); #else ERRSTATUS convert_user_str_to_pt( ); #endif /********************************************************************** @ gplam() *********************************************************************** */ void #if XVT_CC_PROTO gpclam(double a, double recf, double ophi, double olam, double ok, double sphi, double slam, double *conv, double *sk); #else gpclam(); #endif /********************************************************************** @ gpcmer() *********************************************************************** */ void #if XVT_CC_PROTO gpcmer(double a, double recf, double ok, double sphi, double *conv, double *sk); #else gpcmer(); #endif /********************************************************************** @ gpcnzm() *********************************************************************** */ void #if XVT_CC_PROTO gpcnzm(double a, double recf, double ophi, double olam, double sphi, double slam, double *conv, double *sk); #else gpcnzm(); #endif /********************************************************************** @ gpcobm() *********************************************************************** */ void #if XVT_CC_PROTO gpcobm(double a, int32 kodor, double sphi, double slam, double u, double *conv, double *sk, double olam, double e, double es, double ogam, double oaz, double ta, double tb, double te); #else gpcobm(); #endif /********************************************************************** @ gpconv_tm() *********************************************************************** */ void #if XVT_CC_PROTO gpconv_tm(double a, double recf, double olam, double ok, double sphi, double slam, double *conv, double *sk); #else gpconv_tm(); #endif /********************************************************************** @ gpconv_ups() *********************************************************************** */ void #if XVT_CC_PROTO gpconv_ups(double a, double recf, double sphi, double slam, double *conv, double *sk); #else gpconv_ups(); #endif /********************************************************************** @ gpconv_utm() *********************************************************************** */ void #if XVT_CC_PROTO gpconv_utm( double a, double recf, double sphi, double slam, int32 izone, double *conv, double *sk); #else gpconv_utm(); #endif /********************************************************************** @ gpmadl *********************************************************************** */ #if XVT_CC_PROTO ERRSTATUS gpmadl(double a,double recf,double sphi,double slam, double *y,double *x,double *ygs,double *xgs, double ophis,double olam,double fn,double fe,double ok,double al, double Const,double r,double ca,double cb); #else ERRSTATUS gpmadl( ); #endif /********************************************************************** @ gpnzmg *********************************************************************** */ #if XVT_CC_PROTO void gpnzmg(double a, double ophi, double olam, double fn, double fe, double sphi, double slam, double *y, double *x); #else void gpnzmg( ); #endif /********************************************************************** @ nzmgor *********************************************************************** */ void #if XVT_CC_PROTO nzmgor( COORD_TYPE *coord_type ); #else nzmgor( ); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/units_d.h000066400000000000000000000040241345660466700203460ustar00rootroot00000000000000#ifndef H_UNITS_D #define H_UNITS_D #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_DTCC_D #include "dtcc_d.h" #endif /*************************************************************** @ UNIT_LIST **************************************************************** List of available units of measure. */ typedef struct { char label[30]; short count; short setting; char list[20][30]; /* Change: 20 strings instead of 10 */ char help_topic[49]; } UNIT_LIST; /* * Description: */ /*************************************************************** @ UNITS_LIST **************************************************************** The list of lists of available units */ typedef struct { char label[30]; short count; short setting; char list[7][15]; UNIT_LIST units[8]; } UNITS_LIST; /* * Description: */ /*************************************************************** @ AREA **************************************************************** Area is stored internally in SQ_METERS */ typedef enum { SQ_METERS, SQ_FEET, SQ_KM, SQ_NM, SQ_SM } UAREA; /* * Description: * */ /*************************************************************** @ VOLUME **************************************************************** Volume is stored internally in CU_METERS */ typedef enum { CU_METERS, CU_FT, CU_KM, CU_NM, CU_SM } VOLUME; /* * Description: */ /*************************************************************** @ UNITS **************************************************************** Structure to contain the users units selections */ typedef struct { int32 magic; SCALE scale; HOR_DISTANCE hor_distance; VER_DISTANCE ver_distance; UAREA area; VOLUME volume; GEOGRAPHIC geographic; } UNITS; #endif /* H_UNITS_D */ ogdi-ogdi_4_1_0/vpflib/include/units_f.h000066400000000000000000000443571345660466700203650ustar00rootroot00000000000000#ifndef H_UNITS_F #define H_UNITS_F #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_UNITS_D #include "units_d.h" #endif #if 0 /* JLL */ ************ @area_conv_from[5] () **************************************************************** Area conversion functions from user units to internal units * / #if XVT_CC_PROTO #if XVT_CC == XVT_CC_THINK extern ERRSTATUS MUSE_API(*area_conv_from[5]) (...); #else extern ERRSTATUS MUSE_API(*area_conv_from[5]) (); #endif #else extern ERRSTATUS MUSE_API(*area_conv_from[5]) (); #endif /* * Description: This is the declaration of an array of pointers to functions. * The user unit is represented by a set of enumerated constants for this * unit. This constant is used as the index into the array of pointers to * functions, so as to call the particular conversion function. * * Ex: GFLOAT area_in_sq_feet, area_in_sq_meters; status = * (*area_conv_from[SQ_FEET]) (area_in_sq_feet, &area_in_sq_meters); */ /*************************************************************** @ (*area_conv_to[5])() **************************************************************** Area conversion functions from internal units to user units */ #if XVT_CC_PROTO #if XVT_CC == XVT_CC_THINK extern ERRSTATUS MUSE_API(*area_conv_to[5]) (...); #else extern ERRSTATUS MUSE_API(*area_conv_to[5]) (); #endif #else extern ERRSTATUS MUSE_API(*area_conv_to[5]) (); #endif /* * Description: This is the declaration of an array of pointers to functions. * The user unit is represented by a set of enumerated constants for this * unit. This constant is used as the index into the array of pointers to * functions, so as to call the particular conversion function. * * Ex: GFLOAT area_in_sq_feet, area_in_sq_meters; status = * (*area_conv_to[SQ_FEET]) (area_in_sq_meters, &area_in_sq_feet); * */ /*************************************************************** @ (*volume_conv_from[5])() **************************************************************** Volume conversion functions from user units to internal units */ #if XVT_CC_PROTO #if XVT_CC == XVT_CC_THINK extern ERRSTATUS MUSE_API(*volume_conv_from[5]) (...); #else extern ERRSTATUS MUSE_API(*volume_conv_from[5]) (); #endif #else extern ERRSTATUS MUSE_API(*volume_conv_from[5]) (); #endif /* * Description: * */ /*************************************************************** @ (*volume_conv_to[5])() **************************************************************** Volume conversion functions from internal units to user units */ #if XVT_CC_PROTO #if XVT_CC == XVT_CC_THINK extern ERRSTATUS MUSE_API(*volume_conv_to[5]) (...); #else extern ERRSTATUS MUSE_API(*volume_conv_to[5]) (); #endif #else extern ERRSTATUS MUSE_API(*volume_conv_to[5]) (); #endif /* * Description: * */ #endif /*************************************************************** @ ver_conv_from() **************************************************************** Converts from user vertical distance units to internal (meters) */ ERRSTATUS MUSE_API #if XVT_CC_PROTO ver_conv_from(short user_unit_index, double *mtr_1, double mtr_2); #else ver_conv_from(); #endif /* * Description: * */ /*************************************************************** @ ver_conv_to() **************************************************************** Converts from internal vertical distance to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO ver_conv_to(short user_unit_index, double mtr_1, double *mtr_2); #else ver_conv_to(); #endif /* * Description: * */ /*************************************************************** @ hor_conv_from() **************************************************************** Horizonal conversion functions from user units to internal units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO hor_conv_from(short user_unit_index, double *hor_1, double hor_2); #else hor_conv_from(); #endif /* * Description: * */ /*************************************************************** @ hor_conv_to() **************************************************************** Horizonal conversion functions from internal units to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO hor_conv_to(short user_unit_index, double hor_1, double *hor_2); #else hor_conv_to(); #endif /* * Description: * */ /*************************************************************** @ scale_conv_from() **************************************************************** Scale conversion functions from user units to internal units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO scale_conv_from(short user_unit_index, double *recip, double user_unit); #else scale_conv_from(); #endif /* * Description: This is the declaration of an array of pointers to functions. * The user unit is represented by set of enumerated constants for this unit. * This constant is used as the index into the array of pointers to * functions, so as to call the particular conversion function. * * Ex: GFLOAT scale_in_per_deg, scale_reciprocal; status = * (*scale_conf_from[SCALE_IN_PER_DEG]) (scale_in_per_deg, * &scale_reciprocal); */ /*************************************************************** @ scale_conv_to() **************************************************************** Scale conversion functions from internal units to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO scale_conv_to(short user_unit_index, double recip, double *user_unit); #else scale_conv_to(); #endif /* * Description: * */ /*************************************************************** @ cubm_from_cubf() **************************************************************** Cubic meters from cubic feet */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_from_cubf( double *meter, double feet); #else ERRSTATUS MUSE_API cubm_from_cubf(); #endif /* * Description: * */ /*************************************************************** @ cubm_from_cubkm() **************************************************************** Cubic meters from cubic kilometers */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_from_cubkm( double *meter, double kmeter); #else ERRSTATUS MUSE_API cubm_from_cubkm(); #endif /* * Description: * */ /*************************************************************** @ cubm_from_cubm() **************************************************************** Cubic meters from cubic meters */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_from_cubm( double *meter1, double meter2); #else ERRSTATUS MUSE_API cubm_from_cubm(); #endif /* * Description: * */ /*************************************************************** @ cubm_from_cubnm() **************************************************************** Cubic meters from cubic nautical miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_from_cubnm( double *meter, double nmile); #else ERRSTATUS MUSE_API cubm_from_cubnm(); #endif /* * Description: * */ /*************************************************************** @ cubm_from_cubsm() **************************************************************** Cubic meters from cubic statute miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_from_cubsm( double *meter, double stmile); #else ERRSTATUS MUSE_API cubm_from_cubsm(); #endif /* * Description: * */ /*************************************************************** @ cubm_to_cubf() **************************************************************** Cubic meters to cubic feet */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_to_cubf( double meter, double *feet); #else ERRSTATUS MUSE_API cubm_to_cubf(); #endif /* * Description: * */ /*************************************************************** @ cubm_to_cubkm() **************************************************************** Cubic meters to cubic kilometers */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_to_cubkm( double meter, double *kmeter); #else ERRSTATUS MUSE_API cubm_to_cubkm(); #endif /* * Description: * */ /*************************************************************** @ cubm_to_cubm() **************************************************************** Cubic meters to cubic meters */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_to_cubm( double meter1, double *meter2); #else ERRSTATUS MUSE_API cubm_to_cubm(); #endif /* * Description: * */ /*************************************************************** @ cubm_to_cubnm() **************************************************************** Cubic meters to cubic nautical miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_to_cubnm( double meter, double *nmile); #else ERRSTATUS MUSE_API cubm_to_cubnm(); #endif /* * Description: * */ /*************************************************************** @ cubm_to_cubsm() **************************************************************** Cubic meters to cubic statute miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API cubm_to_cubsm( double meter, double *stmile); #else ERRSTATUS MUSE_API cubm_to_cubsm(); #endif /* * Description: * */ /*************************************************************** @ decode_units() **************************************************************** Convert units structure to local binary */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_units( unsigned char *buffer, UNITS * units); #else ERRSTATUS MUSE_API decode_units(); #endif /* * Description: The units structure information in the character buffer * (binary portable Intel format) is placed into the units structure in local * binary. Used by the constructor functions while loading in a map * document. */ /*************************************************************** @ encode_units() **************************************************************** Convert units structure external form */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_units( unsigned char *buffer, UNITS * units); #else ERRSTATUS MUSE_API encode_units(); #endif /* * Description: The units structure is converted to the external binary * portable (Intel) format. Used by the destructor functions while preparing * to store a map document. */ /*************************************************************** @ geo_conv_from() **************************************************************** Geo. conversion functions from user units to internal units */ #if XVT_CC_PROTO ERRSTATUS MUSE_API geo_conv_from(short tag, POINT_DD * dd, POINT_UNITS * user_unit); #else ERRSTATUS MUSE_API geo_conv_from(); #endif /* * Description: * */ /*************************************************************** @ geo_conv_to() **************************************************************** Geo. conversion functions from internal units to user units */ ERRSTATUS MUSE_API #if XVT_CC_PROTO geo_conv_to(short tag, POINT_DD * dd, POINT_UNITS * user_unit); #else geo_conv_to(); #endif /* * Description: * */ /*************************************************************** @ ftnblkd() **************************************************************** Initialize block data */ #if XVT_CC_PROTO void ftnblkd(void); #else void ftnblkd(); #endif /* * Description: * */ /**************************************************************** @ gptmgr() ***************************************************************** GP to MGRS and UTM grids */ #if XVT_CC_PROTO void gptmgr( double *a, double *recf, double *sphi, double *slam, int32 *izone, double *y, double *x, char *mgrs, int P1, char *azone, int P2, int32 *isph, int32 *igrpin); #else void gptmgr(); #endif /* * Description: * */ /****************************************************************** @ gptutm() ******************************************************************* GP to UTM grid */ #if XVT_CC_PROTO void gptutm( double a, double recf, double sphi, double slam, int32 *izone, double *y, double *x, int32 ifixz); #else void gptutm(); #endif /* * Description: * */ /******************************************************************* @ milref() ******************************************************************** GP to MGRS */ #if XVT_CC_PROTO void milref( int32 *iarea, double *a, double *recf, double *sphi, double slam, int32 *izone, double y, double x, char *mgrs, int P2, char *azone, int P1, int32 *isph, int32 *igrpin); #else void milref(); #endif /* * Description: * */ /*************************************************************** @ pdmstodd() **************************************************************** */ #if XVT_CC_PROTO void pdmstodd ( float pdms, float *dd ); #else void pdmstodd(); #endif /* * Description: */ /******************************************************************** @ savmgr() ********************************************************************* Save MGRS */ #if XVT_CC_PROTO void savmgr( char *mgrs, int P1, int32 nchar, double xltr, double yltr, int32 ltrnum[], double spsou, double spnor, double sleast, double slwest, double ylow, double yslow, int32 iarea, int32 izone, int32 ltrlow, int32 ltrhi, int32 ltrhy, double fnltr, double feltr, char *azone, int P2); #else void savmgr(); #endif /* * Description: * */ /*************************************************************** @ scale_to_user_str **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API scale_to_user_str ( UNITS * units, GFLOAT scale_reciprocal, char *output ); #else ERRSTATUS MUSE_API scale_to_user_str(); #endif /* * Description: * */ /*************************************************************** @ sqm_from_sqf() **************************************************************** Square meters from square feet */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_from_sqf( GFLOAT * sqm, GFLOAT sqf); #else ERRSTATUS MUSE_API sqm_from_sqf(); #endif /* * Description: * */ /*************************************************************** @ sqm_from_sqkm() **************************************************************** Square meters from square kilometers */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_from_sqkm( GFLOAT * sqm, GFLOAT sqkm); #else ERRSTATUS MUSE_API sqm_from_sqkm(); #endif /* * Description: * */ /*************************************************************** @ sqm_from_sqm() **************************************************************** Square meters from square meters */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_from_sqm( GFLOAT * sqm1, GFLOAT sqm2); #else ERRSTATUS MUSE_API sqm_from_sqm(); #endif /* * Description: * */ /*************************************************************** @ sqm_from_sqnm() **************************************************************** Square meters from square nautical miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_from_sqnm( GFLOAT * sqm, GFLOAT sqnm); #else ERRSTATUS MUSE_API sqm_from_sqnm(); #endif /* * Description: * */ /*************************************************************** @ sqm_from_sqsm() **************************************************************** Square meters from square statue miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_from_sqsm( GFLOAT * sqm, GFLOAT sqnm); #else ERRSTATUS MUSE_API sqm_from_sqsm(); #endif /* * Description: * */ /*************************************************************** @ sqm_to_sqf() **************************************************************** Square meters to square feet */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_to_sqf( GFLOAT sqm, GFLOAT * sqf); #else ERRSTATUS MUSE_API sqm_to_sqf(); #endif /* * Description: * */ /*************************************************************** @ sqm_to_sqkm() **************************************************************** Square meters to square kilometers */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_to_sqkm( GFLOAT sqm, GFLOAT * sqkm); #else ERRSTATUS MUSE_API sqm_to_sqkm(); #endif /* * Description: * */ /*************************************************************** @ sqm_to_sqm() **************************************************************** Square meters to square meters */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_to_sqm( GFLOAT sqm1, GFLOAT * sqm2); #else ERRSTATUS MUSE_API sqm_to_sqm(); #endif /* * Description: * */ /*************************************************************** @ sqm_to_sqnm() **************************************************************** Square meters to square nautical miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_to_sqnm( GFLOAT sqm, GFLOAT * sqnm); #else ERRSTATUS MUSE_API sqm_to_sqnm(); #endif /* * Description: * */ /*************************************************************** @ sqm_to_sqsm() **************************************************************** Square meters to square statute miles */ #if XVT_CC_PROTO ERRSTATUS MUSE_API sqm_to_sqsm( GFLOAT sqm, GFLOAT * sqsm); #else ERRSTATUS MUSE_API sqm_to_sqsm(); #endif /* * Description: * */ /*************************************************************** @ units_construct() **************************************************************** Construct the units object */ #if XVT_CC_PROTO ERRSTATUS MUSE_API units_construct( FILE * file, UNITS ** pointer); #else ERRSTATUS MUSE_API units_construct(); #endif /* * Description: The units object contains a list of the user selected map * units. */ /*************************************************************** @ units_destruct() **************************************************************** Destroy the object of type UNITS */ #if XVT_CC_PROTO ERRSTATUS MUSE_API units_destruct( FILE * file, BOOLEAN destruct, UNITS ** pointer); #else ERRSTATUS MUSE_API units_destruct(); #endif /* * Description: * */ #endif /* H_UNITS_F */ ogdi-ogdi_4_1_0/vpflib/include/valid_f.h000066400000000000000000000034041345660466700203060ustar00rootroot00000000000000#ifndef H_VALIDFUN #define H_VALIDFUN /*************************************************************** @ check_integer() **************************************************************** Check that edit field contains a valid integer with no more than the given number of digits */ #if XVT_CC_PROTO BOOLEAN check_integer(short length, char *string, BOOLEAN negs_ok, int *caret_pos); #else BOOLEAN check_integer(); #endif /* Description: Checks each character in a string and returns TRUE if a non-digit or too many digits are found. This method is used for dialog box fields because E_CHAR events are not sent or are not portable. */ /*************************************************************** @ check_real() **************************************************************** Check that edit field contains a valid real number with no more than the given total number of digits and the given number of digits to the right of the decimal place */ #if XVT_CC_PROTO BOOLEAN check_real(short width, short precision, char *string, int *caret_pos); #else BOOLEAN check_real(); #endif /* Description: checks each character in a string and returns TRUE if a non-digit or too many digits are found. This method is used for dialog box fields because E_CHAR events are not sent or are not portable. */ #if XVT_CC_PROTO BOOLEAN check_for_ltr_x_error(char *mgrs); #else BOOLEAN check_for_ltr_x_error(); #endif #if XVT_CC_PROTO BOOLEAN check_for_non_mgrs_ellips(char *mgrs, char *isph, int input_type_code); #else BOOLEAN check_for_non_mgrs_ellips(); #endif #if XVT_CC_PROTO BOOLEAN check_for_ups(double sphi, int32 *izone, double *y, double *x, char *mgrs, int32 *iarea, double degrad); #else BOOLEAN check_for_ups(); #endif #endif ogdi-ogdi_4_1_0/vpflib/include/vec_d.h000066400000000000000000000145701345660466700177700ustar00rootroot00000000000000#ifndef H_VEC_D #define H_VEC_D #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_VIEW_DEF #include "view_d.h" #endif #ifndef H_PHIGS_D #include "phigs_d.h" #endif #ifndef __VPF_H__ /* VPF feature types */ typedef enum { LINE=1, AREA, ANNO, POINTS, COMPLEX=6 } vpf_feature_type; #endif #define MAGIC_VEC2_DATA 120000002L #define MAXPOINTS 16000 #define MAXLINES 16000 #define MAXAREAS 16000 #define MAXTEXT 16000 #define MAXRINGS 5000 #define MAXSEGS 5000 #define MAXCOORDS 5000 #define MAXSTRING 80 #define SZ_VEC 60 #define SZ_VEC_EXTENTS 32 #define SZ_VEC_LINES 4 #define SZ_VEC_TEXT 4 #define SZ_VEC_POINTS 4 #define SZ_VEC_AREAS 4 #define SZ_VEC_SYMBOLOGY 16 #define SZ_VEC_INFO 8 #define SZ_SYMB_LINES 20 #define SZ_SYMB_TEXT 16 #define SZ_SYMB_POINTS 16 #define SZ_SYMB_AREAS 10 #define SZ_COORDINATE 16 #define SZ_LONG 4 #define SZ_DOUBLE 8 /*************************************************************** @ FEATURE_EDIT_FLAGS **************************************************************** A set of flags used in feature editing. */ typedef struct { BOOLEAN selected; /*TRUE if selected*/ BOOLEAN deleted; /*TRUE if flagged for deletion*/ BOOLEAN modified; /*TRUE if recently modified*/ } FEATURE_EDIT_FLAGS; /* Description: */ /*************************************************************** @ POINT_SYMB **************************************************************** Point Symbology structure for display of markers. */ typedef struct { Pint marker_color; Pint marker_type; Pfloat marker_scale; } POINT_SYMB; /* Description: */ /*************************************************************** @ LINE_SYMB **************************************************************** Line Symbology structure for display of lines. */ typedef struct { Pint line_color; Pint line_style; Pfloat line_width; POINT_SYMB *point_symb; } LINE_SYMB; /* Description: */ /*************************************************************** @ TEXT_SYMB **************************************************************** Text Symbology structure for display of text. */ typedef struct { Pint text_color; Pfloat text_scale; POINT_SYMB *point_symb; } TEXT_SYMB; /* Description: */ /*************************************************************** @ AREA_SYMB **************************************************************** Area Symbology structure for display of areas. */ typedef struct { Pint area_color; Pint_style area_style; LINE_SYMB *line_symb; } AREA_SYMB; /* Description: */ /*************************************************************** @ COORDINATE **************************************************************** Geospatial coordinate pair. */ typedef struct { float x; float y; } COORDINATE; /* Description: */ /*************************************************************** @ SEGMENT **************************************************************** Line/edge segment. */ typedef struct { int32 id; int32 nr_coords; COORDINATE *coords; } SEGMENT; /* Description: */ /*************************************************************** @ POINT_FEATURE **************************************************************** Point Feature structure. */ typedef struct { int32 id; COORDINATE *coord; POINT_SYMB *point_symb; FEATURE_EDIT_FLAGS flags; } POINT_FEATURE; /* Description: */ /*************************************************************** @ LINE_FEATURE **************************************************************** Line Feature structure. */ typedef struct { int32 id; int32 nr_segs; SEGMENT **segs; LINE_SYMB *line_symb; FEATURE_EDIT_FLAGS flags; } LINE_FEATURE; /* Description: */ /*************************************************************** @ RING **************************************************************** Ring structure. */ typedef struct { int32 id; int32 nr_segs; SEGMENT **segs; } RING; /* Description: */ /*************************************************************** @ AREA_FEATURE **************************************************************** Area Feature structure. */ typedef struct { int32 id; int32 nr_rings; RING **rings; AREA_SYMB *area_symb; FEATURE_EDIT_FLAGS flags; } AREA_FEATURE; /* Description: */ /*************************************************************** @ TEXT_FEATURE **************************************************************** Text Feature structure. */ typedef struct { int32 id; char *string; int32 nr_coords; COORDINATE *coords; TEXT_SYMB *text_symb; FEATURE_EDIT_FLAGS flags; } TEXT_FEATURE; /* Description: */ /**************************************************************************** @ VEC_EXTENT ***************************************************************************** Spatial extents of the data-set. */ typedef struct { double xmin; double ymin; double xmax; double ymax; } VEC_EXTENT; /* Description: */ /**************************************************************************** @ VEC_INFO ***************************************************************************** Spatial extents of the data-set. */ typedef struct { char *type; char *info; } VEC_INFO; /* Description: */ /*************************************************************** @ SYMBOLOGY **************************************************************** Symbology structure for displaying of VECs. */ typedef struct { LINE_SYMB *line_symb; TEXT_SYMB *text_symb; POINT_SYMB *point_symb; AREA_SYMB *area_symb; } SYMBOLOGY; /* Description: */ /*********************************************************************** @ VEC ************************************************************************ A MUSE structure to hold vector overlay data. */ typedef struct { int32 magic; vpf_feature_type feature_type; int32 nr_features; int32 nr_lines; int32 nr_text; int32 nr_points; int32 nr_areas; VEC_EXTENT *extents; VEC_INFO *info; LINE_FEATURE **lines; TEXT_FEATURE **text; POINT_FEATURE **points; AREA_FEATURE **areas; SYMBOLOGY *symbology; } VEC; /* Description: */ #endif /* H_VEC_DEF */ ogdi-ogdi_4_1_0/vpflib/include/vec_f.h000066400000000000000000000457111345660466700177730ustar00rootroot00000000000000#ifndef H_VEC_F #define H_VEC_F #ifndef INCL_XVTH #include "xvt.h" #endif #ifndef H_VEC_D #include "vec_d.h" #endif #ifndef H_MGM_D #include "mgm_d.h" #endif /*************************************************************** @ area_feature_construct() **************************************************************** Area feature constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API area_feature_construct(FILE *file, AREA_FEATURE ***area, int32 nr_features); #else ERRSTATUS MUSE_API area_feature_construct(); #endif /* Description: If file is not NULL the area feature is written to the file. If destruct is TRUE the area feature is released. */ /*************************************************************** @ line_feature_construct() **************************************************************** Line feature constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API line_feature_construct(FILE *file,LINE_FEATURE ***lines, int32 nr_features); #else ERRSTATUS MUSE_API line_feature_construct(); #endif /* Description: If file is not NULL the line feature is written to the file. If destruct is TRUE the line feature is released. */ /*************************************************************** @ point_feature_construct() **************************************************************** Point feature constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API point_feature_construct(FILE *file, POINT_FEATURE ***points, int32 nr_features); #else ERRSTATUS MUSE_API point_feature_construct(); #endif /* Description: If file is not NULL the point feature is written to the file. If destruct is TRUE the point feature is released. */ /*************************************************************** @ text_feature_construct() **************************************************************** Text feature constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API text_feature_construct(FILE *file, TEXT_FEATURE ***text, int32 nr_features); #else ERRSTATUS MUSE_API text_feature_construct(); #endif /* Description: If file is not NULL the text feature is written to the file. If destruct is TRUE the text feature is released. */ /*************************************************************** @ decode_area_symb() **************************************************************** Decode area symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_area_symb(unsigned char *record, AREA_SYMB *area_symb); #else ERRSTATUS MUSE_API decode_area_symb(); #endif /* Description: Decodes data into the AREA_SYMB structure after read from file. */ /*************************************************************** @ area_symb_construct() **************************************************************** Area symbology constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API area_symb_construct(FILE *file, AREA_SYMB **area_symb); #else ERRSTATUS MUSE_API area_symb_construct(); #endif /* Description: If file is not NULL the area symbology is written to the file. If destruct is TRUE the area symbology is released. */ /*************************************************************** @ decode_line_symb() **************************************************************** Decode line symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_line_symb(unsigned char *record, LINE_SYMB *line_symb); #else ERRSTATUS MUSE_API decode_line_symb(); #endif /* Description: Decodes data into the LINE_SYMB structure after read from file. */ /*************************************************************** @ line_symb_construct() **************************************************************** Line symbology constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API line_symb_construct(FILE *file, LINE_SYMB **line_symb); #else ERRSTATUS MUSE_API line_symb_construct(); #endif /* Description: If file is not NULL the line symbology is written to the file. If destruct is TRUE the line symbology is released. */ /*************************************************************** @ decode_point_symb() **************************************************************** Decode point symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_point_symb(unsigned char *record, POINT_SYMB *point_symb); #else ERRSTATUS MUSE_API decode_point_symb(); #endif /* Description: Decodes data into the POINT_SYMB structure after read from file. */ /*************************************************************** @ point_symb_construct() **************************************************************** Point symbology constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API point_symb_construct(FILE *file, POINT_SYMB **point_symb); #else ERRSTATUS MUSE_API point_symb_construct(); #endif /* Description: If file is not NULL the point symbology is written to the file. If destruct is TRUE the point symbology is released. */ /*************************************************************** @ decode_symbology() **************************************************************** Decode symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_symbology(unsigned char *record, SYMBOLOGY *symb); #else ERRSTATUS MUSE_API decode_symbology(); #endif /* Description: Decodes data into the SYMBOLOGY structure after read from file. */ /*************************************************************** @ symbology_construct() **************************************************************** Symbology constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API symbology_construct(FILE *file, SYMBOLOGY **symb); #else ERRSTATUS MUSE_API symbology_construct(); #endif /* Description: If file is not NULL the symbology is written to the file. If destruct is TRUE the symbology is released. */ /*************************************************************** @ decode_text_symb() **************************************************************** Decode text symbology */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_text_symb(unsigned char *record, TEXT_SYMB *text_symb); #else ERRSTATUS MUSE_API decode_text_symb(); #endif /* Description: Decodes data into the TEXT_SYMB structure after read from file. */ /*************************************************************** @ text_symb_construct() **************************************************************** Text symbology constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API text_symb_construct(FILE *file, TEXT_SYMB **text_symb); #else ERRSTATUS MUSE_API text_symb_construct(); #endif /* Description: If file is not NULL the text symbology is written to the file. If destruct is TRUE the text symbology is released. */ /*************************************************************** @ decode_vec_extents() **************************************************************** Decode vector extents. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_vec_extents(unsigned char *record, VEC_EXTENT *extents); #else ERRSTATUS MUSE_API decode_vec_extents(); #endif /* Description: Decodes data into the VEC_EXTENT structure after read from file. */ /*************************************************************** @ vec_extent_construct() **************************************************************** Vector extent constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_extent_construct(FILE *file, VEC_EXTENT **extents); #else ERRSTATUS MUSE_API vec_extent_construct(); #endif /* Description: If file is not NULL the vector extent is written to the file. If destruct is TRUE the vector extent is released. */ /*************************************************************** @ vec_info_construct() **************************************************************** Vector information constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_info_construct(FILE *file, VEC_INFO **info); #else ERRSTATUS MUSE_API vec_info_construct(); #endif /* Description: If file is not NULL the vector information is written to the file. If destruct is TRUE the vector information is released. */ /*************************************************************** @ decode_vec() **************************************************************** Decode Vector. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API decode_vec(unsigned char *record, VEC *vec); #else ERRSTATUS MUSE_API decode_vec(); #endif /* Description: Decodes data into the VECTOR structure after read from file. */ /*************************************************************** @ vec_construct() **************************************************************** Vector constructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_construct(FILE *file, VEC **vec); #else ERRSTATUS MUSE_API vec_construct(); #endif /* Description: If file is not NULL the vector is written to the file. If destruct is TRUE the vector is released. */ /*************************************************************** @ is_vec_ok() **************************************************************** Test Vector Magic number for validity. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API is_vec_ok(FILE *file); #else ERRSTATUS MUSE_API is_vec_ok(); #endif /* Description: Checks a newly opened vector file to see is it has a correct magic number. */ /*************************************************************** @ area_feature_destruct() **************************************************************** Area feature destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API area_feature_destruct(FILE *file, BOOLEAN destruct, AREA_FEATURE ***area, int32 nr_areas); #else ERRSTATUS MUSE_API area_feature_destruct(); #endif /* Description: Constructs a area feature object. If file is not NULL the area feature is read in from the file. */ /*************************************************************** @ line_feature_destruct() **************************************************************** Line feature destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API line_feature_destruct(FILE *file, BOOLEAN destruct, LINE_FEATURE ***lines, int32 nr_lines); #else ERRSTATUS MUSE_API line_feature_destruct(); #endif /* Description: Constructs a line feature object. If file is not NULL the line feature is read in from the file. */ /*************************************************************** @ point_feature_destruct() **************************************************************** Point feature destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API point_feature_destruct(FILE *file, BOOLEAN destruct, POINT_FEATURE ***points, int32 nr_points); #else ERRSTATUS MUSE_API point_feature_destruct(); #endif /* Description: Constructs a point feature object. If file is not NULL the point feature is read in from the file. */ /*************************************************************** @ text_feature_destruct() **************************************************************** Text feature destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API text_feature_destruct(FILE *file, BOOLEAN destruct, TEXT_FEATURE ***text, int32 nr_text); #else ERRSTATUS MUSE_API text_feature_destruct(); #endif /* Description: Constructs a text feature object. If file is not NULL the text feature is read in from the file. */ /*************************************************************** @ encode_area_symb() **************************************************************** Encode area symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_area_symb(unsigned char *record, AREA_SYMB *area_symb); #else ERRSTATUS MUSE_API encode_area_symb(); #endif /* Description: Encodes the AREA_SYMB structure so that it can be written portably. */ /*************************************************************** @ area_symb_destruct() **************************************************************** Area symbology destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API area_symb_destruct(FILE *file, BOOLEAN destruct, AREA_SYMB **area_symb); #else ERRSTATUS MUSE_API area_symb_destruct(); #endif /* Description: Constructs a area symbology object. If file is not NULL the area symbology is read in from the file. */ /*************************************************************** @ encode_line_symb() **************************************************************** Encode line symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_line_symb(unsigned char *record, LINE_SYMB *line_symb); #else ERRSTATUS MUSE_API encode_line_symb(); #endif /* Description: Encodes the LINE_SYMB structure so that it can be written portably. */ /*************************************************************** @ line_symb_destruct() **************************************************************** Line symbology destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API line_symb_destruct(FILE *file, BOOLEAN destruct, LINE_SYMB **line_symb); #else ERRSTATUS MUSE_API line_symb_destruct(); #endif /* Description: Constructs a vector line symbology. If file is not NULL the line symbology is read in from the file. */ /*************************************************************** @ encode_point_symb() **************************************************************** Encode point symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_point_symb(unsigned char *record, POINT_SYMB *point_symb); #else ERRSTATUS MUSE_API encode_point_symb(); #endif /* Description: Encodes the POINT_SYMB structure so that it can be written portably. */ /*************************************************************** @ point_symb_destruct() **************************************************************** Point symbology destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API point_symb_destruct(FILE *file, BOOLEAN destruct, POINT_SYMB **point_symb); #else ERRSTATUS MUSE_API point_symb_destruct(); #endif /* Description: Constructs a point symbology object. If file is not NULL the point symbology is read in from the file. */ /*************************************************************** @ encode_symbology() **************************************************************** Encode symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_symbology(unsigned char *record, SYMBOLOGY *symb); #else ERRSTATUS MUSE_API encode_symbology(); #endif /* Description: Encodes the SYMBOLOGY structure so that it can be written portably. */ /*************************************************************** @ symbology_destruct() **************************************************************** Symbology destructor */ #if XVT_CC_PROTO ERRSTATUS MUSE_API symbology_destruct(FILE *file, BOOLEAN destruct, SYMBOLOGY **symb); #else ERRSTATUS MUSE_API symbology_destruct(); #endif /* Description: Constructs a symbology object. If file is not NULL the symbology is read in from the file. */ /*************************************************************** @ encode_text_symb() **************************************************************** Encode text symbology. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_text_symb(unsigned char *record, TEXT_SYMB *text_symb); #else ERRSTATUS MUSE_API encode_text_symb(); #endif /* Description: Encodes the TEXT_SYMB structure so that it can be written portably. */ /*************************************************************** @ text_symb_destruct() **************************************************************** Text symbology destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API text_symb_destruct(FILE *file, BOOLEAN destruct, TEXT_SYMB **text_symb); #else ERRSTATUS MUSE_API text_symb_destruct(); #endif /* Description: Constructs a text symbology object. If file is not NULL the text symbology is read in from the file. */ /*************************************************************** @ encode_vec_extents() **************************************************************** Encode vector extents. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_vec_extents(unsigned char *record, VEC_EXTENT *extents); #else ERRSTATUS MUSE_API encode_vec_extents(); #endif /* Description: Encodes the VEC_EXTENT structure so that it can be written portably. */ /*************************************************************** @ vec_extent_destruct() **************************************************************** Vector extent destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_extent_destruct(FILE *file, BOOLEAN destruct, VEC_EXTENT **extents); #else ERRSTATUS MUSE_API vec_extent_destruct(); #endif /* Description: Constructs a vector extent object. If file is not NULL the vector extent is read in from the file. */ /*************************************************************** @ vec_info_destruct() **************************************************************** Vector information destructor */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_info_destruct(FILE *file, BOOLEAN destruct, VEC_INFO **info); #else ERRSTATUS MUSE_API vec_info_destruct(); #endif /* Description: Constructs a vector information object. If file is not NULL the vector information is read in from the file. */ /*************************************************************** @ encode_vec() **************************************************************** Encode vector. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API encode_vec(unsigned char *record, VEC *vec); #else ERRSTATUS MUSE_API encode_vec(); #endif /* Description: Encodes the VECTOR structure so that it can be written portably. */ /*************************************************************** @ vec_destruct() **************************************************************** Vector destructor. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API vec_destruct(FILE *file, BOOLEAN destruct, VEC **vec); #else ERRSTATUS MUSE_API vec_destruct(); #endif /* Description: Constructs a vector object. If file is not NULL the vector is read in from the file. */ /*************************************************************** @ draw_vec() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API draw_vec( MGM *mgm, VEC *vec, WINDOW map_win, BOOLEAN *no_process_vector); #else ERRSTATUS MUSE_API draw_vec(); #endif /* Description: */ /*************************************************************** @ draw_vec_areas() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API draw_vec_areas( MGM * mgm, VEC * vec, WINDOW map_win, BOOLEAN * npv); #else ERRSTATUS MUSE_API draw_vec_areas(); #endif /* Description: */ /*************************************************************** @ draw_vec_lines() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API draw_vec_lines( MGM * mgm, VEC * vec, WINDOW map_win, BOOLEAN * npv); #else ERRSTATUS MUSE_API draw_vec_lines(); #endif /* Description: */ /*************************************************************** @ draw_vec_points() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API draw_vec_points( MGM * mgm, VEC * vec, WINDOW map_win, BOOLEAN * npv); #else ERRSTATUS MUSE_API draw_vec_points(); #endif /* Description: */ /*************************************************************** @ draw_vec_text() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS MUSE_API draw_vec_text( MGM * mgm, VEC * vec, WINDOW map_win, BOOLEAN * npv); #else ERRSTATUS MUSE_API draw_vec_text(); #endif /* Description: */ #endif /* H_VEC_F */ ogdi-ogdi_4_1_0/vpflib/include/vector.h000066400000000000000000000070501345660466700202050ustar00rootroot00000000000000#ifndef H_VECTOR #define H_VECTOR #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_PHIGS_D #include "phigs_d.h" #endif #ifndef H_VEC_D #include "vec_d.h" #endif #ifndef H_SQLLIB_D #include "sqllib_d.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif #ifndef MAGIC_VECTOR #define MAGIC_VECTOR 110000000L #endif #ifndef MAGIC_VEC_DATA /* SR 10/02 */ #define MAGIC_VEC_DATA 120000001L #endif /* SR 10/02 */ /*************************************************************** @ Vec_Data flags **************************************************************** */ #define VEC_DATA_VALID_MASK 0x0001 #define VEC_DATA_NEEDS_REDRAW_MASK 0x0002 #define VEC_DATA_USE_TIMER_MASK 0x0003 /* * Description: */ /* SR 09/16 */ /*************************************************************** @ VEC_DATA **************************************************************** Defines a vector data structure */ typedef struct { int32 magic; int32 bit_flags; BOOLEAN contains_valid_data; /*to compile SEL_THEME sel_theme;*/ VEC *vector; FILE_SPEC file_spec; int32 vec_timer; } VEC_DATA; /* * SR 09/25--list of functions for constructing map versions with different * vec_data structures */ #if XVT_CC_PROTO ERRSTATUS vec_con_vers0(FILE * file, VEC_DATA ** pointer, BYTE_ORDER * bo); #else ERRSTATUS vec_con_vers0(); #endif /* * Memory allocation and initialization for version 0 maps whose * product_pointers point to a VECTOR structure. Only called when opening an * old .map file: added overlays will be created with vec_data_construct for * the latest version of maps. */ #if XVT_CC_PROTO ERRSTATUS vec_con_vers1(FILE * file, VEC_DATA ** pointer, BYTE_ORDER * bo); #else ERRSTATUS vec_con_vers1(); #endif /* * Memory allocation and initialization of the VEC_DATA structure in version * 1 maps, which contains edge color and width, text and point color, and a * pointer to a VECTOR structure. */ /*************************************************************** @ (*vec_data_construct[])() **************************************************************** list of functions to construct vec_data structure for each map version */ #if XVT_CC_PROTO extern ERRSTATUS(*vec_data_construct[2]) (FILE * file, VEC_DATA ** pointer, BYTE_ORDER * bo); #else extern ERRSTATUS(*vec_data_construct[2]) (); #endif /*************************************************************** @ vec_data_destruct() **************************************************************** function to destruct vec_data structure */ #if XVT_CC_PROTO ERRSTATUS vec_data_destruct(FILE * file, BOOLEAN destruct, VEC_DATA ** vec_data, BYTE_ORDER * bo); #else ERRSTATUS vec_data_destruct(); #endif /************************************************************************ @ decode_vec_data() ************************************************************************* function to decode the vec_data structure */ #if XVT_CC_PROTO ERRSTATUS decode_vec_data(unsigned char *record, VEC_DATA * vec_data); #else ERRSTATUS decode_vec_data(); #endif /************************************************************************ @ encode_vec_data() ************************************************************************* A function to encode the vec_data structure*/ #if XVT_CC_PROTO ERRSTATUS encode_vec_data(unsigned char *record, VEC_DATA * vec_data); #else ERRSTATUS encode_vec_data(); #endif #endif /* H_VECTOR */ ogdi-ogdi_4_1_0/vpflib/include/view.h000066400000000000000000000002271345660466700176540ustar00rootroot00000000000000#ifndef H_VIEW #define H_VIEW #ifndef H_VIEW_DEF #include "viewdef.h" #endif #ifndef H_VIEW_FUNC #include "viewfunc.h" #endif #endif /* H_VIEW */ ogdi-ogdi_4_1_0/vpflib/include/view_d.h000066400000000000000000000025071345660466700201620ustar00rootroot00000000000000/* @Viewstruct */ #ifndef H_VIEW_DEF #define H_VIEW_DEF #ifndef _WINDOWS #ifndef INCL_XVTH #include "xvt.h" #endif /*************************************************************** @ VIEW **************************************************************** The structure of bitmap viewing parmeters */ typedef struct { int32 magic; int bitmap_xsize; int bitmap_ysize; int bitmap_xmin; int bitmap_ymin; int bitmap_xmax; int bitmap_ymax; int scroll_x; int scroll_y; int status; double zoomx; double zoomy; void *winstuff; BOOLEAN new_palette; /* has a palette been made? */ } VIEW; /* Description: bit_maps may contain 1, 4, 8, or 24 bits per pixel. The bit_map begins at the upper left corner of the image. The order is row-major, left-to-right, then top-to-bottom. Each row is 0 padded (if necessary) so that the next row begins on an even (2 byte) word. The bit_map is useable directly on Macintosh and MS Windows. */ #ifdef _WINDOWS /*************************************************************** @ WINVIEW **************************************************************** A window list and corresponding view list. */ typedef struct { WINDOW list[100]; VIEW view[100]; } WINVIEW; #endif /* Description: */ #endif /* _WINDOWS */ #endif /* #ifndef H_VIEW_DEF */ ogdi-ogdi_4_1_0/vpflib/include/view_f.h000066400000000000000000000133211345660466700201600ustar00rootroot00000000000000/* @Viewfunc */ #ifndef H_VIEW_FUNC #define H_VIEW_FUNC #ifndef H_MUSEDEF /*JLL#include "musedef.h"*/ #endif #if XVT_OS == XVT_OS_WIN #ifndef __WINDOWS_H #include "windows.h" #endif #endif /*************************************************************** @ view_close(); **************************************************************** Close map view. */ #if XVT_CC_PROTO ERRSTATUS view_close(WINDOW xvt_win); #else /* !XVT_CC_PROTO */ ERRSTATUS view_close(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_construct() **************************************************************** Allocates memory for VIEW structure. */ #if XVT_CC_PROTO ERRSTATUS view_construct(void); #else ERRSTATUS view_construct(); #endif /* Description: */ /*************************************************************** @ view_create(); **************************************************************** Creates map view of screen. */ #if XVT_CC_PROTO #if XVTWS == WINWS ERRSTATUS view_create(WINDOW xvt_win, HDC MSmem, HBITMAP MSbitmap); #elif XVTWS == MTFWS #include ERRSTATUS view_create(WINDOW xvt_win, XImage* image, BYTE pHMEM data, Pixmap pix); #else /* XVTWS == MACWS */ ERRSTATUS view_create(WINDOW xvt_win); #endif #else /* !XVT_CC_PROTO */ ERRSTATUS view_create(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_destruct() **************************************************************** Deallocates memory for VIEW structure. */ #if XVT_CC_PROTO ERRSTATUS view_destruct(void); #else ERRSTATUS view_destruct(); #endif /* Description: */ /*************************************************************** @ view_get_color() **************************************************************** Returns a valid color to phigs. */ #if XVT_CC_PROTO void view_get_color(WINDOW xvt_win, int index, int type); #else void view_get_color(); #endif /* Description: */ /*************************************************************** @ view_color_dist() **************************************************************** Returns a dist color. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API view_color_dist(RGB x, RGB y, int32 *distance); #else ERRSTATUS MUSE_API view_color_dist(); #endif /* Description: */ /*************************************************************** @ view_get_cur() **************************************************************** Gets current view associated with the window. */ #if XVT_CC_PROTO ERRSTATUS MUSE_API view_get_cur(WINDOW xvt_win, VIEW **view); #else ERRSTATUS MUSE_API view_get_cur(); #endif /* Description: */ /*************************************************************** @ view_new_win() **************************************************************** Set a new view window. */ #if XVT_CC_PROTO ERRSTATUS view_new_win(WINDOW xvt_win); #else ERRSTATUS view_new_win(); #endif /* Description: */ /*************************************************************** @ view_open(); **************************************************************** Opens map view to write into. */ #if XVT_CC_PROTO ERRSTATUS view_open(WINDOW xvt_win); #else /* !XVT_CC_PROTO */ ERRSTATUS view_open(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_put_palette() **************************************************************** Puts the palette out to the native window manager */ #if XVT_CC_PROTO ERRSTATUS view_put_palette(WINDOW xvt_win, PALETTE *palette); #else ERRSTATUS view_put_palette(); #endif /* Description: */ /*************************************************************** @ view_reset() **************************************************************** Resets map view to original pix map. */ #if XVT_CC_PROTO ERRSTATUS view_reset(WINDOW xvt_win); #else /* !XVT_CC_PROTO */ ERRSTATUS view_reset(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_scale(); **************************************************************** Opens map view to write into. */ #if XVT_CC_PROTO ERRSTATUS view_scale(WINDOW xvt_win); #else ERRSTATUS view_scale(); #endif /* Description: */ /*************************************************************** @ view_update() **************************************************************** Refreshes map view */ #if XVT_CC_PROTO ERRSTATUS view_update(WINDOW xvt_win, BOOLEAN force_resample); #else /* !XVT_CC_PROTO */ ERRSTATUS view_update(); #endif /* XVT_CC_PROTO */ /* Description: * / /*************************************************************** @ view_remove_bitmap() **************************************************************** Remove bitmap from view list. */ #if XVT_CC_PROTO ERRSTATUS view_remove_bitmap(WINDOW xvt_win); #else /* !XVT_CC_PROTO */ ERRSTATUS view_remove_bitmap(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_remove_win() **************************************************************** Remove window from view list. */ #if XVT_CC_PROTO ERRSTATUS view_remove_win(WINDOW xvt_win); #else /* !XVT_CC_PROTO */ ERRSTATUS view_remove_win(); #endif /* XVT_CC_PROTO */ /* Description: */ /*************************************************************** @ view_nearest_color() **************************************************************** */ #if XVT_CC_PROTO ERRSTATUS view_nearest_color(PALETTE * pal, PALETTE_USAGE palette_usage, RGB rgb, USHORT * pal_color); #else ERRSTATUS view_nearest_color(); #endif #if XVT_CC_PROTO ERRSTATUS view_get_list(Pint_list * ws_id_list); #else ERRSTATUS view_get_list(); #endif #endif /* #ifndef H_VIEW_FUNC */ ogdi-ogdi_4_1_0/vpflib/include/vpf_d.h000066400000000000000000000374111345660466700200050ustar00rootroot00000000000000#ifndef H_VPF_DEF #define H_VPF_DEF #include #define CLOSED 0 #define OPENED 1 /* define NULL values */ #define VARIABLE_STRING_NULL_LENGTH 10 #define NULLCHAR ' ' #define NULLTEXT " " #define NULLSHORT -SHRT_MAX #define NULLINT -LONG_MAX #define NULLDATE " " #if XVT_OS_ISUNIX #define NULLFLOAT ((float) quiet_nan (0)) #define NULLDOUBLE ((double) quiet_nan (0)) #elif XVT_CC == XVT_THINK #define NULLFLOAT ((float)3.40282346638528860e+38) #define NULLDOUBLE ((double)1.797693134862315708e+308) #else #define NULLFLOAT ((float) 3.402823466e+38) #define NULLDOUBLE ((double) 1.7976931348623158e+30) #endif /* These are all the metacharacters used to parse out input text files */ #define COMPONENT_SEPERATOR ';' #define LINE_CONTINUE '\\' #define SPACE ' ' #define TEXT_NULL "-" #define COMMENT_CHAR '"' #define FIELD_COUNT '=' #define FIELD_SEPERATOR ',' #define END_OF_FIELD ':' #define FIELD_PARTITION '^' #define NEXT_ELEMENT '|' #define COMMENT '#' #define NEW_LINE '\n' #define VARIABLE_COUNT '*' #define TAB '\t' /* These macros help determine the type in the key datatype */ #define TYPE0(cell) ((cell>>6)&(3)) #define TYPE1(cell) ((cell>>4)&(3)) #define TYPE2(cell) ((cell>>2)&(3)) #define TYPE3(cell) ((cell)&(3)) typedef enum { VpfNull, VpfChar, VpfShort, VpfInteger, VpfFloat, VpfDouble, VpfDate, VpfKey, VpfCoordinate, VpfTriCoordinate, VpfDoubleCoordinate, VpfDoubleTriCoordinate, VpfUndefined } VpfDataType; typedef union { unsigned char f1; unsigned short int f2; uint32 f3; } key_field; typedef char VDATE[21]; /* Include null end of string */ typedef union { char *Char; short Short; int32 Int; float Float; double Double; VDATE Date; char Other; } null_field; typedef enum { Read, Write } file_mode; /* Each column in a table row has a count and a pointer to the data */ /* and a null value default */ typedef struct { int32 count; void *ptr; } COLUMN; /* A table row is an array of columns */ typedef COLUMN *ROW; /* Index for variable width tables. */ /* One index cell for each row in the table. */ typedef struct { uint32 pos; uint32 length; } INDEX; /* The basic information carried for each field in the table */ typedef struct { char *name; /* Name of the field */ char description[81]; /* Field description */ char keytype; /* Type of key - (P)rimary, (F)oreign, * (N)onkey */ char vdt[13]; /* Value description table name */ char *tdx; /* Thematic index file name */ char type; /* Data type - T,I,F,K,D */ int32 count; /* Number of items in this column (-1 * =>variable) */ null_field nullval; /* This is used for the converter */ char *narrative; /* Name of a narrative table describing the * field */ } header_cell, *header_type; typedef struct { float x; float y; } XY_COORDINATE; typedef struct { double x; double y; } XY_DCOORDINATE; typedef struct { float x; float y; float z; } XYZ_COORDINATE; typedef struct { double x; double y; double z; } XYZ_DCOORDINATE; typedef struct { unsigned char type; int32 id; int32 tile; int32 exid; } ID_TRIPLET; /*************************************************************** @ HEADER_SIZE **************************************************************** Size of header to be read. */ typedef struct { int32 header_length; char byte_order; } HEADER_SIZE; /* * Description: * */ /*************************************************************** @ STANDARD_HEADER **************************************************************** Table Desciption and documentation filename. */ typedef struct { char table_description[101]; char separator_1; char narrative_table[13]; } STANDARD_HEADER; /* * Description: * */ /*************************************************************** @ REPEAT_HEADER **************************************************************** Repeated for each column defined header. */ typedef struct { char name[17]; char separator_1; char data_type; char separator_2; char number[5]; char separator_3; char key_type; char separator_4; char column_description[101]; char separator_5; char value_description[13]; char separator_6; char thematic_index[13]; char separator_7; char separator_8; } REPEAT_HEADER; /* * Description: * */ /*************************************************************** @ VPF_TABLE **************************************************************** VPF Table Structure (standard header). */ typedef struct { HEADER_SIZE header_size; char separator_1; STANDARD_HEADER standard_header; char separator_2; REPEAT_HEADER repeat_header[34]; char separator_3; } VPF_TABLE, VPT; /* * Description: * */ /*************************************************************** ************ FILE STRUCTURES ************************** ***************************************************************/ /*************************************************************** @ DHT **************************************************************** Database Header Table. */ typedef struct { VPT *vpt; int32 id; char vpf_version[11]; char database_name[9]; char database_desc[101]; char media_standard[21]; char originator[51]; char addressee[101]; char media_volumes; char seq_numbers; char num_data_sets; char security_class; char downgrading[4]; char downgrade_date[21]; char releasability[21]; char other_std_name[51]; char other_std_date[21]; char other_std_ver[11]; char transmittal_id; char edition_number[11]; char edition_date[21]; } DHT; /* * Description: * */ /*************************************************************** @ LAT **************************************************************** Library Attribute Table. */ typedef struct { VPT *vpt; int32 id; char library_name[9]; float xmin; float ymin; float xmax; float ymax; } LAT; /* * Description: * */ /*************************************************************** @ LHT **************************************************************** Library Header Table. */ typedef struct { VPT *vpt; int32 id; char product_type[13]; char library_name[13]; char description[101]; char data_struct_code; int32 scale; char source_series[16]; char source_id[31]; char source_edition[21]; char source_name[101]; char source_date[21]; char security_class; char downgrading[4]; char downgrading_date[21]; char releasability[21]; } LHT; /* * Description: * */ /*************************************************************** @ GRT **************************************************************** Geographic Refernce Table. */ typedef struct { VPT *vpt; int32 id; char data_type[4]; char units[4]; char ellipsoid_name[16]; char ellipsoid_detail[51]; char vert_datum_name[16]; char vert_datum_code[4]; char sound_datum_name[16]; char sound_datum_code[4]; char geo_datum_name[16]; char geo_datum_code[11]; char projection_name[21]; char projection_code[3]; char parameter1[21]; char parameter2[21]; char parameter3[21]; char parameter4[21]; char false_origin_x[21]; char false_origin_y[21]; char false_origin_z[21]; char reg_pt[11]; char reg_long[16]; char reg_lat[16]; char reg_z[6]; char reg_table_x[16]; char reg_table_y[16]; char reg_table_z[16]; char diag_pt[11]; char diag_long[16]; char diag_lat[16]; char diag_z[6]; char diag_table_x[16]; char diag_table_y[16]; char diag_table_z[16]; } GRT; /* * Description: * */ /*************************************************************** @ CAT **************************************************************** Coverage Attribute Table. */ typedef struct { VPT *vpt; int32 id; char coverage_name[9]; char description[51]; int32 level; } CAT; /* * Description: * */ /**************************************************************************/ /* DATA STRUCTURES */ /**************************************************************************/ /*************************************************************** @ INDEX_DATA **************************************************************** Offset and Length. */ typedef struct { int32 offset; int32 length; } INDEX_DATA; /* * Description: * */ /*************************************************************** @ INDEX **************************************************************** Index for index table. */ typedef struct { int32 nr_records; int32 size; INDEX_DATA **record; } IDX, EDX, TXX, ENX; /* * Description: * */ /*************************************************************** @ FT **************************************************************** Feature Table. */ typedef struct { VPT *vpt; int32 id; short tile_id; int32 table; void *data; } FT, LFT, TFT, PFT; /* * Description: * */ /*************************************************************** @ END_RECORD **************************************************************** Entity Node Primitive Record (Points). */ typedef struct { int32 id; int32 pft_id; int32 contain_face; char first_edge[2]; /* to be defined as NULL */ int32 nr_coordinates; /* Not a VPF specified field */ XY_COORDINATE **coordinate; } END_RECORD; /* * Description: * */ /*************************************************************** @ END **************************************************************** Entity Node Primitive Table (Points) */ typedef struct { VPT *vpt; int32 nr_records; /* Nat a VPF specified field */ END_RECORD **record; } END; /* * Description: * */ /*************************************************************** @ EDG_RECORD **************************************************************** Edge Primitive Record (Lines). */ typedef struct { int32 id; int32 lft_id; int32 start_node; int32 end_node; ID_TRIPLET *right_face; ID_TRIPLET *left_face; ID_TRIPLET *right_edge; ID_TRIPLET *left_edge; int32 nr_coordinates; /* Not a VPF specified field */ XY_COORDINATE **coordinate; } EDG_RECORD; /* * Description: * */ /*************************************************************** @ EDG **************************************************************** Edge Primitive Table (Lines) */ typedef struct { VPT *vpt; int32 nr_records; /* Nat a VPF specified field */ EDG_RECORD **record; } EDG; /* * Description: * */ /*************************************************************** @ TXT_RECORD **************************************************************** Text Primitive Record. */ typedef struct { int32 id; int32 txt_id; char *string; int32 nr_coordinates; /* Not a VPF specified field */ XY_COORDINATE **coordinate; } TXT_RECORD; /* * Description: * */ /*************************************************************** @ TXT **************************************************************** Text Primitive Table */ typedef struct { VPT *vpt; int32 nr_records; /* Nat a VPF specified field */ TXT_RECORD **record; } TXT; /* * Description: * */ /**************************************************************************/ /* TABLE_DATA */ /**************************************************************************/ typedef struct { int32 offset; int32 size; } TABLE_DATA; /**************************************************************************/ /* VECTOR */ /**************************************************************************/ typedef struct { int32 magic; DHT *dht; LAT *lat; CAT *cat; GRT *grt; LHT *lht; EDG *edg; EDX *edx; LFT *lft; TXT *txt; TXX *txx; TFT *tft; ENX *enx; END *end; PFT *pft; } VECTOR; /* VPF table structure: */ typedef struct { char name[13]; /* Table filename */ int32 nfields; /* Number of fields */ char description[81]; /* Table description */ char narrative[13]; /* Table narrative file name */ header_type header; /* Table header structure */ FILE *fp; /* Table file pointer */ FILE *xfp; /* Index table file pointer */ IDX *idx; /* Index data */ int32 nrows; /* Number of rows in the table */ ROW *row; /* Array of table rows */ int32 size; /* Size of table in bytes */ int32 reclen; /* Table record length (-1 = variable) */ int32 ddlen; /* Header length */ int32 offset; /* Offset in bytes to start of current table */ int32 fpos; /* Location of the filepointer */ char *defstr; /* rdf, definition string */ file_mode mode; /* Table is either reading or writing */ unsigned char status; /* VPF table status - OPENED or CLOSED */ unsigned char byte_order; /* Byte order of the table's data */ } VPFTABLE; #endif /* H_VPF */ ogdi-ogdi_4_1_0/vpflib/include/vpf_f.h000066400000000000000000000072721345660466700200110ustar00rootroot00000000000000#ifndef H_VPF_FUNC #define H_VPF_FUNC #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif /* Prototype Definitions */ #if XVT_CC_PROTO ID_TRIPLET read_key(VPFTABLE *, BYTE_ORDER *); void *get_table_element(int32, ROW, VPFTABLE *, void *, int32 *); char *get_string(int32 *, char *, char); char get_char(int32 *, char *); int32 get_vpf_string(VPFTABLE *, ROW *, int32, char *, int32); int32 get_number(int32 *, char *, char); int32 parse_header(VPFTABLE *, BYTE_ORDER *); ROW get_row(int32, VPFTABLE *, BYTE_ORDER *); void free_row(ROW, VPFTABLE *); void format_date(VDATE, char *); ERRSTATUS open_table(char *, VPFTABLE *, BYTE_ORDER *); void close_table(VPFTABLE *); void clear_table(VPFTABLE *); char *rightjust(char *); char *cpy_del(char *, char, int32 *); void swap_two(char *, char *); void swap_four(char *, char *); void swap_eight(char *, char *); int32 file_read(void *, VpfDataType, size_t, FILE *, BYTE_ORDER *); int32 file_write(void *, VpfDataType, size_t, FILE *, BYTE_ORDER *); ERRSTATUS header_read(VPT **, VPFTABLE *, BYTE_ORDER *); ERRSTATUS dht_read(VPFTABLE *, DHT **, BYTE_ORDER *); ERRSTATUS lat_read(VPFTABLE *, LAT **, BYTE_ORDER *); ERRSTATUS cat_read(VPFTABLE *, CAT **, BYTE_ORDER *); ERRSTATUS grt_read(VPFTABLE *, GRT **, BYTE_ORDER *); ERRSTATUS lht_read(VPFTABLE *, LHT **, BYTE_ORDER *); ERRSTATUS idx_read(VPFTABLE *, IDX **, BYTE_ORDER *); ERRSTATUS edg_read(VPFTABLE *, EDG **, IDX *, BYTE_ORDER *); ERRSTATUS txt_read(VPFTABLE *, TXT **, IDX *, BYTE_ORDER *); ERRSTATUS end_read(VPFTABLE *, END **, IDX *, BYTE_ORDER *); ERRSTATUS vpf_write(char *, VECTOR *, BYTE_ORDER *); ERRSTATUS hdr_write(VPFTABLE *, VPT *, BYTE_ORDER *); ERRSTATUS dht_write(VPFTABLE *, DHT *, BYTE_ORDER *); ERRSTATUS lat_write(VPFTABLE *, LAT *, BYTE_ORDER *); ERRSTATUS lht_write(VPFTABLE *, LHT *, BYTE_ORDER *); ERRSTATUS grt_write(VPFTABLE *, GRT *, BYTE_ORDER *); ERRSTATUS cat_write(VPFTABLE *, CAT *, BYTE_ORDER *); ERRSTATUS idx_write(VPFTABLE *, IDX *, BYTE_ORDER *); ERRSTATUS edg_write(VPFTABLE *, EDG *, BYTE_ORDER *); ERRSTATUS txt_write(VPFTABLE *, TXT *, BYTE_ORDER *); ERRSTATUS end_write(VPFTABLE *, END *, BYTE_ORDER *); #else ID_TRIPLET read_key(); ERRSTATUS open_table(); void close_table(); void clear_table(); void *get_table_element(); char *get_string(); char get_char(); int32 get_number(); int32 get_vpf_string(); int32 parse_header(); void free_row(); void format_date(); ROW get_row(); char *rightjust(); char *cpy_del(); void swap_two(); void swap_four(); void swap_eight(); int32 file_read(); int32 file_write(); ERRSTATUS header_read(); ERRSTATUS dht_read(); ERRSTATUS lat_read(); ERRSTATUS cat_read(); ERRSTATUS grt_read(); ERRSTATUS lht_read(); ERRSTATUS idx_read(); ERRSTATUS edg_read(); ERRSTATUS txt_read(); ERRSTATUS end_read(); ERRSTATUS vpf_write(); ERRSTATUS hdr_write(); ERRSTATUS dht_write(); ERRSTATUS lat_write(); ERRSTATUS lht_write(); ERRSTATUS grt_write(); ERRSTATUS cat_write(); ERRSTATUS idx_write(); ERRSTATUS edg_write(); ERRSTATUS txt_write(); ERRSTATUS end_write(); #endif #endif /* H_VPF_FUNC */ ogdi-ogdi_4_1_0/vpflib/linklist.c000066400000000000000000000504601345660466700171070ustar00rootroot00000000000000 /************************************************************************* * *N Module LINKLIST.C * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions that make up a singly linked list * data structure. It is generic in the sense that it can hold any * type of data, including user-defined types and structures. That * is why you must treat the data element as a void pointer and pass * in its size when inserting into the list. These routines are * assured of working with "non-pointer" types of data elements. * If you try storing other lists, or structures with pointers hanging * off of them, the results will become unpredictable. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C * Dan Maddux Jan. 1994 Windows, Sun & Mac Port *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * linked_list_type ll_init(); * int32 ll_empty( linked_list_type list ); * position_type ll_first( linked_list_type list ); * position_type ll_last( linked_list_type list ); * position_type ll_next( position_type position ); * position_type ll_previous( position_type position, linked_list_type * list ); * int32 ll_end( position_type position ); * void ll_element( position_type position, void *element ); * void ll_insert( void *element, unsigned size, position_type position ); * void ll_delete( position_type position ); * void ll_reset( linked_list_type list ); * position_type ll_locate( void *element, linked_list_type list ); * void ll_replace( void *element, position_type position ); *E *************************************************************************/ #ifndef INCL_XVTH #include #endif #if 0 #include #include #include #include #endif #ifndef __LINKLIST_H__ #include "linklist.h" #endif /************************************************************************* * *N ll_init * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function allocates and initializes a new linked list structure. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * ll_init == (linked_list_type) initialized head of the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ linked_list_type ll_init() { linked_list_type list; if ((list = (linked_list_type) xvt_malloc( sizeof(cell_type) ))==NULL) { xvt_note ("LL_INIT: Out of memory"); exit(1); } list->element = NULL; list->element_size = 0; list->next = NULL; return list; } /************************************************************************* * *N ll_empty * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function TRUE if the list is empty and FALSE if it is not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * list == (linked_list_type) linked list being checked. * ll_empty == (int32) boolean function result. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 ll_empty( linked_list_type list ) #else int32 ll_empty( list ) linked_list_type list; #endif { if (list == NULL) return TRUE; if (list->next == NULL) return TRUE; else return FALSE; } /************************************************************************* * *N ll_first * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the head of the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * list == (linked_list_type) linked list. * ll_first == (position_type) head of the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO position_type ll_first( linked_list_type list ) #else position_type ll_first( list ) linked_list_type list; #endif { return ((position_type) list); } /************************************************************************* * *N ll_last * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns *THE* last position in the list, which is * not useable. Use ll_previous to get to the last USEABLE link in * the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * list == (linked_list_type) linked list. * ll_last == (position_type) tail of the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO position_type ll_last( linked_list_type list ) #else position_type ll_last( list ) linked_list_type list; #endif { position_type p; p = (position_type) list; while (p->next != NULL) p = p->next; return p; } /************************************************************************* * *N ll_next * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the next position in the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) current position in the list. * ll_next == (position_type) next position in the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO position_type ll_next( position_type position ) #else position_type ll_next( position ) position_type position; #endif { return(position->next); } /************************************************************************* * *N ll_previous * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the previous position in the list. Note: * This is a singly linked list -> no backward pointer -> this * operation is relatively inefficient. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) current position. * list == (linked_list_type) linked list. * ll_previous == (position_type) previous position in the list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO position_type ll_previous (position_type position, linked_list_type list) #else position_type ll_previous (position, list) position_type position; linked_list_type list; #endif { position_type p; if (position==list) return(position); p = list; while (p->next != position) p = p->next; return(p); } /************************************************************************* * *N ll_end * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines if the given position is at the end of the * list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) current position in the list. * ll_end == (int32) TRUE -- if position is the end of the list. * FALSE -- if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 ll_end (position_type position) #else int32 ll_end (position) position_type position; #endif { if (position == NULL) return(TRUE); else { if (position->next == NULL) return(TRUE); else return(FALSE); } } /************************************************************************* * *N ll_element * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function copies the contents of the element at position * currently being pointed to by "position" into the output data * element. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) position in the list. * element == (void *) pointer to the element data. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO void ll_element (position_type position, void *element) #else void ll_element (position, element) position_type position; void *element; #endif { memcpy (element, position->next->element, position->next->element_size); return; } /************************************************************************* * *N ll_element_size * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the size of the contents of the element at * position currently being pointed to by "position". *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) position in the list. * size == (size_t) size in byte of the current element. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dan Maddux May 1993 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO size_t ll_element_size (position_type position) #else size_t ll_element_size (position) position_type position; #endif { return (position->next->element_size); } /************************************************************************* * *N ll_insert * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function inserts a new cell into the list at position that will * contain the data pointed to by element. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * element == (void *) pointer to the data element to insert. * size == (size_t) size of the data element. * position == (position_type) position to insert the new cell. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO void ll_insert (void *element, size_t size, position_type position) #else void ll_insert (element, size, position) void *element; size_t size; position_type position; #endif { position_type temp; if ((temp = (position_type)xvt_malloc (sizeof(cell_type))) == NULL) { xvt_note ("LL_INSERT: out of memory"); abort(); } temp->next = position->next; position->next = temp; temp->element_size = size; if ((temp->element = xvt_malloc (size)) == NULL) { xvt_note ("LL_INSERT: out of memory"); abort(); } memcpy (temp->element, element, size); return; } /************************************************************************* * *N ll_delete * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function deletes and disposes of a cell from the linked list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * position == (position_type) position in the list to delete. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO void ll_delete( position_type position ) #else void ll_delete( position ) position_type position; #endif { position_type p; if (position != NULL) { /* Cut the element out of the chain */ p = position->next; position->next = p->next; xvt_free( p->element ); xvt_free ((char*)p); } } /************************************************************************* * *N ll_reset * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function empties out a linked list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * list == (linked_list_type) linked list to be emptied. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void ll_delete( position_type position ); * int32 ll_empty( linked_list_type list ); *E *************************************************************************/ #ifdef PROTO void ll_reset (linked_list_type list) #else void ll_reset ( list ) linked_list_type list; #endif { while (! ll_empty(list)) ll_delete(ll_first(list)); xvt_free ((char*)list); list = NULL; } /************************************************************************* * *N ll_locate * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function locates a position in the list by comparing data. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * element == (void *) pointer to the data element to locate. * list == (linked_list_type) linked list. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO position_type ll_locate( void *element, linked_list_type list ) #else position_type ll_locate( element, list ) void *element; linked_list_type list; #endif { position_type p; p = list; while (p->next != NULL) { if ( memcmp(p->next->element,element,p->next->element_size) == 0 ) return p; else p = p->next; } return NULL; } /************************************************************************* * *N ll_replace * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function replaces an element in the linked list at the given * position. WARNING: The new data element must be the same size as * the previous data element or you will get some rather INTERESTING * results. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * element == (void *) data element to replace existing data. * position == (position_type) position in the list to replace * the data. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Feb. 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO void ll_replace (void *element, position_type position) #else void ll_replace (element, position) void *element; position_type position; #endif { memcpy (position->next->element, element, position->next->element_size); } ogdi-ogdi_4_1_0/vpflib/linklist.h000066400000000000000000000040041345660466700171050ustar00rootroot00000000000000/* ==================================================================== Environmental Systems Research Institute (ESRI) Applications Programming Project: Conversion from ARC/INFO to VPF Original Coding: Tom Wood Fall 1990 Modifications: David Flinn February 1991 ================================================================== */ #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #ifndef _MACHINE_ #include "machine.h" #endif typedef struct linked_list_cell { void *element; size_t element_size; struct linked_list_cell *next; } cell_type, *linked_list_type, *position_type; #define LL_FIRST(list) (position_type)list #define LL_NEXT(position) position->next #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifdef PROTO linked_list_type ll_init(void); position_type ll_locate (void *element, linked_list_type list); position_type ll_first (linked_list_type list ); position_type ll_last (linked_list_type list ); position_type ll_next (position_type position ); position_type ll_previous (position_type position, linked_list_type list); int32 ll_empty (linked_list_type list ); int32 ll_end (position_type position ); void ll_element (position_type position, void *element); void ll_insert (void *element, size_t size, position_type position); void ll_delete (position_type position ); void ll_reset (linked_list_type list ); void ll_replace (void *element, position_type position); size_t ll_element_size (position_type position); #else linked_list_type ll_init (); int32 ll_empty (); position_type ll_first (); position_type ll_last (); position_type ll_next (); position_type ll_previous (); int32 ll_end (); void ll_element (); void ll_insert (); void ll_delete (); void ll_reset (); position_type ll_locate (); void ll_replace (); size_t ll_element_size (); #endif #endif /* ifdef __LINKLIST_H__ */ ogdi-ogdi_4_1_0/vpflib/makefile000066400000000000000000000017571345660466700166170ustar00rootroot00000000000000# # Copyright (c) 1997 Logiciels et Applications Scientifiques (L.A.S.) Inc. # Il est strictement interdit de publier ou de devoiler le contenu de ce # programme sans avoir prealablement obtenu la permission de L.A.S. Inc. # It is strictly forbidden to publish or divulge the content of # these programs without the prior permission of L.A.S. Inc. # TOBEGEN = vpf TARGETGEN=$(ARCHGEN) SOURCES = vpfselec.c \ vpftidx.c \ vpfwrite.c \ vpftable.c \ vpfrelat.c \ vpfprim.c \ vpfquery.c \ get_feat.c \ vpfdproj.c \ coorgeom.c \ vpfspx.c \ set.c \ linklist.c \ reduce2.c \ vpfread.c \ vpfprop.c \ strfunc.c \ musedir.c INCLUDES = $(CURRENT_INCLUDE) $(GENERAL_INCLUDE) $(VPF_INCLUDE) CFLAGS = $(INCLUDES) $(COMMON_CFLAGS) $(UNIX_DEFINE) \ -DSYS_BIG_ENDIAN=$(BIG_ENDIAN) include $(TOPDIR)/config/common.mak ifeq ($(HAVE_ICONV),yes) CFLAGS := $(CFLAGS) -DHAVE_ICONV endif all: MKOBJECTDIR $(MAKE) --directory $(OBJDIR) -f ../makefile PASS='depend' $(TARGETGEN) clean: default-clean ogdi-ogdi_4_1_0/vpflib/musedir.c000066400000000000000000000252301345660466700167230ustar00rootroot00000000000000/* * MUSEDIR.C- a set of directory and file utilities implemented over XVT * functions. These functions could also be implemented over a specific * operating system to wean from XVT. * * This file contains the following functions: dir_create dir_current dir_pop * dir_push dir_restore dir_save file_open file_spec_to_string muse_access * muse_filelength muse_check_path */ #ifndef INCL_XVTH #include "xvt.h" #endif #ifdef unix /* #include "direct.h" */ #include #include #include #include #endif #include "machine.h" #include "musedir.h" #ifndef TRUE #define TRUE 1 #endif #ifdef _MSDOS #include "io.h" #endif #ifdef _WINDOWS #include #include #endif #include /**************************************************************************/ /* FILE_OPEN */ /**************************************************************************/ static int muse_exists_path(const char* path) { int acc; /* fprintf(stderr, "trying %s\n", path);*/ #ifdef _WINDOWS acc = _access(path, 0); #else acc = access(path, 0); #endif return acc == 0; } static int muse_fix_path_case(const char* src_path, char dest_path[SZ_FNAME]) { char tmp_path[SZ_FNAME]; int lastSlashPos; int i; int len; int curPartHasDot = 0; int curPartIsLowerCase = 1; int curPartIsUpperCase = 1; strcpy(dest_path, src_path); if (muse_exists_path(dest_path)) { return 1; } lastSlashPos = -1; len = strlen(dest_path); /* Find the maximum part of the path that exists */ for(i=len-1;i>=0;i--) { if (dest_path[i] == FILE_SEP) { memcpy(tmp_path, dest_path, i); tmp_path[i] = 0; if (muse_exists_path(tmp_path)) { lastSlashPos = i; break; } } } i++; for(;i= 'a' && dest_path[i] <= 'z') { curPartIsUpperCase = 0; } else if (dest_path[i] >= 'A' && dest_path[i] <= 'Z') { curPartIsLowerCase = 0; } if ((dest_path[i] == FILE_SEP || i == len-1) && i != 0) { int limit = (dest_path[i] == FILE_SEP) ? i-1 : i; memcpy(tmp_path, dest_path, limit+1); tmp_path[limit+1] = 0; if (muse_exists_path(tmp_path) == 0) { int j; for(j=lastSlashPos+1;j<=limit;j++) { tmp_path[j] = toupper(tmp_path[j]); } if (curPartIsUpperCase == 1 || muse_exists_path(tmp_path) == 0) { for(j=lastSlashPos+1;j<=limit;j++) { tmp_path[j] = tolower(tmp_path[j]); } if (curPartIsLowerCase == 1 || muse_exists_path(tmp_path) == 0) { if (i == len-1 && !(dest_path[i] == '.' || (i-1>=0 && dest_path[i-1] == ';' && dest_path[i] == '1'))) { char tmp_dest_path[SZ_FNAME]; if (curPartHasDot == 0) { strcpy(tmp_path, dest_path); strcat(tmp_path, "."); if (muse_fix_path_case(tmp_path, tmp_dest_path)) { strcpy(dest_path, tmp_dest_path); return 1; } } strcpy(tmp_path, dest_path); strcat(tmp_path, ";1"); if (muse_fix_path_case(tmp_path, tmp_dest_path)) { strcpy(dest_path, tmp_dest_path); return 1; } return 0; } else { return 0; } } else { memcpy(dest_path, tmp_path, limit+1); } } else { memcpy(dest_path, tmp_path, limit+1); } } curPartIsLowerCase = 1; curPartIsUpperCase = 1; curPartHasDot = 0; lastSlashPos = i; } } return 1; } #if XVT_CC_PROTO FILE * muse_file_open(char *path, char *mode) #else FILE * muse_file_open(path, mode) char *path; char *mode; #endif { char pathext[SZ_FNAME]; char real_path[SZ_FNAME]; strcpy(pathext, path); muse_check_path(pathext); if (muse_fix_path_case(pathext, real_path) == 0) { return NULL; } return fopen(real_path, mode); /* #ifdef _MAC if ((file = fopen(pathext, mode)) == (FILE *) NULL) { if (strchr(pathext, '.') == NULL) strcat(pathext, "."); strcat(pathext, ";1"); file = fopen(pathext, mode); } return (file); #endif */ } /**************************************************************************/ /* FIL_OPEN */ /**************************************************************************/ /* #if XVT_CC_PROTO int fil_open(char *path, int mode) #else int fil_open(path, mode) char *path; int mode; #endif { int file; char pathext[SZ_FNAME]; char lobuf[SZ_FNAME]; char upbuf[SZ_FNAME]; int i, len; BOOLEAN DOT_FOUND = 0; int32 lenup; char *s; strcpy(pathext, path); muse_check_path(pathext); #ifdef _WINDOWS file = open(pathext, mode); return (file); #endif #ifdef unix acc = access(pathext, amode); return (acc); #if 0 memset(lobuf, (char) NULL, SZ_FNAME); memset(upbuf, (char) NULL, SZ_FNAME); len = strlen(pathext); strcpy(upbuf, pathext); strcpy(lobuf, pathext); for (i = len-1; i >= 0; i--) { if (pathext[i] == '.') { DOT_FOUND = TRUE; } if (pathext[i] == (int) FILE_SEP) break; } #if 0 for (i = len - 1; (i >= 0 && pathext[i] != (int) FILE_SEP); i--) { upbuf[i] = toupper(pathext[i]); lobuf[i] = tolower(pathext[i]); } #endif s = strchr(&pathext[1],'/'); if (s != (char *)NULL) lenup = strlen(s); else lenup = len; for (i = len - lenup; i < len; i++) { upbuf[i] = toupper(pathext[i]); lobuf[i] = tolower(pathext[i]); } if ((file = open(pathext, mode)) < 0) { if (!DOT_FOUND) strcat(pathext, "."); if ((file = open(pathext, mode)) < 0) { strcat(pathext, ";1"); file = open(pathext, mode); } } if (file < 0) { if ((file = open(lobuf, mode)) < 0) { if (!DOT_FOUND) strcat(lobuf, "."); if ((file = open(lobuf, mode)) < 0) { strcat(lobuf, ";1"); file = open(lobuf, mode); } } } if (file < 0) { if ((file = open(upbuf, mode)) < 0) { if (!DOT_FOUND) strcat(upbuf, "."); if ((file = open(upbuf, mode)) < 0) { strcat(upbuf, ";1"); file = open(upbuf, mode); } } } return (file); #endif #endif } */ /**************************************************************************/ /* MUSE_ACCESS */ /**************************************************************************/ #if XVT_CC_PROTO int muse_access(char *path, int amode) #else int muse_access(path, amode) char *path; int amode; #endif { int acc; char pathext[SZ_FNAME]; char real_path[SZ_FNAME]; strcpy(pathext, path); muse_check_path(pathext); if (muse_fix_path_case(pathext, real_path) == 0) { return -1; } #ifdef _WINDOWS acc = _access(real_path, amode); #else acc = access(real_path, amode); #endif return acc; } /**************************************************************************/ /* MUSE_FILELENGTH */ /**************************************************************************/ #if XVT_CC_PROTO int32 muse_filelength(char *path) #else int32 muse_filelength(path) char *path; #endif { #ifdef unix struct stat buf; #endif FILE *file; int32 length; length = 0; file = muse_file_open(path, "rb"); if (file != NULL) { #ifdef _WINDOWS length = _filelength(fileno(file)); #else if (fstat(fileno(file),&buf) == 0) { length = (int32) buf.st_size; } else { length = 0; } #endif fclose(file); } return (length); } /************************************************************************/ /* MUSE_CHECK_PATH */ /************************************************************************/ void muse_check_path(path) char *path; { #ifdef unix char tpath[SZ_FNAME]; char *tp = tpath, *pp1 = path, *pp2; DIR *dir; struct dirent *de; /*fprintf(stderr, "muse_check_path: \"%s\"\n", path);*/ while (*pp1) { if (*pp1 == '/' || *pp1 == '\\') { pp1++; if (tp >= tpath + SZ_FNAME) return; *tp++ = FILE_SEP; continue; } pp2 = pp1 + 1; while (*pp2 && *pp2 != '/' && *pp2 != '\\') pp2++; if (tp >= tpath + SZ_FNAME) return; *tp = 0; /*fprintf(stderr, "muse_check_path: directory \"%s\" \"%.*s\"\n", tpath, (int)(pp2 - pp1), pp1);*/ dir = opendir(tpath); if (!dir) { /*fprintf(stderr, "muse_check_path: directory \"%s\" does not exist\n", tpath);*/ return; } while ((de = readdir(dir))) { /*fprintf(stderr, "muse_check_path: name \"%s\"\n", de->d_name);*/ if (strncasecmp(de->d_name, pp1, pp2 - pp1)) continue; if (!de->d_name[pp2 - pp1]) break; if (de->d_name[pp2 - pp1] == '.' && !de->d_name[pp2 - pp1 + 1]) break; if (de->d_name[pp2 - pp1] == ';' && de->d_name[pp2 - pp1 + 1] == '1' && !de->d_name[pp2 - pp1 + 2]) break; if (de->d_name[pp2 - pp1] == '.' && de->d_name[pp2 - pp1 + 1] == ';' && de->d_name[pp2 - pp1 + 2] == '1' && !de->d_name[pp2 - pp1 + 3]) break; } if (de) { strncpy(tp, de->d_name, tpath + SZ_FNAME - tp); tp = memchr(tp, 0, tpath + SZ_FNAME - tp); if (!tp) tp = tpath + SZ_FNAME; /*fprintf(stderr, "muse_check_path: new name \"%s\"\n", tpath);*/ } closedir(dir); if (!de) return; pp1 = pp2; } if (tp >= tpath + SZ_FNAME) return; *tp = 0; strncpy(path, tpath, SZ_FNAME); /*fprintf(stderr, "muse_check_path: returning \"%s\"\n", path);*/ #else int32 i, length; length = strlen(path); for (i = 0; i < length; i++) if (path[i] == '\\') path[i] = FILE_SEP; return; #endif } ogdi-ogdi_4_1_0/vpflib/musedir.h000066400000000000000000000025151345660466700167310ustar00rootroot00000000000000/* MUSEDIR.H */ #ifndef H_MUSEDIR #define H_MUSEDIR #ifndef INCL_XVTH #include "xvt.h" #endif #ifdef _MACHINE_ #include "machine.h" #endif #ifdef _UNIX #include #endif #ifndef _WINDOWS #ifdef _MAC #define FILE_SEP ':' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #ifdef _MSDOS #define FILE_SEP '\\' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #ifdef _UNIX #define FILE_SEP '/' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #if XVT_OS == XVT_OS_HPUX #define FILE_SEP '/' #endif #else #define FILE_SEP '\\' #define FILE_EXT1 "" #define FILE_EXT2 "" #endif #define ERRSTATUS short #ifndef STAT_SUCCESS #define STAT_SUCCESS 0 #endif #if PROTO ERRSTATUS dir_create (char*); ERRSTATUS dir_pop(char *); ERRSTATUS dir_push(char *, char *); ERRSTATUS dir_restore (char *); ERRSTATUS dir_save(char *); ERRSTATUS dir_current(char *); /* ERRSTATUS file_spec_to_string (FILE_SPEC *, char *);*/ FILE *muse_file_open (char*, char*); int muse_access (char *, int); int32 muse_filelength (char *); void muse_check_path (char*); #else ERRSTATUS dir_create (); ERRSTATUS dir_pop(); ERRSTATUS dir_push(); ERRSTATUS dir_restore (); ERRSTATUS dir_save(); ERRSTATUS dir_current(); ERRSTATUS file_spec_to_string (); FILE *muse_file_open (); int muse_access (); int muse_filelength (); void muse_check_path (); #endif #endif /* H_MUSEDIR */ ogdi-ogdi_4_1_0/vpflib/reduce2.c000066400000000000000000000574641345660466700166220ustar00rootroot00000000000000#ifndef INCL_XVTH #include #endif #include #if 0 #include #include #endif #include "machine.h" #ifndef THIN_DIG_H #include "reduce2.h" #endif //#define MAX(m,n) (((m) > (n)) ? (m) : (n)) //#define MIN(m,n) (((m) < (n)) ? (m) : (n)) #define DOCNT(i,t,n) (_d_l=n, (_d_m=(t-(i)+_d_l)/_d_l) > 0 ? _d_m : 0L ) /* General purpose tools for polyline reduction: Reduca - Closed polygon reduction which preserves small shapes. Reduc1 - Preprocessor to set up reduction parameters. Reduc2 - Douglas Peuker reduction. Xcheck - Post processing check/repair to preserve topology. Plnint - Detects intersection of polylines. -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-*- UNIT NAME: REDUCA FUNCTIONAL DESCRIPTION: Customizes Douglas-Peuker polygon reduction by changing resolution tolerance as required to prevent small areas from degenerating. INPUT FILES/PARAMETERS: in, nin - polyline of length nin relem - Resolution element length CHGMAX - Limit % area change for polygons. merc - Mercator compensation for world map OUTPUT FILES/PARAMETERS: out, nout - reduced polyline SUBROUTINES CALLED: Reduc1 - For polyline reduction PROGRAMMER: DATE OF LAST CHANGE REASON FOR CHANGE Tom Wescott NOSC April 92 Original entry Jim Bellenger SC/WGEA Dec 92 Cleaned up the FORTRAN conversion -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*- */ #define CHGMAX 0.2E0 #if XVT_CC_PROTO void Reduca (COORDS *in, int32 *nin, COORDS *out, int32 *nout, double *relem, int32 *merc) #else void Reduca (in, nin, out, nout, relem, merc) COORDS *in; int32 *nin; COORDS *out; int32 *nout; double *relem; int32 *merc; #endif { int32 i, j; double ain, aout, change, toler; double x1, x2, y1, y2; void Reduc1(); toler = *relem; /* Calculate area of input polygon. */ ain = 0.E0; if ( (in[0].x == in[*nin - 1].x) && (in[0].y == in[*nin - 1].y) ) { for (i=0; i < *nin; i++ ) { j = i + 1; if( j == *nin ) j = 0; x1 = in[i].x; x2 = in[j].x; y1 = in[i].y; y2 = in[j].y; ain = ain + 0.5E0*(x1*y2 - y1*x2); } } else { /* Leave ain = 0.0 to fully reduce all unclosed polylines. */ } /* Do Until (% change under CHGMAX) */ do { /* Reduce the polygon. */ Reduc1( in, nin, out, nout, &toler, merc ); /* Check for drastic change in area. */ if (ain == 0.0 ) change = 0.0; else { /* Calculate area of reduced polygon. */ aout = 0.0; for (i=0; i < *nout; i++) { j = i + 1; if (j == *nout ) j = 0; x1 = out[i].x; x2 = out[j].x; y1 = out[i].y; y2 = out[j].y; aout = aout + 0.5E0*(x1*y2 - y1*x2); } change = fabs( (aout - ain)/ain ); } /* Decrease the tolerance. if change too small */ if ( change > CHGMAX ) toler = toler*.707E0; } while (change > CHGMAX); /* End do */ return; } /* end of function */ /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*- UNIT NAME: REDUC1 FUNCTIONAL DESCRIPTION: Customizes Douglas-Peuker polyline reduction by breaking int32 input polylines, and defining the coordinate system used. INPUT FILES/PARAMETERS: in, nin - Polyline of length nin relem - Resolution element length merc - Mercator compensation if not 0. DLIMIT - Prohibits long output segments from reducing to two points. OUTPUT FILES/PARAMETERS: out, nout - Reduced polyline SUBROUTINES CALLED: Reduc2 - Actual D-P reduction. PROGRAMMER: DATE OF LAST CHANGE REASON FOR CHANGE Tom Wescott NOSC March 90 Original entry Jim Bellenger SC/WGEA Dec 92 Cleaned up the FORTRAN conversion -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-*/ #if XVT_CC_PROTO void Reduc1 (COORDS *in, int32 *nin, COORDS *out, int32 *nout, double *relem, int32 *merc) #else void Reduc1 (in, nin, out, nout, relem, merc) COORDS *in; int32 *nin; COORDS *out; int32 *nout; double *relem; int32 *merc; #endif { int32 i, iend, j, k, llsph, ng, nlimit; double coslat, dlimit, dmax, toler, xmax, xmin, ymax, ymin; void Reduc2(); /* Limit processing group verticies to speed (n-squared) execution. */ nlimit = 1000; /* Limit processing group span to avoid excessively long output segments. */ dlimit = 30.E0*(*relem); j = 0; iend = 0; /* Break long polylines into groups with ends (i,iend) and length (ng). While (input not exhausted) do */ do { /* SET UP PROCESSING GROUP */ toler = *relem; /* Set first point in group back to the last input point we want to keep. */ i = iend; ng = 0; xmin = in[i].x; xmax = in[i].x; ymin = in[i].y; ymax = in[i].y; dmax = 0.0; for (k=i; k < *nin; k++) { xmin = MIN( xmin, in[k].x ); xmax = MAX( xmax, in[k].x ); ymin = MIN( ymin, in[k].y ); ymax = MAX( ymax, in[k].y ); dmax = MAX( xmax - xmin, ymax - ymin ); if ( (ng >= 2) && ((dmax > dlimit) || (ng >= nlimit)) ) { /* Process group without including this point. */ break; } else { /* Update last point in group to pt. k */ ng = ng + 1; iend = k; } } /* Do a Douglas-Peuker reduction. */ if ( *merc != 0 ) { /* SET MERCATOR COMPENSATION: For low resolution output only... If Reduced resolution versions are to be used to draw mercator or similar world maps, modifying toler to decrease with latitude provides uniform display resolution. Storage penalty is slight. */ coslat = MAX( cos( in[i].y ), 0.1E0 ); toler = toler*coslat; /* Use Plane Geometry for the reduction. */ llsph = 0; } else { /* Use Spherical Geometry for the reduction. */ llsph = 1; } Reduc2 (&in[i], &ng, &out[j], nout, &toler, &llsph ); /* Insure first point survives after possible degenerate first group. */ if ( j == 0 ) { out[0].x = in[0].x; out[0].y = in[0].y; } j = j + *nout - 1; *nout = j; } while ( iend < *nin-1 ); /* End while. */ /* Insure last point survives after possible degenerate final group. */ if ( (in[*nin - 1].x != out[*nout - 1].x) || (in[*nin - 1].y != out[*nout - 1].y) ) { *nout = *nout + 1; out[*nout - 1].x = in[*nin - 1].x; out[*nout - 1].y = in[*nin - 1].y; } /* POST PROCESSING QC: Prohibit short line segments from degenerating to single points. */ if ( (*nout == 1) && ((in[0].x != in[*nin - 1].x) || (in[0].y != in[*nin - 1].y)) ) { *nout = 2; out[*nout - 1].x = in[*nin - 1].x; out[*nout - 1].y = in[*nin - 1].y; } return; } /* end of function */ /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-* UNIT NAME: REDUC2 FUNCTIONAL DESCRIPTION: DOUGLAS-PEUKER POLYLINE REDUCTION Reduces the number of verticies in a polyline by deleting those producing no effect below a specified resolution or tolerance. INPUT FILES/PARAMETERS: xin,yin,nin - Polyline of length nin. toler - Resolution element length, same units lldeg - Coordinate system to be used. = 1 Units must be in decimal degrees. Spherical trig approximated. <>1 Any units, plane geometry used. OUTPUT FILES/PARAMETERS: xout,yout,nout - reduced polyline SUBROUTINES CALLED: none. REFERENCE: Douglas & Peucker, Canadian Cartographer 1973 PROGRAMMER: DATE OF LAST CHANGE REASON FOR CHANGE Tom Wescott NOSC March 90 Original entry Jim Bellenger SC/WGEA Dec 92 Cleaned up the FORTRAN conversion Dan Maddux SC/WGEA 15 Apr 93 Dynamic allocation -*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-*/ #define MXVRT 10000 #if XVT_CC_PROTO void Reduc2 (COORDS *in, int32 *nin, COORDS *out, int32 *nout, double *toler, int32 *lldeg) #else void Reduc2 (in, nin, out, nout, toler, lldeg) COORDS *in; int32 *nin; COORDS *out; int32 *nout; double *toler; int32 *lldeg; #endif { int32 aptr, fptr, maxptr, stkptr, tptr, *stack; double coslat, rlat; double a, b, cterm, dist2, len2, maxd2, numerator, toler2, xa, xf, xt, ya, yf, yt; double pi=4.E0/atan(1.E0); /* Allocate stack */ stack = (int32*)xvt_malloc (MXVRT * sizeof (int32)); /* Initialize the pointers for the anchor,tester and float pts. */ *nout = 0; aptr = 0; fptr = *nin - 1; stkptr = 0; maxptr = 0; toler2 = *toler**toler; if ( *lldeg == 1 ) { /* Set an abcissa multiplier to approximate meridian convergence. */ rlat = in[0].y *pi/180.E0; coslat = cos( rlat ); } else { /* Set a constant multiplier to calculate distances in Plane Geometry. */ coslat = 1.E0; } /* While (line not finished) do */ while (1) { /* Set the anchor and float points. */ xa = in[aptr].x *coslat; ya = in[aptr].y; xf = in[fptr].x *coslat; yf = in[fptr].y; /* Calculate constant constant values associated with line segment AF (components, length squared, & cross term.) */ a = xf - xa; b = yf - ya; len2 = a*a + b*b; cterm = yf*xa - ya*xf; /* Identify the intermediate point furthest from line segment AF. */ maxd2 = 0.E0; for (tptr=aptr+1; tptr < fptr-1; tptr++ ) { /* get a test point */ xt = in[tptr].x *coslat; yt = in[tptr].y; /* Calculate distance squared perpendicular to line segment AF. */ if ( (a != 0.E0) || (b != 0.E0) ) { numerator = yt*a - xt*b + cterm; dist2 = numerator*numerator/len2; } else { dist2 = (xt - xa)*(xt - xa) + (yt - ya)*(yt - ya); } if ( dist2 > maxd2 ) { maxptr = tptr; maxd2 = dist2; } } if ( maxd2 > toler2 ) { /* The tolerance has been exceeded, push this floater onto the stack, and reset float point to the max distance point. */ stkptr = stkptr + 1; if ( stkptr > MXVRT ) { xvt_note ("Reduc2: stack blew up" ); } stack[stkptr-1] = fptr; fptr = maxptr; } else { /* The tolerance has been met. Output the current anchor point. */ *nout = *nout + 1; out[*nout - 1].x = in[aptr].x; out[*nout - 1].y = in[aptr].y; if ( stkptr == 0 ) { /* Output the final float point and exit. */ if ( (*nout > 1) || ((pow(in[0].x - in[fptr].x, 2.E0) + pow(in[0].y - in[fptr].y, 2.E0)) > toler2) ) { *nout = *nout + 1; out[*nout - 1].x = in[fptr].x; out[*nout - 1].y = in[fptr].y; } /* Free the stack */ if (stack) xvt_free ((char*)stack); return; } else { /* Change the current float point into the new anchor point. */ aptr = fptr; /* Pop the stack to get the next floater. */ fptr = stack[stkptr-1]; stkptr = stkptr - 1; } } } /* End while */ } /* end of function */ #if 0 /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-* UNIT NAME: Xcheck FUNCTIONAL DESCRIPTION: Post processing QC/Repair for polyline reduction. Takes precaution against creating a self or mutual crossing condition in the output polyline(s). Plane geometry is used to detect intersections. !? Repair is done by replacing as many points from original polyline as reqd to eliminate crossings. INPUT FILES/PARAMETERS: xr,yr,nr - Reduced polyline. xo,yo,no - Original unreduced version of xr,yr xc,yc,nc - Polyline to be checked for crossings. (may be a copy of xr,yr) OUTPUT FILES/PARAMETERS: xr,yr,nr - Reduced polyline (crossings removed) ierror - Reports a failed correction. (may have had crossing in original) SUBROUTINES CALLED: plnint - Counts line-polyline intersections. PROGRAMMER: DATE OF LAST CHANGE REASON FOR CHANGE Tom Wescott NOSC March 92 Original entry Jim Bellenger SC/WGEA Dec 92 Cleaned up the FORTRAN conversion -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-*/ #define BIG 1.0E99 void Xcheck(int32 *idr, double *xr, double *yr, int32 *nr, double *xo, double *yo, int32 *no, int32 *idc, double *xc, double *yc, int32 *nc, int32 *ierror) { int32 i, j, k, iend, istep, istr, ivrt, lcross, len, line, loop, lstart, m, maxints, maxlin, n, ncross, ndelet, nints, nreplc; int32 _d_l, _d_m, _do4, _do5; double tx[MXVRT], ty[MXVRT], x1, x2, xcmax, xcmin, xmax, xmin, xrmax, xrmin, y1, y2, ycmax, ycmin, ymax, ymin, yrmax, yrmin; void Plnint(); char string[256]; *ierror = 0; loop = 0; if ( (*nr >= 2) && (*nc > 2) ) { /* Use minimax test to screen cases where intersection is impossible. */ xrmin = BIG; yrmin = BIG; xrmax = -BIG; yrmax = -BIG; for (i=0; i<*nr; i++ ) { xrmin = MIN( xmin, xr[i] ); yrmin = MIN( ymin, yr[i] ); xrmax = MAX( xmax, xr[i] ); yrmax = MAX( ymax, yr[i] ); } xcmin = BIG; ycmin = BIG; xcmax = -BIG; ycmax = -BIG; for (i=0; i<*nc; i++) { xcmin = MIN( xmin, xc[i] ); ycmin = MIN( ymin, yc[i] ); xcmax = MAX( xmax, xc[i] ); ycmax = MAX( ymax, yc[i] ); } if ( (((xrmax > xcmin) && (xrmin < xcmax)) && (yrmax > ycmin)) && (yrmin < ycmax) ) { while (1) { /* Exhaustive check from first line segment begins here. */ lstart = 1; ncross = 0; while (1) { /* Check from next unrepaired segment begins here. */ loop = loop + 1; /* Find the line segment with the most crossings. */ maxints = 0; maxlin = 0; lcross = 0; for ( line = lstart; line < *nr-1; line++ ) { x1 = xr[line]; y1 = yr[line]; x2 = xr[line + 1]; y2 = yr[line + 1]; if ( *idr != *idc ) Plnint( &x1, &y1, &x2, &y2, xc, yc, nc, &nints ); else Plnint( &x1, &y1, &x2, &y2, xr, yr, nr, &nints ); if ( nints > 0 ) lcross = lcross + 1; if ( nints > maxints ) { maxints = nints; n = line; } } if ( maxints > 0 ) { /* Repair bad line segment with the most crossings. */ x1 = xr[n - 1]; y1 = yr[n - 1]; x2 = xr[n]; y2 = yr[n]; if ( *idr != *idc ) Plnint( &x1, &y1, &x2, &y2, xc, yc, nc, &nints ); else Plnint( &x1, &y1, &x2, &y2, xr, yr, nr, &nints ); ncross = ncross + nints; if ( nints > 0 ) { xvt_note (" SID %d Reduced line%d crosses%d lines in SID %d loop# %d \n", *idr, n, nints, *idc, loop ); /* Find ends of bad segment in input polyline. */ istr = MXVRT; for ( j=0; j < *no; j++) { if ( istr == MXVRT ) { if ( (x1 == xo[j]) && (y1 == yo[j]) ) istr = j; } else { if ( (x2 == xo[j]) && (y2 == yo[j]) ) iend = j; } } ndelet = iend - istr - 1; xvt_note (" Repairing segment,str,end = %d %d %d SID = %d \n", n, istr, iend, *idr ); /* Generate a more accurate replacement for the bad segment. Inserting a single central input point in the segment on each iteration results in near minimum length polylines. */ istep = MAX( 1, (iend - istr)/2 ); len = 0; for ( ivrt = istr, _do4=DOCNT(istr,iend,_do5=istep); _do4 > 0; ivrt += _do5, _do4-- ) { len = len + 1; tx[len - 1] = xo[ivrt]; ty[len - 1] = yo[ivrt]; } nreplc = len - 2; if ( nreplc > 0 ) { /* Push rest of polyline down its buffer and replace deletes. */ for ( j = *nr; j >= n+1; j-- ) { xr[j + nreplc] = xr[j]; yr[j + nreplc] = yr[j]; } for ( k=0; k < nreplc; k++ ) { xr[n + k] = tx[1 + k]; yr[n + k] = ty[1 + k]; xvt_note (" Replaced input pt %d (x,y) = %g %g \n", istr + k*istep, xr[n + k], yr[n + k] ); } *nr = *nr + nreplc; xvt_note (" Number of points in,out = %d %d SID = %d \n", *no, *nr, *idr ); /* Polyline modified. Repeat crossing check from beginning. */ if ( loop <= (*nr - 1) ) break; } else { /* No modification. Continue crossing check from next line. */ lstart = n + 1; if ( loop <= (*nr - 1) ) continue; } } } if ( ncross != 0 ) { m = m + 1; sprintf (string," **** Error # %d SID = %d \n", m, *idr ); note (string); *ierror = 2; } } } } } return; } /* end of function */ /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*-* UNIT NAME: PLNINT FUNCTIONAL DESCRIPTION: Counts crossings of a line segment by a polyline. INPUT FILES/PARAMETERS: x1,y1, x2,y2 - Line segment. x(n),y(n),len - Polyline arrays. LOCAL VARIABLES: xi,yi - Current point in input polyline. xprv,yprv - Previous point. s1, s2 - Sign of sN tells half plane. dX, dY, D - Coefficients of test line in form: dY*x - dX*y + D = 0 ddx,ddy,dd - Coefs of polyline segment. OUTPUT: nint - Number of crossings. PROGRAMMER: DATE OF LAST CHANGE REASON FOR CHANGE Tom Wescott (NOSC) Jan 89 Original code Jim Bellenger SC/WGEA Dec 92 Cleaned up the FORTRAN conversion -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*|*-*-*- */ void Plnint (double *x1, double *y1, double *x2, double *y2, double *x, double *y, int32 *len, int32 *nints) { int32 inptr; double s1, s2, s3, s4; double ax, ay, bx, by, d, dd, ddx, ddy, dx, dy, xi, xprv, yi, yprv; /* NOTE: This test requires high precision arithmetic when applied to short segmented polylines. */ *nints = 0; ax = *x1; ay = *y1; bx = *x2; by = *y2; /* Compute vector (also half plane) general form coefficients from directed line segment (ax,ay) to (bx,by). */ dy = ay - by; dx = ax - bx; d = ax*by - ay*bx; /* Initialize counters, and set up loop with previous point. */ inptr = 0; xprv = x[inptr]; yprv = y[inptr]; s1 = dy*xprv - dx*yprv + d; /* Count intersections of directed segment and polyline. While (verts remain) do. */ while (1) { inptr = inptr + 1; if ( inptr >= *len ) break; xi = x[inptr]; yi = y[inptr]; s2 = dy*xi - dx*yi + d; /* Perform initial screen to insure polyline segment crosses line segmemt. */ if ( (s1 <= 0.E0) && (s2 <= 0.E0) ) { /* Do nothing. */ } else if( (s1 >= 0.E0) && (s2 >= 0.E0) ) { /* Do nothing. */ } else { /* Secondary screen to insure line segment crosses polyline segment. */ ddx = xprv - xi; ddy = yprv - yi; dd = xprv*yi - yprv*xi; s3 = ddy*ax - ddx*ay + dd; s4 = ddy*bx - ddx*by + dd; if ( (s3 >= 0.E0) && (s4 >= 0.E0) ) { /* No cross. */ } else if ( (s3 <= 0.E0) && (s4 <= 0.E0) ) { /* No cross */ } else { *nints = *nints + 1; } } if ( s2 != 0.E0 ) s1 = s2; xprv = xi; yprv = yi; } /* End while. */ return; } /* end of function */ #endif /* if 0 */ ogdi-ogdi_4_1_0/vpflib/set.c000066400000000000000000000623121345660466700160500ustar00rootroot00000000000000/************************************************************************* * *N Module SET.C * Purpose: * This module contains functions that make up an abstract data type * "set". The data structures and algorithms herein allow programs * to perform basic manipulations defined in the mathematics of set * theory. These operations are fundamental to relational database * theory, as well. * * Sets are initialized with a user-defined size, and elements in * the set may be accessed from 0 up to and including the given * set size. All sets passed into functions in this module are * expected to have been initialized with set_init(). * Parameters: * N/A * External Variables: * None * Functions Called: * set_type set_init( int32 n ); * int set_empty( set_type set ); * void set_insert( int32 element, set_type set ); * void set_delete( int32 element, set_type set ); * int set_member( int32 element, set_type set ); * int32 set_min( set_type set ); * int32 set_max( set_type set ); * int num_in_set( set_type set ); * void set_on( set_type set ); * void set_off( set_type set ); * int set_equal( set_type a, set_type b ); * void set_assign( set_type *a, set_type b ); * set_type set_union( set_type a, set_type b ); * set_type set_intersection( set_type a, set_type b ); * set_type set_difference( set_type a, set_type b ); * void set_nuke( set_type *set ); *************************************************************************/ #ifndef INCL_XVTH #include "xvt.h" #endif #ifdef _MSDOS #ifndef _WINDOWS #include #include #include #include #endif #else #include #endif #include #include #ifndef __SET_H__ #include "set.h" #endif #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif static unsigned char checkmask[] = {254,253,251,247,239,223,191,127}; static unsigned char setmask[] = {1,2,4,8,16,32,64,128}; #define BITSET(bit,byte) ((byte | checkmask[bit]) ^ checkmask[bit]) #define SET_BIT(bit,byte) (byte | setmask[bit]) /* Warning: UNSET_BIT should only be called if the bit is not already set. If it is already set, this macro may actually turn the bit on. */ #define UNSET_BIT(bit,byte) (byte ^ setmask[bit]) /* The number of bytes in the set. The byte buffer should only access bytes 0 through (NBYTES(set)-1). */ #define NBYTES(set) ((set.size>>3L) + 1L) #ifndef max #define max(a,b) ( (a > b) ? a : b ) #endif /* #define BOUNDSCHECK 1 */ #ifdef PROTO static char set_byte (int32 nbyte, set_type set) #else static char set_byte (nbyte, set) int32 nbyte; set_type set; #endif { if ( (nbyte < 0) || (nbyte >= NBYTES(set)) ) return 0; return set.buf[nbyte]; } #define SET_BYTE( nbyte, set, byte ) \ if ( (nbyte < 0) || (nbyte >= NBYTES(set)) ) \ byte = 0; \ else \ byte = set.buf[nbyte]; /************************************************************************* * set_off * Purpose: * Parameters: * set == (set_type) set to be acted upon. * External Variables: * Functions Called: * None *************************************************************************/ #ifdef PROTO void set_off (set_type set) #else void set_off (set) set_type set; #endif { #if 0 memset(set.buf,0,NBYTES(set)); #endif gmemset (set.buf, 0, NBYTES (set)); } /************************************************************************* * *N set_on * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Turns each element in the set 'on'. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type) set to be acted upon. * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *************************************************************************/ #ifdef PROTO void set_on (set_type set) #else void set_on (set) set_type set; #endif { register int32 i; unsigned char byte=255; /* Turn on all bits up through set.size. */ /* All but the last byte. */ #if 0 memset(set.buf,byte,(set.size>>3L)); #endif gmemset (set.buf, byte, (set.size>>3L)); /* The valid bits of the last byte. */ for (i=(set.size>>3L)*8L;i<=set.size;i++) set_insert(i,set); } /************************************************************************* * *N set_init * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Initialize the set for 'n' elements. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * n == (int32) maximum number of elements in the set. * return == (set_type) initialized set. * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F *************************************************************************/ #ifdef PROTO set_type set_init (int32 n) #else set_type set_init (n) int32 n; #endif { set_type s; int32 nbytes; s.size = n; nbytes = NBYTES(s); #if 1 /* Passe passe a thomas !!! LAS inc.*/ s.buf = (char*)xvt_zmalloc (nbytes+1L); s.buf_handle = s.buf; #else s.buf_handle = galloc (nbytes+1L); s.buf = glock (s.buf_handle); #endif if (s.buf == (char*)NULL) { xvt_error ("SET_INIT: Out of Memory!"); } set_off(s); return s; } /************************************************************************* * *N set_empty * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns TRUE if the given set is empty; else it * returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type) set. * return == (int) TRUE[1] or FALSE[0]. * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *************************************************************************/ #ifdef PROTO int set_empty (set_type set) #else int set_empty (set) set_type set; #endif { register int32 i, nbytes; nbytes = NBYTES(set); for (i=0;i == (int32) element to insert into the set. * set == (set_type) set. * External Variables: * None * Functions Called: * None *************************************************************************/ #ifdef PROTO void set_insert (int32 element, set_type set) #else void set_insert (element, set) int32 element; set_type set; #endif { int32 nbyte,bit; unsigned char byte; if ((element < 0) || (element > set.size)) { return; } nbyte = element >> 3L; /* element/8 */ bit = element % 8L; SET_BYTE (nbyte, set, byte); byte = SET_BIT (bit, byte); set.buf[nbyte] = byte; } /************************************************************************* * *N set_delete * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function deletes the given element from the specified set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * element == (int32) element to delete from the set. * set == (set_type) set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void unset_bit() BITSTUFF.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO void set_delete (int32 element, set_type set) #else void set_delete (element, set) int32 element; set_type set; #endif { int32 nbyte,bit; unsigned char byte; if ((element<0)||(element>set.size)) { #ifdef BOUNDSCHECK fprintf(stderr,"Invalid call to set_delete!\n"); exit(1); #endif return; } nbyte = element>>3L; /* element/8 */ bit = element%8L; SET_BYTE(nbyte,set,byte); if (!BITSET(bit,byte)) return; byte = UNSET_BIT(bit,byte); set.buf[nbyte] = byte; } /************************************************************************* * *N set_member * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether a given element is a member of * the specified set. It returns either TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * element == (int32) element to check in the set. * set == (set_type) set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void bitset() BITSTUFF.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO int set_member (int32 element, set_type set) #else int set_member (element, set) int32 element; set_type set; #endif { int32 nbyte,bit; unsigned char byte; if ((element < 0)||(element > set.size)) return FALSE; nbyte = element>>3L; /* element/8L */ bit = element%8L; SET_BYTE(nbyte,set,byte); return BITSET(bit,byte); } /************************************************************************* * *N set_min * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the minimum element in the given set. * If the set is empty, the return value is MAXLONG. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type) set. * return == (int32) minimum element in the set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void bitset() BITSTUFF.C * int set_empty( set_type set ) SET.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO int32 set_min (set_type set) #else int32 set_min (set) set_type set; #endif { register int32 nbyte, bit, element, nbytes; unsigned char byte = ' '; if (!set.size) return (int32) MAXLONG; /* Find the first byte with a bit set */ nbytes = NBYTES(set); for (nbyte=0;nbyte set.size) return (int32) MAXLONG; if (BITSET(bit,byte)) return element; } return (int32) MAXLONG; } /************************************************************************* * *N set_max * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the maximum element in the given set. * If the set is empty, the return value is -MAXLONG. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type) set. * return == (int32) maximum element in the set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C * Brian Glover Nov 1992 MDB upgrade *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO int32 set_max (set_type set) #else int32 set_max (set) set_type set; #endif { register int32 bytenum, bit, nbytes; unsigned char byte; if (!set.size) return (int32) -MAXLONG; /* Find the last byte with a bit set */ nbytes = NBYTES(set); bytenum = nbytes; for (bytenum=bytenum-1;bytenum>=0;bytenum--) { if (set.buf[bytenum]) { byte = set.buf[bytenum]; break; } } if (bytenum < 0) return (int32) -MAXLONG; for (bit=7;bit>=0;bit--) { if (BITSET(bit,byte)) { return ((bytenum*8L)+bit); } } return (int32) -MAXLONG; } /************************************************************************* * *N num_in_set * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the number of elements in the given set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type) set. * return == (int32) number of elements in the set. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void bitset() BITSTUFF.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO int32 num_in_set (set_type set) #else int32 num_in_set (set) set_type set; #endif { register int32 nbyte,bit,n=0L, nbytes; unsigned char byte; if (set.size == 0) return n; nbytes = NBYTES(set); for (nbyte=0;nbyte == (set_type) first set to compare. * b == (set_type) second set to compare. * return == (int) TRUE if (a==b) or FALSE if (a!=b). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO int set_equal (set_type a, set_type b) #else int set_equal (a, b) set_type a, b; #endif { if (a.size != b.size) return FALSE; if (memcmp(a.buf,b.buf,NBYTES(a))==0) return TRUE; else return FALSE; } /************************************************************************* * *N set_assign * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function assigns set a to be equal to set b. If a and b are * different sizes, the function will reallocate a to match b. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * a == (set_type *) set to be assigned. * b == (set_type) set to assign to a. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO void set_assign (set_type *a, set_type b) #else void set_assign (a, b) set_type *a, b; #endif { register int32 nbytes; nbytes = NBYTES(b); if (a->size == b.size) { memcpy(a->buf,b.buf,nbytes); } else { /* a and b are different sizes */ a->buf = (char *)xvt_realloc(a->buf,nbytes+1L); if (!a->buf) { fprintf(stderr,"Memory reallocation error in set_assign\n"); exit(1); } memcpy(a->buf,b.buf,nbytes); a->size = b.size; } } /************************************************************************* * *N set_union * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Return the set C such that C = (A U B). C is initialized within * this function, and should be nuked when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * a == (set_type) set to be unioned. * b == (set_type) set to be unioned. * return == (set_type) (A U B). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * set_type set_init() SET.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO set_type set_union (set_type a, set_type b) #else set_type set_union (a, b) set_type a, b; #endif { register int32 i, nbytes; set_type c; c = set_init( (int32)max(a.size,b.size) ); nbytes = NBYTES(c); for (i=0;i == (set_type) set to be intersectioned. * b == (set_type) set to be intersectioned. * return == (set_type) (A o B). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * set_type set_init() SET.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO set_type set_intersection (set_type a, set_type b) #else set_type set_intersection (a, b) set_type a, b; #endif { register int32 i, nbytes; set_type c; c = set_init( (int32)max(a.size,b.size) ); nbytes = NBYTES(c); for (i=0;i == (set_type) set to subtract from. * b == (set_type) set to be subtracted. * return == (set_type) (A - B). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * set_type set_init() SET.C * int set_member() SET.C * void set_insert() SET.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO set_type set_difference (set_type a, set_type b) #else set_type set_deffenence (a, b) set_type a, b; #endif { register int32 i; set_type c; c = set_init( a.size ); for (i=0;i<=a.size;i++) { if ( i > b.size ) { if (set_member(i,a)) set_insert( i, c ); } else { if ((set_member(i,a)) && (!set_member(i,b))) set_insert(i,c); } } return c; } /************************************************************************* * *N set_nuke * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Nucleate a set from existence. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * set == (set_type *) set to be nuked. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels July 1990 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This function conforms to ANSI C standards. *E *************************************************************************/ #ifdef PROTO void set_nuke (set_type *set) #else void set_nuke (set) set_type *set; #endif { if (set->buf) #if 0 xvt_free (set->buf); #endif { // gunlock (set->buf_handle); gfree (set->buf_handle); } set->size = -1; } ogdi-ogdi_4_1_0/vpflib/set.h000066400000000000000000000034521345660466700160550ustar00rootroot00000000000000/* ===================================================================== Environmental Systems Research Institute (ESRI) Applications Programming Project: VPF display software Original Coding: Barry Micheals November 1990 PC version Modifications: David Flinn October 1991 UNIX ================================================================= */ #ifndef __SET_H__ #define __SET_H__ #include "xvt.h" #include "machine.h" /* A set is represented as an array of characters with each character */ /* holding 8 bits of the set. */ typedef struct { int32 size; char /*huge*/ *buf; GHANDLE buf_handle; } set_type; /* Functions: */ #ifdef PROTO set_type set_init (int32 n); int set_empty (set_type set); void set_insert (int32 element, set_type set); void set_delete (int32 element, set_type set); int set_member (int32 element, set_type set); int32 set_min (set_type set); int32 set_max (set_type set); int32 num_in_set (set_type set); void set_on (set_type set); void set_off (set_type set); int set_equal (set_type a, set_type b); void set_assign (set_type *a, set_type b); set_type set_union (set_type a, set_type b); set_type set_intersection (set_type a, set_type b); set_type set_difference (set_type a, set_type b); void set_nuke (set_type *set); #else set_type set_init (); int set_empty (); void set_insert (); void set_delete (); int set_member (); int32 set_min (); int32 set_max (); int32 num_in_set (); void set_on (); void set_off (); int set_equal (); void set_assign (); set_type set_union (); set_type set_intersection (); set_type set_difference (); void set_nuke (); #endif /* If PROTO */ #endif /* ifdef __SET_H__ */ ogdi-ogdi_4_1_0/vpflib/strfunc.c000066400000000000000000000253061345660466700167430ustar00rootroot00000000000000 /*****************************************************************************/ /* STRFUNC */ /* */ /* Purpose: */ /* This module contains functions some additional character string */ /* handling functions beyond the standard C string libraries. */ /* The strings passed in to each of these functions is actually */ /* modified and an identical string is returned. */ /* Contents: */ /* strupr */ /* strlwr */ /* strreverse */ /* leftjust */ /* rightjust */ /* justify */ /* Mstrcmpi */ /* Mstrncmpi */ /*****************************************************************************/ #ifndef INCL_XVTH #include #endif #ifdef _UNIX #include #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif /*****************************************************************************/ /* strupr */ /* */ /* Purpose: */ /* This function changes all lowercase characters in a string to */ /* uppercase. */ /* */ /* Parameters: */ /* string == (char *) string to be made uppercase. */ /* strupr == (char *) pointer to string. */ /* */ /*****************************************************************************/ #ifdef PROTO char *strupr (char *string) #else char *strupr (string) char *string; #endif { size_t i; if (!string) return string; for (i=0; i == (char *) string to be made uppercase. */ /* strupr == (char *) pointer to string. */ /* */ /*****************************************************************************/ #ifdef PROTO char *strlwr (char *string) #else char *strlwr (string) char *string; #endif { size_t i; if (!string) return string; for (i=0; i == (char *) string to be reversed. * strreverse == (char *) pointer to string. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Brian Glover April 1992 Rewrite of non-ANSI function *E *************************************************************************/ #ifdef PROTO char *strreverse (char *str) #else char *strreverse (str) char *str; #endif { size_t i, len; char *copy; len = strlen (str); copy = (char*)xvt_malloc (sizeof(char) * (len+1)); strcpy (copy, str); for (i=0; i == (char *) string to be left justified. */ /* leftjust == (char *) pointer to string. */ /*****************************************************************************/ #ifdef PROTO char *leftjust (char *str) #else char *leftjust (str) char *str; #endif { register char * eol; const char *post_white; if (!str) return str; post_white = str + strspn(str, " \t\n\b"); if( post_white != str ) { memmove( str, post_white, strlen(post_white)+1 ); } if ((eol = strchr (str, '\n')) != NULL) *eol = 0; return str; } /*****************************************************************************/ /* rightjust */ /* */ /* Purpose: */ /* This function right justifies a string by removing all trailing */ /* whitespace. */ /* */ /* Parameters: */ /* string == (char *) string to be right justified. */ /* rightjust == (char *) pointer to string. */ /*****************************************************************************/ #ifdef PROTO char *rightjust (char *str) #else char *rightjust (str) char *str; #endif { size_t len, i; len = strlen (str); if (len == 0) return str; i = len - 1; while ((i>0) && ((str[i]==0) || (str[i]==' '))) i--; if (i < (len-1)) str[i+1] = '\0'; for (i=0; i == (char*) string to be left justified. */ /* justify == (char*) pointer to string. */ /*****************************************************************************/ #ifdef PROTO char *justify (char *str) #else char *justify (str) char *str; #endif { str = leftjust (str); str = rightjust (str); return (str); } /*****************************************************************************/ /* Mstrcmpi */ /* MUSE platform independent form of a case insensitive string compare */ /*****************************************************************************/ #ifdef PROTO int Mstrcmpi (const char* string1, const char *string2) #else int Mstrcmpi (string1, string2) const char *string1; const char *string2; #endif { int value; #ifdef _MAC value = strcmpi ((char*)string1, (char*)string2); #elif defined(_HPUX_SOURCE) || defined(_UNIX) value = strcasecmp (string1, string2); #else value = stricmp (string1, string2); #endif return (value); } /*****************************************************************************/ /* Mstrncmpi */ /* MUSE platform independent form of a function to compare a portion of */ /* two strings without regard to case. */ /*****************************************************************************/ #ifdef PROTO int Mstrncmpi (const char* string1, const char *string2, size_t size) #else int Mstrncmpi (string1, string2, size) const char *string1; const char *string2; size_t size; #endif { int value; #ifdef _MAC value = strncmpi ((char*)string1, (char*)string2, size); #elif defined(_WINDOWS) value = strnicmp (string1, string2, size); #else value = strncasecmp (string1, string2, size); #endif return (value); } ogdi-ogdi_4_1_0/vpflib/strfunc.h000066400000000000000000000023241345660466700167430ustar00rootroot00000000000000#ifndef __STRFUNC_H__ #define __STRFUNC_H__ #include "stdio.h" #include #define VPF_SEPARATOR '\\' #define VPF_SEPARATOR_STRING "\\" #ifdef _MSDOS #define OS_SEPARATOR '\\' #define OS_SEPARATOR_STRING "\\" #define DIR_SEPARATOR '\\' #endif #ifdef _UNIX #define OS_SEPARATOR '/' #define OS_SEPARATOR_STRING "/" #define DIR_SEPARATOR '/' #endif #ifdef _MAC #define OS_SEPARATOR ':' #define OS_SEPARATOR_STRING ":" #define DIR_SEPARATOR ':' #endif /* Functions: */ #ifdef PROTO char *strupr( char *str); char *strlwr( char *str); char *leftjust( char *str); char *rightjust( char *str); char *justify (char *str); int Mstrcmpi (const char *string1, const char *string2); int Mstrncmpi (const char *string1, const char *string2, size_t size); #elif _MSC_VER #include char *leftjust( char *str); char *rightjust( char *str); char *justify (char *str); int Mstrcmpi (const char *string1, const char *string2); int Mstrncmpi (const char *string1, const char *string2, size_t size); #else char *strupr (); char *strlwr (); char *leftjust (); char *rightjust (); char *justify (); int Mstrcmpi (); int Mstrncmpi (); #endif #endif /* ifdef __STRFUNC_H__ */ ogdi-ogdi_4_1_0/vpflib/vec_d.h000066400000000000000000000111301345660466700163320ustar00rootroot00000000000000#ifndef H_VEC_D #define H_VEC_D #ifndef H_MUSE1 #include "muse1.h" #endif #ifndef H_VIEW_DEF #include "view_d.h" #endif #ifndef _WINDOWS #ifndef H_PHIGS_D #include "phigs_d.h" #endif #endif #ifndef __VPF_H__ /* VPF feature types */ typedef enum { LINE=1, AREA, ANNO, POINTS, COMPLEX=6 } vpf_feature_type; #endif #define MAGIC_VEC2_DATA 120000002L #define MAXPOINTS 16000 #define MAXLINES 16000 #define MAXAREAS 16000 #define MAXTEXT 16000 #define MAXRINGS 5000 #define MAXSEGS 5000 #define MAXCOORDS 5000 #define MAXSTRING 80 #define SZ_VEC 60 #define SZ_VEC_EXTENTS 32 #define SZ_VEC_LINES 4 #define SZ_VEC_TEXT 4 #define SZ_VEC_POINTS 4 #define SZ_VEC_AREAS 4 #define SZ_VEC_SYMBOLOGY 16 #define SZ_VEC_INFO 8 #define SZ_SYMB_LINES 20 #define SZ_SYMB_TEXT 16 #define SZ_SYMB_POINTS 16 #define SZ_SYMB_AREAS 10 #define SZ_COORDINATE 16 #define SZ_LONG 4 #define SZ_DOUBLE 8 /*************************************************************** @ FEATURE_EDIT_FLAGS **************************************************************** A set of flags used in feature editing. */ typedef struct { BOOLEAN selected; /*TRUE if selected*/ BOOLEAN deleted; /*TRUE if flagged for deletion*/ BOOLEAN modified; /*TRUE if recently modified*/ } FEATURE_EDIT_FLAGS; /* Description: */ /*************************************************************** @ COORDINATE **************************************************************** Geospatial coordinate pair. */ typedef struct { float x; float y; } COORDINATE; /* Description: */ /*************************************************************** @ SEGMENT **************************************************************** Line/edge segment. */ typedef struct { int32 id; int32 nr_coords; COORDINATE *coords; } SEGMENT; /* Description: */ /*************************************************************** @ POINT_FEATURE **************************************************************** Point Feature structure. */ typedef struct { int32 id; COORDINATE *coord; FEATURE_EDIT_FLAGS flags; } POINT_FEATURE; /* Description: */ /*************************************************************** @ LINE_FEATURE **************************************************************** Line Feature structure. */ typedef struct { int32 id; int32 nr_segs; SEGMENT **segs; FEATURE_EDIT_FLAGS flags; } LINE_FEATURE; /* Description: */ /*************************************************************** @ RING **************************************************************** Ring structure. */ typedef struct { int32 id; int32 nr_segs; SEGMENT **segs; } RING; /* Description: */ /*************************************************************** @ AREA_FEATURE **************************************************************** Area Feature structure. */ typedef struct { int32 id; int32 nr_rings; RING **rings; FEATURE_EDIT_FLAGS flags; } AREA_FEATURE; /* Description: */ /*************************************************************** @ TEXT_FEATURE **************************************************************** Text Feature structure. */ typedef struct { int32 id; char *string; int32 nr_coords; COORDINATE *coords; FEATURE_EDIT_FLAGS flags; } TEXT_FEATURE; /* Description: */ /**************************************************************************** @ VEC_EXTENT ***************************************************************************** Spatial extents of the data-set. */ typedef struct { double xmin; double ymin; double xmax; double ymax; } VEC_EXTENT; /* Description: */ /**************************************************************************** @ VEC_INFO ***************************************************************************** Spatial extents of the data-set. */ typedef struct { char *type; char *info; } VEC_INFO; /*********************************************************************** @ VEC ************************************************************************ A MUSE structure to hold vector overlay data. */ typedef struct { int32 magic; vpf_feature_type feature_type; int32 nr_features; int32 nr_lines; int32 nr_text; int32 nr_points; int32 nr_areas; VEC_EXTENT *extents; VEC_INFO *info; LINE_FEATURE **lines; TEXT_FEATURE **text; POINT_FEATURE **points; AREA_FEATURE **areas; } VEC; /* Description: */ #endif /* H_VEC_DEF */ ogdi-ogdi_4_1_0/vpflib/vpf.h000066400000000000000000000033571345660466700160610ustar00rootroot00000000000000/* VPF.H */ #ifndef __VPF_H__ #define __VPF_H__ 1 #ifndef _MACHINE_ #include "machine.h" #endif /* Define some standard VPF-related data types and structures */ /* Currently supported VPF versions */ typedef enum { VPF_0_7, VPF_0_8, VPF_0_9, VPF_1_0 } vpf_version_type; /* VPF feature types */ typedef enum { LINE=1, AREA, ANNO, VPFPOINTS, VPFCOMPLEX=6 } vpf_feature_type; /* VPF primitive types */ typedef enum { EDGE=1, FACE, TEXT, ENTITY_NODE, CONNECTED_NODE } vpf_primitive_type; typedef struct { unsigned char edge; unsigned char face; unsigned char text; unsigned char entity_node; unsigned char connected_node; } primitive_class_type; typedef enum { UNKNOWN_SECURITY, UNCLASSIFIED, RESTRICTED, CONFIDENTIAL, SECRET, TOP_SECRET } security_type; /* Units of measure */ typedef enum { UNKNOWN_UNITS, METERS, FEET, INCHES, KILOMETERS, OTHER_UNITS, DEC_DEGREES } vpf_units_type; /* Map coordinate projection definitions */ typedef enum { DDS, /* Decimal Degrees */ AC, /* Albers Equal Area */ AK, /* Azimuthal Equal Area */ AL, /* Azimuthal Equal Distance */ GN, /* Gnomonic */ LE, /* Lambert Conformal Conic */ LJ, /* Lambert (Cylindrical) Equal Area */ MC, /* Mercator */ OC, /* Oblique Mercator */ OD, /* Orthographic */ PG, /* Polar Stereographic */ TC, /* Transverse Mercator */ UT, /* UTM */ PC /* Plate-Carree */ } vpf_projection_code; typedef struct { vpf_projection_code code; double parm1, parm2, parm3, parm4; vpf_units_type units; double false_easting, false_northing; int32 (*forward_proj)(); int32 (*inverse_proj)(); char name[21]; } vpf_projection_type; typedef unsigned char boolean; #endif ogdi-ogdi_4_1_0/vpflib/vpf2vec.c000066400000000000000000001504131345660466700166300ustar00rootroot00000000000000/**************************************************************************/ /* VPF2VEC.C */ /* */ /* Contents: */ /* vpf2vec.c */ /* get_features */ /* get_selected_tile_primitives */ /* primitives_within_extent */ /* get_tile_set */ /* bit_fix */ /* */ /**************************************************************************/ #include "xvt.h" #include "vpf.h" #include "vpfview.h" #include "vpfrelat.h" #include "vpfspx.h" #include "vpfprim.h" #include "vpfproj.h" #include "vpfquery.h" #include "vpfselec.h" #include "get_feat.h" #include "params.h" #include "vec_d.h" #include "musedir.h" #include "vpf2vec.h" #include "strfunc.h" #include "i_stat.h" /* Prototype */ set_type spatial_index_search( char *fname,float x1, float y1, float x2, float y2 ); /**************************************************************************/ /* VPF2VEC */ /**************************************************************************/ #ifdef PROTO void vpf2vec (USER_PARAMS *params, VEC *vec) #else void vpf2vec (params, vec) USER_PARAMS *params; VEC *vec; #endif { view_type view; map_environment_type mapenv; char StatusMessage[40], string[40]; static char sep[2] = {DIR_SEPARATOR,'\0'}; /* Create the Status Window */ strcpy (StatusMessage, "INITIALIZING!"); strcpy (string, "Please be patient"); if (iCreateStatus (StatusMessage, string) != TRUE) { xvt_note ("VPF2VEC: Cannot create Status Window."); return; } /* Allocate space for view, database, & library structures */ view.path = (char*)xvt_malloc (PATHSIZE); if (view.path == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.name, "MUSE"); view.ndb = 1L; view.nthemes = 1L; view.database = (database_type*) xvt_zmalloc (sizeof (database_type)); if (view.database == (database_type*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } view.database->path = (char*)xvt_zmalloc (PATHSIZE); view.database->nlibraries = 1; view.database->library = (library_type*)xvt_zmalloc (sizeof (library_type)); if (view.database->library == (library_type*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } view.database->library->viewable = TRUE; view.database->library->path = (char*)xvt_zmalloc (PATHSIZE); if (view.database->library->path == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.database->path, params->db_path); strcat (view.database->path, sep); strcpy (view.database->name, params->db_name); strcpy (view.database->library->name, params->lib_name); /* Set Spatial Extents */ mapenv.mapextent.x1 = params->x_min; mapenv.mapextent.x2 = params->x_max; mapenv.mapextent.y1 = params->y_min; mapenv.mapextent.y2 = params->y_max; /* Accomidate crossing the 180 meridian */ if (mapenv.mapextent.x1 > mapenv.mapextent.x2) mapenv.mapextent.x2 += 360.E0; strcpy (view.database->library->path, view.database->path); strcat (view.database->library->path, view.database->name); strcat (view.database->library->path, sep); strcat (view.database->library->path, view.database->library->name); strcat (view.database->library->path, sep); view.database->library->projection = DDS; view.database->library->units = DDS; strcpy (view.path, view.database->path); strcat (view.path, view.database->name); /* THEMES */ view.theme = (theme_type*)xvt_malloc (sizeof (theme_type)); if (view.theme == NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } view.nthemes = 1; /* Set Theme parameters */ view.theme->database = (char*)xvt_malloc (SZ_FNAME); if (view.theme->database == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->database, view.database->path); view.theme->database = strcat (view.theme->database, view.database->name); view.theme->library = (char*)xvt_malloc (SZ_FNAME); if (view.theme->library == NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->library, view.database->library->name); view.theme->coverage = (char*)xvt_malloc (SZ_FNAME); if (view.theme->coverage == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->coverage, params->cov_name); view.theme->expression = (char*)xvt_malloc (80 * sizeof (char)); if (view.theme->expression == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->expression, params->expression); view.theme->fc = (char*)xvt_malloc (SZ_FNAME); if (view.theme->fc == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->fc, params->fclass); /* Feature Table Path */ view.theme->ftable = (char*)xvt_malloc (SZ_FNAME); if (view.theme->ftable == (char*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } strcpy (view.theme->ftable, view.theme->database); strcat (view.theme->ftable, sep); strcat (view.theme->ftable, view.theme->library); strcat (view.theme->ftable, sep); strcat (view.theme->ftable, view.theme->coverage); strcat (view.theme->ftable, sep); strcat (view.theme->ftable, view.theme->fc); /* Allocate space for vec structure */ vec->magic = MAGIC_VEC2_DATA; vec->extents = (VEC_EXTENT*)xvt_zmalloc (sizeof (VEC_EXTENT)); if (vec->extents == (VEC_EXTENT*)NULL) { xvt_note ("VPF2VEC: Out of memory!"); clean_up (view); return; } vec->extents->xmin = params->x_min; vec->extents->xmax = params->x_max; vec->extents->ymin = params->y_min; vec->extents->ymax = params->y_max; /* Accomidate crossing the 180 meridian */ if (vec->extents->xmin > vec->extents->xmax) vec->extents->xmax += 360.E0; vec->feature_type = params->feature_type; switch (params->feature_type) { case LINE: { strcat (view.theme->ftable, ".lft"); break; } case AREA: { strcat (view.theme->ftable, ".aft"); break; } case ANNO: { strcat (view.theme->ftable, ".tft"); break; } case VPFPOINTS: { strcat (view.theme->ftable, ".pft"); break; } case COMPLEX: break; default: { xvt_note ("VPF_SS: Invalid feature type."); return; } } get_features (vec, &view, &mapenv); clean_up (view); return; } /*********************************************************************/ /* CLEAN_UP */ /*********************************************************************/ #ifdef PROTO void clean_up (view_type view) #else void clean_up (view) view_type view; #endif { /* Free allocated memory */ if (view.path) xvt_free (view.path); if (view.theme) { if (view.theme->database) xvt_free (view.theme->database); if (view.theme->library) xvt_free (view.theme->library); if (view.theme->fc) xvt_free (view.theme->fc); if (view.theme->ftable) xvt_free (view.theme->ftable); xvt_free ((char*)view.theme); } if (view.database) { if (view.database->library) { if (view.database->library->path) xvt_free (view.database->library->path); if (view.database->library->tile_set.buf) set_nuke (&view.database->library->tile_set); xvt_free ((char*)view.database->library); } if (view.database->path) xvt_free (view.database->path); xvt_free ((char*)view.database); } /* Destroy Status Window */ iDestroyStatus (); return; } /*****************************************************************************/ /* GET_FEATURES */ /* */ /* Purpose: */ /* This function retreives the selected features from a specified */ /* feature class based upon a selection expression. */ /* Parameters: */ /* view == (view_type*) view structure. */ /* mapenv == (map_environment_type*) map environment structure. */ /* return == (int32) completion status: */ /* 1 if completed successfully, */ /* 0 if an error occurred. */ /*****************************************************************************/ #ifdef PROTO int32 get_features (VEC *vec, view_type *view, map_environment_type *mapenv) #else int32 get_features (vec, view, mapenv) VEC *vec; view_type *view; map_environment_type *mapenv; #endif { int32 status, finished=1, tilecover, TILEPATH_=0, prim; int32 number_relate_paths, relpathnum; vpf_table_type rngtable,edgtable,fbrtable, tile_table, fcs; vpf_table_type fca, ft; int32 fit=0L, fc_id; row_type row; char ptype[4], StatusMessage[40], string[40]; int32 i, j, n=0L, tile, tileid; int32 pclass; int32 starttile, endtile, startprim, endprim; int32 count, nr, TABLE_NAME_, PRIM_TYPE_; char path[255], libpath[255], covpath[255], tiledir[255], ftable[255]; char *buf, *primtype; static char sep[2] = {DIR_SEPARATOR,'\0'}; set_type sprims, primitives, feature_rows; fcrel_type fcrel; int32 nr_features; LINE_FEATURE **temp_lines; AREA_FEATURE **temp_areas; TEXT_FEATURE **temp_text; POINT_FEATURE **temp_points; BOOLEAN stop_processing = FALSE; strcpy (libpath, view->theme->database); strcat (libpath, sep); strcat (libpath, view->theme->library); strcat (libpath, sep); strcpy (covpath, libpath); strcat (covpath, view->theme->coverage); strcat (covpath, sep); /* Look for feature class entry in FCA */ strcpy (path, covpath); strcat (path, "fca"); if (muse_access (path, 0) == 0) { fca = vpf_open_table (path, disk, "rb", NULL); j = table_pos ("FCLASS",fca); for (i=1; i<=fca.nrows; i++) { row = read_next_row (fca); buf = (char*)get_table_element (j, row, fca, NULL, &count); rightjust (buf); if (Mstrcmpi (buf, view->theme->fc) == 0) { fc_id = (int32)i; i = fca.nrows + 2; } xvt_free (buf); free_row (row, fca); } vpf_close_table(&fca); } /* Get the set of Feature_IDs that satisfy the thematic expression */ strcpy (path, view->theme->ftable); ft = vpf_open_table (path, disk, "rb", NULL); feature_rows = query_table (view->theme->expression, ft); vpf_close_table (&ft); nr_features = num_in_set (feature_rows); /* Return if no features were found */ if (nr_features == 0) return (-1); /* Set Primitive Class type and */ /* allocate memory for array of feature pointes */ switch (vec->feature_type) { case LINE: { vec->lines = (LINE_FEATURE**)xvt_zmalloc (MAXLINES * sizeof (LINE_FEATURE*)); if (vec->lines == NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } strcpy (ptype, "EDG"); pclass = 1; break; } case AREA: { vec->areas = (AREA_FEATURE**)xvt_zmalloc (MAXAREAS * sizeof (AREA_FEATURE*)); if (vec->areas == NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } strcpy (ptype, "FAC"); pclass = 2; break; } case ANNO: { vec->text = (TEXT_FEATURE**)xvt_zmalloc (MAXTEXT * sizeof (TEXT_FEATURE*)); if (vec->text == NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } strcpy (ptype, "TXT"); pclass = 3; break; } case VPFPOINTS: { vec->points = (POINT_FEATURE**)xvt_zmalloc (MAXPOINTS * sizeof (POINT_FEATURE*)); if (vec->points == NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } /* Determine if points are Entity Nodes "END" or */ /* Connected Nodes "CND". */ strcpy (string, view->theme->fc); strcat (string, ".PFT"); /* Open Feature Class Schema table "FCS" */ strcpy (path, covpath); strcat (path, "fcs"); fcs= vpf_open_table (path, disk, "rb", NULL); /* Find the column that contains the feature table name */ TABLE_NAME_ = table_pos ("TABLE1", fcs); PRIM_TYPE_ = table_pos ("TABLE2", fcs); /* Find the correct row for the feature table */ for (i=0; itheme->fc, fcs); vpf_close_table (&fcs); } /* Look for the primitive table at the coverage level */ /* to determine if the coverage is tiled. */ strcpy (path, covpath); strcat (path, ptype); if (muse_access (path, 0) == 0) { tilecover = FALSE; starttile = 1; endtile = 1; } else { view->database->library->tile_set = get_tile_set (libpath, mapenv->mapextent, &stop_processing); if (stop_processing) return (-1); /* The coverage is tiled, open the TILEREF.AFT table */ strcpy (path, libpath); strcat (path, "tileref"); strcat (path, sep); strcat (path, "tileref.aft"); if ((muse_access (path, 0)) == 0) { tilecover = TRUE; starttile = set_min (view->database->library->tile_set); endtile = set_max (view->database->library->tile_set); tile_table = vpf_open_table (path, disk, "rb", NULL); TILEPATH_ = (int32)table_pos ("TILE_NAME", tile_table); } else { /* No primitive table found & no tileref table found */ /* This is a problem. */ xvt_error ("GET_FEATURES: Can't find primitive table."); return (-1); } } /**** RELATIVE PATH LOOP ***************************************/ for (relpathnum=0; relpathnumtheme->ftable) - 1; while (view->theme->ftable[j] != DIR_SEPARATOR && j>0) j--; if (view->theme->ftable[j] == DIR_SEPARATOR) strcpy (ftable, &view->theme->ftable[j+1]); else strcpy (ftable, view->theme->ftable); rightjust (ftable); fcrel = select_feature_class_relate (covpath, view->theme->fc, ptype, ftable, relpathnum); } prim = 0; /* Open the Feature_Table */ ft = vpf_open_table (view->theme->ftable, disk, "rb", NULL); /**** Tile Loop ********************************************/ /* If the coverage is untiled still go thru the loop once. */ /* That is, treat an untiled coverage as a single tile. */ /***********************************************************/ for (tile = starttile; tile <= endtile; tile++) { if (stop_processing) break; /* Update Status Window */ sprintf (StatusMessage, "Retrieve Features"); sprintf (string, "Searching Tile Nr. %ld", tile); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) return (-1); if (tilecover) { if (!set_member(tile,view->database->library->tile_set)) continue; row = get_row (tile, tile_table); buf = (char*)get_table_element (TILEPATH_, row, tile_table, NULL, &count); free_row (row, tile_table); /* Convert uppercase chars to lowercase */ buf = strlwr (buf); strcpy (tiledir, buf); rightjust (tiledir); /* Filter path for system specific file separators */ muse_check_path (tiledir); strcat (tiledir, sep); xvt_free (buf); tileid = tile; } else { strcpy (tiledir, ""); tileid = 0; } finished = TRUE; strcpy (path, covpath); strcat (path, tiledir); strcat (path, ptype); /* Check for primitive table within the current tile */ if (muse_access (path, 0) != 0) continue; fcrel.table[prim] = vpf_open_table (path, disk, "rb", NULL); wait_cursor (); if (fit) { /* Get set of primitives that meet spatial constraints */ sprims = primitives_within_extent (mapenv->mapextent, covpath, tiledir, pclass, fcrel.table[prim].nrows); nr = num_in_set (sprims); /* Get set of primitives that meet both spatial and */ /* thematic constraints. */ primitives = get_fit_primitives (covpath, pclass, feature_rows, sprims, tileid, fc_id, fcrel.table[prim].nrows, &stop_processing); nr = num_in_set (primitives); set_nuke (&sprims); } else { primitives = get_selected_tile_primitives (covpath, fcrel, pclass, feature_rows, mapenv, tileid, tiledir, &status); } if (primitives.size < 1) { vpf_close_table (&fcrel.table[prim]); continue; } if (set_empty (primitives)) { set_nuke (&primitives); vpf_close_table (&fcrel.table[prim]); continue; } finished = 1; startprim = set_min (primitives); endprim = set_max (primitives); /* It turns out to be MUCH faster off of a CD-ROM to */ /* read each row and discard unwanted ones than to */ /* forward seek past them. It's about the same off */ /* of a hard disk. */ fseek (fcrel.table[prim].fp, index_pos (startprim, fcrel.table[prim]), SEEK_SET); /* Load the primitives into the vec structure */ switch (pclass) { case EDGE: { for (i=startprim; ilines[n] = (LINE_FEATURE*)xvt_zmalloc (sizeof (LINE_FEATURE)); if (vec->lines[n] == NULL) xvt_fatal ("GET_FEATURES: Out of memory!"); vec->lines[n]->id = i; get_line_feature (vec->lines[n], row, fcrel.table[prim]); vec->nr_lines += 1; n++; sprintf (string, "%ld Found", vec->nr_lines); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) stop_processing = TRUE; if (vec->nr_lines == MAXLINES) { xvt_note ("Line feature limit reached (MAXLINES)"); stop_processing = TRUE; } } free_row (row, fcrel.table[prim]); } break; } case ENTITY_NODE: case CONNECTED_NODE: { for (i=startprim; ipoints[n] = (POINT_FEATURE*)xvt_zmalloc (sizeof (POINT_FEATURE)); if (vec->points[n] == NULL) xvt_fatal ("GET_FEATURES: Out of memory!"); get_point_feature (vec->points[n], row, fcrel.table[prim]); vec->nr_points += 1; n++; sprintf (string, "%ld Found", vec->nr_points); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) stop_processing = TRUE; if (vec->nr_points == MAXPOINTS) { xvt_note ("Point feature limit reached (MAXPOINTS)"); stop_processing = TRUE; } } free_row (row, fcrel.table[prim]); } break; } case FACE: { /* Must also open RNG, EDG, and FBR for drawing faces. */ strcpy (path, covpath); strcat (path, tiledir); strcat (path, "rng"); rngtable = vpf_open_table (path, disk, "rb", NULL); strcpy (path, covpath); strcat (path, tiledir); strcat (path, "edg"); edgtable = vpf_open_table (path, disk, "rb", NULL); strcpy (path, covpath); strcat (path, tiledir); strcat (path, "fbr"); fbrtable = vpf_open_table (path, disk, "rb", NULL); /* startprim should never be 1 i.e. face_id=1 which is the */ /* universal face. DCW shows face_id=1 to be a valid feature */ /* which is incorrect. */ if (startprim == 1) startprim = 2; for (i=startprim; i<=endprim; i++) { if (stop_processing) break; row = read_next_row (fcrel.table[prim]); if (set_member (i, primitives)) { vec->areas[n] = (AREA_FEATURE*)xvt_zmalloc (sizeof (AREA_FEATURE)); if (vec->areas[n] == NULL) xvt_fatal ("GET_FEATURES: Out of memory!"); vec->areas[n]->id = n+1; get_area_feature (vec->areas[n], i, fcrel.table[prim], rngtable, edgtable); vec->nr_areas += 1; n++; sprintf (string, "%ld Found", vec->nr_areas); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) stop_processing = TRUE; if (vec->nr_areas == MAXAREAS) { xvt_note ("Area feature limit reached (MAXAREAS)"); stop_processing = TRUE; } } free_row (row, fcrel.table[prim]); } vpf_close_table (&rngtable); vpf_close_table (&edgtable); vpf_close_table (&fbrtable); break; } case TEXT: { for (i=startprim; itext[n] = (TEXT_FEATURE*)xvt_zmalloc (sizeof (TEXT_FEATURE)); if (vec->text[n] == NULL) xvt_fatal ("GET_FEATURES: Out of memory!"); get_text_feature (vec->text[n], row, fcrel.table[prim]); vec->nr_text += 1; n ++; sprintf (string, "%ld Found", vec->nr_text); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) stop_processing = TRUE; if (vec->nr_text == MAXTEXT) { xvt_note ("Text feature limit reached (MAXTEXT)"); stop_processing = TRUE; } } free_row (row, fcrel.table[prim]); } break; } } /* switch (pclass) */ vpf_close_table (&fcrel.table[prim]); set_nuke (&primitives); } /* Tile Loop */ if (!finished) { status = 0; deselect_feature_class_relate (&fcrel); break; } status = 1; deselect_feature_class_relate (&fcrel); } /* relpathnum loop */ /* Finished getting the features, now clean up */ /* Close the Feature Table if open */ vpf_close_table (&ft); if (tilecover) { vpf_close_table (&tile_table); } set_nuke (&feature_rows); /* Reallocate space for feature pointer addresses */ switch (pclass) { case EDGE: { temp_lines = (LINE_FEATURE**)xvt_zmalloc (vec->nr_lines * sizeof (LINE_FEATURE*)); if (temp_lines == (LINE_FEATURE**)NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } else { memcpy (temp_lines, vec->lines, (vec->nr_lines * sizeof (LINE_FEATURE*))); xvt_free ((char*)vec->lines); vec->lines = temp_lines; vec->nr_features = vec->nr_lines; } break; } case ENTITY_NODE: case CONNECTED_NODE: { temp_points = (POINT_FEATURE**)xvt_zmalloc (vec->nr_points * sizeof (POINT_FEATURE*)); if (temp_points == (POINT_FEATURE**)NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } else { memcpy (temp_points, vec->points, (vec->nr_points * sizeof (POINT_FEATURE*))); xvt_free ((char*)vec->points); vec->points = temp_points; vec->nr_features = vec->nr_points; } break; } case FACE: { temp_areas = (AREA_FEATURE**)xvt_zmalloc (vec->nr_areas * sizeof (AREA_FEATURE*)); if (temp_areas == (AREA_FEATURE**)NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } else { memcpy (temp_areas, vec->areas, (vec->nr_areas * sizeof (AREA_FEATURE*))); xvt_free ((char*)vec->areas); vec->areas = temp_areas; vec->nr_features = vec->nr_areas; } break; } case TEXT: { temp_text = (TEXT_FEATURE**)xvt_zmalloc (vec->nr_text * sizeof (TEXT_FEATURE*)); if (temp_text == (TEXT_FEATURE**)NULL) { xvt_fatal ("GET_FEATURES: Out of memory!"); return (-1); } else { memcpy (temp_text, vec->text, (vec->nr_text * sizeof (TEXT_FEATURE*))); xvt_free ((char*)vec->text); vec->text = temp_text; vec->nr_features = vec->nr_text; } break; } } /* switch(pclass) */ /* Destroy the Status Window */ iDestroyStatus(); return (0); } /*****************************************************************************/ /* GET_SELECTED_TILE_PRIMITIVES */ /* */ /* Purpose: */ /* This function determines all of the selected primitive rows from */ /* the selected features of a given tile. */ /* */ /* This function expects a feature class relationship structure that */ /* has been successfully created with select_feature_class_relate() */ /* from the feature table to the primitive. The primitive table in */ /* the feature class relate structure must have been successfully */ /* opened for the given tile. */ /* Parameters: */ /* covpath == (char*) path th the VPF coverage. */ /* fclass == (char*) feature class. */ /* fcrel == (fcrel_type) feature class relate structure.*/ /* primclass == (int32) primitive class to select. */ /* feature_rows == (set_type) set of selected features. */ /* mapenv == (map_environment_type *) map environment. */ /* tile == (int32) tile number. */ /* tiledir == (char*) path to the tile directory. */ /* status == (int32*) status of the function: */ /* 1 if completed, 0 if user escape. */ /* return == (set_type) set of primitives for the */ /* features. */ /*****************************************************************************/ #ifdef PROTO set_type get_selected_tile_primitives (char *covpath, fcrel_type fcrel, int32 primclass, set_type feature_rows, map_environment_type *mapenv, int32 tile, char *tiledir, int32 *status) #else set_type get_selected_tile_primitives (covpath, fcrel, primclass, feature_rows, mapenv, tile, tiledir, status) char *covpath; fcrel_type fcrel; int32 primclass; set_type feature_rows; map_environment_type *mapenv; int32 tile; char *tiledir; int32 *status; #endif { int32 feature, prim; row_type row; set_type primitive_rows; set_type primitives; int32 feature_rownum; register int32 i, start,end; linked_list_type feature_list; position_type p; extent_type pextent; prim = 0; feature = fcrel.nchain-1; /* Assume that fcrel.table[prim] has been opened */ primitives.size = 0; primitives.buf = NULL; primitives = set_init(fcrel.table[prim].nrows+1); /* All VPF products produced so far are in Decimal Degrees */ /* so no calls to mapextent is needed */ pextent = mapenv->mapextent; /*DGM*/ /* Get the set of primitive rows within the map extent */ primitive_rows = primitives_within_extent (pextent, covpath, tiledir, primclass, fcrel.table[prim].nrows); if (set_empty (primitive_rows)) { set_nuke (&primitive_rows); return primitives; } end = set_max (primitive_rows); start = set_min (primitive_rows); if (end>0 && start<1) start=1; if (end>fcrel.table[prim].nrows) end = fcrel.table[prim].nrows; /* It turns out to be MUCH faster off of a CD-ROM to */ /* read each row and discard unwanted ones than to */ /* forward seek past them. It's about the same off */ /* of a hard disk. */ fseek(fcrel.table[prim].fp,index_pos(start,fcrel.table[prim]), SEEK_SET); for (i=start; i<=end; i++) { if (i>fcrel.table[prim].nrows) break; row = read_next_row (fcrel.table[prim]); if (!row) break; if (!set_member (i, primitive_rows)) { free_row (row, fcrel.table[prim]); continue; } feature_list = fc_row_numbers (row, fcrel, tile); free_row (row, fcrel.table[prim]); if (!ll_empty(feature_list)) { p = ll_first(feature_list); while (!ll_end(p)) { ll_element(p,&feature_rownum); if ((feature_rownum < 1) || (feature_rownum > fcrel.table[feature].nrows)) { p = ll_next(p); continue; } if (set_member (feature_rownum, feature_rows)) { set_insert (i, primitives); break; } p = ll_next (p); } } if (feature_list) ll_reset (feature_list); } set_nuke(&primitive_rows); *status = 1; return primitives; } /******************************************************************************/ /* PRIMITIVES_WITHIN_EXTENT */ /* */ /* Spatially select all of the primitives for a primitive class in a */ /* specified tile that are contained within the specified map extent. */ /* The map extent must be specified in decimal degrees. */ /* Parameters: */ /* extent == (extent_type) spatial extent in decimal degrees. */ /* covpath == (char*) directory path to a VPF coverage. */ /* tiledir == (char*) tile directory from the tileref.aft. */ /* primclass == (int) primitive class identifier. Must be */ /* EDGE, FACE, ENTITY_NODE, CONNECTED_NODE, or TEXT. */ /* numprims == (int32) number of rows in the associated */ /* primitive table. */ /* return == (set_type) set of selected primitives. */ /******************************************************************************/ #ifdef PROTO set_type primitives_within_extent (extent_type mapextent, char *covpath, char *tiledir, int32 primclass, int32 numprims) #else set_type primitives_within_extent (mapextent, covpath, tiledir, primclass, numprims) extent_type mapextent; char *covpath; char *tiledir; int32 primclass; int32 numprims; #endif { char path[255]; BOOLEAN index_exists = FALSE; set_type primitive_rows; static char *spxname[] = {"","ESI","FSI","TSI","NSI","CSI"}; static char *brname[] = {"","EBR","FBR","TBR","NBR","CBR"}; primitive_rows.size = 0; primitive_rows.buf = (char *)NULL; /* 20 is a fairly arbitrary cutoff of the number of */ /* primitives that make a spatial index search worth while. */ if (numprims > 20) { strcpy (path, covpath); strcat (path, tiledir); strcat (path, spxname[primclass]); if (muse_access (path, 0) == 0) { index_exists = TRUE; primitive_rows = spatial_index_search (path, (float)mapextent.x1, (float)mapextent.y1, (float)mapextent.x2, (float)mapextent.y2); } } if ((numprims <= 20) || (index_exists == FALSE)) { /* Next best thing - bounding rectangle table */ strcpy (path, covpath); strcat (path, tiledir); strcat (path, brname[primclass]); if ((muse_access (path,0) == 0) && (numprims > 20)) primitive_rows = bounding_select (path, mapextent, NOPROJ); } /* if the spatial index or bounding rectangle table were found then */ /* just turn on the entire set. */ if (primitive_rows.size == 0) { primitive_rows = set_init (numprims+1L); set_on (primitive_rows); } return (primitive_rows); } /******************************************************************************/ /* bitfix */ /******************************************************************************/ #ifdef PROTO static float bitfix (float f) #else static float bitfix (f) float f; #endif { int32 machine_byte_order = MACHINE_BYTE_ORDER; union { float f; unsigned char c[4]; } fltchr; fltchr.f = f; if (machine_byte_order == LEAST_SIGNIFICANT) fltchr.c[0] = ((fltchr.c[0] >> 3) << 3); else fltchr.c[3] = ((fltchr.c[3] >> 3) << 3); return (fltchr.f); } /******************************************************************************/ /* GET_TILE_SET */ /******************************************************************************/ #ifdef PROTO set_type get_tile_set (char* lib_path, extent_type extent, BOOLEAN *cancel_process) #else set_type get_tile_set (lib_path, extent, cancel_process) char* lib_path; extent_type extent; BOOLEAN *cancel_process; #endif { char path[255], StatusMessage[40], string[40]; int32 XMIN_, YMIN_, XMAX_, YMAX_, FAC_ID_; float delta, retval; int32 i, n, face_id, nr_tiles=0L; static char sep[2] = {DIR_SEPARATOR,'\0'}; row_type row; vpf_table_type fbr, aft; fextent_type tile_extent, area_extent; set_type tile_set; /* Convert the double area extents to float */ area_extent.x1 = (float)extent.x1; area_extent.y1 = (float)extent.y1; area_extent.x2 = (float)extent.x2; area_extent.y2 = (float)extent.y2; /* Initialize the set to contain 0 elements */ tile_set = set_init (0L); if (area_extent.y2 > 90.0) { delta = (area_extent.y2 - 90.0); area_extent.y2 = 90.0; area_extent.y1 -= delta; } /* Open the tileref.fbr table */ strcpy (path, lib_path); strcat (path, "tileref"); strcat (path, sep); strcat (path, "fbr"); if (muse_access (path,0)!=0) return (tile_set); fbr = vpf_open_table (path, disk, "rb", NULL); if (!fbr.fp) { vpf_close_table (&fbr); return (tile_set); } XMIN_ = table_pos("XMIN",fbr); YMIN_ = table_pos("YMIN",fbr); XMAX_ = table_pos("XMAX",fbr); YMAX_ = table_pos("YMAX",fbr); /* Check for invalid fbr */ if (XMIN_ < 0 || YMIN_ < 0 || XMAX_ < 0 || YMAX_ < 0) { vpf_close_table(&fbr); *cancel_process = TRUE; return (tile_set); } /* Initialize tile_set */ tile_set = set_init (fbr.nrows); /* Open the Tileref.aft table */ strcpy (path, lib_path); strcat (path, "tileref"); strcat (path, sep); strcat (path, "tileref.aft"); aft = vpf_open_table (path, disk, "rb", NULL); if (!aft.fp) { vpf_close_table (&fbr); vpf_close_table (&aft); return (tile_set); } FAC_ID_ = table_pos ("FAC_ID", aft); for (i=1; i<=aft.nrows; i++) { if (FAC_ID_ >= 0) { /* Uses the MIL-STD-2407 (26 May 1993) style of the tile reference coverage with a FAC_ID */ row = read_next_row (aft); get_table_element (FAC_ID_, row, aft, &face_id, &n); free_row (row, aft); } else { /* Assume the library use the MIL-STD-600006 (before 26 May 1993) style of the tile reference coverage, which assumes a 1:1 relationship between the TILEREF.AFT and the FAC table, and discards the universe face 1. */ face_id = i; } /* Ignore the Universal Face (face_id = 1) */ if (face_id == 1) continue; row = read_row (face_id, fbr); get_table_element (XMIN_, row, fbr, &retval, &n); tile_extent.x1 = bitfix (retval); get_table_element (YMIN_, row, fbr, &retval, &n); tile_extent.y1 = retval; get_table_element (XMAX_, row, fbr, &retval, &n); tile_extent.x2 = retval; get_table_element (YMAX_, row, fbr, &retval, &n); tile_extent.y2 = retval; free_row (row, fbr); if (geo_intersect (area_extent, tile_extent)) { set_insert (i, tile_set); nr_tiles++; } /* Update Status Window */ sprintf (StatusMessage, "TILE SEARCH"); sprintf (string, "%ld Found", nr_tiles); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("VPF2vec: Update Status failed."); if (iCheckCancel() != TRUE) { set_nuke (&tile_set); vpf_close_table (&fbr); vpf_close_table (&aft); *cancel_process = TRUE; return (tile_set); } } vpf_close_table (&fbr); vpf_close_table (&aft); return (tile_set); } /*****************************************************************************/ /* get_fit_primitives */ /* */ /* Purpose: */ /* Get the set of primitives in the given tile for the selected features */ /* in the given feature class. Use the Feature Index Table instead of */ /* the schema relationships. */ /* Parameters: */ /* covpath ==(char*) path to the VPF coverage. */ /* primclass ==(int) primitive class to select. */ /* fset == (set_type*) set of feature IDs that meet the */ /* thematic conditions. */ /* sprims == (set_type*) set of primitive IDs that meet */ /* the spatial conditions. */ /* tile ==(int32) tile number. */ /* fca_id ==(int) Feature Class Attribute table id of the */ /* selected feature class. */ /* numprims ==(int) number of rows in the specified tile's */ /* primitive table for the specified primitive */ /* class. */ /* status ==(int *) status of the function: */ /* 1 if completed, 0 if user escape. */ /* return ==(set_type) set of primitives for the features */ /* */ /* Modified 21 June 94 DGM */ /*****************************************************************************/ #ifdef PROTO set_type get_fit_primitives (char *covpath, int32 primclass, set_type fset, set_type sprims, int32 tile, int32 fca_id, int32 numprims, BOOLEAN *stop_processing) #else set_type get_fit_primitives (covpath, primclass, fset, sprims, tile, fca_id, numprims, stop_processing) char *covpath; int32 primclass; set_type fset; set_type sprims; int32 tile, fca_id, numprims; BOOLEAN *stop_processing; #endif { set_type primitives, tileset, fcset, selset; int32 i, start, end, prim_id, tile_id, fc_id, feature_id, count; short short_tile_id; int32 PRIM_ID_, TILE_ID_, FC_ID_, FEATURE_ID_; vpf_table_type fit; row_type row; char path[255], StatusMessage[40], string[40]; static char *ptable[] = {"","EDG","FAC","TXT","END","CND"}; /* Initialize sets */ primitives = set_init (numprims+1); /* Open the FIT */ strcpy (path, covpath); strcat (path, ptable[primclass]); strcat (path, ".FIT"); muse_check_path (path); if (muse_access (path,0) != 0) return primitives; fit = vpf_open_table (path, disk, "rb", NULL); if (!fit.fp) return primitives; /* Get the column positions of tile_id, primitive_id, feature_class_id, */ /* feature_id. */ TILE_ID_ = table_pos ("TILE_ID", fit); PRIM_ID_ = table_pos ("PRIM_ID", fit); FC_ID_ = table_pos ("FC_ID", fit); if (FC_ID_ < 0) FC_ID_ = table_pos ("FCA_ID", fit); FEATURE_ID_ = table_pos ("FEATURE_ID", fit); if ((TILE_ID_ < 0 && tile) || PRIM_ID_ < 0 || FC_ID_ < 0 || FEATURE_ID_ < 0) { vpf_close_table (&fit); return primitives; } /* Look for TILE_ID thematic index */ tileset.size = 0; if (tile) { if (fit.header[TILE_ID_].tdx) { strcpy (path, covpath); strcat (path, fit.header[TILE_ID_].tdx); muse_check_path (path); if (muse_access (path,0) == 0) { if (fit.header[TILE_ID_].type == 'I') { tile_id = (int32)tile; tileset = read_thematic_index (path, (char*)&tile_id); } else if (fit.header[TILE_ID_].type == 'S') { short_tile_id = tile; tileset = read_thematic_index(path,(char *)&short_tile_id); } } /* if muse_access */ } /* if tile_id.tdx */ } /* if tile */ if (!tileset.size) { tileset = set_init (fit.nrows+1); set_on (tileset); set_delete (0, tileset); } /* Look for FC_ID thematic index */ fcset.size = 0; if (fit.header[FC_ID_].tdx) { strcpy (path, covpath); strcat (path, fit.header[FC_ID_].tdx); muse_check_path (path); if (muse_access (path, 0) == 0) { fc_id = (int32)fca_id; fcset = read_thematic_index (path, (char*)&fc_id); } } /* if fc_id.tdx */ if (!fcset.size) { fcset = set_init (fit.nrows+1); set_on (fcset); set_delete (0, fcset); } /* Get the set of all FIT rows in the search tile that match the */ /* search fca_id. */ selset = set_intersection (tileset, fcset); set_nuke (&tileset); set_nuke (&fcset); if (set_empty (selset)) { vpf_close_table (&fit); set_nuke (&selset); return (primitives); } /* Now loop through the FIT and get the matching primitive ids */ start = set_min (selset); end = set_max (selset); /* Set file pointer to start record */ fseek (fit.fp, index_pos (start, fit), SEEK_SET); for (i=start; i<=end; i++) { if ((i % 10) == 0) { /* Update Status Window */ sprintf (StatusMessage, "Retrieve Features"); sprintf (string, "Searching Tile Nr. %ld", tile); if (iUpdateStatus (StatusMessage, string) != TRUE) xvt_note ("GET_FIT_PRIMITIVES: Update Status failed."); if (iCheckCancel() != TRUE) { vpf_close_table (&fit); set_nuke (&selset); *stop_processing = TRUE; return (primitives); } } /* Read each row of the fit starting at "start". If the row is a member */ /* of selset then get the tile_id. */ row = read_next_row (fit); if (set_member (i, selset)) { /* i is a member of selset so now we must test it to see if it */ /* meets the conditions of the thematic expression */ get_table_element(PRIM_ID_,row,fit,&prim_id,&count); get_table_element(FC_ID_,row,fit,&fc_id,&count); get_table_element(FEATURE_ID_,row,fit,&feature_id,&count); tile_id = 0; if (tile) { if (fit.header[TILE_ID_].type == 'I') { get_table_element (TILE_ID_, row, fit, &tile_id, &count); } else if (fit.header[TILE_ID_].type == 'S') { get_table_element(TILE_ID_, row, fit, &short_tile_id, &count); tile_id = short_tile_id; } } /* if tile */ if (tile_id == tile && fc_id == fca_id && set_member (prim_id, sprims) && set_member (feature_id, fset)) { set_insert (prim_id, primitives); } } /* if set_member */ free_row (row, fit); } /* for i */ vpf_close_table (&fit); set_nuke (&selset); return (primitives); } ogdi-ogdi_4_1_0/vpflib/vpf2vec.h000066400000000000000000000044331345660466700166350ustar00rootroot00000000000000/**********************************************************************/ /* VPF2VEC.H */ /* Dan Maddux, DMASC/WGEA, 12 March 1993 */ /**********************************************************************/ #ifndef VPF2VEC_H #define VPF2VEC_H #ifndef __VPFVIEW_H__ #include "vpfview.h" #endif #ifndef __VPFRELAT_H__ #include "vpfrelat.h" #endif #ifndef PARAMS_H #include "params.h" #endif #ifndef H_VEC_D #include "vec_d.h" #endif /* Copied from grpim.h */ #ifndef NoLine #define NoLine -1 #endif #define PATHSIZE 255 #if 0 typedef struct { char *description; int32 value; double relem; } DATA; typedef struct { double x; double y; } DATA_AREA; #endif /* Global Declarations */ vpf_projection_type NOPROJ = {DDS, 0.0, 0.0, 0.0, 0.0, 0, 0.0, 0.0, NULL, NULL, "Decimal Degrees "}; /* Prototype Definitions */ #ifdef PROTO void vpf2vec (USER_PARAMS *params, VEC *vec); set_type query_table (char *expression, vpf_table_type table); int32 get_features (VEC*, view_type*, map_environment_type*); set_type get_selected_tile_primitives (char *covpath, fcrel_type fcrel, int32 primclass, set_type feature_rows, map_environment_type *mapenv, int32 tile, char *tiledir, int32 *status); set_type primitives_within_extent (extent_type mapextent, char *covpath, char *tiledir, int32 primclass, int32 numprims); set_type get_tile_set (char*, extent_type, BOOLEAN*); void clean_up (view_type); set_type get_fit_primitives (char *covpath, int32 primclass, set_type fset, set_type sprims, int32 tile, int32 fca_id, int32 numprims, BOOLEAN *stop_processing); set_type get_prim_set (char *covpath, int32 primclass, char *expression, vpf_table_type ft, set_type sprims, int32 tile, int32 numprims); #else void vpf2vec (); set_type query_table (); int32 get_features (); set_type get_selected_tile_primitives (); set_type primitives_within_extent (); set_type get_tile_set (); void clean_up (); set_type get_fit_primitives (); set_type get_prim_set (); #endif #endif /* VPF2VEC_H */ ogdi-ogdi_4_1_0/vpflib/vpfbrows.c000066400000000000000000001011221345660466700171160ustar00rootroot00000000000000/* VPFBROWS.C */ #include "xvt.h" #include "musedir.h" #include "vpftable.h" #include "vpfbrows.h" #include "ibrowse.h" #define MAXLINES 10000 #define MAXLENGTH 255 static int32 maxlength; #ifdef PROTO void vpf_browse (BROWSE *browse) #else void vpf_browse (browse) BROWSE *browse; #endif { SLIST slist; SLIST_ELT elt; char *string; /* Display results in Browse Window */ wait_cursor (); if (browse->string_length < MAXLENGTH) maxlength = browse->string_length; else maxlength = MAXLENGTH; /*********************** QUIKFIX ****************************/ /* Allowing the user to select the stringlength is causing */ /* too many problems to correct at this time so force */ /* maxlength to always = 255. dgm */ /************************************************************/ maxlength = MAXLENGTH; slist = table_to_slist (browse); elt = slist_first (slist); string = slist_get (slist, elt, 0L); ibrowse_slist (string, slist); return; } #ifdef PROTO SLIST table_to_slist (BROWSE *browse) #else SLIST table_to_slist (browse) BROWSE browse; #endif { SLIST browse_list; vpf_table_type table; date_type dval, *dptr; id_triplet_type kval, *kptr; coordinate_type cval, *cptr; tri_coordinate_type zval, *zptr; row_type row; int32 i, j, k, n; int ival, *iptr; int32 lval, *lptr; float fval, *fptr; char *buf, ch, date[40]; char *string, *temp, index[4]; /* Initialize string count to 0 */ str2list (NULL, NULL); memset (&table, '\0', sizeof (vpf_table_type)); memset (&index, '\0', sizeof (index)); string = xvt_zmalloc (maxlength); temp = xvt_zmalloc (maxlength); browse_list = slist_new(); /* Add the table path and name as the first string on the list */ strcpy (string, browse->path); str2list (browse_list, string); strcpy (string, " "); str2list (browse_list, string); /* Determine if the file to be browsed is an INDEX */ if ((strncmp (&browse->path[(strlen (browse->path) - 1)], "x", 1) == 0) || (strncmp (&browse->path[(strlen (browse->path) - 1)], "X", 1) == 0) || (strncmp (&browse->path[(strlen (browse->path) - 3)], "fcz", 3) == 0)) { browse_list = idx_to_str (browse, browse_list); xvt_free (string); xvt_free (temp); return (browse_list); } else if ((strncmp (&browse->path[(strlen (browse->path) - 2)], "si", 2) == 0) || (strncmp (&browse->path[(strlen (browse->path) - 2)], "SI", 2) == 0)) { browse_list = si_to_str (browse, browse_list); xvt_free (string); xvt_free (temp); return (browse_list); } else if ((strncmp (&browse->path[(strlen (browse->path) - 2)], "ti", 2) == 0) || (strncmp (&browse->path[(strlen (browse->path) - 2)], "TI", 2) == 0)) { browse_list = ti_to_str (browse, browse_list); xvt_free (string); xvt_free (temp); return (browse_list); } table = vpf_open_table (browse->path, DISK, "rb", NULL); if (browse->hdr_data) { /* Dump Table Header Info */ strcpy (string, "****** TABLE HEADER DATA ******"); str2list (browse_list, string); sprintf (string, "NAME: %s", table.name); str2list (browse_list, string); strcpy (string, "DESCRIPTION: "); if (table.description) strcat (string, table.description); else strcat (string, "NULL"); str2list (browse_list, string); strcpy (string, "NARRATIVE TABLE: "); if (table.narrative) strcat (string, table.narrative); else strcat (string, "NULL"); str2list (browse_list, string); sprintf (string, "BYTE ORDER: %c", table.byte_order); str2list (browse_list, string); sprintf (string, "HEADER LENGTH: %ld", table.ddlen); str2list (browse_list, string); sprintf (string, "RECORD LENGTH: %ld", table.reclen); str2list (browse_list, string); sprintf (string, "NR RECORDS: %ld", table.nrows); str2list (browse_list, string); sprintf (string, "NR FIELDS: %ld", table.nfields); str2list (browse_list, string); strcpy (string, " "); str2list (browse_list, string); } if (browse->field_desc) { strcpy (string, "****** FIELD DESCRIPTORS ******"); str2list (browse_list, string); for (i=0; i", table.header[i].name); sprintf (&string[ strlen (string)], "<%c>", table.header[i].type); sprintf (&string[ strlen (string)], "<%ld>", table.header[i].count); sprintf (&string[ strlen (string)], "<%c>", table.header[i].keytype); sprintf (&string[ strlen (string)], "<%s>", table.header[i].description); sprintf (&string[ strlen (string)], "<%s>", table.header[i].vdt); sprintf (&string[ strlen (string)], "<%s>", table.header[i].tdx); sprintf (&string[ strlen (string)], "<%s>", table.header[i].narrative); str2list (browse_list, string); } strcpy (string, " "); str2list (browse_list, string); } strcpy (string, "****** TABLE RECORD DATA ******"); str2list (browse_list, string); if (browse->start_record < 1) browse->start_record = 1; if (browse->end_record > table.nrows) browse->end_record = table.nrows; for (i=browse->start_record; i<=browse->end_record; i++) { row = get_row (i, table); memset (string, '\0', maxlength); sprintf (string, "%ld: ", i); for (j=0; j", ch); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else /* String is greater than one char int32 */ { buf = (char*)get_table_element (j, row, table, NULL, &n); n = strlen (buf); /* Filter out carriage control characters */ for (k=0; k", buf); if (add_string (browse_list, string, temp) == FALSE) { xvt_free (buf); free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } xvt_free (buf); } break; case 'I': /* Int32 Integer */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &lval, &n); sprintf (temp, "<%ld>", lval); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { lptr = (int32*)get_table_element (j, row, table, NULL, &n); for (k=0; k",lptr[k]); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)lptr); } break; case 'S': /* Short */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &ival, &n); sprintf (temp, "<%d>", ival); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { iptr = (int*)get_table_element (j, row, table, NULL, &n); for (k=0; k",iptr[k]); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)iptr); } break; case 'F': /* Float */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &fval, &n); sprintf (temp, "<%f>", fval); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { fptr = (float*)get_table_element (j, row, table, NULL, &n); for (k=0; k", fptr[k]); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)fptr); } break; case 'C': /* Coordinate pair */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &cval, &n); sprintf (temp,"<%lf,%lf>", cval.x, cval.y); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { cptr = (coordinate_type*)get_table_element (j, row, table, NULL, &n); #if 0 for (k=0; k", cptr[k].x, cptr[k].y); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } #endif if (str2list (browse_list, string) != TRUE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } for (k=0; k", kval.id, kval.tile, kval.exid); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { kptr = get_table_element (j, row, table, NULL, &n); for (k=0; k", kptr[k].id, kptr[k].tile, kptr[k].exid); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)kptr); } break; case 'D': /* Date */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &dval, &n); format_date (dval, date); sprintf (temp, "<%s>", date); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { dptr = get_table_element (j, row, table, NULL, &n); for (k=0; k", date); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)dptr); } break; case 'Z': /* 3D Coordinates */ if ((int)table.header[j].count==1) { get_table_element (j, row, table, &zval, &n); sprintf (temp, "<%f,%f,%f>", zval.x, zval.y, zval.z); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } else { zptr = (tri_coordinate_type*)get_table_element (j, row, table, NULL, &n); for (k=1; k", zptr[k].x, zptr[k].y, zptr[k].z); if (add_string (browse_list, string, temp) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } } xvt_free ((char*)zptr); } break; default: break; } /* switch */ } if (str2list (browse_list, string) == FALSE) { free_row (row, table); vpf_close_table (&table); xvt_free (string); xvt_free (temp); return (browse_list); } free_row (row, table); } strcpy (string, "END_OF_TABLE"); slist_add (browse_list, NULL, string, 0L); vpf_close_table (&table); if (string) xvt_free (string); if (temp) xvt_free (temp); return (browse_list); } /**************************************************************************/ /* IDX_TO_STR */ /**************************************************************************/ #ifdef PROTO SLIST idx_to_str (BROWSE *browse, SLIST browse_list) #else SLIST idx_to_str (browse, browse_list) BROWSE *browse; SLIST browse_list; #endif { FILE *file; char *string; int32 entries, size, offset, length, i; /* Initialize string count to 0 */ str2list (NULL, NULL); file = muse_file_open (browse->path, "rb"); string = xvt_zmalloc(sizeof (char) * maxlength); VpfRead (&entries, VpfInteger, 1, file); VpfRead (&size, VpfInteger, 1, file); /* Print Header Data */ if (browse->hdr_data) { strcpy (string, "****** VARIABLE LENGTH INDEX HEADER DATA ******"); str2list (browse_list, string); sprintf (string, "Entries: %ld", entries); str2list (browse_list, string); sprintf (string, "Size: %ld", size); str2list (browse_list, string); strcpy (string, " "); str2list (browse_list, string); } strcpy (string, "***** RECORD DATA *****"); str2list (browse_list, string); if (browse->start_record < 1) browse->start_record = 1; if (browse->end_record > entries) browse->end_record = entries; for (i = browse->start_record; i <= browse->end_record; i++) { VpfRead (&offset, VpfInteger, 1, file); VpfRead (&length, VpfInteger, 1, file); sprintf (string, "%ld: %ld, %ld", i, offset, length); if (str2list (browse_list, string) == FALSE) { fclose (file); xvt_free (string); return (browse_list); } } fclose (file); strcpy (string, "END_OF_TABLE"); slist_add (browse_list, NULL, string, 0L); xvt_free (string); return (browse_list); } /* END IDX_TO_STR */ /**************************************************************************/ /* SI_TO_STR */ /**************************************************************************/ #ifdef PROTO SLIST si_to_str (BROWSE *browse, SLIST browse_list) #else SLIST si_to_str (browse, browse_list) BROWSE *browse; SLIST browse_list; #endif { FILE *file; char *string; unsigned char x1, y1, x2, y2; int32 numprim, nnode, id, offset, count, i; float xmin, ymin, xmax, ymax; /* Initialize string count to 0 */ str2list (NULL, NULL); file = muse_file_open (browse->path, "rb"); string = xvt_zmalloc(sizeof (char) * maxlength); /* Header Info */ VpfRead (&numprim, VpfInteger, 1, file); VpfRead (&xmin, VpfFloat, 1, file); VpfRead (&ymin, VpfFloat, 1, file); VpfRead (&xmax, VpfFloat, 1, file); VpfRead (&ymax, VpfFloat, 1, file); VpfRead (&nnode, VpfInteger, 1, file); if (browse->hdr_data) { strcpy (string, "****** SPATIAL INDEX HEADER DATA ******"); str2list (browse_list, string); sprintf (string, "Number of Primitives: %ld", numprim); str2list (browse_list, string); sprintf (string, "Xmin: %f", xmin); str2list (browse_list, string); sprintf (string, "Ymin: %f", ymin); str2list (browse_list, string); sprintf (string, "Xmax: %f", xmax); str2list (browse_list, string); sprintf (string, "Ymax: %f", ymax); str2list (browse_list, string); sprintf (string, "Number of Nodes: %ld", nnode); str2list (browse_list, string); } strcpy (string, "****** SPATIAL INDEX BIN ARRAY RECORDS ******"); str2list (browse_list, string); if (browse->start_record < 1) browse->start_record = 1; if (browse->end_record > nnode) browse->end_record = nnode; for (i=browse->start_record; i<=browse->end_record; i++) { VpfRead (&offset, VpfInteger, 1, file); VpfRead (&count, VpfInteger, 1, file); sprintf (string, "Node: %ld, Offset: %ld, Count: %ld", i, offset, count); if (str2list (browse_list, string) == FALSE) { if (file) fclose (file); xvt_free (string); return (browse_list); } } strcpy (string, " "); str2list (browse_list, string); /* Position the file pointer to the beginning of the Bin Data Records */ /* if not there already. */ if (browse->end_record != nnode) { while (i<=nnode) { VpfRead (&offset, VpfInteger, 1, file); VpfRead (&count, VpfInteger, 1, file); i++; } } strcpy (string, "****** SPATIAL INDEX BIN DATA RECORDS ******"); str2list (browse_list, string); if (browse->start_record < 1) browse->start_record = 1; if (browse->end_record > numprim) browse->end_record = numprim; for (i=browse->start_record; i<=browse->end_record; i++) { VpfRead (&x1, VpfChar, 1, file); VpfRead (&y1, VpfChar, 1, file); VpfRead (&x2, VpfChar, 1, file); VpfRead (&y2, VpfChar, 1, file); VpfRead (&id, VpfInteger, 1, file); sprintf (string, "X1: %3d, Y1: %3d, X2: %3d, Y2: %3d, ID: %d", x1, y1, x2, y2, id); if (str2list (browse_list, string) == FALSE) { xvt_free (string); if (file) fclose (file); return (browse_list); } } if (file) fclose (file); strcpy (string, "END_OF_TABLE"); slist_add (browse_list, NULL, string, 0L); xvt_free (string); return (browse_list); } /**************************************************************************/ /* TI_TO_STR */ /**************************************************************************/ #ifdef PROTO SLIST ti_to_str (BROWSE *browse, SLIST browse_list) #else SLIST ti_to_str (browse, browse_list) BROWSE *browse; SLIST browse_list; #endif { size_t nr_elts, nr_entries, i, maxlines; int32 length, nr_rows, *count; char indx_type, data_type, index_data_type; char *string, *temp, name[13], col[26], unused[5]; int32 offset, nr_records; char *t_elt; int32 i_elt; short s_elt; float f_elt; double r_elt; FILE *file; /* Initialize string count to 0 */ str2list (NULL, NULL); file = muse_file_open (browse->path, "rb"); string = (char*)xvt_zmalloc (sizeof (char) * maxlength); temp = (char*)xvt_zmalloc (sizeof (char) * maxlength); memset (name, '\0', sizeof(name)); memset (col, '\0', sizeof(col)); VpfRead (&length, VpfInteger, 1, file); VpfRead (&nr_entries, VpfInteger, 1, file); VpfRead (&nr_rows, VpfInteger, 1, file); VpfRead (&indx_type, VpfChar, 1, file); VpfRead (&data_type, VpfChar, 1, file); VpfRead (&nr_elts, VpfInteger, 1, file); VpfRead (&index_data_type, VpfChar, 1, file); VpfRead (&name, VpfChar, 12, file); VpfRead (&col, VpfChar, 25, file); VpfRead (&unused, VpfChar, 4, file); if (browse->hdr_data) { strcpy (string, "***** THEMATIC INDEX HEADER DATA *****"); str2list (browse_list, string); sprintf (string, "Header_size: %ld", length); str2list (browse_list, string); sprintf (string, "Nr_entries: %ld", (int32)nr_entries); str2list (browse_list, string); sprintf (string, "Nr_rows: %ld", nr_rows); str2list (browse_list, string); sprintf (string, "Index_type: %c", indx_type); str2list (browse_list, string); sprintf (string, "Data_type: %c", data_type); str2list (browse_list, string); sprintf (string, "Nr_elements: %ld", (int32)nr_elts); str2list (browse_list, string); sprintf (string, "Index_data_type: %c", index_data_type); str2list (browse_list, string); sprintf (string, "Table_name: %s", name); str2list (browse_list, string); sprintf (string, "Column_name: %s", col); str2list (browse_list, string); sprintf (string, "Unused_field: %s", unused); str2list (browse_list, string); } strcpy (string, " "); str2list (browse_list, string); count = (int32*)xvt_zmalloc (sizeof(int32) * nr_entries); /* Divide the remaining allowable text lines between the Index Directory */ /* records and the Index Data records */ maxlines = MAXLINES / 2; strcpy (string, "***** INDEX DIRECTORY RECORDS *****"); str2list (browse_list, string); /* Read Index Directory Records */ switch (data_type) { case 'L': /* Character String */ case 'T': /* Character String */ t_elt = (char*) xvt_zmalloc ((size_t) nr_elts); for (i=0; i",row_nrs[j]); if (add_string (browse_list, string, temp) == FALSE) { xvt_free ((char*)row_nrs); xvt_free ((char*)count); xvt_free (temp); xvt_free (string); return (browse_list); } } xvt_free ((char*)row_nrs); } break; } /* case S */ case 'I': /* Int32 Integer */ { int32 j, *row_nrs; for (i=0; i",row_nrs[j]); if (add_string (browse_list, string, temp) == FALSE) { xvt_free ((char*)row_nrs); xvt_free ((char*)count); xvt_free (temp); xvt_free (string); return (browse_list); } } xvt_free ((char*)row_nrs); } break; } /* case I */ } /* switch */ } /* if */ strcpy (string, "END_OF_TABLE"); slist_add (browse_list, NULL, string, 0L); xvt_free (string); xvt_free (temp); if (count) xvt_free ((char*)count); fclose (file); return (browse_list); } /***************************************************************************/ /* ADD_STRING */ /***************************************************************************/ #ifdef PROTO BOOLEAN add_string (SLIST list, char *string, char* temp) #else BOOLEAN add_string (list, string, temp) SLIST list; char *string; char *temp; #endif { size_t l1, l2; /* See if the string has enough room left to cat temp */ l1 = strlen (temp); l2 = strlen (string); if ((l1 + l2) > maxlength) { /* Not enough room left in string so add string to slist and start fresh */ if (str2list (list, string) != TRUE) { /* MAXLINES reached */ return (FALSE); } strcpy (string, temp); return (TRUE); } /* See if temp will fit into string */ if (l1 < (maxlength - l2)) { /* Copy contents of temp to string */ strcat (string, temp); } else /* Temp is too big to fit into one string so break it up */ { short start, end = 0; BOOLEAN done = FALSE; while (!done) { start = end; end += maxlength - 1; strncpy (string, &temp[start], end); if (str2list (list, string) != TRUE) { /* MAXLINES reached */ return (FALSE); } if (end >= l1) done = TRUE; } } return (TRUE); } /***************************************************************************/ /* STR2LIST */ /***************************************************************************/ #ifdef PROTO BOOLEAN str2list (SLIST list, char* string) #else BOOLEAN str2list (list, string) SLIST list; char *string; #endif { static int32 nr_lines; /* Use a Null string to initialize nr_lines */ if (string == (char*)NULL) { nr_lines = 0L; return (TRUE); } slist_add (list, NULL, string, 0L); nr_lines++; /* Check nr_lines for MAXLINES */ if (nr_lines >= MAXLINES) { /* Close up shop */ strcpy (string, "MAXLINES REACHED"); slist_add (list, NULL, string, 0L); return (FALSE); } else /* Start a new string */ memset (string, '\0', maxlength); return (TRUE); } ogdi-ogdi_4_1_0/vpflib/vpfbrows.h000066400000000000000000000017001345660466700171240ustar00rootroot00000000000000/* VPF_BROWSE.H */ #ifndef vpf_browse_h #define vpf_browse_h #include "xvt.h" #include "vpftable.h" #ifndef BOOLEAN typedef short BOOLEAN; #endif /* Browse Data Structure Definition */ typedef struct { char *path; BOOLEAN hdr_data; BOOLEAN field_desc; BOOLEAN field_labels; BOOLEAN cancel; int32 nr_fields; int32 start_record; int32 end_record; int32 string_length; } BROWSE; /* Prototype Declaration */ #ifdef PROTO void vpf_browse (BROWSE*); SLIST table_to_slist (BROWSE*); SLIST idx_to_str (BROWSE*, SLIST); SLIST si_to_str (BROWSE*, SLIST); SLIST ti_to_str (BROWSE*, SLIST); BOOLEAN add_string (SLIST, char*, char*); BOOLEAN str2list (SLIST, char*); #else void vpf_browse (); SLIST table_to_slist (); SLIST idx_to_str (); SLIST si_to_str (); SLIST ti_to_str (); BOOLEAN add_string (); BOOLEAN str2list (); #endif #endif ogdi-ogdi_4_1_0/vpflib/vpfdproj.c000066400000000000000000000154601345660466700171110ustar00rootroot00000000000000/* Vpfdproj dummy routines */ #ifndef __VPFPROJ_H__ #include "vpfproj.h" #endif #ifndef NOREF #define NOREF(a) a = a #endif #ifdef PROTO int32 plate_carree_fwd (double *x, double *y) #else int32 plate_carree_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return(0); } #ifdef PROTO int32 plate_carree_inv (double *x, double *y) #else int32 plate_carree_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return(0); } #ifdef PROTO void set_vpf_forward_projection (vpf_projection_type proj) #else void set_vpf_forward_projection (proj) vpf_projection_type proj; #endif { NOREF (proj); return; } #ifdef PROTO void set_vpf_inverse_projection (vpf_projection_type proj) #else void set_vpf_inverse_projection (proj) vpf_projection_type proj; #endif { NOREF (proj); return; } #ifdef PROTO vpf_projection_type set_vpf_projection_parms (vpf_projection_code code, extent_type extent) #else vpf_projection_type set_vpf_projection_parms (code, extent) vpf_projection_code code; extent_type extent; #endif { vpf_projection_type dummy; NOREF (code); NOREF (extent); memset(&dummy, 0, sizeof(dummy)); return (dummy); } #ifdef PROTO vpf_projection_type get_vpf_forward_projection() #else vpf_projection_type get_vpf_forward_projection () #endif { vpf_projection_type dummy; memset(&dummy, 0, sizeof(dummy)); return (dummy); } #ifdef PROTO vpf_projection_type get_vpf_inverse_projection() #else vpf_projection_type get_vpf_inverse_projection () #endif { vpf_projection_type dummy; memset(&dummy, 0, sizeof(dummy)); return (dummy); } #ifdef PROTO int32 albers_equal_area_fwd (double *x, double *y) #else int32 albers_equal_area_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 albers_equal_area_inv( double *x, double *y ) #else int32 albers_equal_area_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 azimuthal_equal_area_fwd( double *x, double *y ) #else int32 azimuthal_equal_area_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 azimuthal_equal_area_inv (double *x, double *y ) #else int32 azimuthal_equal_area_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 azimuthal_equal_distance_fwd (double *x, double *y ) #else int32 azimuthal_equal_distance_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 azimuthal_equal_distance_inv (double *x, double *y ) #else int32 azimuthal_equal_distance_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 gnomonic_fwd (double *x, double *y ) #else int32 gnomonic_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 gnomonic_inv (double *x, double *y ) #else int32 gnomonic_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 lambert_conformal_conic_fwd ( double *x, double *y ) #else int32 lambert_conformal_conic_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 lambert_conformal_conic_inv (double *x, double *y ) #else int32 lambert_conformal_conic_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 lambert_equal_area_fwd( double *x, double *y ) #else int32 lambert_equal_area_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 lambert_equal_area_inv (double *x, double *y ) #else int32 lambert_equal_area_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 mercator_fwd( double *x, double *y ) #else int32 mercator_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 mercator_inv (double *x, double *y ) #else int32 mercator_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 oblique_mercator_fwd( double *x, double *y ) #else int32 oblique_mercator_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 oblique_mercator_inv ( double *x, double *y ) #else int32 oblique_mercator_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 orthographic_fwd ( double *x, double *y ) #else int32 orthographic_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 orthographic_inv ( double *x, double *y ) #else int32 orthographic_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 polar_stereographic_fwd (double *x, double *y) #else int32 polar_stereographic_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 polar_stereographic_inv( double *x, double *y ) #else int32 polar_stereographic_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 transverse_mercator_fwd( double *x, double *y ) #else int32 transverse_mercator_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 transverse_mercator_inv ( double *x, double *y ) #else int32 transverse_mercataor_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 UTM_fwd( double *x, double *y ) #else int32 UTM_fwd (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 UTM_inv( double *x, double *y ) #else int32 UTM_inv (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 forward_project( double *x, double *y ) #else int32 forward_project (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO int32 inverse_project( double *x, double *y ) #else int32 inverse_project (x, y) double *x, *y; #endif { NOREF (x); NOREF (y); return (0); } #ifdef PROTO void set_vpf_coordinate_projection( vpf_projection_type proj ) #else void set_vpf_coordinate_projection (proj) vpf_projection_type proj; #endif { NOREF (proj); return; } ogdi-ogdi_4_1_0/vpflib/vpfio.h000066400000000000000000000102131345660466700163760ustar00rootroot00000000000000/* char VPFIO_H_ID[] = "@(#) vpfio.h 2.3 11/9/91 ESRI Applications Programming" ; */ /* ======================================================================== Environmental Systems Research Institute (ESRI) Applications Programming Project: Conversion from ARC/INFO to VPF Original Coding: David Flinn July 1991 Modifications: ======================================================================== */ #ifndef _VPF_IO_ #define _VPF_IO_ #include /* These are all the metacharacters used to parse out input text files */ #define COMPONENT_SEPERATOR ';' #define LINE_CONTINUE '\\' #define SPACE ' ' #define TEXT_NULL "-" #define COMMENT_CHAR '"' #define FIELD_COUNT '=' #define FIELD_SEPERATOR ',' #define END_OF_FIELD ':' #define FIELD_PARTITION '^' #define NEXT_ELEMENT '|' #define COMMENT '#' #define NEW_LINE '\n' #define VARIABLE_COUNT '*' #define TAB '\t' /* Set up the macros to read in data from disk and to write */ #ifndef _MSDOS #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* types */ typedef enum { VpfNull, VpfChar, VpfShort, VpfInteger, VpfFloat, VpfDouble, VpfDate, VpfKey, VpfCoordinate, VpfTriCoordinate, VpfDoubleCoordinate, VpfDoubleTriCoordinate, VpfUndefined } VpfDataType ; #define Read_Vpf_Char(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfChar,count,fromfile) #define Read_Vpf_Short(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfShort,count,fromfile) #define Read_Vpf_Int(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfInteger,count,fromfile) #define Read_Vpf_Float(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfFloat,count,fromfile) #define Read_Vpf_Double(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfDouble,count,fromfile) #define Read_Vpf_Date(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfDate,count,fromfile) #define Read_Vpf_Coordinate(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfCoordinate,count,fromfile) #define Read_Vpf_CoordinateZ(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfTriCoordinate,count,fromfile) #define Read_Vpf_DoubleCoordinate(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfDoubleCoordinate,count,fromfile) #define Read_Vpf_DoubleCoordinateZ(tobuffer,fromfile,count) \ VpfRead(tobuffer,VpfDoubleTriCoordinate,count,fromfile) #define Write_Vpf_Char(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfChar,count,fromfile) #define Write_Vpf_Short(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfShort,count,fromfile) #define Write_Vpf_Int(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfInteger,count,fromfile) #define Write_Vpf_Float(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfFloat,count,fromfile) #define Write_Vpf_Double(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfDouble,count,fromfile) #define Write_Vpf_Date(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfDate,count,fromfile) #define Write_Vpf_Coordinate(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfCoordinate,count,fromfile) #define Write_Vpf_CoordinateZ(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfTriCoordinate,count,fromfile) #define Write_Vpf_DoubleCoordinate(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfDoubleCoordinate,count,fromfile) #define Write_Vpf_DoubleCoordinateZ(tobuffer,fromfile,count) \ VpfWrite(tobuffer,VpfDoubleTriCoordinate,count,fromfile) /* subroutines */ #ifdef PROTO int32 VpfRead (void *to, VpfDataType type, int32 count, FILE *from); int32 VpfWrite (void *from, VpfDataType type, int32 count, FILE *to); #else int32 VpfRead (); int32 VpfWrite (); #endif #endif /* ifndef _VPF_IO_ */ ogdi-ogdi_4_1_0/vpflib/vpfprim.c000066400000000000000000001247071345660466700167470ustar00rootroot00000000000000/*********************************************************************** * *N Module VPFPRIM - VPF Primitives * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions for reading VPF primitives *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifndef INCL_XVTH #include #endif #ifdef _MSDOS #include #include #else #include #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __VPFPROJ_H__ #include "vpfproj.h" #endif #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif #ifndef __VPFPRIM_H__ #include "vpfprim.h" #endif #ifndef H_MUSEDIR #include "musedir.h" #endif /*********************************************************************** * *N create_edge_rec * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function creates an edge record internal structure from a * row of a VPF edge table. NOTE: This function allocates memory * for "edge_rec.coord". This array should be freed when no longer * needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row == (row_type) VPF table row. * edge_table == (vpf_table_type) opened VPF table to read. * return == (edge_rec_type) returned edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO edge_rec_type create_edge_rec (row_type row, vpf_table_type edge_table, int32 (*projfunc)()) #else edge_rec_type create_edge_rec (row, edge_table, projfunc) row_type row; vpf_table_type edge_table; int32 (*projfunc)(); #endif { edge_rec_type edge; int32 rowid, start, end, right_face, left_face, right_edge, left_edge; int32 coord, count, i; id_triplet_type key; coordinate_type *Ccoord; tri_coordinate_type *Zcoord; double_tri_coordinate_type *Ycoord; if (!row) { edge.id = -1; edge.npts = 0; return edge; } rowid = table_pos( "ID", edge_table ); start = table_pos( "START_NODE", edge_table ); end = table_pos( "END_NODE", edge_table ); right_face = table_pos( "RIGHT_FACE", edge_table ); left_face = table_pos( "LEFT_FACE", edge_table ); right_edge = table_pos( "RIGHT_EDGE", edge_table ); left_edge = table_pos( "LEFT_EDGE", edge_table ); coord = table_pos( "COORDINATES", edge_table ); get_table_element( rowid, row, edge_table, &(edge.id), &count ); if (start >= 0) get_table_element( start, row, edge_table, &(edge.start_node), &count ); else edge.start_node = 0; if (end >= 0) get_table_element( end, row, edge_table, &(edge.end_node), &count ); else edge.end_node = 0; if (right_face >= 0) { if (edge_table.header[right_face].type=='K') { get_table_element( right_face, row, edge_table, &key, &count ); edge.right_face = key.id; } else if (edge_table.header[right_face].type=='I') { get_table_element( right_face, row, edge_table, &(edge.right_face), &count ); } else { edge.right_face=1; } } else { edge.right_face = 1; } if (left_face >= 0) { if (edge_table.header[right_face].type=='K') { get_table_element( left_face, row, edge_table, &key, &count ); edge.left_face = key.id; } else if (edge_table.header[left_face].type=='I') { get_table_element( left_face, row, edge_table, &(edge.left_face), &count ); } else { edge.left_face=1; } } else { edge.left_face = 1; } if (edge_table.header[right_edge].type=='K') { get_table_element( right_edge, row, edge_table, &key, &count ); edge.right_edge = key.id; } else if (edge_table.header[right_edge].type=='I') { get_table_element( right_edge, row, edge_table, &(edge.right_edge), &count ); } else { edge.right_edge=0; } if (edge_table.header[left_edge].type=='K') { get_table_element( left_edge, row, edge_table, &key, &count ); edge.left_edge = key.id; } else if (edge_table.header[left_edge].type=='I') { get_table_element( left_edge, row, edge_table, &(edge.left_edge), &count ); } else { edge.left_edge=0; } switch (edge_table.header[coord].type) { case 'C': Ccoord = (coordinate_type *)get_table_element( coord, row, edge_table, NULL, &count ); edge.coords = (double_coordinate_type*)xvt_malloc((size_t)count * sizeof(double_coordinate_type)); if (edge.coords) { for (i=0;i == (int32) edge id number. * edge_table == (vpf_table_type) opened VPF table to read. * return == (edge_rec_type) returned edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO edge_rec_type read_edge( int32 id, vpf_table_type edge_table, int32 (*projfunc)() ) #else edge_rec_type read_edge (id, edge_table, projfunc) int32 id; vpf_table_type edge_table; int32 (*projfunc)(); #endif { edge_rec_type edge; row_type row; row = get_row( id, edge_table ); edge = create_edge_rec( row, edge_table, projfunc ); free_row( row, edge_table ); return edge; } /*********************************************************************** * *N read_next_edge * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the next VPF edge record from the input VPF table. * NOTE: This function allocates memory for "edge_rec.coord". * This array should be freed when no longer needed. * Must have called vpf_open_table with DISK as the storage type, * since this function accesses the disk to read the next row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * edge_table == (vpf_table_type) opened VPF table to read. * return == (edge_rec_type) returned edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO edge_rec_type read_next_edge (vpf_table_type edge_table, int32 (*projfunc)() ) #else edge_rec_type read_next_edge (edge_table, projfunc) vpf_table_type edge_table; int32 (*projfunc)(); #endif { edge_rec_type edge; row_type row; row = read_next_row( edge_table ); edge = create_edge_rec( row, edge_table, projfunc ); free_row( row, edge_table ); return edge; } /*********************************************************************** * *N first_edge_coordinate * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the first coordinate of the given VPF edge * record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * edge_rec == (edge_rec_type *) VPF edge record structure. * return == (double_coordinate_type) first coordinate * in the edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO double_coordinate_type first_edge_coordinate (edge_rec_type *edge_rec) #else double_coordinate_type first_edge_coordinate (edge_rec) edge_rec_type *edge_rec; #endif { coordinate_type coord; tri_coordinate_type Zcoord; double_coordinate_type Bcoord; double_tri_coordinate_type Ycoord; int32 size; edge_rec->current_coordinate = 0; if (edge_rec->coords) { /* Coordinate array is in memory */ return edge_rec->coords[0]; } /* Read coordinate from table */ fseek(edge_rec->fp,edge_rec->startpos,SEEK_SET); switch (edge_rec->coord_type) { case 'C': ogdi_fread(&coord,sizeof(coord),1,edge_rec->fp); Bcoord.x = (double) coord.x; Bcoord.y = (double) coord.y; size = sizeof(coord); break; case 'Z': ogdi_fread(&Zcoord,sizeof(Zcoord),1,edge_rec->fp); Bcoord.x = (double) Zcoord.x; Bcoord.y = (double) Zcoord.y; size = sizeof(Zcoord); break; case 'B': ogdi_fread(&Bcoord,sizeof(Bcoord),1,edge_rec->fp); size = sizeof(Bcoord); break; case 'Y': ogdi_fread(&Ycoord,sizeof(Ycoord),1,edge_rec->fp); Bcoord.x = Ycoord.x; Bcoord.y = Ycoord.y; size = sizeof(Ycoord); break; default: Bcoord.x = (double) NULLINT; Bcoord.y = (double) NULLINT; size = 0; break; } edge_rec->pos = edge_rec->startpos + size; return Bcoord; } /*********************************************************************** * *N next_edge_coordinate * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the next coordinate of the given VPF edge * record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * edge_rec == (edge_rec_type *) VPF edge record structure. * return == (double_coordinate_type) next coordinate * in the edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO double_coordinate_type next_edge_coordinate (edge_rec_type *edge_rec) #else double_coordinate_type next_edge_coordinate (edge_rec) edge_rec_type *edge_rec; #endif { coordinate_type coord; tri_coordinate_type Zcoord; double_coordinate_type Bcoord; double_tri_coordinate_type Ycoord; int32 size; if (edge_rec->current_coordinate < 0) return first_edge_coordinate(edge_rec); edge_rec->current_coordinate++; if (edge_rec->current_coordinate >= edge_rec->npts) { edge_rec->current_coordinate = edge_rec->npts-1L; if (!edge_rec->coords) fseek(edge_rec->fp,edge_rec->startpos + (edge_rec->npts-1L)*sizeof(coord), SEEK_SET); } if (edge_rec->coords) { /* Coordinate array is in memory */ return edge_rec->coords[edge_rec->current_coordinate]; } /* Read coordinate from table */ switch (edge_rec->coord_type) { case 'C': ogdi_fread(&coord,sizeof(coord),1,edge_rec->fp); Bcoord.x = (double) coord.x; Bcoord.y = (double) coord.y; size = sizeof(coord); break; case 'Z': ogdi_fread(&Zcoord,sizeof(Zcoord),1,edge_rec->fp); Bcoord.x = (double) Zcoord.x; Bcoord.y = (double) Zcoord.y; size = sizeof(Zcoord); break; case 'B': ogdi_fread(&Bcoord,sizeof(Bcoord),1,edge_rec->fp); size = sizeof(Bcoord); break; case 'Y': ogdi_fread(&Ycoord,sizeof(Ycoord),1,edge_rec->fp); Bcoord.x = Ycoord.x; Bcoord.y = Ycoord.y; size = sizeof(Ycoord); break; default: Bcoord.x = (double) NULLINT; Bcoord.y = (double) NULLINT; size = 0; break; } edge_rec->pos = edge_rec->startpos + size; return Bcoord; } /*********************************************************************** * *N get_edge_coordinate * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the specified coordinate of the given VPF edge * record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * edge_rec == (edge_rec_type *) VPF edge record structure. * n == (int32) coordinate array number. * return == (double_coordinate_type) next coordinate * in the edge record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO double_coordinate_type get_edge_coordinate (int32 n, edge_rec_type *edge_rec) #else double_coordinate_type get_edge_coordinate (n, edge_rec) int32 n; edge_rec_type *edge_rec; #endif { coordinate_type coord; tri_coordinate_type Zcoord; double_coordinate_type Bcoord; double_tri_coordinate_type Ycoord; int32 size; if (n < 0) return first_edge_coordinate(edge_rec); if (n >= edge_rec->npts) n = edge_rec->npts-1L; edge_rec->current_coordinate = n; if (edge_rec->coords) { /* Coordinate array is in memory */ return edge_rec->coords[n]; } /* Read coordinate from table */ switch (edge_rec->coord_type) { case 'C': size = sizeof(coord); break; case 'Z': size = sizeof(Zcoord); break; case 'B': size = sizeof(Bcoord); break; case 'Y': size = sizeof(Ycoord); break; default: size = 0; break; } edge_rec->pos = edge_rec->startpos + (n*size); fseek(edge_rec->fp,edge_rec->pos,SEEK_SET); switch (edge_rec->coord_type) { case 'C': ogdi_fread(&coord,sizeof(coord),1,edge_rec->fp); Bcoord.x = (double) coord.x; Bcoord.y = (double) coord.y; break; case 'Z': ogdi_fread(&Zcoord,sizeof(Zcoord),1,edge_rec->fp); Bcoord.x = (double) Zcoord.x; Bcoord.y = (double) Zcoord.y; break; case 'B': ogdi_fread(&Bcoord,sizeof(Bcoord),1,edge_rec->fp); break; case 'Y': ogdi_fread(&Ycoord,sizeof(Ycoord),1,edge_rec->fp); Bcoord.x = Ycoord.x; Bcoord.y = Ycoord.y; break; default: Bcoord.x = (double)NULLINT; Bcoord.y = (double)NULLINT; break; } return Bcoord; } /*********************************************************************** * *N read_face * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads a VPF face record from the input VPF table. * It performs a search for the specified face number, and, if found, * reads and returns the face record. If id is out of range, * either the lowest or highest id numbered face record type will be * returned. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * id == (int32) face id number. * face_table == (vpf_table_type) opened VPF table to read. * return == (face_rec_type) returned face record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO face_rec_type read_face (int32 id, vpf_table_type face_table) #else face_rec_type read_face (id, face_table) int32 id; vpf_table_type face_table; #endif { face_rec_type face; int32 count, rowid, ring; row_type row; rowid = table_pos( "ID", face_table ); ring = table_pos( "RING_PTR", face_table ); row = get_row( id, face_table ); get_table_element( rowid, row, face_table, &(face.id), &count ); get_table_element( ring, row, face_table, &(face.ring), &count ); free_row( row, face_table ); return face; } /*********************************************************************** * *N read_next_face * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * Purpose: *P * This function reads the next VPF face record from the input VPF * table. Must have used vpf_open_table with DISK as the storage type. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * face_table == (vpf_table_type) opened VPF table to read. * return == (face_rec_type) returned face record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO face_rec_type read_next_face( vpf_table_type face_table ) #else face_rec_type read_next_face (face_table) vpf_table_type face_table; #endif { face_rec_type face; int32 count, rowid, ring; row_type row; rowid = table_pos( "ID", face_table ); ring = table_pos( "RING_PTR", face_table ); row = read_next_row( face_table ); get_table_element( rowid, row, face_table, &(face.id), &count ); get_table_element( ring, row, face_table, &(face.ring), &count ); free_row( row, face_table ); return face; } /*********************************************************************** * *N read_ring * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads a VPF ring record from the input VPF table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * id == (int32) ring id number. * ring_table == (vpf_table_type) opened VPF table to read. * return == (ring_rec_type) returned ring record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO ring_rec_type read_ring (int32 id, vpf_table_type ring_table) #else ring_rec_type read_ring (id, ring_table) int32 id; vpf_table_type ring_table; #endif { ring_rec_type ring; int32 count, rowid, face, edge; row_type row; rowid = table_pos( "ID", ring_table ); face = table_pos( "FACE_ID", ring_table ); edge = table_pos( "START_EDGE", ring_table ); row = get_row( id, ring_table ); get_table_element( rowid, row, ring_table, &(ring.id), &count ); get_table_element( face, row, ring_table, &(ring.face), &count ); get_table_element( edge, row, ring_table, &(ring.edge), &count ); free_row( row, ring_table ); return ring; } /*********************************************************************** * *N read_next_ring * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the next VPF ring record from the input VPF table. * If read_next_ring goes past the end of the vpftable, ring_rec_type * id will be a garbage number. The programmer must ensure that this * does NOT happen. Must have called vpf_open_table with DISK as the * storage type. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * ring_table == (vpf_table_type) opened VPF table to read. * return == (ring_rec_type) returned ring record. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO ring_rec_type read_next_ring (vpf_table_type ring_table ) #else ring_rec_type read_next_ring (ring_table) vpf_table_type ring_table; #endif { ring_rec_type ring; int32 count, rowid, face, edge; row_type row; rowid = table_pos( "ID", ring_table ); face = table_pos( "FACE_ID", ring_table ); edge = table_pos( "START_EDGE", ring_table ); row = read_next_row( ring_table ); get_table_element( rowid, row, ring_table, &(ring.id), &count ); get_table_element( face, row, ring_table, &(ring.face), &count ); get_table_element( edge, row, ring_table, &(ring.edge), &count ); free_row( row, ring_table ); return ring; } /*********************************************************************** * *N read_node * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads a VPF node record from the input VPF table. * It performs a search for the specified node number, and, if found, * reads and returns the node record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * id == (int32) node id number. * node_table == (vpf_table_type) opened VPF table to read. * return == (node_rec_type) returned node record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO node_rec_type read_node (int32 id, vpf_table_type node_table, int32 (*projfunc)() ) #else node_rec_type read_node (id, node_table, projfunc) int32 id; vpf_table_type node_table; int32 (*projfunc)(); #endif { node_rec_type node; int32 count, rowid, face, first_edge, coord; coordinate_type c; tri_coordinate_type Zcoord; double_coordinate_type Bcoord; double_tri_coordinate_type Ycoord; row_type row; rowid = table_pos( "ID", node_table ); face = table_pos( "CONTAINING_FACE", node_table ); first_edge = table_pos( "FIRST_EDGE", node_table ); coord = table_pos( "COORDINATE", node_table ); row = get_row( id, node_table ); get_table_element( rowid, row, node_table, &(node.id), &count ); if (face>0) get_table_element( face, row, node_table, &(node.face), &count ); else node.face = 0; if (first_edge>0) get_table_element( first_edge, row, node_table, &(node.first_edge), &count ); else node.first_edge = 0; switch (node_table.header[coord].type) { case 'C': get_table_element( coord, row, node_table, &c, &count ); node.x = (double) c.x; node.y = (double) c.y; break; case 'Z': get_table_element( coord, row, node_table, &Zcoord, &count ); node.x = (double) Zcoord.x; node.y = (double) Zcoord.y; break; case 'B': get_table_element( coord, row, node_table, &Bcoord, &count ); node.x = Bcoord.x; node.y = Bcoord.y; break; case 'Y': get_table_element( coord, row, node_table, &Ycoord, &count ); node.x = Ycoord.x; node.y = Ycoord.y; break; default: node.x = (double)NULLINT; node.y = (double)NULLINT; break; } free_row( row, node_table ); if (projfunc != NULL) { projfunc( &(node.x), &(node.y) ); } return node; } /*********************************************************************** * *N read_next_node * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the next VPF node record from the input * VPF table. Must have called vpf_open_table with DISK as the * storage type. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * node_table == (vpf_table_type) opened VPF table to read. * return == (node_rec_type) returned node record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E *********************************************************************/ #ifdef PROTO node_rec_type read_next_node (vpf_table_type node_table, int32 (*projfunc)()) #else node_rec_type read_next_node (node_table, projfunc) vpf_table_type node_table; int32 (*projfunc)(); #endif { node_rec_type node; int32 count, rowid, face, first_edge, coord; coordinate_type c; tri_coordinate_type Zcoord; double_coordinate_type Bcoord; double_tri_coordinate_type Ycoord; row_type row; rowid = table_pos( "ID", node_table ); face = table_pos( "CONTAINING_FACE", node_table ); first_edge = table_pos( "FIRST_EDGE", node_table ); coord = table_pos( "COORDINATE", node_table ); row = read_next_row( node_table ); get_table_element( rowid, row, node_table, &(node.id), &count ); if (face>0) get_table_element( face, row, node_table, &(node.face), &count ); else node.face = 0; if (first_edge>0) get_table_element( first_edge, row, node_table, &(node.first_edge), &count ); else node.first_edge = 0; switch (node_table.header[coord].type) { case 'C': get_table_element( coord, row, node_table, &c, &count ); node.x = (double) c.x; node.y = (double) c.y; break; case 'Z': get_table_element( coord, row, node_table, &Zcoord, &count ); node.x = (double) Zcoord.x; node.y = (double) Zcoord.y; break; case 'B': get_table_element( coord, row, node_table, &Bcoord, &count ); node.x = Bcoord.x; node.y = Bcoord.y; break; case 'Y': get_table_element( coord, row, node_table, &Ycoord, &count ); node.x = Ycoord.x; node.y = Ycoord.y; break; default: node.x = (double)NULLINT; node.y = (double)NULLINT; break; } free_row( row, node_table ); if (projfunc != NULL) { projfunc( &(node.x), &(node.y) ); } return node; } /*********************************************************************** * *N read_text * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads a VPF annotation record from the input VPF table. * It performs a search for the specified annotation id, and, if * found, reads and returns the annotation record. NOTE: This function * allocates memory for "txt.text". This must be freed when no * longer needed. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * id == (int32) annotation id. * text_table == (vpf_table_type) opened VPF table to read. * return == (text_rec_type) returned annotation record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO text_rec_type read_text (int32 id, vpf_table_type text_table, int32 (*projfunc)()) #else text_rec_type read_text (id, text_table, projfunc) int32 id; vpf_table_type text_table; int32 (*projfunc)(); #endif { text_rec_type txt; int32 count, rowid, text, coord; coordinate_type *c; tri_coordinate_type *Zcoord; double_coordinate_type *Bcoord; double_tri_coordinate_type *Ycoord; row_type row; rowid = table_pos( "ID", text_table ); text = table_pos( "STRING", text_table ); coord = table_pos( "SHAPE_LINE", text_table ); row = get_row( id, text_table ); get_table_element( rowid, row, text_table, &(txt.id), &count ); txt.text = get_table_element( text, row, text_table, NULL, &count ); switch (text_table.header[coord].type) { case 'C': c = (coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = (double) c[0].x; txt.y = (double) c[0].y; xvt_free((char*)c); break; case 'Z': Zcoord = (tri_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = (double) Zcoord[0].x; txt.y = (double) Zcoord[0].y; xvt_free((char*)Zcoord); break; case 'B': Bcoord = (double_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = Bcoord[0].x; txt.y = Bcoord[0].y; xvt_free((char*)Bcoord); break; case 'Y': Ycoord = (double_tri_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = Ycoord[0].x; txt.y = Ycoord[0].y; xvt_free ((char*)Ycoord); break; default: txt.x = (double)NULLINT; txt.y = (double)NULLINT; break; } free_row( row, text_table ); if (projfunc != NULL) { projfunc( &(txt.x), &(txt.y) ); } return txt; } /*********************************************************************** * *N read_next_text * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the next VPF annotation record from the input * VPF table. Must have called vpf_open_table with DISK as the storage * type. NOTE: This function allocates memory for "txt.text". This * must be freed when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * text_table == (vpf_table_type) opened VPF table to read. * return == (text_rec_type) returned annotation record. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO text_rec_type read_next_text( vpf_table_type text_table, int32 (*projfunc)()) #else text_rec_type read_next_text (text_table, projfunc) vpf_table_type text_table; int32 (*projfunc)(); #endif { text_rec_type txt; int32 count, rowid, text, coord; coordinate_type *c; tri_coordinate_type *Zcoord; double_coordinate_type *Bcoord; double_tri_coordinate_type *Ycoord; row_type row; rowid = table_pos( "ID", text_table ); text = table_pos( "STRING", text_table ); coord = table_pos( "SHAPE_LINE", text_table ); row = read_next_row( text_table ); get_table_element( rowid, row, text_table, &(txt.id), &count ); txt.text = get_table_element( text, row, text_table, NULL, &count ); switch (text_table.header[coord].type) { case 'C': c = (coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = (double) c[0].x; txt.y = (double) c[0].y; xvt_free ((char*)c); break; case 'Z': Zcoord = (tri_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = (double) Zcoord[0].x; txt.y = (double) Zcoord[0].y; xvt_free ((char*)Zcoord); break; case 'B': Bcoord = (double_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = Bcoord[0].x; txt.y = Bcoord[0].y; xvt_free ((char*)Bcoord); break; case 'Y': Ycoord = (double_tri_coordinate_type *)get_table_element( coord, row, text_table, NULL, &count ); txt.x = Ycoord[0].x; txt.y = Ycoord[0].y; xvt_free ((char*)Ycoord); break; default: txt.x = (double)NULLINT; txt.y = (double)NULLINT; break; } free_row( row, text_table ); if (projfunc != NULL) { projfunc( &(txt.x), &(txt.y) ); } return txt; } /*********************************************************************** * *N bounding_select * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the bounding rectangle table to weed out the * local primitives. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * brpath == (char *) path to the bounding rectangle table. * mapextent == (extent_type) map extent to compare. * dec_degrees == (int32) flag to indicate if data is in decimal * degrees. * projfunc == (int32 *)() inverse projection function. * bounding_select == (set_type) set of bounding rectangle ids. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO set_type bounding_select( char *brpath, extent_type extent, vpf_projection_type invproj ) #else set_type bounding_select (brpath, extent, invproj) char *brpath; extent_type extent; vpf_projection_type invproj; #endif { vpf_table_type table; row_type row; set_type set; int32 count, id; int32 XMIN_, YMIN_, XMAX_, YMAX_; extent_type box, pextent; float fx1,fy1,fx2,fy2; double x1,y1,x2,y2; vpf_projection_type pcproj, prevproj; prevproj = get_vpf_forward_projection(); /* Project all extents to plate-carree for cartesian comparisons */ /* (decimal degree coordinate systems) */ x1 = extent.x1; y1 = extent.y1; x2 = extent.x2; y2 = extent.y2; pcproj = set_vpf_projection_parms(PC,extent); set_vpf_forward_projection(pcproj); plate_carree_fwd(&x1,&y1); plate_carree_fwd(&x2,&y2); pextent.x1 = x1; pextent.y1 = y1; pextent.x2 = x2; pextent.y2 = y2; table = vpf_open_table(brpath,disk,"rb",NULL); XMIN_ = table_pos("XMIN",table); YMIN_ = table_pos("YMIN",table); XMAX_ = table_pos("XMAX",table); YMAX_ = table_pos("YMAX",table); set = set_init(table.nrows+1); for (id=1;id<=table.nrows;id++) { row = read_next_row( table ); get_table_element(XMIN_,row,table,&fx1,&count); get_table_element(YMIN_,row,table,&fy1,&count); get_table_element(XMAX_,row,table,&fx2,&count); get_table_element(YMAX_,row,table,&fy2,&count); free_row(row,table); box.x1 = (double)fx1; box.y1 = (double)fy1; box.x2 = (double)fx2; box.y2 = (double)fy2; if (invproj.inverse_proj != NULL) { set_vpf_inverse_projection(invproj); invproj.inverse_proj( &(box.x1), &(box.y1) ); invproj.inverse_proj( &(box.x2), &(box.y2) ); } x1 = box.x1; y1 = box.y1; x2 = box.x2; y2 = box.y2; set_vpf_forward_projection(pcproj); plate_carree_fwd(&x1,&y1); plate_carree_fwd(&x2,&y2); box.x1 = x1; box.y1 = y1; box.x2 = x2; box.y2 = y2; if ( contained(box,pextent) || contained(pextent,box) ) { set_insert(id,set); } } vpf_close_table(&table); set_vpf_forward_projection(prevproj); return set; } /*********************************************************************** * *N open_bounding_rect * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function opens the bounding rectangle table for the specified * primitmive class. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * covpath == (char *) path to coverage directory. * tiledir == (char *) directory name of tile directory. * pclass == (int32) primitive class for bounding rectangle. * open_bounding_rect == (vpf_table_type) bounding rectangle table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Sept 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO vpf_table_type open_bounding_rect (char *covpath, char *tiledir, int32 pclass) #else vpf_table_type open_bounding_rect (covpath, tiledir, pclass) char *covpath; char *tiledir; int32 pclass; #endif { vpf_table_type brtable; char path[256]; static char *brname[] = {"","ebr","fbr","tbr","nbr","cbr"}; strcpy( path, covpath ); strcat (path, tiledir); strcat (path, brname[pclass]); if (muse_access(path,0)==0) { brtable = vpf_open_table( path, disk, "rb", NULL ); } else { brtable.fp = NULL; brtable.status = CLOSED; } return brtable; } /*********************************************************************** * *N read_bounding_rect * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Reads the specified extent from the opened bounding rectangle table. * If the given projection function is not NULL, the bounding * rectangle coordinates are projected through the specified function * before being returned. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row == (int32) table row. * brtable == (vpf_table_type) bounding rectangle table. * projfunc == (int32 *)() inverse projection function. * read_bounding_rect == (extent_type) spatial extent. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Sept 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO extent_type read_bounding_rect (int32 row, vpf_table_type brtable, int32 (*projfunc)() ) #else extent_type read_bounding_rect (row, brtable, projfunc) int32 row; vpf_table_type brtable; int32 (*projfunc)(); #endif { int32 count; extent_type extent; float x1,y1,x2,y2; row_type tablerow; int32 XMIN_,YMIN_,XMAX_,YMAX_; XMIN_ = table_pos("XMIN",brtable); YMIN_ = table_pos("YMIN",brtable); XMAX_ = table_pos("XMAX",brtable); YMAX_ = table_pos("YMAX",brtable); tablerow = read_row(row,brtable); get_table_element(XMIN_,tablerow,brtable,&x1,&count); get_table_element(YMIN_,tablerow,brtable,&y1,&count); get_table_element(XMAX_,tablerow,brtable,&x2,&count); get_table_element(YMAX_,tablerow,brtable,&y2,&count); free_row(tablerow,brtable); extent.x1 = (double) x1; extent.y1 = (double) y1; extent.x2 = (double) x2; extent.y2 = (double) y2; if (projfunc != NULL) { projfunc( &(extent.x1), &(extent.y1) ); projfunc( &(extent.x2), &(extent.y2) ); } return extent; } /*********************************************************************** * *N read_next_bounding_rect * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Reads the next extent from the opened bounding rectangle table. * If the given projection function is not NULL, the bounding * rectangle coordinates are projected through the specified function * before being returned. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row == (int32) table row. * brtable == (vpf_table_type) bounding rectangle table. * projfunc == (int32 *)() inverse projection function. * read_bounding_rect == (extent_type) spatial extent. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Sept 1991 DOS Turbo C *E **********************************************************************/ #ifdef PROTO extent_type read_next_bounding_rect( vpf_table_type brtable, int32 (*projfunc)() ) #else extent_type read_next_bounding_rect (brtable, projfunc) vpf_table_type brtable; int32 (*projfunc)(); #endif { int32 count; extent_type extent; float x1,y1,x2,y2; row_type tablerow; int32 XMIN_,YMIN_,XMAX_,YMAX_; XMIN_ = table_pos("XMIN",brtable); YMIN_ = table_pos("YMIN",brtable); XMAX_ = table_pos("XMAX",brtable); YMAX_ = table_pos("YMAX",brtable); tablerow = read_next_row(brtable); get_table_element(XMIN_,tablerow,brtable,&x1,&count); get_table_element(YMIN_,tablerow,brtable,&y1,&count); get_table_element(XMAX_,tablerow,brtable,&x2,&count); get_table_element(YMAX_,tablerow,brtable,&y2,&count); free_row(tablerow,brtable); extent.x1 = (double) x1; extent.y1 = (double) y1; extent.x2 = (double) x2; extent.y2 = (double) y2; if (projfunc != NULL) { projfunc( &(extent.x1), &(extent.y1) ); projfunc( &(extent.x2), &(extent.y2) ); } return extent; } ogdi-ogdi_4_1_0/vpflib/vpfprim.h000066400000000000000000000074561345660466700167550ustar00rootroot00000000000000 #ifndef __VPFPRIM_H__ #define __VPFPRIM_H__ 1 #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif #ifndef __SET_H__ #include "set.h" #endif #ifndef _VPF_TABLE_H_ #include "vpftable.h" #endif #ifndef __VPF_H__ #include "vpf.h" #endif /* VPF edge record internal structure */ typedef struct { int32 id; int32 start_node; int32 end_node; int32 right_face; int32 left_face; int32 right_edge; int32 left_edge; char dir; int32 npts; double_coordinate_type *coords; /* For coordinate arrays too large for memory (DOS support) */ FILE *fp; int32 startpos, pos, current_coordinate; char coord_type; int32 (*projfunc)(); } edge_rec_type; /* "static" part of the edge record (non-variable) */ typedef struct { int32 id; int32 start_node; int32 end_node; int32 right_face; int32 left_face; int32 right_edge; int32 left_edge; char dir; int32 npts; } edge_static_type; /* VPF face record structure */ typedef struct { int32 id; int32 ring; } face_rec_type; /* VPF ring record structure */ typedef struct { int32 id; int32 face; int32 edge; } ring_rec_type; /* VPF entity node record internal structure */ typedef struct { int32 id; int32 face; int32 first_edge; double x; double y; } node_rec_type; /* VPF text record internal structure */ typedef struct { int32 id; char *text; double x; double y; } text_rec_type; #ifdef PROTO edge_rec_type create_edge_rec( row_type row, vpf_table_type edge_table, int32 (*projfunc)() ); edge_rec_type read_edge( int32 id, vpf_table_type edge_table, int32 (*projfunc)() ); edge_rec_type read_next_edge( vpf_table_type edge_table, int32 (*projfunc)() ); double_coordinate_type first_edge_coordinate( edge_rec_type *edge_rec ); double_coordinate_type next_edge_coordinate( edge_rec_type *edge_rec ); double_coordinate_type get_edge_coordinate( int32 n, edge_rec_type *edge_rec ); face_rec_type read_face( int32 id, vpf_table_type face_table ); face_rec_type read_next_face( vpf_table_type face_table ); ring_rec_type read_ring( int32 id, vpf_table_type ring_table ); ring_rec_type read_next_ring( vpf_table_type ring_table ); node_rec_type read_node( int32 id, vpf_table_type node_table, int32 (*projfunc)() ); node_rec_type read_next_node( vpf_table_type node_table, int32 (*projfunc)() ); text_rec_type read_text( int32 id, vpf_table_type text_table, int32 (*projfunc)() ); text_rec_type read_next_text( vpf_table_type text_table, int32 (*projfunc)() ); set_type bounding_select( char *brpath, extent_type extent, vpf_projection_type invproj ); vpf_table_type open_bounding_rect( char *covpath, char *tiledir, int32 pclass ); extent_type read_bounding_rect( int32 row, vpf_table_type brtable, int32 (*projfunc)() ); extent_type read_next_bounding_rect( vpf_table_type brtable, int32 (*projfunc)() ); #else edge_rec_type create_edge_rec (); edge_rec_type read_edge (); edge_rec_type read_next_edge (); double_coordinate_type first_edge_coordinate (); double_coordinate_type next_edge_coordinate (); double_coordinate_type get_edge_coordinate (); face_rec_type read_face (); face_rec_type read_next_face (); ring_rec_type read_ring (); ring_rec_type read_next_ring (); node_rec_type read_node (); node_rec_type read_next_node (); text_rec_type read_text (); text_rec_type read_next_text (); set_type bounding_select (); vpf_table_type open_bounding_rect (); extent_type read_bounding_rect (); extent_type read_next_bounding_rect (); #endif /* If PROTO */ #endif ogdi-ogdi_4_1_0/vpflib/vpfproj.h000066400000000000000000000065131345660466700167510ustar00rootroot00000000000000 #ifndef __VPFPROJ_H__ #define __VPFPROJ_H__ 1 #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif #ifndef __VPF_H__ #include "vpf.h" #endif #ifdef PROTO vpf_projection_type set_vpf_projection_parms (vpf_projection_code code, extent_type extent); void set_vpf_forward_projection( vpf_projection_type proj ); void set_vpf_inverse_projection( vpf_projection_type proj ); vpf_projection_type get_vpf_forward_projection(); vpf_projection_type get_vpf_inverse_projection(); double central_meridian( double minlon, double maxlon ); int32 plate_carree_fwd( double *x, double *y ); int32 plate_carree_inv( double *x, double *y ); int32 albers_equal_area_fwd( double *x, double *y ); int32 albers_equal_area_inv( double *x, double *y ); int32 azimuthal_equal_area_fwd( double *x, double *y ); int32 azimuthal_equal_area_inv( double *x, double *y ); int32 azimuthal_equal_distance_fwd( double *x, double *y ); int32 azimuthal_equal_distance_inv( double *x, double *y ); int32 gnomonic_fwd( double *x, double *y ); int32 gnomonic_inv( double *x, double *y ); int32 lambert_conformal_conic_fwd( double *x, double *y ); int32 lambert_conformal_conic_inv( double *x, double *y ); int32 lambert_equal_area_fwd( double *x, double *y ); int32 lambert_equal_area_inv( double *x, double *y ); int32 mercator_fwd( double *x, double *y ); int32 mercator_inv( double *x, double *y ); int32 oblique_mercator_fwd( double *x, double *y ); int32 oblique_mercator_inv( double *x, double *y ); int32 orthographic_fwd( double *x, double *y ); int32 orthographic_inv( double *x, double *y ); int32 polar_stereographic_fwd( double *x, double *y ); int32 polar_stereographic_inv( double *x, double *y ); int32 transverse_mercator_fwd( double *x, double *y ); int32 transverse_mercator_inv( double *x, double *y ); int32 UTM_fwd( double *x, double *y ); int32 UTM_inv( double *x, double *y ); int32 forward_project( double *x, double *y ); int32 inverse_project( double *x, double *y ); void set_vpf_coordinate_projection( vpf_projection_type proj ); #else vpf_projection_type set_vpf_projection_parms (); void set_vpf_forward_projection(); void set_vpf_inverse_projection(); vpf_projection_type get_vpf_forward_projection(); vpf_projection_type get_vpf_inverse_projection(); double central_meridian(); int32 plate_carree_fwd(); int32 plate_carree_inv(); int32 albers_equal_area_fwd(); int32 albers_equal_area_inv(); int32 azimuthal_equal_area_fwd(); int32 azimuthal_equal_area_inv(); int32 azimuthal_equal_distance_fwd(); int32 azimuthal_equal_distance_inv(); int32 gnomonic_fwd(); int32 gnomonic_inv(); int32 lambert_conformal_conic_fwd(); int32 lambert_conformal_conic_inv(); int32 lambert_equal_area_fwd(); int32 lambert_equal_area_inv(); int32 mercator_fwd(); int32 mercator_inv(); int32 oblique_mercator_fwd(); int32 oblique_mercator_inv(); int32 orthographic_fwd(); int32 orthographic_inv(); int32 polar_stereographic_fwd(); int32 polar_stereographic_inv(); int32 transverse_mercator_fwd(); int32 transverse_mercator_inv(); int32 UTM_fwd(); int32 UTM_inv(); int32 forward_project(); int32 inverse_project(); void set_vpf_coordinate_projection(); #endif #endif ogdi-ogdi_4_1_0/vpflib/vpfprop.c000066400000000000000000002203431345660466700167510ustar00rootroot00000000000000 /************************************************************************* * *N Module VPFPROP - VPF Properties Module * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions for returning various standard * properties of VPF entities such as databases, libraries, coverages, * and feature classes. * * All of the functions take character strings as arguments to * identify VPF tables and directories. These character strings * must not be passed NULL value parameters. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifndef INCL_XVTH #include #endif #ifndef __VPF_H__ #include "vpf.h" #endif #ifndef __VPFPROJ_H__ #include "vpfproj.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef __VPFPROP_H__ #include "vpfprop.h" #endif #ifndef MAXINT #define MAXINT SHRT_MAX #endif /* Global Variables */ char *projection_names[] = {"Decimal Degrees", "Albers Equal Area", "Azimuthal Equal Area", "Azimuthal Equal Distance", "Gnomonic", "Lambert Conformal Conic", "Lambert Equal Area", "Mercator", "Oblique Mercator", "Orthographic", "Polar Stereographic", "Transverse Mercator", "UTM", "Plate-Carree"}; extern void *vpf_forward_projection; extern void *vpf_inverse_projection; /* Check the directory path separators against the operating system separators. */ #ifdef PROTO void vpf_check_os_path( char *path ) #else void vpf_check_os_path (path) char *path; #endif { char *p, vpf_separator, os_separator; vpf_separator = VPF_SEPARATOR; os_separator = OS_SEPARATOR; if (vpf_separator == os_separator) return; p = &path[0]; while (*p) { if (*p == VPF_SEPARATOR) *p = OS_SEPARATOR; p++; } } /* Set the case of the filename for the current operating system. */ #ifdef PROTO char *os_case( char *filename ) #else char *os_case (filename) char *filename; #endif { char str[255]; strcpy(str,filename); #ifdef _MSDOS return strupr(str); #else return strlwr(str); #endif } /* The following function is a modification of file_exists using "access" */ /* rather that "stat" to make it more portable DGM */ #ifdef PROTO int32 file_exists( char *filepath ) #else int32 file_exists (filepath) char *filepath; #endif { char *copy; int32 found; if (muse_access (filepath, 00) == 0) return 1; found = 0; /* filepath not found - try a '.' extension */ copy = (char *)xvt_malloc(strlen(filepath)+2); if (!copy) { xvt_note ("memory allocation error in vpfprop::file_exists()\n"); return 0; } strcpy(copy,filepath); strcat(copy,"."); if (muse_access(copy, 00)==0) found = 1; xvt_free(copy); return found; } /************************************************************************* * *N database_library_names * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns an array of the library names in a specified VPF database. * The number of library names in the array is returned in nlibs. * The array of strings is dynamically allocated and each array element * as well as the array itself should be freed when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * dbpath ==(char *) path the the VPF database. * nlibs ==(int *) the number of libraries in the database. * return ==(char **) array of library names in the database. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char **database_library_names( char *dbpath, int32 *nlibs ) #else char **database_library_name (dbpath, nlibs) char *dbpath; int32 *nlibs; #endif { vpf_table_type table; row_type row; int32 LIB_, n, i; char **libname, path[255]; *nlibs = 0; strcpy(path,dbpath); vpf_check_os_path(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("LAT")); if (!file_exists(path)) return (char **)NULL; table = vpf_open_table( path, disk, "rb", NULL ); if (!table.fp) return (char **)NULL; LIB_ = table_pos("LIBRARY_NAME",table); if (LIB_ < 0) { xvt_note ("vpfprop::database_library_names: "); xvt_note ("Invalid LAT (%s) - missing LIBRARY_NAME field\n", dbpath); vpf_close_table(&table); return (char **)NULL; } libname = (char**)xvt_zmalloc ((size_t)table.nrows * sizeof(char*)); if (!libname) { vpf_close_table(&table); return (char **)NULL; } *nlibs = (int32)table.nrows; for (i=0;i==(char *) path the the VPF database. * return ==(char *) database producer. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *database_producer( char *dbpath ) #else char *database_producer (dbpath) char *dbpath; #endif { char path[255], *producer=(char *)NULL; int32 PROD_,n; row_type row; vpf_table_type table; strcpy(path,dbpath); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("DHT")); if (!file_exists(path)) { xvt_note ("vpfprop::database_producer: %s not found\n",path); return producer; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::database_producer: Error opening %s\n",path); return producer; } PROD_ = table_pos("ORIGINATOR",table); if (PROD_ < 0) { xvt_note ("vpfprop::database_producer: Invalid DHT (%s) - missing ORIGINATOR field\n", path); vpf_close_table(&table); return producer; } row = read_next_row(table); producer = (char *)get_table_element(PROD_,row,table,NULL,&n); free_row(row,table); vpf_close_table(&table); return producer; } /************************************************************************* * *N library_description * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the text description of the specified VPF library in the * specified database. * The character string is dynamically allocated and should be freed * when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * database_path ==(char *) path the the VPF database. * library ==(char *) library name. * return ==(char *) description of the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *library_description( char *database_path, char *library ) #else char *library_description (database_path, library) char *database_path; char *library; #endif { char path[255],lib[16], *description=(char *)NULL; int32 DESC_,n; vpf_table_type table; row_type row; strcpy(path,database_path); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcpy(lib,library); rightjust(lib); strcat(path,os_case(lib)); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("LHT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_description: %s not found\n",path); return description; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_description: Error opening %s\n",path); return description; } DESC_ = table_pos("DESCRIPTION",table); if (DESC_ < 0) { xvt_note ("vpfprop::library_description: Invalid LHT (%s) - missing DESCRIPTION field\n", path); vpf_close_table(&table); return description; } row = read_next_row(table); description = (char *)get_table_element(DESC_,row,table,NULL,&n); free_row(row,table); vpf_close_table(&table); return description; } /************************************************************************* * *N library_extent * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the geographic extent of the specified VPF library in the * coordinate system for the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * database_path ==(char *) path the the VPF database. * library ==(char *) library name. * return ==(extent_type) geographic extent of the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO extent_type library_extent( char *database_path, char *library ) #else extent_type library_extent (database_path, library) char *database_path, *library; #endif { static extent_type extent = {0.0,0.0,0.0,0.0}; char path[255], *lib, found; int32 LIB_, XMIN_, YMIN_, XMAX_, YMAX_, i, n; float x1, y1, x2, y2; vpf_table_type table; row_type row; strcpy(path,database_path); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("LAT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_extent: %s not found\n",path); return extent; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_extent: Error opening %s\n",path); return extent; } LIB_ = table_pos("LIBRARY_NAME",table); if (LIB_ < 0) { xvt_note ("vpfprop::library_extent: Invalid LAT (%s) - missing LIBRARY_NAME field\n", path); vpf_close_table(&table); return extent; } XMIN_ = table_pos("XMIN",table); if (XMIN_ < 0) { xvt_note ("vpfprop::library_extent: Invalid LAT (%s) - missing XMIN field\n", path); vpf_close_table(&table); return extent; } YMIN_ = table_pos("YMIN",table); if (YMIN_ < 0) { xvt_note ("vpfprop::library_extent: Invalid LAT (%s) - missing YMIN field\n", path); vpf_close_table(&table); return extent; } XMAX_ = table_pos("XMAX",table); if (XMAX_ < 0) { xvt_note ("vpfprop::library_extent: Invalid LAT (%s) - missing XMAX field\n", path); vpf_close_table(&table); return extent; } YMAX_ = table_pos("YMAX",table); if (YMAX_ < 0) { xvt_note ("vpfprop::library_extent: Invalid LAT (%s) - missing YMAX field\n", path); vpf_close_table(&table); return extent; } found = 0; for (i=0;i==(char *) path the the VPF library. * return ==(security_type) security classification * of the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO security_type library_security( char *library_path ) #else security_type library_security (library_path) char *library_path; #endif { char path[255],sec; int32 SEC_,n; security_type security=UNKNOWN_SECURITY; vpf_table_type table; row_type row; if (!library_path) { xvt_note ("vpfprop::library_security: no path specified\n"); return security; } strcpy(path,library_path); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("LHT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_security: %s not found\n",path); return security; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_security: Error opening %s\n",path); return security; } SEC_ = table_pos("SECURITY_CLASS",table); if (SEC_ < 0) { xvt_note ("vpfprop::library_security: Invalid LHT (%s) - missing SECURITY_CLASS field\n", path); vpf_close_table(&table); return security; } row = read_next_row(table); get_table_element(SEC_,row,table,&sec,&n); free_row(row,table); vpf_close_table(&table); switch (sec) { case 'U': security = UNCLASSIFIED; break; case 'R': security = RESTRICTED; break; case 'C': security = CONFIDENTIAL; break; case 'S': security = SECRET; break; case 'T': security = TOP_SECRET; break; } return security; } /************************************************************************* * *N library_coverage_names * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns an array of coverage names present in the specified library. * The number of coverages is returned in ncov. The array of strings * is dynamically allocated and each array element as well as the * array itself should be freed when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * ncov ==(int32 *) number of coverages in the library. * return ==(char **) array of coverage names in the * library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char **library_coverage_names( char *library_path, int32 *ncov ) #else char **library_coverage_names (library_path, ncov) char *library_path, *ncov; #endif { char **covname = (char **)NULL; char path[255]; vpf_table_type table; row_type row; int32 i,n; int32 COV_; *ncov = 0; strcpy(path,library_path); rightjust(path); if (path[strlen(path)-1] != OS_SEPARATOR) strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("CAT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_coverage_names: "); xvt_note ("Invalid VPF library (%s) - CAT missing\n",library_path); return covname; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_coverage_names: "); xvt_note ("Error opening %s\n",path); return covname; } COV_ = table_pos("COVERAGE_NAME",table); if (COV_ < 0) { xvt_note ("vpfprop::library_coverage_names: "); xvt_note ("%s - Invalid CAT - missing COVERAGE_NAME field\n", library_path); vpf_close_table(&table); return covname; } covname = (char **)xvt_malloc ((size_t)table.nrows * sizeof (char*)); if (!covname) { xvt_note ("vpfprop::library_coverage_names: "); xvt_note ("Memory allocation error\n"); vpf_close_table(&table); return covname; } for (i=0;i==(char *) path the the VPF library. * ncov ==(int32 *) number of coverages in the library. * return ==(char **) array of coverage descriptions in * the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char **library_coverage_descriptions( char *library_path, int32 *ncov ) #else char **library_coverage_descriptions (library_path, ncov) char *library_path, *ncov; #endif { char **covdesc = (char **)NULL; char path[255]; vpf_table_type table; row_type row; int32 i,n; int32 DESC_; *ncov = 0; strcpy(path,library_path); rightjust(path); if (path[strlen(path)-1] != OS_SEPARATOR) strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("CAT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_coverage_descriptions: "); xvt_note ("Invalid VPF library (%s) - CAT missing\n", library_path); return covdesc; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_coverage_descriptions: "); xvt_note ("Error opening %s\n",path); return covdesc; } DESC_ = table_pos("DESCRIPTION",table); if (DESC_ < 0) { xvt_note ("vpfprop::library_coverage_descriptions: "); xvt_note ("%s - Invalid CAT - missing DESCRIPTION field\n", library_path); vpf_close_table(&table); return covdesc; } covdesc = (char**)xvt_malloc ((size_t)table.nrows * sizeof(char*)); if (!covdesc) { xvt_note ("vpfprop::library_coverage_descriptions: "); xvt_note ("Memory allocation error\n"); vpf_close_table(&table); return covdesc; } for (i=0;i\" where is the * name of the coverage and is the name of the feature class. * The number of feature classes is returned in nfc. The array of * strings is dynamically allocated and each array element as well * as the array itself should be freed when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * nfc ==(long *) number of feature classes in the * library. * return ==(char **) array of coverage name\feature * class name pairs in the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char **library_feature_class_names( char *library_path, int32 *nfc ) #else char **library_feature_class_names (library_path, nfc) char *library_path; int32 *nfc; #endif { int32 ncov,i,j,k,n; char path[255]; char **ptr, **coverages, **subset, **fcnames=(char **)NULL; *nfc=0; strcpy(path,library_path); vpf_check_os_path(path); rightjust(path); if (!file_exists(path)) { xvt_note ("vpfprop::library_feature_class_names: %s not found\n", path); return fcnames; } coverages = library_coverage_names( path, &ncov ); if (ncov == 0) { xvt_note ("vpfprop::library_feature_class_names: No coverages in library %s\n", path); return fcnames; } for (i=0;i==(char *) path the the VPF library. * return ==(double) minimum tile height in the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO double library_tile_height( char *library_path ) #else double library_tile_height (library_path) char *library_path; #endif { double tileheight=0.0; vpf_table_type table; row_type row; char path[255], dbpath[255],*libname; int32 i, n; int32 YMIN_, YMAX_, XMIN_, XMAX_; double x1, y1, x2, y2; extent_type libextent; /* for dec degrees */ vpf_projection_type libproj; void (*invproj)()=NULL; libproj = library_projection(library_path); set_vpf_forward_projection(libproj); set_vpf_inverse_projection(libproj); #if 0 if (libproj.code > DDS) { invproj = vpf_inverse_projection[libproj.code]; } #endif strcpy(path,library_path); vpf_check_os_path(path); rightjust(path); if (path[strlen(path)-1] != OS_SEPARATOR) strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("TILEREF")); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("FBR")); if (!file_exists(path)) { strcpy(dbpath,library_path); rightjust(dbpath); if (dbpath[strlen(dbpath)-1] == DIR_SEPARATOR) dbpath[strlen(dbpath)-1] = '\0'; i = strlen(dbpath)-1; while (dbpath[i] != DIR_SEPARATOR && i>= 0) i--; if (dbpath[i] == DIR_SEPARATOR) { libname = &dbpath[i+1]; dbpath[i] = '\0'; } else { libname = library_path; strcpy(dbpath,""); } libextent = library_extent(dbpath,libname); if (libproj.code > DDS) { invproj(&libextent.x1,&libextent.y1); invproj(&libextent.x2,&libextent.y2); } tileheight = (libextent.y2 - libextent.y1); return tileheight; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_tile_height - "); xvt_note ("Error opening %s\n",path); return tileheight; } YMIN_ = table_pos("YMIN",table); if (YMIN_ < 0) { xvt_note ("vpfprop:library_tile_height: "); xvt_note ("Invalid FBR (%s) - missing YMIN field\n", path); vpf_close_table(&table); return tileheight; } YMAX_ = table_pos("YMAX",table); if (YMAX_ < 0) { xvt_note ("vpfprop:library_tile_height: "); xvt_note ("Invalid FBR (%s) - missing YMAX field\n", path); vpf_close_table(&table); return tileheight; } XMIN_ = table_pos("XMIN",table); if (XMIN_ < 0) { xvt_note ("vpfprop:library_tile_height: "); xvt_note ("Invalid FBR (%s) - missing XMIN field\n", path); vpf_close_table(&table); return tileheight; } XMAX_ = table_pos("XMAX",table); if (XMAX_ < 0) { xvt_note ("vpfprop:library_tile_height: "); xvt_note ("Invalid FBR (%s) - missing XMAX field\n", path); vpf_close_table(&table); return tileheight; } tileheight = (float)MAXINT; for (i=1;i<=table.nrows;i++) { row = read_next_row(table); get_table_element(YMIN_,row,table,&y1,&n); get_table_element(YMAX_,row,table,&y2,&n); if (libproj.code > DDS) { get_table_element(XMIN_,row,table,&x1,&n); get_table_element(XMAX_,row,table,&x2,&n); libextent.x1 = x1; libextent.y1 = y1; libextent.x2 = x2; libextent.y2 = y2; invproj(&libextent.x1,&libextent.y1); invproj(&libextent.x2,&libextent.y2); x1 = libextent.x1; y1 = libextent.y1; x2 = libextent.x2; y2 = libextent.y2; } if ((y2-y1) < tileheight) tileheight = (y2-y1); free_row(row,table); } vpf_close_table(&table); return tileheight; } /************************************************************************* * *N library_projection * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the projection information for the stored coordinates in the * specified VPF library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * return ==(vpf_projection_type) projection information * for the library. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO vpf_projection_type library_projection( char *library_path ) #else vpf_projection_type library_projection (library_path) char *library_path; #endif { vpf_projection_type proj; char path[255], *buf; vpf_table_type table; row_type row; int32 n, col; float num; proj.code = 0; strcpy(proj.name,""); proj.parm1 = 0.0; proj.parm2 = 0.0; proj.parm3 = 0.0; proj.parm4 = 0.0; proj.units = 0; proj.false_easting = 0.0; proj.false_northing = 0.0; proj.forward_proj = NULL; proj.inverse_proj = NULL; strcpy(path,library_path); rightjust(path); vpf_check_os_path(path); if (path[strlen(path)-1] != OS_SEPARATOR) strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("GRT")); if (!file_exists(path)) { xvt_note ("vpfprop::library_projection: "); xvt_note ("%s not found\n",path); return proj; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::library_projection: Error opening %s\n",path); return proj; } row = read_next_row(table); col = table_pos("UNITS",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No UNITS field\n",path); proj.units = UNKNOWN_UNITS; } else { buf = (char *)get_table_element(col,row,table,NULL,&n); rightjust(buf); if (strcmp(buf,"000")==0) proj.units = UNKNOWN_UNITS; else if (strcmp(buf,"001")==0) proj.units = METERS; else if (strcmp(buf,"014")==0) proj.units = FEET; else if (strcmp(buf,"019")==0) proj.units = DEC_DEGREES; else if (strcmp(buf,"021")==0) proj.units = INCHES; else if (strcmp(buf,"022")==0) proj.units = KILOMETERS; else if (strcmp(buf,"999")==0) proj.units = OTHER_UNITS; else { xvt_note ("vpfprop::library_projection: "); xvt_note ("%s - Unknown UNITS code (%s)\n",path,buf); proj.units = UNKNOWN_UNITS; } xvt_free(buf); } col = table_pos("PROJECTION_CODE",table); if (col < 0) { proj.code = DDS; if (proj.units == UNKNOWN_UNITS) proj.units = DEC_DEGREES; } else { buf = (char *)get_table_element(col,row,table,NULL,&n); strupr(buf); if (n>2) buf[2] = '\0'; if (strcmp(buf,"AC")==0) proj.code = AC; else if (strcmp(buf,"AK")==0) proj.code = AK; else if (strcmp(buf,"AL")==0) proj.code = AL; else if (strcmp(buf,"GN")==0) proj.code = GN; else if (strcmp(buf,"LE")==0) proj.code = LE; else if (strcmp(buf,"LJ")==0) proj.code = LJ; else if (strcmp(buf,"MC")==0) proj.code = MC; else if (strcmp(buf,"OC")==0) proj.code = OC; else if (strcmp(buf,"OD")==0) proj.code = OD; else if (strcmp(buf,"PG")==0) proj.code = PG; else if (strcmp(buf,"TC")==0) proj.code = TC; else if (strcmp(buf,"UT")==0) proj.code = UT; else if (strcmp(buf," ")==0) proj.code = DDS; else { xvt_note ("vpfprop::library_projection: "); xvt_note ("%s - Unknown projection code (%s)\n", path, buf); proj.code = -1; } xvt_free(buf); } if (proj.code < 0) strcpy(proj.name,"Unknown"); else strcpy ((char*) proj.name, (char*)projection_names[proj.code]); #if 0 proj.forward_proj = vpf_forward_projection[proj.code]; proj.inverse_proj = vpf_inverse_projection[proj.code]; #endif if (proj.code == DDS) { free_row(row,table); vpf_close_table(&table); return proj; } /* parm1, parm2, parm3, parm4 */ col = table_pos("PARAMETER1",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No PARAMETER1 field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.parm1 = num; } col = table_pos("PARAMETER2",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No PARAMETER2 field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.parm2 = num; } col = table_pos("PARAMETER3",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No PARAMETER3 field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.parm3 = num; } col = table_pos("PARAMETER4",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No PARAMETER4 field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.parm4 = num; } col = table_pos("FALSE_ORIGIN_X",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No FALSE_ORIGIN_X field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.false_easting = num; } col = table_pos("FALSE_ORIGIN_Y",table); if (col < 0) { xvt_note ("vpfprop::library_projection: "); xvt_note ("Invalid GRT (%s)- No FALSE_ORIGIN_Y field\n",path); } else { get_table_element(col,row,table,&num,&n); proj.false_northing = num; } free_row(row,table); vpf_close_table(&table); return proj; } /************************************************************************* * *N coverage_description * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the description of the specified coverage in the specified * VPF library. The description string is dynamically allocated and * should be freed when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * coverage ==(char *) coverage name. * return ==(char *) description of the coverage. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *coverage_description( char *library_path, char *coverage ) #else char *coverage_description (library_path, coverage) char *library_path, *coverage; #endif { char path[255],*cov,*description=(char *)NULL; vpf_table_type table; row_type row; int32 COV_, DESC_, n; int32 found,i; strcpy(path,library_path); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("CAT")); if (!file_exists(path)) { xvt_note ("vpfprop::coverage_description: %s not found\n",path); return description; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::coverage_description: Error opening %s\n",path); return description; } COV_ = table_pos("COVERAGE_NAME",table); if (COV_ < 0) { xvt_note ("vpfprop::coverage_description: Invalid CAT (%s) - missing COVERAGE_NAME field\n", path); vpf_close_table(&table); return description; } DESC_ = table_pos("DESCRIPTION",table); if (DESC_ < 0) { xvt_note ("vpfprop::coverage_description: Invalid CAT (%s) - missing DESCRIPTION field\n", path); vpf_close_table(&table); return description; } found = 0; for (i=0;i==(char *) path the the VPF library. * nfc ==(int32 *) number of feature classes in the * coverage. * return ==(char **) array of feature class names in * the coverage. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char **coverage_feature_class_names( char *library_path, char *coverage, int32 *nfc ) #else char **coverage_feature_class_names (library_path, coverage, nfc) char *library_path, coverage; int32 *nfc; #endif { char **fcnames = (char **)NULL, path[255], covpath[255]; char *fc,**ptr; vpf_table_type table; row_type row; int32 FC_, i, j, k, n; int32 found; *nfc = 0; fcnames = (char **)xvt_malloc(sizeof(char *)); if (!fcnames) { xvt_note ( "vpfprop::coverage_feature_class_names: Memory allocation error\n"); return (char **)NULL; } strcpy(covpath,library_path); rightjust(covpath); if (covpath[strlen(covpath)-1] != OS_SEPARATOR) strcat(covpath,OS_SEPARATOR_STRING); strcat(covpath,os_case(coverage)); rightjust(covpath); strcat(covpath,OS_SEPARATOR_STRING); vpf_check_os_path(covpath); strcpy(path,covpath); strcat(path,os_case("FCS")); if (!file_exists(path)) { xvt_note ("vpfprop::coverage_feature_class_names: "); xvt_note ("Invalid VPF coverage (%s) - missing FCS\n",covpath); xvt_free ((char*)fcnames); return (char **)NULL; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::coverage_feature_class_names: Error opening %s\n", path); xvt_free ((char*)fcnames); return (char **)NULL; } FC_ = table_pos("FEATURE_CLASS",table); if (FC_ < 0) { xvt_note ("vpfprop::coverage_feature_class_names: "); xvt_note ("Invalid FCS (%s) - missing FEATURE_CLASS field\n", path); vpf_close_table(&table); xvt_free ((char*)fcnames); return (char **)NULL; } j = 0; row = read_next_row(table); fcnames[j] = (char *)get_table_element(FC_,row,table,NULL,&n); rightjust(fcnames[j]); free_row(row,table); for (i=2;i<=table.nrows;i++) { row = read_next_row(table); fc = (char *)get_table_element(FC_,row,table,NULL,&n); rightjust(fc); free_row(row,table); found = 0; for (k=j;k>=0;k--) { if (Mstrcmpi (fc, fcnames[k]) == 0) { found = 1; break; } } if (!found) { j++; ptr = (char**)realloc ((void*)fcnames, (size_t)(j+1) * sizeof(char*)); if (!ptr) { xvt_note ("vpfprop::coverage_feature_class_names: "); xvt_note ("Memory allocation error\n"); for (k=(j-1);k>=0;k--) { xvt_free(fcnames[k]); } xvt_free ((char*)fcnames); vpf_close_table(&table); return (char **)NULL; } fcnames = ptr; fcnames[j] = (char *)xvt_malloc(strlen(fc)+1); if (!fcnames[j]) { xvt_note ("vpfprop::coverage_feature_class_names: "); xvt_note ("Memory allocation error\n"); for (k=0;k==(char *) path the the VPF library. * coverage ==(char *) coverage name. * return ==(int32) topology level of the coverage. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 coverage_topology_level( char *library_path, char *coverage ) #else int32 coverage_topology_level (library_path, coverage) char *library_path, *coverage; #endif { char path[255],*cov; int32 level=0, found,i; vpf_table_type table; row_type row; int32 COV_,LVL_,n; strcpy(path,library_path); vpf_check_os_path(path); rightjust(path); strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case("CAT")); if (!file_exists(path)) { xvt_note ("vpfprop::coverage_topology_level: %s not found\n",path); return level; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::coverage_topology_level: Error opening %s\n",path); return level; } COV_ = table_pos("COVERAGE_NAME",table); if (COV_ < 0) { xvt_note ("vpfprop::coverage_topology_level: Invalid CAT (%s) - missing COVERAGE_NAME field\n", path); vpf_close_table(&table); return level; } LVL_ = table_pos("LEVEL",table); if (LVL_ < 0) { xvt_note ("vpfprop::coverage_topology_level: Invalid CAT (%s) - missing LEVEL field\n", path); vpf_close_table(&table); return level; } found = 0; for (i=0;i==(char *) path the the VPF library. * coverage ==(char *) coverage name. * feature_class ==(char *) feature class name. * return ==(char *) feature class description string. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *feature_class_description( char *library_path, char *coverage, char *feature_class ) #else char *feature_class_description (library_path, coverage, feature_class) char *library_path, *coverage, *feature_class; #endif { char *desc = (char *)NULL, path[255], *fctable, *fc; vpf_table_type table; row_type row; int32 FC_, DESC_, i, n; int32 found; /* First, see if an FCA table exists in the coverage */ strcpy(path,library_path); rightjust(path); if (path[strlen(path)-1] != OS_SEPARATOR) strcat(path,OS_SEPARATOR_STRING); strcat(path,os_case(coverage)); rightjust(path); strcat(path,OS_SEPARATOR_STRING); vpf_check_os_path(path); strcat(path,os_case("FCA")); if (file_exists(path)) { table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::feature_class_description: Error opening %s\n", path); return (char *)NULL; } FC_ = table_pos("FCLASS",table); if (FC_ < 0) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Invalid FCA (%s) - missing FCLASS field\n", path); vpf_close_table(&table); return (char *)NULL; } DESC_ = table_pos("DESCRIPTION",table); if (DESC_ < 0) DESC_ = table_pos("DESCR",table); if (DESC_ < 0) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Invalid FCA (%s) - missing DESCRIPTION field\n", path); vpf_close_table(&table); return (char *)NULL; } found = 0; for (i=1;i<=table.nrows;i++) { row = read_next_row(table); fc = (char *)get_table_element(FC_,row,table,NULL,&n); rightjust(fc); if (Mstrcmpi (fc, feature_class) == 0) { found = 1; desc = (char *)get_table_element(DESC_,row,table,NULL,&n); } xvt_free(fc); free_row(row,table); if (found) break; } vpf_close_table(&table); if (!found) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Feature class (%s) not found in FCA (%s)\n", feature_class,path); } } else { /* Get description from feature class table */ fctable = feature_class_table( library_path, coverage, feature_class ); if (!fctable) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Invalid feature class (%s) in coverage (%s %s)\n", feature_class, library_path,coverage); return (char *)NULL; } if (!file_exists(fctable)) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("%s not found\n",fctable); xvt_free(fctable); return (char *)NULL; } table = vpf_open_table(fctable,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Error opening %s\n",fctable); xvt_free(fctable); return (char *)NULL; } xvt_free(fctable); desc = (char *)xvt_malloc(strlen(table.description)+1); if (!desc) { xvt_note ("vpfprop::feature_class_description: "); xvt_note ("Memory allocation error\n"); return (char *)NULL; } strcpy(desc,table.description); vpf_close_table(&table); } return desc; } /************************************************************************* * *N feature_class_table_description * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the text description for the specified feature class table. * The description string is dynamically allocated and should be freed * when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * fctable ==(char *) path to the feature class table. * return ==(char *) feature class table description. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *feature_class_table_description( char *fctable ) #else char *feature_class_table_description (fctable) char *fctable; #endif { char path[255],*description=(char *)NULL; vpf_table_type table; strcpy(path,fctable); vpf_check_os_path(path); rightjust(path); if (!file_exists(path)) { xvt_note ("vpfprop::feature_class_table_description: %s not found\n", path); return description; } if (!is_vpf_table(path)) { xvt_note ( "vpfprop::feature_class_table_description: %s not a VPF table.\n", path); return description; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::feature_class_table_description: Error opening %s\n", path); return description; } description = (char*)xvt_malloc (strlen (table.description)+1); strcpy (description, table.description); vpf_close_table(&table); return description; } /************************************************************************* * *N feature_class_table * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the feature table path for the specified VPF feature class. * The description string is dynamically allocated and should be freed * when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * coverage ==(char *) coverage name. * feature_class ==(char *) feature class name. * return ==(char *) feature class table path. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO char *feature_class_table( char *library_path, char *coverage, char *feature_class ) #else char *feature_class_table (library_path, coverage, feature_class) char *library_path, *coverage, *feature_class; #endif { char *fctable = (char *)NULL, path[255], covpath[255]; char *fc, *table1; vpf_table_type table; row_type row; int32 TABLE1_, FC_, i,n; int32 fcfound, ftfound; fctable = (char *)xvt_malloc(255); if (!fctable) { xvt_note ( "vpfprop::feature_class_table: Memory allocation error\n"); return (char *)NULL; } strcpy(covpath,library_path); rightjust(covpath); if (covpath[strlen(covpath)-1] != OS_SEPARATOR) strcat(covpath,OS_SEPARATOR_STRING); strcat(covpath,os_case(coverage)); rightjust(covpath); strcat(covpath,OS_SEPARATOR_STRING); vpf_check_os_path(covpath); strcpy(fctable,covpath); strcpy(path,covpath); strcat(path,os_case("FCS")); if (!file_exists(path)) { xvt_note ("vpfprop::feature_class_table: "); xvt_note ("Invalid VPF coverage (%s) - missing FCS\n",covpath); xvt_free(fctable); return (char *)NULL; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::feature_class_table: Error opening %s\n", path); xvt_free(fctable); return (char *)NULL; } FC_ = table_pos("FEATURE_CLASS",table); if (FC_ < 0) { xvt_note ("vpfprop::feature_class_table: "); xvt_note ("Invalid FCS (%s) - missing FEATURE_CLASS field\n", path); vpf_close_table(&table); xvt_free(fctable); return (char *)NULL; } TABLE1_ = table_pos("TABLE1",table); if (TABLE1_ < 0) { xvt_note ("vpfprop::feature_class_table: "); xvt_note ("Invalid FCS (%s) - missing TABLE1 field\n", path); vpf_close_table(&table); xvt_free(fctable); return (char *)NULL; } fcfound = 0; ftfound = 0; for (i=1;i<=table.nrows;i++) { row = read_next_row(table); fc = (char *)get_table_element(FC_,row,table,NULL,&n); rightjust(fc); if (Mstrcmpi (fc, feature_class) == 0) { fcfound = 1; table1 = (char*)get_table_element (TABLE1_, row, table, NULL, &n); rightjust (table1); if (is_feature (table1)) { ftfound = 1; if (is_feature (fctable)) { if (is_complex_feature (table1)) { strcpy (fctable, covpath); strcat (fctable, os_case (table1)); } } else { strcat (fctable, os_case (table1)); } } xvt_free (table1); } free_row(row,table); xvt_free(fc); } vpf_close_table(&table); if (!fcfound) { xvt_note ("vpfprop::feature_class_table: "); xvt_note ("Feature class (%s) not found in FCS (%s)\n", feature_class,path); xvt_free(fctable); fctable = (char *)NULL; } if (!ftfound) { xvt_note ("vpfprop::feature_class_table: "); xvt_note ("(%s) - No feature table found for feature class %s\n", path,feature_class); xvt_free(fctable); fctable = (char *)NULL; } return fctable; } /************************************************************************* * *N feature_class_primitive_type * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the type(s) of primitive(s) associated with the specified * VPF feature class. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * library_path ==(char *) path the the VPF library. * coverage ==(char *) coverage name. * feature_class ==(char *) feature class name. * return ==(primitive_class_type) primitive class * structure for the feature class. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO primitive_class_type feature_class_primitive_type( char *library_path, char *coverage, char *feature_class ) #else primitive_class_type feature_class_primitive_type (library_path, coverage, feature_class) char *library_path, *coverage, *feature_class; #endif { static primitive_class_type pclass = {0,0,0,0,0}; char path[255], covpath[255]; char *fc, *table1, *table2; vpf_table_type table; row_type row; int32 TABLE1_, TABLE2_, FC_, i,n; int32 fcfound, pfound; strcpy(covpath,library_path); rightjust(covpath); if (covpath[strlen(covpath)-1] != OS_SEPARATOR) strcat(covpath,OS_SEPARATOR_STRING); strcat(covpath,os_case(coverage)); rightjust(covpath); strcat(covpath,OS_SEPARATOR_STRING); vpf_check_os_path(covpath); strcpy(path,covpath); strcat(path,os_case("FCS")); if (!file_exists(path)) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Invalid VPF coverage (%s) - missing FCS\n",covpath); return pclass; } table = vpf_open_table(path,disk,"rb",NULL); if (!table.fp) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Error opening %s\n", path); return pclass; } FC_ = table_pos("FEATURE_CLASS",table); if (FC_ < 0) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Invalid FCS (%s) - missing FEATURE_CLASS field\n", path); vpf_close_table(&table); return pclass; } TABLE1_ = table_pos("TABLE1",table); if (TABLE1_ < 0) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Invalid FCS (%s) - missing TABLE1 field\n", path); vpf_close_table(&table); return pclass; } TABLE2_ = table_pos("TABLE2",table); if (TABLE2_ < 0) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Invalid FCS (%s) - missing TABLE2 field\n", path); vpf_close_table(&table); return pclass; } fcfound = 0; pfound = 0; for (i=1;i<=table.nrows;i++) { row = read_next_row(table); fc = (char *)get_table_element(FC_,row,table,NULL,&n); rightjust(fc); if (Mstrcmpi (fc, feature_class) == 0) { fcfound = 1; table1 = (char*)get_table_element (TABLE1_, row, table, NULL, &n); rightjust (table1); if (is_primitive (table1)) { pfound = 1; switch (primitive_class (table1)) { case EDGE: pclass.edge = 1; break; case FACE: pclass.face = 1; break; case TEXT: pclass.text = 1; break; case ENTITY_NODE: pclass.entity_node = 1; break; case CONNECTED_NODE: pclass.connected_node = 1; break; } } xvt_free (table1); table2 = (char*)get_table_element (TABLE2_, row, table, NULL, &n); rightjust (table2); if (is_primitive (table2)) { pfound = 1; switch (primitive_class (table2)) { case EDGE: pclass.edge = 1; break; case FACE: pclass.face = 1; break; case TEXT: pclass.text = 1; break; case ENTITY_NODE: pclass.entity_node = 1; break; case CONNECTED_NODE: pclass.connected_node = 1; break; } } xvt_free(table2); } free_row(row,table); xvt_free(fc); } vpf_close_table(&table); if (!fcfound) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("Feature class (%s) not found in FCS (%s)\n", feature_class,path); } if (!pfound) { xvt_note ("vpfprop::feature_class_primitive_type: "); xvt_note ("(%s) - No primitive table found for feature class %s\n", path,feature_class); } return pclass; } /************************************************************************* * *N is_primitive * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns TRUE if the given table name is that of a valid VPF * primitive table; otherwise, returns FALSE. Determination is * based solely upon the file name. The actual contents of the * file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) TRUE if the table name specifies a VPF * primitive; otherwise, returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 is_primitive( char *tablename ) #else int32 is_primitive (tablename) char *tablename; #endif { char *locname,*end; int32 len, retval=0; locname = (char*) xvt_zmalloc (strlen (tablename) * sizeof(char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop::is_primitive: Memory allocation error"); return FALSE; } strcpy(locname,tablename); vpf_check_os_path(locname); /* if OS_SEPARATOR in string, delete through last OS_SEPARATOR */ end = strrchr(locname,OS_SEPARATOR); if (end != NULL) { end += sizeof(char); strcpy(locname,end); } /* if trailing '.' remove */ len = strlen(locname); if (locname[len-1]=='.') { locname[len-1]='\0'; len--; } strupr(locname); if (strcmp(locname,"END") == 0) retval = TRUE; if (strcmp(locname,"CND") == 0) retval = TRUE; if (strcmp(locname,"EDG") == 0) retval = TRUE; if (strcmp(locname,"FAC") == 0) retval = TRUE; if (strcmp(locname,"TXT") == 0) retval = TRUE; xvt_free(locname); return retval; } /************************************************************************* * *N is_simple_feature * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns TRUE if the given table name is that of a valid VPF * simple feature table; otherwise, returns FALSE. Determination is * based solely upon the file name. The actual contents of the * file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) TRUE if the table name specifies a VPF * simple feature; otherwise, returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 is_simple_feature( char *tablename ) #else int32 is_simple_feature (tablename) char *tablename; #endif { char *locname, *end; int32 retval=0; locname = (char*) xvt_zmalloc (strlen (tablename) * sizeof (char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop:is_simple_feature: Memory allocation error"); return FALSE; } strcpy(locname,tablename); rightjust(locname); /* if '.' in string, delete through last . */ end = strrchr(locname,'.'); if (end != NULL) { strcpy(locname,end); } strupr(locname); if (strcmp(locname,".PFT")==0) retval = TRUE; if (strcmp(locname,".LFT")==0) retval = TRUE; if (strcmp(locname,".AFT")==0) retval = TRUE; if (strcmp(locname,".TFT")==0) retval = TRUE; xvt_free(locname); return retval; } /************************************************************************* * *N is_complex_feature * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns TRUE if the given table name is that of a valid VPF * complex feature table; otherwise, returns FALSE. Determination is * based solely upon the file name. The actual contents of the * file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) TRUE if the table name specifies a VPF * complex feature; otherwise, returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 is_complex_feature( char *tablename ) #else int32 is_complex_feature (tablename) char *tablename; #endif { char *locname, *end; int32 retval=0; locname = (char*)xvt_zmalloc (strlen (tablename) * sizeof(char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop:is_complex_feature: Memory allocation error"); return FALSE; } strcpy(locname,tablename); rightjust(locname); /* if '.' in string, delete through last . */ end = strrchr(locname,'.'); if (end != NULL) { strcpy(locname,end); } strupr(locname); if (strcmp(locname,".CFT")==0) retval = TRUE; xvt_free(locname); return retval; } /************************************************************************* * *N is_feature * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns TRUE if the given table name is that of a valid VPF * feature table; otherwise, returns FALSE. Determination is * based solely upon the file name. The actual contents of the * file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) TRUE if the table name specifies a VPF * feature; otherwise, returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 is_feature( char *tablename ) #else int32 is_feature (tablename) char *tablename; #endif { if (is_simple_feature(tablename)) return TRUE; if (is_complex_feature(tablename)) return TRUE; return FALSE; } /************************************************************************* * *N is_join * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns TRUE if the given table name is that of a valid VPF * join table; otherwise, returns FALSE. Determination is * based solely upon the file name. The actual contents of the * file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) TRUE if the table name specifies a VPF * join table; otherwise, returns FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 is_join( char *tablename ) #else int32 is_join (tablename) char *tablename; #endif { char *locname, *end; int32 retval=0; locname = (char*)xvt_zmalloc (strlen (tablename) * sizeof(char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop:is_join: Memory allocation error"); return FALSE; } /* if '.' in string, delete through last . */ end = strrchr(tablename,'.'); if (end != NULL) { strcpy(locname,end); } else { strcpy(locname,tablename); } rightjust(locname); strupr(locname); if (strcmp(locname,".CJT")==0) retval = TRUE; if (strcmp(locname,".PJT")==0) retval = TRUE; if (strcmp(locname,".LJT")==0) retval = TRUE; if (strcmp(locname,".AJT")==0) retval = TRUE; if (strcmp(locname,".TJT")==0) retval = TRUE; xvt_free(locname); return retval; } /************************************************************************* * *N primitive_class * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the primitive class of the given VPF primitive table name. * If the table name is not that of a valid VPF primitive table, 0 is * returned. Determination is based solely upon the file name. The * actual contents of the file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * tablename ==(char *) name of the VPF table to check. * return ==(int32) primitive class of the table (EDGE, FACE, * ENTITY_NODE, CONNECTED_NODE, TEXT, or 0 * (if tablename not a primitive)). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 primitive_class( char *tablename ) #else int32 primitive_class (tablename) char *tablename; #endif { char *locname,*end; int32 len, retval=0; locname = (char*)xvt_zmalloc (strlen (tablename) * sizeof(char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop:primitive_class: Memory allocation error"); return FALSE; } strcpy(locname,tablename); vpf_check_os_path(locname); /* if OS_SEPARATOR in string, delete through last OS_SEPARATOR */ end = strrchr(locname,OS_SEPARATOR); if (end != NULL) { end += sizeof(char); strcpy(locname,end); } /* if trailing '.' remove */ len = strlen(locname); if (locname[len-1]=='.') { locname[len-1]='\0'; len--; } strupr(locname); if (strcmp(locname,"END") == 0) retval = ENTITY_NODE; if (strcmp(locname,"CND") == 0) retval = CONNECTED_NODE; if (strcmp(locname,"EDG") == 0) retval = EDGE; if (strcmp(locname,"FAC") == 0) retval = FACE; if (strcmp(locname,"TXT") == 0) retval = TEXT; xvt_free(locname); return retval; } /************************************************************************* * *N feature_class_type * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Returns the VPF feature type for the given feature table name. * If the table name is not that of a valid VPF feature table, 0 is * returned. Determination is based solely upon the file name. * The actual contents of the file are not checked for validity. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * table ==(char *) name of the VPF table to check. * return ==(int32) VPF feature type of the table (LINE, * AREA, ANNO, POINT, COMPLEX, or 0 * (if table is none of the above)). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1992 gcc *E *************************************************************************/ #ifdef PROTO int32 feature_class_type( char *table ) #else int32 feature_class_type (table) char *table; #endif { char *locname, *end; int32 retval=0; locname = (char*)xvt_zmalloc (strlen (table) * sizeof (char)+1); if (locname == (char*)NULL) { xvt_note ("vpfprop:feature_class_type: Memory allocation error"); return 0; } strcpy(locname,table); rightjust(locname); /* if '.' in string, delete through last . */ end = strrchr(locname,'.'); if (end != NULL) { strcpy(locname,end); } strupr(locname); if (strcmp(locname,".PFT")==0) retval = VPFPOINTS; if (strcmp(locname,".LFT")==0) retval = LINE; if (strcmp(locname,".AFT")==0) retval = AREA; if (strcmp(locname,".TFT")==0) retval = ANNO; if (strcmp(locname,".CFT")==0) retval = VPFCOMPLEX; xvt_free(locname); return retval; } ogdi-ogdi_4_1_0/vpflib/vpfprop.h000066400000000000000000000050321345660466700167520ustar00rootroot00000000000000 #ifndef __VPFPROP_H__ #define __VPFPROP_H__ 1 #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif #ifndef __VPF_H__ #include "vpf.h" #endif #ifdef PROTO char **database_library_names( char *dbpath, int32 *nlibs ); char *database_producer( char *dbpath ); char *library_description( char *database_path, char *library ); extent_type library_extent( char *database_path, char *library ); security_type library_security( char *library_path ); char **library_coverage_names( char *library_path, int32 *ncov ); char **library_coverage_descriptions( char *library_path, int32 *ncov ); char **library_feature_class_names( char *library_path, int32 *nfc ); double library_tile_height( char *library_path ); vpf_projection_type library_projection( char *library_path ); char *coverage_description( char *library_path, char *coverage ); char **coverage_feature_class_names( char *library_path, char *coverage, int32 *nfc ); int32 coverage_topology_level( char *library_path, char *coverage ); char *feature_class_description( char *library_path, char *coverage, char *feature_class ); char *feature_class_table_description( char *fctable ); char *feature_class_table( char *library_path, char *coverage, char *feature_class ); primitive_class_type feature_class_primitive_type( char *library_path, char *coverage, char *feature_class ); int32 is_primitive( char *tablename ); int32 is_simple_feature( char *tablename ); int32 is_complex_feature( char *tablename ); int32 is_feature( char *tablename ); int32 is_join( char *tablename ); int32 primitive_class( char *tablename ); int32 feature_class_type( char *table ); #else char **database_library_names(); char *database_producer(); char *library_description(); extent_type library_extent(); security_type library_security(); char **library_coverage_names(); char **library_coverage_descriptions(); char **library_feature_class_names(); double library_tile_height(); vpf_projection_type library_projection(); char *coverage_description(); char **coverage_feature_class_names(); int32 coverage_topology_level(); char *feature_class_description(); char *feature_class_table_description(); char *feature_class_table(); primitive_class_type feature_class_primitive_type(); int32 is_primitive(); int32 is_simple_feature(); int32 is_complex_feature(); int32 is_feature(); int32 is_join(); int32 primitive_class(); int32 feature_class_type(); #endif #endif ogdi-ogdi_4_1_0/vpflib/vpfquery.c000066400000000000000000000776651345660466700171570ustar00rootroot00000000000000 /************************************************************************* * *N Module VPFQUERY * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions for querying a VPF table with a * selection expression. It has one main entry point - query_table(). *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C * Dec 1992 UNIX mdb port *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions: *F * set_type query_table( char *expression, vpf_table_type table ); *E *************************************************************************/ #ifndef INCL_XVTH #include #endif #if 0 #include #include #include #include #endif #ifdef _MSDOS #include #endif #ifndef __LINKLIST_H__ #include "linklist.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __SET_H__ #include "set.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif /* Delimiter tokens */ typedef enum { EQ, NE, LE, GE, LT, GT, AND, OR, QUOTE } delim_type; delim_type delim; /* Valid delimeter strings */ char *delimstr[] = { "=", "<>", "<=", ">=", "<", ">", " AND ", " OR ", "\"" }; int32 ndelim = 9; char **fieldname; int32 *fieldcol; int32 nfields; /* Token types */ #define DELIMETER 1 #define FIELD 2 #define VALUE 3 #define QUOTE 4 #define STRING 5 #define EOL 6 #define FINISHED 7 #define LOP 8 /* Logical Operator */ #define JOIN 9 #define ERRORTOKEN 10 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif typedef struct { int32 field; char op; char value[255]; char join; } expr_type; #ifdef PROTO void *memalloc (size_t size) #else void *memalloc (size) size_t size; #endif { void *ptr; ptr = (void*)xvt_malloc (size); if (!ptr) { xvt_note ("Memory allocation error in VPFQUERY\n"); exit(1); } return ptr; } #ifdef PROTO int32 is_white( char c ) #else int32 is_white( c ) char c; #endif { if (c==' ' || c=='\t') return 1; return 0; } /************************************************************************* * *N return_token * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the first token string found in the * expression string. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * expr ==(char *) selection expression string. * token ==(char *) first token in the string. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO void return_token (char *expr, char *token) #else void return_token ( expr, token) char *expr; char *token; #endif { register int32 i, j, n, found=0, stopflag; n = 0; stopflag=0; while (expr[0] == ' ') { for (i=0; i 0) token[i] = '\0'; else token[strlen (delimstr[j])] = '\0'; found = 1; break; } } if ((found) || (!is_white(*expr))) n++; if ((!found) && (*expr)) expr++; if (found) break; } } /************************************************************************* * *N get_token * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function gets the first token, token type, and token value of * the expression string, and then advances the expression string * past the token. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * expression ==(char *) selection expression string. * token ==(char *) first token in the string. * token_type ==(int32 *) token type. * token_value ==(int32 *) token_value. * return ==(char *) new selection expression. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void return_token( char *expr, char *token ) VPFQUERY.C *E *************************************************************************/ #ifdef PROTO char *get_token (char *expression, char *token, int32 *token_type, int32 *token_value) #else char *get_token ( expression, token, token_type, token_value) char *expression; char *token; int32 *token_type; int32 *token_value; #endif { register int32 i, stopflag; *token_type = 0; /* Test for no expression (NULL) */ if (*expression == '\0') { *token_type = FINISHED; *token_value = 0; return expression; } /* Test for "control/linefeed" (\r) delimiter */ if (*expression == '\r') { ++expression; ++expression; *token = '\r'; token[1] = '\n'; token[2] = 0; *token_type = DELIMETER; } stopflag = 0; while ((expression[0] == '\"') || (expression[0] == ' ')) { /* Test for any of the expression delimiters */ for (i=0; i==(char *) selection expression string. * table ==(vpf_table_type) VPF table structure. * return ==(linked_list_type) list of expression clauses. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * char *get_token( char *expression, char *token, int32 *token_type, * int32 *token_value) VPFQUERY.C * void display_message( char *input) USER DEFINED * linked_list_type ll_init() LINKLIST.C * void ll_reset( linked_list_type list ) LINKLIST.C * void ll_insert( void *element, unsigned size, * position_type position ) LINKLIST.C *E *************************************************************************/ #ifdef PROTO linked_list_type parse_expression (char *expression, vpf_table_type table) #else linked_list_type parse_expression (expression, table) char *expression; vpf_table_type table; #endif { linked_list_type exprlist; position_type pos; expr_type expr; int32 i, token_type, token_value; char token[260]; char *orig_expression; orig_expression = (char*)xvt_zmalloc (strlen (expression) + 1); strcpy (orig_expression, expression); exprlist = ll_init(); pos = exprlist; /* Set up globals */ nfields = (int32)table.nfields; fieldname = (char**)memalloc ((size_t)(nfields+2) * sizeof (char*)); fieldcol = (int32*)memalloc ((size_t)(nfields+2) * sizeof(int32)); for (i=0; inext; expression = get_token (expression, token, &token_type, &token_value); } else if (token_type == FINISHED) { expr.join = '\0'; ll_insert (&expr, sizeof(expr), pos); } else { xvt_note ("Expression syntax error %s\n",orig_expression); ll_reset (exprlist); exprlist = NULL; break; } } for (i=0; i 255 should not be * compared with this function. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * val1 ==(void *) first buffer to compare. * val2 ==(void *) second buffer to compare. * size ==(int32) number of bytes to compare. * op ==(char) logical operator. * return ==(int32) TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 bufcomp( void *val1, void *val2, int32 size, char op ) #else int32 bufcomp( val1, val2, size, op ) void *val1; void *val2; int32 size; char op; #endif { int32 result; result = (int32)memcmp (val1, val2, (size_t)size); switch (op) { case EQ: result = !result; break; case NE: break; case LT: if (result < 0) result = TRUE; else result = FALSE; break; case LE: if (result <= 0) result = TRUE; else result = FALSE; break; case GT: if (result > 0) result = TRUE; else result = FALSE; break; case GE: if (result >= 0) result = TRUE; else result = FALSE; break; default: xvt_note ("Invalid logical operator (%d)\n",op); result = FALSE; break; } return result; } /************************************************************************* * *N strcompare * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function compares two strings with the given logical operator. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * val1 ==(char *) first buffer to compare. * val2 ==(char *) second buffer to compare. * op ==(char) logical operator. * return ==(int32) TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 strcompare( char *val1, char *val2, char op ) #else int32 strcompare( val1, val2, op ) char *val1; char *val2; char op; #endif { int32 result; char str1[300], str2[300]; strcpy(str1,val1); rightjust(str1); strcpy(str2,val2); rightjust(val2); result = Mstrcmpi (str1, str2); switch (op) { case EQ: result = !result; break; case NE: break; case LT: if (result < 0) result = TRUE; else result = FALSE; break; case LE: if (result <= 0) result = TRUE; else result = FALSE; break; case GT: if (result > 0) result = TRUE; else result = FALSE; break; case GE: if (result >= 0) result = TRUE; else result = FALSE; break; default: xvt_note ("Invalid logical operator (%d)\n",op); result = FALSE; break; } return result; } /************************************************************************* * *N icompare * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function compares two int32 integers with the given logical * operator. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * val1 ==(int32 int) first buffer to compare. * val2 ==(int32 int) second buffer to compare. * op ==(char) logical operator. * return ==(int32) TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 icompare( int32 val1, int32 val2, char op ) #else int32 icompare(val1, val2, op ) int32 val1; int32 val2; char op; #endif { int32 result; switch (op) { case EQ: result = (val1 == val2); break; case NE: result = (val1 != val2); break; case LT: result = (val1 < val2); break; case LE: result = (val1 <= val2); break; case GT: result = (val1 > val2); break; case GE: result = (val1 >= val2); break; default: xvt_note ("Invalid logical operator (%d)\n",op); result = FALSE; break; } return result; } /************************************************************************* * *N fcompare * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function compares two floating point numbers with the given * logical operator. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * val1 ==(int32) first buffer to compare. * val2 ==(int32) second buffer to compare. * op ==(char) logical operator. * return ==(int32) TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *************************************************************************/ #ifdef PROTO int32 fcompare( float val1, float val2, char op ) #else int32 fcompare( val1, val2, op ) float val1; float val2; char op; #endif { int32 result; switch (op) { case EQ: result = (val1 == val2); break; case NE: result = (val1 != val2); break; case LT: result = (val1 < val2); break; case LE: result = (val1 <= val2); break; case GT: result = (val1 > val2); break; case GE: result = (val1 >= val2); break; default: xvt_note ("Invalid logical operator (%d)\n",op); result = FALSE; break; } return result; } /************************************************************************* * *N query_table * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the set of selected rows of a VPF table * based upon the evaluation of the given selection expression string. * * The expression is strictly evaluated left to right. No nesting * is supported, so parentheses are not allowed. The expression * must match the form: * [ ] * where, * is a valid field name of the table. * is one of the following: =, <, >, <=, >=, <> (not equal). * is a valid value for the field. * is either " AND " or " OR ". * Any number of clauses () may be joined * together with AND or OR to form the expression. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * expression ==(char *) selection expression string. * table ==(vpf_table_type) VPF table structure. * return ==(set_type) set of selected rows. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * set_type set_init (int32 n) SET.C * void set_insert (int32 element, set_type set) SET.C * linked_list_type parse_expression (char *expression, * vpf_table_type table) VPFQUERY.C * row_type read_next_row (vpf_table_type table) VPFREAD.C * position_type ll_first (linked_list_type list) LINKLIST.C * int32 ll_end (position_type position) LINKLIST.C * void ll_element (position_type position, void *element) LINKLIST.C * void *get_table_element (int32 field_number, row_type row, * vpf_table_type table, void *value, * int32 *count) VPFREAD.C * void display_message (char *info) USER DEFINED * int32 strcompare (char *val1, char *val2, char op) VPFQUERY.C * int32 icompare (int32 val1, int32 val2, char op) VPFQUERY.C * int32 fcompare (float val1, float val2, char op) VPFQUERY.C * void ll_reset (linked_list_type list) LINKLIST.C * void free_row (row_type row, vpf_table_type table) VPFREAD.C *E *************************************************************************/ #ifdef PROTO set_type query_table( char *expression, vpf_table_type table ) #else set_type query_table( expression, table ) char *expression; vpf_table_type table; #endif { row_type row; position_type pos; expr_type expr; register int32 i; int32 boolval=FALSE, booltemp=FALSE, join = OR; int32 lval, lval2, count; short sval,sval2; float fval, fval2; char tval, tval2, *tptr; linked_list_type exprlist; set_type select_set; int32 ipos; #if 0 /* DGM */ select_set = set_init(table.nrows+1); #endif select_set = set_init (table.nrows); /* If the expression is "*" then just turn on all members of select_set */ /* and return */ if (strcmp (expression, "*") == 0) { set_on(select_set); return select_set; } exprlist = parse_expression( expression, table ); if (!exprlist) return select_set; if (table.storage == DISK) { ipos = index_pos (1L, table); fseek( table.fp, ipos, SEEK_SET ); } for (i=1;i<=table.nrows;i++) { if (table.storage == DISK) row = read_next_row(table); else row = get_row( i, table ); pos = ll_first(exprlist); while (!ll_end(pos)) { ll_element( pos, &expr ); switch (table.header[expr.field].type) { case 'I': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &lval, &count ); lval2 = atol(expr.value); booltemp = icompare( lval, lval2, expr.op ); } else { xvt_note ("Selection may not be performed upon arrays"); } break; case 'S': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &sval, &count ); sval2 = (short)atoi (expr.value); booltemp = icompare( (int32)sval, (int32)sval2, expr.op ); } else { xvt_note ("Selection may not be performed upon arrays"); } break; case 'T': case 'L': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &tval, &count ); tval2 = expr.value[0]; booltemp = bufcomp( &tval, &tval2, sizeof(tval), expr.op ); } else { tptr = (char *)get_table_element( expr.field, row, table, NULL, &count ); booltemp = strcompare( tptr, expr.value, expr.op ); xvt_free(tptr); } break; case 'F': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &fval, &count ); fval2 = (float)atof (expr.value); booltemp = fcompare( fval, fval2, expr.op ); } else { xvt_note ("Selection may not be performed upon arrays"); } break; default: xvt_note ("Field type not supported for query\n"); break; } if (join==OR) boolval = boolval || booltemp; else boolval = boolval && booltemp; join = expr.join; pos = pos->next; } free_row( row, table ); if (boolval) set_insert(i,select_set); boolval = FALSE; join = OR; } ll_reset(exprlist); return select_set; } /************************************************************************* * *N query_table_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns 1 if the given row matches * the given selection expression string, 0 otherwise. * * The expression is strictly evaluated left to right. No nesting * is supported, so parentheses are not allowed. The expression * must match the form: * [ ] * where, * is a valid field name of the table. * is one of the following: =, <, >, <=, >=, <> (not equal). * is a valid value for the field. * is either " AND " or " OR ". * Any number of clauses () may be joined * together with AND or OR to form the expression. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * expression ==(char *) selection expression string. * row ==(row_type) VPF row structure. * return ==(int) 1 if row matches expression, * 0 otherwise. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels June 1993 VPFVIEW DOS 1.1 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *************************************************************************/ #ifdef PROTO int32 query_table_row (char *expression, row_type row, vpf_table_type table) #else int32 query_table_row (expression, row, table) char *expression; row_type row; vpf_table_type table; #endif { position_type pos; expr_type expr; int32 boolval=FALSE, booltemp=FALSE, join = OR; int32 lval, lval2, count; short sval, sval2; float fval, fval2; char tval, tval2, *tptr; linked_list_type exprlist; if (strcmp(expression,"*")==0) { return 1; } exprlist = parse_expression( expression, table ); if (!exprlist) return 0; pos = ll_first(exprlist); while (!ll_end(pos)) { ll_element( pos, &expr ); switch (table.header[expr.field].type) { case 'I': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &lval, &count ); lval2 = atol(expr.value); booltemp = icompare( lval, lval2, expr.op ); } else { } break; case 'S': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &sval, &count ); sval2 = atoi(expr.value); booltemp = icompare( (int32)sval, (int32)sval2, expr.op ); } else { } break; case 'T': case 'L': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &tval, &count ); tval2 = expr.value[0]; booltemp = bufcomp( &tval, &tval2, sizeof(tval), expr.op ); } else { tptr = (char *)get_table_element( expr.field, row, table, NULL, &count ); booltemp = strcompare( tptr, expr.value, expr.op ); xvt_free(tptr); } break; case 'F': if (table.header[expr.field].count == 1) { get_table_element( expr.field, row, table, &fval, &count ); if (!is_vpf_null_float(fval)) { fval2 = (float) atof(expr.value); booltemp = fcompare( fval, fval2, expr.op ); } else booltemp = FALSE; } else { } break; default: break; } if (join==OR) boolval = boolval || booltemp; else boolval = boolval && booltemp; join = expr.join; pos = pos->next; } ll_reset(exprlist); return boolval; } ogdi-ogdi_4_1_0/vpflib/vpfquery.h000066400000000000000000000007561345660466700171470ustar00rootroot00000000000000#ifndef __VPFQUERY_H__ #define __VPFQUERY_H__ #ifndef __VPFVIEW_H__ #include "vpfview.h" #endif #ifndef __SET_H__ #include "set.h" #endif #ifndef __LIKLIST_H__ #include "linklist.h" #endif /* Function Definitions */ #ifdef PROTO set_type query_table (char *expression, vpf_table_type table ); linked_list_type parse_expression (char *expression, vpf_table_type table); #else set_type query_table (); linked_list_type parse_expression (); #endif #endif /* ifdef __VPFQUERY_H__ */ ogdi-ogdi_4_1_0/vpflib/vpfread.c000066400000000000000000001516361345660466700167140ustar00rootroot00000000000000/************************************************************************* * *N Module VPFREAD.C * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions for reading VPF tables. It, along * with VPFTABLE.C and VPFWRITE.C (and VPFIO.C for UNIX), comprises a * fairly extensive set of functions for handling VPF tables. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 Original Version DOS Turbo C * David Flinn Jul 1991 Merged with Barry & Mody's code for UNIX * Jim TenBrink Oct 1991 Split this module off from vpftable and * merged converter and vpfview branches * for the functions included here.. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. It includes #ifdefs for * all system dependencies, so that it will work efficiently with * either Turbo C in DOS or (at least) GNU C in UNIX. *E * *************************************************************************/ #ifndef INCL_XVTH #include #endif #if 0 #include #include #include #include #include #endif #ifdef _MSDOS #include #include #endif #ifdef HAVE_ICONV #include #endif #ifdef _UNIX #include #define SEEK_SET 0 /* Turbo C fseek value */ #define SEEK_CUR 1 #endif #ifndef _MACHINE_ #include "machine.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif extern int32 STORAGE_BYTE_ORDER; /* * currently being used by the converter routines, not by the vpfview * routines */ #ifdef PROTO char * get_line (FILE *fp) #else char * get_line (fp) FILE *fp; #endif { int32 CurrentChar, /* This is an int because fgetc returns an int */ count , NextBlock = 256 , LineAllocation = 0 ; char *CurrentLine = (char *) NULL ; /* This forever loop searches past all lines beginning with #, indicating comments. */ for (;;) { CurrentChar = fgetc(fp); if ( CurrentChar == COMMENT ) /* skip past comment line */ for (;CurrentChar != NEW_LINE; ) { if (CurrentChar == EOF) return (char *) NULL ; CurrentChar = fgetc (fp) ; } else break ; } /* end of forever loop */ if (CurrentChar == EOF ) return (char *) NULL ; for(count = 0; CurrentChar != EOF; CurrentChar = fgetc(fp), count++) { /* Allocate space for output line, if needed */ if (! ( count < LineAllocation )) { LineAllocation += NextBlock ; if ( CurrentLine ) CurrentLine = (char*) xvt_realloc (CurrentLine, (size_t)LineAllocation ); else CurrentLine = (char*) xvt_zmalloc ((size_t)LineAllocation); if (!CurrentLine) { #if 0 printf("get_line: Out of Memory"); #endif return (char *) NULL ; } } if ( ( CurrentChar == (int32) LINE_CONTINUE ) ) { CurrentChar = fgetc(fp ) ; /* read character after backslash */ /* A newline will be ignored and thus skipped over */ if ( CurrentChar == (int32) SPACE ) /* Assume line continue error */ while ( fgetc (fp) != (int32) SPACE ) ; else if (CurrentChar != (int32) NEW_LINE ) { /* copy it if not new line */ CurrentLine[count++] = (char) LINE_CONTINUE ; CurrentLine[count] = (char) CurrentChar ; } else count -- ; /* Decrement the counter on a newline character */ } else if (CurrentChar == (int32) NEW_LINE ) /* We're done */ break; else CurrentLine[count] = (char)CurrentChar; } /* end of for count */ CurrentLine[count] = (char)('\0'); /* terminate string */ return CurrentLine ; } #ifdef PROTO int32 VpfRead ( void *to, VpfDataType type, int32 count, FILE *from ) #else int32 VpfRead ( to, type, count, from ) void *to; VpfDataType type; int32 count; FILE *from; #endif { int32 retval=0, i ; switch ( type ) { case VpfChar: retval = fread ( to, sizeof (char), (size_t)count, from ) ; break ; case VpfShort: { short int stemp , *sptr = (short *) to ; for ( i=0; i < count; i++ ) { retval = fread ( &stemp, sizeof (short), 1, from ) ; if (STORAGE_BYTE_ORDER != MACHINE_BYTE_ORDER) swap_two ( (char*)&stemp, (char*)sptr ) ; else *sptr = stemp; sptr++ ; } } break ; case VpfInteger: { if (STORAGE_BYTE_ORDER != MACHINE_BYTE_ORDER) { int32 itemp, *iptr = (int32 *) to ; for ( i=0; i < count; i++ ) { retval = fread ( &itemp, sizeof (int32), 1, from ) ; swap_four ((char*)&itemp, (char*)iptr ) ; iptr++ ; } } else { retval = fread ( to, sizeof (int32), (size_t)count, from ) ; } } break ; case VpfFloat: { float ftemp , *fptr = (float*)to; for (i=0; ix ) ; swap_four ((char*)&ctemp.y, (char*)&cptr->y ) ; cptr++ ; } } else { retval = fread (to, sizeof(coordinate_type), (size_t)count, from ) ; } } break ; case VpfDoubleCoordinate: { double_coordinate_type dctemp , *dcptr = (double_coordinate_type *) to ; for (i=0; ix ) ; swap_eight ((char*)&dctemp.y, (char*)&dcptr->y ) ; } else { dcptr->x = dctemp.x; dcptr->y = dctemp.y; } dcptr++ ; } } break ; case VpfTriCoordinate: { if (STORAGE_BYTE_ORDER != MACHINE_BYTE_ORDER) { tri_coordinate_type temp, *ptr = (tri_coordinate_type*)to; for (i=0; ix); swap_four ((char*)&temp.y, (char*)&ptr->y); swap_four ((char*)&temp.z, (char*)&ptr->z); ptr++; } } else retval = fread (to, sizeof (tri_coordinate_type), (size_t)count, from); } break ; case VpfDoubleTriCoordinate: { double_tri_coordinate_type dttemp , *dtptr = (double_tri_coordinate_type *) to ; for ( i=0; i < count; i++ ) { retval = fread ( &dttemp,sizeof (double_tri_coordinate_type), 1, from); if (STORAGE_BYTE_ORDER != MACHINE_BYTE_ORDER) { swap_eight ((char*)&dttemp.x, (char*)&dtptr->x ) ; swap_eight ((char*)&dttemp.y, (char*)&dtptr->y ) ; swap_eight ((char*)&dttemp.z, (char*)&dtptr->z ) ; } else { dtptr->x = dttemp.x; dtptr->y = dttemp.y; dtptr->z = dttemp.z; } dtptr++ ; } } break ; case VpfNull: /* Do Nothing */ break ; default: #if 0 printf ("\nVpfRead: error on data type , %s >", type); #endif break ; } /* end of switch */ return retval; /* whatever fread returns */ } /* #endif */ /************************************************************************* * *N index_length * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the length of a specified row from the table * index. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row_number == (int32) row number in the table. * table == (vpf_table_type) VPF table structure. * return == (int32) length of the table row or 0 on error. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 Original Version DOS Turbo C * Dave Flinn July 1991 UNIX extensions * JTB 10/91 removed aborts() *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 index_length( int32 row_number, vpf_table_type table ) #else int32 index_length( row_number, table ) int32 row_number; vpf_table_type table; #endif { int32 recsize,len=0; uint32 ulen; int32 pos; STORAGE_BYTE_ORDER = table.byte_order; if (row_number < 1) row_number = 1; if (row_number > table.nrows) row_number = table.nrows; switch (table.xstorage) { case COMPUTE: len = table.reclen; break; case DISK: recsize = sizeof(index_cell); fseek( table.xfp, (int32)(row_number*recsize), SEEK_SET ); if ( ! Read_Vpf_Int(&pos,table.xfp,1) ) { #if 0 printf ("\nindex_length: error reading index.") ; #endif len = 0 ; } if ( ! Read_Vpf_Int(&ulen,table.xfp,1) ) { #if 0 printf ("\nindex_length: error reading index."); #endif return 0 ; } len = ulen; break; case RAM: len = table.index[row_number-1].length; break; default: if ( table.mode == Write && table.nrows != row_number ) { /* Just an error check, should never get here in writing */ xvt_note ("index_length: error trying to access row %d", (int) row_number ) ; len = 0; } break; } return len; } /************************************************************************* * *N index_pos * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the position of a specified row from the table * index. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row_number == (int32) row number in the table. * table == (vpf_table_type) VPF table structure. * return == (int32) position of the table row * or zero on error. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 Original Version DOS Turbo C * Dave Flinn July 1991 Updated for UNIX * JTB 10/91 removed aborts() *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 index_pos (int32 row_number, vpf_table_type table) #else int32 index_pos (row_number, table) int32 row_number; vpf_table_type table; #endif { int32 recsize; uint32 pos = 0; /* Intergraph solution TR#GX323 */ STORAGE_BYTE_ORDER = table.byte_order; /* ERO: previously clamped row_number to [1, table.nrows] but does not */ /* seam to be sane, especially if table.nrows = 0 */ if (row_number < 1 || row_number > table.nrows) { xvt_note ("index_pos: error trying to access row %d/%d in table %s\n", (int) row_number, table.nrows, table.path ) ; return 0; } switch (table.xstorage) { case COMPUTE: pos = table.ddlen + ((row_number-1) * table.reclen); break; case DISK: recsize = sizeof(index_cell); fseek( table.xfp, (int32)(row_number*recsize), SEEK_SET ); if ( ! Read_Vpf_Int(&pos,table.xfp,1) ) { #if 0 printf ("\nindex_length: error reading index."); #endif pos = 0 ; } break; case RAM: pos = table.index[row_number-1].pos; break; default: if ( table.mode == Write && table.nrows != row_number ) { /* Just an error check, should never get here in writing */ xvt_note ("index_pos: error trying to access row %d", (int) row_number ) ; pos = 0; } break; } return pos; } /* Compute the offset from the start of the row to the given field */ #ifdef PROTO int32 row_offset( int32 field, row_type row, vpf_table_type table) #else int32 row_offset( field, row, table) int32 field; row_type row; vpf_table_type table; #endif { int32 offset,n,size; int32 i; id_triplet_type key; static int32 keysize[] = {0,sizeof(char),sizeof(short int),sizeof(int32)}; if (field < 0 || field >= table.nfields) return -1; offset = 0L; for (i=0;i == (vpf_table_type) VPF table. * read_key == (id_triplet_type) id triplet key. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 Original Version DOS Turbo C * Dave Flinn July 1991 Updated for UNIX *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO id_triplet_type read_key( vpf_table_type table ) #else id_triplet_type read_key( table ) vpf_table_type table; #endif { id_triplet_type key; unsigned char ucval; unsigned short int uival; STORAGE_BYTE_ORDER = table.byte_order; key.id = 0L; key.tile = 0L; key.exid = 0L; /* just doing this to be consistent */ Read_Vpf_Char (&(key.type),table.fp,1); switch (TYPE0(key.type)) { case 0: break; case 1: Read_Vpf_Char (&ucval, table.fp, 1 ) ; key.id = (int32)ucval; break; case 2: Read_Vpf_Short (&uival, table.fp, 1 ) ; key.id = (int32)uival; break; case 3: Read_Vpf_Int (&(key.id), table.fp, 1 ) ; break; } switch (TYPE1(key.type)) { case 0: break; case 1: Read_Vpf_Char (&ucval, table.fp, 1 ) ; key.tile = (int32)ucval; break; case 2: Read_Vpf_Short (&uival, table.fp, 1 ) ; key.tile = (int32)uival; break; case 3: Read_Vpf_Int (&(key.tile), table.fp, 1 ) ; break; } switch (TYPE2(key.type)) { case 0: break; case 1: Read_Vpf_Char (&ucval, table.fp, 1 ) ; key.exid = (int32)ucval; break; case 2: Read_Vpf_Short (&uival, table.fp, 1 ) ; key.exid = (int32)uival; break; case 3: Read_Vpf_Int (&(key.exid), table.fp, 1 ) ; break; } return key; } /************************************************************************* * *N read_next_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the next row of the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * table == (vpf_table_type) vpf table structure. * return == (row_type) the next row in the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 Original Version DOS Turbo C * Dave Flinn July 1991 Updated for UNIX *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void *vpfmalloc() *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO row_type read_next_row( vpf_table_type table ) #else row_type read_next_row( table ) vpf_table_type table; #endif { register int32 i,j; int32 status; char *tptr; int32 size,count; row_type row; id_triplet_type * keys; coordinate_type dummycoord; int32 id = -1; if (feof(table.fp)) { return NULL; } STORAGE_BYTE_ORDER = table.byte_order; row = (row_type)xvt_zmalloc (((size_t)table.nfields+1) * sizeof(column_type)); if( row == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); return NULL; } for (i=0;i 2000000) { char szMessage[256]; if( strlen(table.path) < 128 ) sprintf(szMessage, "Repeat count for field %d of record %d of table %s is %d\n", i, id, table.path, (unsigned int)count); else sprintf(szMessage, "Repeat count for field %d of record %d of table %s is %d\n", i, id, table.path + strlen(table.path) - 128, (unsigned int)count); xvt_note ("%s", szMessage); free_row ( row, table ) ; return (row_type) NULL; } } else { count = table.header[i].count; } row[i].count = count; status = 0; switch (table.header[i].type) { case 'T': case 'L': if (count == 1) { row[i].ptr = (char *)xvt_zmalloc(sizeof(char)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Char(row[i].ptr, table.fp, 1) ; } else { size = count*sizeof(char); row[i].ptr = (char*) xvt_zmalloc((size_t)size+2); tptr = (char*)xvt_zmalloc ((size_t)size+2); if( row[i].ptr == NULL || tptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); xvt_free(tptr); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Char(tptr,table.fp,count) ; tptr[count] = '\0'; strcpy(row[i].ptr,tptr); xvt_free(tptr); tptr = (char *)NULL; } break; case 'I': row[i].ptr = (int32*)xvt_zmalloc((size_t)count * sizeof (int32)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Int (row[i].ptr, table.fp, count ) ; if( i == 0 && count == 1 ) id = ((int32*)row[i].ptr)[0]; break; case 'S': row[i].ptr = (short*)xvt_zmalloc ((size_t)count * sizeof (short)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Short (row[i].ptr, table.fp, count ) ; break; case 'F': row[i].ptr = (float*)xvt_zmalloc ((size_t)count * sizeof (float)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Float (row[i].ptr, table.fp, count ) ; break; case 'R': row[i].ptr = (double*)xvt_zmalloc ((size_t)count * sizeof (double)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Double (row[i].ptr, table.fp, count ) ; break; case 'D': row[i].ptr = (date_type*)xvt_zmalloc ((size_t)count * sizeof (date_type)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } Read_Vpf_Date (row[i].ptr, table.fp, count ) ; break; case 'C': /* Coordinate strings may be quite large. */ /* Allow for null coordinate string pointer if */ /* not enough memory that can be handled one */ /* coordinate at a time in higher level functions. */ row[i].ptr = (coordinate_type*)xvt_zmalloc ((size_t)count * sizeof(coordinate_type)); if( row[i].ptr == NULL ) { xvt_note ("Out of memory in read_next_row()\n"); free_row ( row, table ) ; return (row_type) NULL; } if (row[i].ptr) Read_Vpf_Coordinate(row[i].ptr,table.fp,count); else for (j=0;j>> read_next_row: no such type < %c >", table.path,table.name,table.header[i].type ) ; status = 1; break ; } /* end of switch */ if (status == 1) { free_row ( row, table ) ; return (row_type) NULL; } } return row; } /************************************************************************* * *N rowcpy * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns a copy of the specified row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * origrow == (row_type) row to copy. * table == (vpf_table_type) vpf table structure. * return == (row_type) copy of the row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void *vpfmalloc() VPFMISC.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO row_type rowcpy( row_type origrow, vpf_table_type table ) #else row_type rowcpy( origrow, table ) row_type origrow; vpf_table_type table; #endif { register int32 i; int32 count; int32 size; row_type row; row = (row_type)xvt_zmalloc ((size_t)table.nfields * sizeof (column_type)); for (i=0;i", table.header[i].type ) ; abort () ; break ; } /* end of switch */ } /* end of table.nfields */ return row; } /************************************************************************* * *N read_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads a specified row from the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row_number == (int32) row number. * table == (vpf_table_type) vpf table structure. * return == (row_type) row that was read in. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * int32 index_pos() VPFTABLE.C * row_type read_next_row() VPFTABLE.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO row_type read_row( int32 row_number, vpf_table_type table ) #else row_type read_row( row_number, table ) int32 row_number; vpf_table_type table; #endif { int32 fpos; /* Intergraph solution DAP 12/10/97 TR323 Don't try to read if table is empty. */ if (table.fp != NULL) { fpos = index_pos(row_number,table); if ( fpos != 0 ) { fseek(table.fp,fpos,SEEK_SET); return read_next_row(table); } else { return NULL; } } else { return NULL; } } /************************************************************************* * *N free_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function frees the memory that was dynamically allocated for the * specified row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row == (row_type) row to be freed. * table == (vpf_table_type) vpf table structure. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void free_row (row_type row, vpf_table_type table) #else void free_row ( row, table) row_type row; vpf_table_type table; #endif { register int32 i; if (!row) return; for (i=0; i == (int32) row number in range [1 .. table.nrows]. * table == (vpf_table_type) vpf table structure. * return == (row_type) returned row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * row_type rowcpy VPFREAD.C * row_type read_row VPFREAD.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO row_type get_row( int32 row_number, vpf_table_type table ) #else row_type get_row( row_number, table ) int32 row_number; vpf_table_type table; #endif { row_type row; row_number = max(min(row_number, table.nrows), 1); if (table.storage == RAM) { row = rowcpy(table.row[row_number-1],table); return row; } else { return read_row( row_number, table ); } } /************************************************************************* * *N table_pos * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the column offset of the specified field name *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * field_name == (char *) field name. * table == (vpf_table_type) VPF table structure. * table_pos == (int32) returned column number. * UNIX returns -1 if not exists *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 table_pos (char * field_name, vpf_table_type table) #else int32 table_pos (field_name, table) char * field_name; vpf_table_type table; #endif { register int32 i; int32 col; col = -1; for (i=0; i == (int32) field column number. * row == (row_type) vpf table row. * table == (vpf_table_type) VPF table structure. * value == (void *) pointer to a single element value. * count == (int32 *) pointer to the array size for a * multiple element value. * return == (void *) returned multiple element value. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void *vpfmalloc() *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void *get_table_element( int32 field_number, row_type row, vpf_table_type table, void *value, int32 *count ) #else void *get_table_element( field_number, row, table, value, count ) int32 field_number; row_type row; vpf_table_type table; void *value; int32 *count; #endif { int32 col; char * tptr; void * retvalue; #ifdef HAVE_ICONV static int do_iconv = -1; static iconv_t iconvd = (iconv_t)-1; if (do_iconv == -1) { do_iconv = getenv("CONVERT_OGDI_TXT_TO_UTF8") != NULL; if (do_iconv) { iconvd = iconv_open("UTF-8", "ISO-8859-1"); } } #endif retvalue = NULL; col = field_number; if ((col < 0) || (col >= table.nfields)) { xvt_note ("GET_TABLE_ELEMENT: Invalid field number %d\n", (int) field_number); return NULL; } if (!row) return NULL; switch (table.header[col].type) { case 'X': retvalue = NULL; break; case 'L': case 'T': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(char)); } else { int i, ascii = 1; retvalue = (char*)xvt_zmalloc (((size_t)2 * row[col].count + 1) * sizeof (char)); tptr = (char*)xvt_zmalloc (((size_t)row[col].count + 1) * sizeof (char)); memcpy (tptr, row[col].ptr, (size_t)row[col].count * sizeof (char)); tptr[row[col].count] = '\0'; for(i=0;tptr[i]!=0;i++) { if ((unsigned char)tptr[i] >= 128) { ascii = 0; if (table.header[col].type == 'T') { //fprintf(stderr, "a T column contains non-ASCII text\n"); } break; } } #ifndef HAVE_ICONV strcpy((char *)retvalue,tptr); #else if (ascii == 1 || iconvd == (iconv_t)-1) strcpy((char *)retvalue,tptr); else { size_t nin = row[col].count; size_t nout = 2 * row[col].count; void* saved_retvalue = retvalue; char* saved_tptr = tptr; char** outbuf = (char**)&retvalue; size_t ret = iconv(iconvd, &tptr, &nin, outbuf, &nout); tptr = saved_tptr; retvalue = saved_retvalue; row[col].count = strlen(retvalue); if (ret == (size_t)-1) { fprintf(stderr, "Can't convert '%s' to UTF-8. Truncating to '%s'\n", tptr, (char*)retvalue); } else { //fprintf(stderr, "UTF-8 text : '%s'\n", (char*)retvalue); } } #endif if(tptr != (char *)NULL) {xvt_free(tptr);tptr = (char *)NULL;} } break; case 'I': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(int32)); } else { retvalue = (int32*)xvt_zmalloc ((size_t)row[col].count * sizeof(int32)); memcpy (retvalue, row[col].ptr,(size_t) row[col].count * sizeof(int32)); } break; case 'S': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(short int)); } else { retvalue = (short*)xvt_zmalloc ((size_t)row[col].count * sizeof(short int)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(short int)); } break; case 'F': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(float)); } else { retvalue = (float*)xvt_zmalloc ((size_t)row[col].count * sizeof(float)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(float)); } break; case 'R': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(double)); } else { retvalue = (double*)xvt_zmalloc ((size_t)row[col].count * sizeof (double)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(double)); } break; case 'C': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(coordinate_type)); } else { if (row[col].ptr) { retvalue = (coordinate_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (coordinate_type)); if (retvalue) memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(coordinate_type)); } else { retvalue = NULL; } } break; case 'Z': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(tri_coordinate_type)); } else { retvalue = (tri_coordinate_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (tri_coordinate_type)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(tri_coordinate_type)); } break; case 'B': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(double_coordinate_type)); } else { retvalue = (double_coordinate_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (double_coordinate_type)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(double_coordinate_type)); } break; case 'Y': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(double_tri_coordinate_type)); } else { retvalue = (double_tri_coordinate_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (double_tri_coordinate_type)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(double_tri_coordinate_type)); } break ; case 'D': if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(date_type)); } else { retvalue = (date_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (date_type)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(date_type)); } break; case 'K': /* ID Triplet */ if (table.header[col].count == 1) { memcpy(value,row[col].ptr,sizeof(id_triplet_type)); } else { retvalue = (id_triplet_type*)xvt_zmalloc ((size_t)row[col].count * sizeof (id_triplet_type)); memcpy (retvalue, row[col].ptr, (size_t)row[col].count * sizeof(id_triplet_type)); } break; } *count = row[col].count; return retvalue; } /************************************************************************* * *N named_table_element * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the element in the specified row in the column * matching the given field name. If the element is a single element * (count=1), the value is passed back via the void pointer *value; * otherwise, an array is allocated and passed back as the return value. * NOTE: If an array is allocated in this function, it should be freed * when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * field_name == (char *) field name. * row_number == (int32) row_number. * table == (vpf_table_type) VPF table structure. * value == (void *) pointer to a single element value. * count == (int32 *) pointer to the array size for a multiple * element value. * return == (void *) returned multiple element value. * or NULL if field_name could not be found * as a column *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void *vpfmalloc() VPFREAD.C * row_type get_row() VPFREAD.C * void free_row() VPFREAD.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void *named_table_element( char * field_name, int32 row_number, vpf_table_type table, void * value, int32 * count ) #else void *named_table_element( field_name, row_number, table, value, count ) char * field_name; int32 row_number; vpf_table_type table; void * value; int32 * count; #endif { int32 col; row_type row; void * retvalue; col = table_pos(field_name, table); if (col < 0) { xvt_note ("%s: Invalid field name <%s>\n",table.name,field_name); return NULL; } row = get_row(row_number,table); retvalue = get_table_element( col, row, table, value, count ); free_row(row, table); return retvalue; } /************************************************************************* * *N table_element * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function returns the element in the specified row in the column * matching the given field number. If the element is a single element * (count=1), the value is passed back via the void pointer *value; * otherwise, an array is allocated and passed back as the return value. * NOTE: If an array is allocated in this function, it should be freed * when no longer needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * field_number == (int32) field number (offset from * first field in table). * row_number == (int32) row_number. * table == (vpf_table_type) VPF table structure. * value == (void *) pointer to a single element value. * count == (int32 *) pointer to the array size for a multiple * element value. * return == (void *) returned multiple element value or * NULL of the field number is invalid *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * row_type get_row() VPFREAD.C * void free_row() VPFREAD.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void *table_element( int32 field_number, int32 row_number, vpf_table_type table, void * value, int32 * count ) #else void *table_element( field_number, row_number, table, value, count ) int32 field_number; int32 row_number; vpf_table_type table; void * value; int32 * count; #endif { row_type row; void * retvalue; row = get_row(row_number, table); retvalue = get_table_element(field_number, row, table, value, count); free_row(row,table); return retvalue; } ogdi-ogdi_4_1_0/vpflib/vpfrelat.c000066400000000000000000001010551345660466700170760ustar00rootroot00000000000000 /*************************************************************************** * * Module VPFRELAT.C * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: * * This module contains functions supporting relates between VPF * feature classes and primitives (and vice versa). It relies * upon the information provided by the Feature Class Schema table. * This table is used to generate a feature class relationship (fcrel) * data structure for a feature class. This structure contains all * of the tables and their primary and foreign keys for the * relationships between a feature table and its primitive, or * from a primitive to its feature table (each relate chain is one way). * This module tries to be as much of a black box as it can to * enable a programmer to simply return the corresponding primitive * row of a feature record, or the corresponding feature row of a * primitive record. * * This is one of the most difficult modules required to support * a truly 'generic' VPF application, since VPF allows so many * variations of feature-primitive relationships. The final version * of this module must support every allowed relationship. **************************************************************************/ #ifndef INCL_XVTH #include #endif #ifndef __SET_H__ #include "set.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __VPFVIEW_H__ #include "vpfview.h" #endif #ifndef __VPFRELAT_H__ #include "vpfrelat.h" #endif #ifndef __VPFTIDX_H__ #include "vpftidx.h" #endif #ifndef __VPFQUERY_H__ #include "vpfquery.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef __VPFPROP_H__ #include "vpfprop.h" #endif #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif /* Determine if the given table name is in the given list of */ /* vpf relate structures. */ #ifdef PROTO int32 table_in_list (char *tablename, linked_list_type rlist) #else int32 table_in_list (tablename, rlist) char *tablename; linked_list_type rlist; #endif { position_type p; vpf_relate_struct rcell; p = ll_first (rlist); while (!ll_end (p)) { ll_element (p, &rcell); if (strcmp(rcell.table1, tablename) == 0) return 1; p = ll_next (p); } return 0; } /************************************************************************** * *N num_relate_paths * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Find the number of possible relate paths for the feature class * from the start table. (Complex features can have several relates * to a single primitive table.) *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * start_table == (char *) table to start from. * fcname == (char *) feature class name. * fcs == (vpf_table_type) feature class schema table. * num_relate_paths == (int32) number of relate paths found. *E *************************************************************************/ #ifdef PROTO int32 num_relate_paths( char *start_table, char *fcname, vpf_table_type fcs ) #else int32 num_relate_paths( start_table, fcname, fcs ) char *start_table; char *fcname; vpf_table_type fcs; #endif { set_type fcset; int32 n; char qstr[80]; sprintf(qstr,"FEATURE_CLASS = %s AND TABLE1 = %s", fcname,start_table); fcset = query_table(qstr,fcs); n = (int32) num_in_set (fcset); set_nuke(&fcset); return n; } /************************************************************************** * *N fcs_relate_list * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Read the feature class schema table and create the list of * tables to chain through. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * fcname == (char *) feature class name. * start_table == (char *) table to start from. * end_table == (char *) table to end with. * fcs == (vpf_table_type) feature class schema table. * npath == (int32) relate path number. * fcs_relate_list == (linked_list_type) list of tables to * chain through. *************************************************************************/ #ifdef PROTO linked_list_type fcs_relate_list( char *fcname, char *start_table, char *end_table, vpf_table_type fcs, int32 npath ) #else linked_list_type fcs_relate_list( fcname, start_table, end_table, fcs, npath ) char *fcname; char *start_table; char *end_table; vpf_table_type fcs; int32 npath; #endif { linked_list_type rlist; vpf_relate_struct rstruct; set_type fcset; char tablename[255], *buf, expr[255]; row_type row; int32 i, rownum, n; int32 TABLE1_, KEY1_, TABLE2_, KEY2_; char prevstr[80]; rlist = ll_init(); sprintf(expr,"FEATURE_CLASS = %s AND TABLE1 = %s",fcname,start_table); fcset = query_table(expr,fcs); if (set_empty(fcset)) { set_nuke(&fcset); return rlist; } TABLE1_ = table_pos("TABLE1",fcs); KEY1_ = table_pos("FOREIGN_KEY",fcs); if (KEY1_ < 0) { KEY1_ = table_pos("TABLE1_KEY",fcs); } TABLE2_ = table_pos("TABLE2",fcs); KEY2_ = table_pos("PRIMARY_KEY",fcs); if (KEY2_ < 0) { KEY2_ = table_pos("TABLE2_KEY",fcs); } /* Get to the relate path number */ n = -1; rownum = 0; for (i=1; i=npath) break; } } if (n %s", fcname,tablename,prevstr); fcset = query_table(expr,fcs); if (set_empty(fcset)) { set_nuke(&fcset); return rlist; } rownum = set_min(fcset); set_nuke(&fcset); row = get_row(rownum,fcs); buf = (char *)get_table_element(TABLE1_,row,fcs,NULL,&n); strcpy(rstruct.table1,buf); rightjust(rstruct.table1); xvt_free(buf); buf = (char *)get_table_element(KEY1_,row,fcs,NULL,&n); strcpy(rstruct.key1,buf); rightjust(rstruct.key1); xvt_free(buf); buf = (char *)get_table_element(TABLE2_,row,fcs,NULL,&n); strcpy(rstruct.table2,buf); rightjust(rstruct.table2); xvt_free(buf); buf = (char *)get_table_element(KEY2_,row,fcs,NULL,&n); strcpy(rstruct.key2,buf); rightjust(rstruct.key2); xvt_free(buf); free_row( row, fcs ); if (table_in_list(rstruct.table1, rlist)) break; ll_insert( &rstruct, sizeof(rstruct), ll_last(rlist) ); strcpy( tablename, rstruct.table2 ); strcpy( prevstr, rstruct.table1 ); } return rlist; } /************************************************************************** * *N related_row * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Return the related row of table2 based upon the value of table 1's key * Table 2 must be the '1' side of an n:1 relationship -- If it isn't, * use 'related_rows()'. * Supported data types - I, S, K, and T. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * keyval1 == (void *) key value from table 1 in the relate. * table2 == (vpf_table_type) table 2 in the relate. * key2 == (char *) key column name in table 2. * return == (int32) first related row number in table 2. * 0 is returned if no related rows are found. *************************************************************************/ #ifdef PROTO int32 related_row( void *keyval1, vpf_table_type table2, char *key2, int32 tile_id ) #else int32 related_row( keyval1, table2, key2, tile_id ) void *keyval1; vpf_table_type table2; char *key2; int32 tile_id; #endif { int32 rowid, i, ival, n, tile, start,end; short int sval; row_type row; int32 KEY2_,TILE_; char cval, *tval, path[255], *keystring; set_type idxset, tileset, searchset; id_triplet_type idtrip; if (strcmp(key2,"ID")==0) { memcpy( &rowid, keyval1, sizeof(rowid) ); return rowid; } rowid = 0; KEY2_ = table_pos(key2,table2); if ((table2.header[KEY2_].type != 'I')&& (table2.header[KEY2_].type != 'S')&& (table2.header[KEY2_].type != 'K')&& (table2.header[KEY2_].type != 'T')) return rowid; if ((table2.header[KEY2_].type != 'T')&& (table2.header[KEY2_].count != 1)) return rowid; if (tile_id > 0) TILE_ = table_pos("TILE_ID",table2); else TILE_ = -1; idxset.size = 0; if (table2.header[KEY2_].tdx) { strcpy (path, table2.path); rightjust (path); /* Remove the filename from the path */ i = strlen (path); while (path[i] != DIR_SEPARATOR) i--; path[i+1] = '\0'; strcat (path, table2.header[KEY2_].tdx); if (muse_access (path, 4) == 0) { idxset = read_thematic_index(path, (char*)keyval1); if (TILE_ < 0) { /* Don't bother checking TILE_ID. */ /* Take the first value in the set. */ i = set_min (idxset); if (i>table2.nrows || i<0) i = 0; set_nuke(&idxset); return i; } } } if (idxset.size == 0) { idxset = set_init (table2.nrows); set_on (idxset); } tileset.size = 0; if (TILE_ >= 0) { if (table2.header[TILE_].tdx) { strcpy (path, table2.path); rightjust (path); /* Remove the filename from the path */ i = strlen (path); while (path[i] != DIR_SEPARATOR) i--; path[i+1] = '\0'; strcat (path, table2.header[TILE_].tdx); if (muse_access( path, 4) == 0) { tile = tile_id; if (table2.header[TILE_].type == 'S') { sval = (short)tile; tileset = read_thematic_index(path,(char *)&sval); } else if (table2.header[TILE_].type == 'I') { tileset = read_thematic_index (path, (char*)&tile); } } } } if (tileset.size == 0) { tileset = set_init (table2.nrows); set_on (tileset); } searchset = set_intersection (tileset, idxset); set_nuke (&tileset); set_nuke (&idxset); if (table2.header[KEY2_].type == 'T') { keystring = (char*)xvt_malloc (strlen((char*)keyval1)); strcpy (keystring, (char*)keyval1); rightjust(keystring); } else { keystring = NULL; } start = set_min(searchset); end = set_max(searchset); if (start < 1) start = 1; if (end > table2.nrows) end = table2.nrows; for (i=start;i<=end;i++) { if (!set_member(i,searchset)) continue; row = get_row(i,table2); if (TILE_>0) { tile = tile_id; if (table2.header[TILE_].type == 'S') { get_table_element(TILE_,row,table2,&sval,&n); tile = sval; } else if (table2.header[TILE_].type == 'I') { get_table_element(TILE_,row,table2,&tile,&n); } if (tile != tile_id) { free_row(row,table2); continue; } } if (table2.header[KEY2_].type == 'I') { get_table_element(KEY2_,row,table2,&ival,&n); if (memcmp(&ival,keyval1,sizeof(ival))==0) rowid = i; } else if (table2.header[KEY2_].type == 'S') { get_table_element(KEY2_,row,table2,&sval,&n); ival = (int32)sval; if (memcmp(&ival,keyval1,sizeof(ival))==0) rowid = i; } else if (table2.header[KEY2_].type == 'K') { get_table_element(KEY2_,row,table2,&idtrip,&n); ival = (int32)idtrip.exid; if (memcmp(&ival,keyval1,sizeof(ival))==0) rowid = i; } else if (table2.header[KEY2_].type == 'T') { if (table2.header[KEY2_].count==1) { get_table_element(KEY2_,row,table2,&cval,&n); if (memcmp(&cval,keyval1,sizeof(ival))==0) rowid = i; } else { tval = get_table_element(KEY2_,row,table2,NULL,&n); rightjust(tval); #ifdef _MAC /*REM*/ if (strcmpi(tval,keystring)==0) rowid = i; #elif defined(_WINDOWS) if (stricmp(tval,keystring)==0) rowid = i; #else if (strcasecmp(tval,keystring)==0) rowid = i; #endif } } free_row(row,table2); if (rowid > 0) break; } set_nuke(&searchset); if (keystring) xvt_free(keystring); return rowid; } /************************************************************************** * *N related_rows * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Return the list of related rows of table2 based upon the value of * table 1's key. * Supported data types - I, S, K, and T. * Thematic index used, if present on key column. * NOTE: A sequential search operation will search the entire * table if no thematic index ...zzz... *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * keyval1 == (void *) key value from table 1 in the relate. * table2 == (vpf_table_type) table 2 in the relate. * key2 == (char *) key column name in table 2. * return == (linked_list_type) list of (int32) related rows * in table 2. If no related rows are found, the * returned list is empty. *************************************************************************/ #ifdef PROTO linked_list_type related_rows (void *keyval1, vpf_table_type table2, char *key2, int32 tile_id) #else linked_list_type related_rows (keyval1, table2, key2, tile_id) void *keyval1; vpf_table_type table2; char *key2; int32 tile_id; #endif { linked_list_type rowlist; set_type idxset, tileset, searchset; int32 rowid, i, ival, n, start,end, tile; short short_tile, sval; row_type row; int32 KEY2_, TILE_; char cval, *tval, path[255], *keystring; id_triplet_type idtrip = {' ',0,0,0}; rowlist = ll_init (); if (strcmp (key2, "ID") == 0) { memcpy (&rowid, keyval1, sizeof (rowid)); ll_insert (&rowid, sizeof (rowid), rowlist); return rowlist; } KEY2_ = table_pos (key2, table2); if ((table2.header[KEY2_].type != 'I') && (table2.header[KEY2_].type != 'S') && (table2.header[KEY2_].type != 'K') && (table2.header[KEY2_].type != 'T')) return rowlist; if ((table2.header[KEY2_].type == 'I') && (table2.header[KEY2_].count != 1)) return rowlist; if (tile_id > 0) TILE_ = table_pos ("TILE_ID", table2); else TILE_ = -1; idxset.size = 0; /* Use thematic index for column KEY2_ if one exists */ if (table2.header[KEY2_].tdx) { strcpy (path, table2.path); rightjust (path); /* Remove the filename from the path */ i = strlen (path); while (path[i] != DIR_SEPARATOR) i--; path[i+1] = '\0'; strcat (path, table2.header[KEY2_].tdx); if (muse_access(path,4)==0) { idxset = read_thematic_index(path,(char *)keyval1); if (TILE_ < 0) { /* don't bother to check TILE_ID for a match */ start = set_min(idxset); end = set_max(idxset); for (i=start;i= 0) { /* Use thematic index for TILE_ column if it exists */ if (table2.header[TILE_].tdx) { strcpy(path,table2.path); rightjust(path); /* Remove the filename from the path */ i = strlen (path); while (path[i] != DIR_SEPARATOR) i--; path[i+1] = '\0'; strcat (path, table2.header[TILE_].tdx); if (muse_access(path,4)==0) { tile = tile_id; if (table2.header[TILE_].type == 'S') { sval = (short int)tile; tileset = read_thematic_index(path,(char *)&sval); } else if (table2.header[TILE_].type == 'I') { tileset = read_thematic_index(path,(char *)&tile); } } } } if (tileset.size == 0) { tileset = set_init (table2.nrows); set_on (tileset); } searchset = set_intersection (tileset, idxset); set_nuke (&tileset); set_nuke (&idxset); if (table2.header[KEY2_].type == 'T') { keystring = (char*)xvt_malloc (strlen ((char*)keyval1)); strcpy (keystring, (char*)keyval1); rightjust(keystring); } else { keystring = NULL; } start = set_min(searchset); end = set_max(searchset); if (start < 1) start = 1; if (end > table2.nrows) end = table2.nrows; for (i=start;i<=end;i++) { if (set_member(i,searchset)) { row = get_row(i,table2); if (TILE_>0) { tile = tile_id; if (table2.header[TILE_].type == 'S') { get_table_element(TILE_,row,table2,&short_tile,&n); tile = short_tile; } else if (table2.header[TILE_].type == 'I') { get_table_element(TILE_,row,table2,&tile,&n); } if (tile != tile_id) { free_row(row,table2); continue; } } if (table2.header[KEY2_].type == 'I') { get_table_element(KEY2_,row,table2,&ival,&n); if (memcmp(&ival,keyval1,sizeof(ival))==0) ll_insert(&i,sizeof(i),ll_last(rowlist)); } else if (table2.header[KEY2_].type == 'S') { get_table_element(KEY2_,row,table2,&sval,&n); if (memcmp(&sval,keyval1,sizeof(sval))==0) ll_insert(&i,sizeof(i),ll_last(rowlist)); } else if (table2.header[KEY2_].type == 'K') { get_table_element(KEY2_,row,table2,&sval,&n); ival = idtrip.exid; if (memcmp(&ival,keyval1,sizeof(ival))==0) ll_insert(&i,sizeof(i),ll_last(rowlist)); } else if (table2.header[KEY2_].type == 'T') { if (table2.header[KEY2_].count==1) { get_table_element(KEY2_,row,table2,&cval,&n); if (memcmp(&cval,keyval1,sizeof(ival))==0) ll_insert(&i,sizeof(i),ll_last(rowlist)); } else { tval = get_table_element(KEY2_,row,table2,NULL,&n); rightjust(tval); #ifdef _MAC /*REM*/ if (strcmpi(tval,keystring)==0) #elif defined(_WINDOWS) if (stricmp(tval,keystring)==0) #else if (strcasecmp(tval,keystring)==0) #endif ll_insert(&i,sizeof(i),ll_last(rowlist)); } } free_row(row,table2); } } set_nuke (&searchset); return rowlist; } /************************************************************************** * *N select_feature_class_relate * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Set up the relationships between features and primitives or between * primitives and features (one way only) for a specified feature class. *************************************************************************/ #ifdef PROTO fcrel_type select_feature_class_relate( char *covpath, char *fcname, char *start_table, char *end_table, int32 npath) #else fcrel_type select_feature_class_relate( covpath, fcname, start_table, end_table, npath) char *covpath; char *fcname; char *start_table; char *end_table; int32 npath; #endif { storage_type storage; vpf_table_type fcs; int32 i; char *path; position_type p; vpf_relate_struct rcell; fcrel_type fcrel; path = (char*)xvt_zmalloc (255 * sizeof (char)); fcrel.nchain = 0; fcrel.table = NULL; fcrel.relate_list = NULL; rightjust(covpath); sprintf( path, "%sfcs", covpath ); /* Feature Class Schema table */ fcs = vpf_open_table (path, disk, "rb", NULL ); if (!fcs.fp) { xvt_note ("select_feature_class_relate: Error opening %s\n",path); return fcrel; } fcrel.relate_list = fcs_relate_list (fcname, start_table, end_table, fcs, npath); if (ll_empty (fcrel.relate_list)) { ll_reset (fcrel.relate_list); xvt_note ("ERROR in feature class relationship!"); return fcrel; } /* Find the number of tables in the relate chain */ p = ll_first (fcrel.relate_list); fcrel.nchain = 0; while (!ll_end(p)) { fcrel.nchain++; p = ll_next (p); } /* Allow for last table2 */ fcrel.nchain++; fcrel.table = (vpf_table_type*) xvt_malloc((size_t)(fcrel.nchain + 1) * sizeof(vpf_table_type)); if (!fcrel.table) { xvt_note ("Out of memory in select_feature_class_relate\n"); exit(1); } for (i=0; i 0) ll_insert(&keyval,sizeof(keyval),ll_last(keylist)); prow = ll_next(prow); free_row(relrow,fcrel.table[n]); } ll_reset(rowlist); } rowlist = ll_init(); if (ll_empty(keylist)) return rowlist; p = ll_first(keylist); while (!ll_end(p)) { ll_element(p,&keyval); templist = related_rows(&keyval,fcrel.table[n],rcell.key2,tile); prow = ll_first(templist); while (!ll_end(prow)) { ll_element(prow,&rownum); if (!ll_locate(&rownum,rowlist)) ll_insert(&rownum,sizeof(rownum),ll_last(rowlist)); prow = ll_next(prow); } ll_reset(templist); p = ll_next(p); } ll_reset(keylist); return rowlist; } /************************************************************************** * *N deselect_feature_class_relate * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Clear out a previously allocated feature class relate structure * from memory. *************************************************************************/ #ifdef PROTO void deselect_feature_class_relate (fcrel_type *fcrel) #else void deselect_feature_class_relate (fcrel) fcrel_type *fcrel; #endif { register int32 i; if (fcrel->nchain > 0) { for (i=0; inchain; i++) { if (fcrel->table[i].status == OPENED) { vpf_close_table (&(fcrel->table[i])); } } xvt_free ((char*)fcrel->table); ll_reset(fcrel->relate_list); } fcrel->nchain = 0; } ogdi-ogdi_4_1_0/vpflib/vpfrelat.h000066400000000000000000000030721345660466700171030ustar00rootroot00000000000000 #ifndef __VPFRELAT_H__ #define __VPFRELAT_H__ 1 #ifndef __LINKLIST_H__ #include "linklist.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __VPFTIDX_H__ #include "vpftidx.h" #endif typedef struct { char table1[40]; char key1[40]; char table2[40]; char key2[40]; } vpf_relate_struct; typedef struct { int32 nchain; vpf_table_type *table; linked_list_type relate_list; } feature_class_relate_type, fcrel_type; #ifdef PROTO int32 num_relate_paths( char *start_table, char *fcname, vpf_table_type fcs ); linked_list_type fcs_relate_list( char *fcname, char *start_table, char *end_table, vpf_table_type fcs, int32 npath ); int32 related_row( void *keyval, vpf_table_type table, char *keyfield, int32 tile_id ); linked_list_type related_rows( void *keyval, vpf_table_type table, char *keyfield, int32 tile_id ); fcrel_type select_feature_class_relate( char *covpath, char *fcname, char *start_table, char *end_table, int32 npath ); int32 fc_row_number( row_type row, fcrel_type fcrel, int32 tile ); linked_list_type fc_row_numbers( row_type row, fcrel_type fcrel, int32 tile ); void deselect_feature_class_relate( fcrel_type *fcrel ); #else int32 num_relate_paths (); linked_list_type fcs_relate_list (); int32 related_row (); linked_list_type related_rows (); fcrel_type select_feature_class_relate (); int32 fc_row_number (); linked_list_type fc_row_numbers (); void deselect_feature_class_relate (); #endif /* If PROTO */ #endif /* VPFRELAT_H */ ogdi-ogdi_4_1_0/vpflib/vpfselec.c000066400000000000000000000172761345660466700170750ustar00rootroot00000000000000 /************************************************************************* * *N Module VPFSELEC - VPF SELECTED FEATURES * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This module contains functions for selecting VPF features and * primitives. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Nov 1991 DOS Turbo C * Feb 1992 - Optimized for CD-ROM performance. *E *************************************************************************/ #ifndef __VPF_H__ #include "vpf.h" #endif #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef __VPFQUERY_H__ #include "vpfquery.h" #endif #ifndef __VPFTIDX_H__ #include "vpftidx.h" #endif #ifndef __VPFSELEC_H__ #include "vpfselec.h" #endif /************************************************************************* * *N get_fit_tile_primitives * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Get the set of primitives in the given tile for the selected features * in the given feature class. Use the Feature Index Table instead of * the schema relationships. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * covpath ==(char *) path th the VPF coverage. * primclass ==(int) primitive class to select. * expression==(char *) expression to apply to the feature table. * feature_table ==(vpf_table_type) feature table. * tile ==(int32) tile number. * fca_id ==(int) Feature Class Attribute table id of the * selected feature class. * numprims ==(int) number of rows in the specified tile's * primitive table for the specified primitive * class. * status ==(int *) status of the function: * 1 if completed, 0 if user escape. * return ==(set_type) set of primitives for the features * in the corresponding tile. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 query_table_row (char *expression, row_type row, vpf_table_type table); #else int32 query_table_row (char *expression, row_type row, vpf_table_type table); #endif #ifdef PROTO set_type get_fit_tile_primitives (char *covpath, int32 primclass, char *expression, vpf_table_type feature_table, int32 tile, int32 fca_id, int32 numprims, int32 *status) #else set_type get_fit_tile_primitives (covpath, primclass, expression, feature_table, tile, fca_id, numprims, status) char *covpath; int32 primclass; char *expression; vpf_table_type feature_table; int32 tile, fca_id, numprims, *status; #endif { set_type primitives, tileset, fcset, selset; int32 i, start, end, prim_id, tile_id, fc_id, feature_id, count; short short_tile_id; int32 PRIM_ID_, TILE_ID_, FC_ID_, FEATURE_ID_; vpf_table_type fit; row_type row, frow; char path[255]; static char *ptable[] = {"","EDG","FAC","TXT","END","CND"}; primitives = set_init (numprims+1); strcpy (path, covpath); strcat (path, ptable[primclass]); strcat (path, ".FIT"); muse_check_path (path); if (muse_access (path,0) != 0) return primitives; fit = vpf_open_table (path, disk, "rb", NULL); if (!fit.fp) return primitives; TILE_ID_ = table_pos ("TILE_ID", fit); PRIM_ID_ = table_pos ("PRIM_ID", fit); FC_ID_ = table_pos ("FC_ID", fit); if (FC_ID_ < 0) FC_ID_ = table_pos ("FCA_ID", fit); FEATURE_ID_ = table_pos ("FEATURE_ID", fit); if ((TILE_ID_ < 0 && tile) || PRIM_ID_ < 0 || FC_ID_ < 0 || FEATURE_ID_ < 0) { vpf_close_table (&fit); *status = 0; return primitives; } /* Look for TILE_ID thematic index */ tileset.size = 0; if (tile) { if (fit.header[TILE_ID_].tdx) { strcpy (path, covpath); strcat (path, fit.header[TILE_ID_].tdx); muse_check_path (path); if (muse_access (path,0) == 0) { if (fit.header[TILE_ID_].type == 'I') { tile_id = (int32)tile; tileset = read_thematic_index (path, (char*)&tile_id); } else if (fit.header[TILE_ID_].type == 'S') { short_tile_id = tile; tileset = read_thematic_index(path,(char *)&short_tile_id); } } /* if muse_access */ } /* if tile_id.tdx */ } /* if tile */ if (!tileset.size) { tileset = set_init (fit.nrows+1); set_on (tileset); set_delete (0, tileset); } /* Look for FC_ID thematic index */ fcset.size = 0; if (fit.header[FC_ID_].tdx) { strcpy (path, covpath); strcat (path, fit.header[FC_ID_].tdx); muse_check_path (path); if (muse_access (path, 0) == 0) { fc_id = (int32)fca_id; fcset = read_thematic_index (path, (char*)&fc_id); } } /* if fc_id.tdx */ if (!fcset.size) { fcset = set_init (fit.nrows+1); set_on (fcset); set_delete (0, fcset); } /* Get the set of all FIT rows in the search tile that match the search fca_id */ selset = set_intersection (tileset, fcset); set_nuke (&tileset); set_nuke (&fcset); if (set_empty (selset)) { vpf_close_table (&fit); set_nuke (&selset); *status = 1; return primitives; } /* Now loop through the FIT and get the matching primitive ids */ start = set_min (selset); end = set_max (selset); /* Set file pointer to start record */ fseek (fit.fp, index_pos (start, fit), SEEK_SET); for (i=start; i<=end; i++) { /* Read each row of the fit starting as start. IF the row is a member */ /* of selset then get the tile_id. */ row = read_next_row (fit); if (set_member (i, selset)) { /* i is a member of selset so now we must test it to see if it */ /* meets the conditions of the thematic expression */ get_table_element(PRIM_ID_,row,fit,&prim_id,&count); get_table_element(FC_ID_,row,fit,&fc_id,&count); get_table_element(FEATURE_ID_,row,fit,&feature_id,&count); tile_id = 0; if (tile) { if (fit.header[TILE_ID_].type == 'I') { get_table_element (TILE_ID_, row, fit, &tile_id, &count); } else if (fit.header[TILE_ID_].type == 'S') { get_table_element(TILE_ID_, row, fit, &short_tile_id, &count); tile_id = short_tile_id; } } /* if tile */ free_row (row, fit); if (tile_id != tile || fc_id != fca_id) continue; frow = get_row (feature_id, feature_table); if (query_table_row (expression, frow, feature_table)) set_insert (prim_id, primitives); free_row(frow,feature_table); } /* if set_member */ free_row (row, fit); } /* for i */ vpf_close_table (&fit); set_nuke (&selset); *status = 1; return primitives; } ogdi-ogdi_4_1_0/vpflib/vpfselec.h000066400000000000000000000010401345660466700170600ustar00rootroot00000000000000/* VPFSELEC.H - SELECT VPF FEATURES */ #ifndef __VPFSELEC_H__ #define __VPFSELEC_H__ 1 #ifndef __SET_H__ #include "set.h" #endif #ifndef __VPFVIEW_H__ #include "vpfview.h" #endif #ifndef __VPFRELAT_H__ #include "vpfrelat.h" #endif #ifdef PROTO set_type get_fit_tile_primitives (char *covpath, int32 primclass, char *expression, vpf_table_type feature_table, int32 tile, int32 fca_id, int32 numprims, int32 *status); #else set_type get_fit_tile_primitives (); #endif #endif ogdi-ogdi_4_1_0/vpflib/vpfselec.i000066400000000000000000000671221345660466700170760ustar00rootroot00000000000000 #pragma comment(exestr, "xpg4plus @(#) stdio.h 20.1 94/12/04 ") #pragma pack(4) typedef unsigned int size_t; typedef long fpos_t; typedef long wchar_t; typedef long wint_t; typedef struct _FILE_ { int __cnt; unsigned char *__ptr; unsigned char *__base; unsigned char __flag; unsigned char __file; unsigned char __buf[2]; } FILE; extern FILE __iob[]; extern int remove(const char *); extern int rename(const char *, const char *); extern FILE *tmpfile(void); extern char *tmpnam(char *); extern int fclose(FILE *); extern int fflush(FILE *); extern FILE *fopen(const char *, const char *); extern FILE *freopen(const char *, const char *, FILE *); extern void setbuf(FILE *, char *); extern int setvbuf(FILE *, char *, int, size_t); extern int fprintf(FILE *, const char *, ...); extern int fscanf(FILE *, const char *, ...); extern int printf(const char *, ...); extern int scanf(const char *, ...); extern int sprintf(char *, const char *, ...); extern int sscanf(const char *, const char *, ...); extern int vfprintf(FILE *, const char *, char * ) ; extern int vprintf(const char *, char * ) ; extern int vsprintf(char *, const char *, char * ) ; extern int fgetc(FILE *); extern char *fgets(char *, int, FILE *); extern int fputc(int, FILE *); extern int fputs(const char *, FILE *); extern int getc(FILE *); extern int getchar(void); extern char *gets(char *); extern int putc(int, FILE *); extern int putchar(int); extern int puts(const char *); extern int ungetc(int, FILE *); extern size_t fread(void *, size_t, size_t, FILE *); #pragma int_to_unsigned fread extern size_t fwrite(const void *, size_t, size_t, FILE *); #pragma int_to_unsigned fwrite extern int fgetpos(FILE *, fpos_t *); extern int fseek(FILE *, long, int); extern int fsetpos(FILE *, const fpos_t *); extern long ftell(FILE *); extern void rewind(FILE *); extern void clearerr(FILE *); extern int feof(FILE *); extern int ferror(FILE *); extern void perror(const char *); extern int __filbuf(FILE *); extern int __flsbuf(int, FILE *); extern int (fileno)(FILE *); extern char *ctermid(char *); extern FILE *fdopen(int, const char *); extern FILE *popen(const char *, const char *); extern char *tempnam(const char *, const char *); extern int getw(FILE *); extern int putw(int, FILE *); extern int pclose(FILE *); extern char *optarg; extern int optind, opterr, optopt; extern char *cuserid(char *); extern int getopt(int, char *const*, const char *); extern int system(const char *); extern wint_t fgetwc(FILE *); extern wchar_t *fgetws(wchar_t *, int, FILE *); extern wint_t fputwc(wint_t, FILE *); extern int fputws(const wchar_t *, FILE *); extern wint_t getwc(FILE *); extern wint_t getwchar(void); extern wint_t putwc(wint_t, FILE *); extern wint_t putwchar(wint_t); extern wint_t ungetwc(wint_t, FILE *); extern int fwprintf(FILE *, const wchar_t *, ...); extern int fwscanf(FILE *, const wchar_t *, ...); extern int wprintf(const wchar_t *, ...); extern int wscanf(const wchar_t *, ...); extern int swprintf(wchar_t *, size_t, const wchar_t *, ...); extern int swscanf(const wchar_t *, const wchar_t *, ...); extern int vfwprintf(FILE *, const wchar_t *, char * ) ; extern int vfwscanf(FILE *, const wchar_t *, char * ) ; extern int vwprintf(const wchar_t *, char * ) ; extern int vwscanf(const wchar_t *, char * ) ; extern int vswprintf(wchar_t *, size_t, const wchar_t *, char * ) ; extern int vswscanf(const wchar_t *, const wchar_t *, char * ) ; extern void funflush(FILE *); extern int snprintf(char *, size_t, const char *, ...); extern int vsnprintf(char *, size_t, const char *, char * ) ; extern int vfscanf(FILE *, const char *, char * ) ; extern int vscanf(const char *, char * ) ; extern int vsscanf(const char *, const char *, char * ) ; extern int nl_fprintf(FILE *, const char *, ...); extern int nl_fscanf(FILE *, const char *, ...); extern int nl_printf(const char *, ...); extern int nl_scanf(const char *, ...); extern int nl_sprintf(char *, const char *, ...); extern int nl_sscanf(const char *, const char *, ...); #pragma pack() #pragma comment(exestr, "xpg4plus @(#) stdlib.h 20.1 94/12/04 ") #pragma pack(4) typedef struct { int quot; int rem; } div_t; typedef struct { long quot; long rem; } ldiv_t; typedef int ssize_t; extern unsigned char __ctype[]; extern double atof(const char *); extern int atoi(const char *); extern long atol(const char *); extern double strtod(const char *, char **); extern float strtof(const char *, char **); extern long strtol(const char *, char **, int); extern unsigned long strtoul(const char *, char **, int); extern int rand(void); extern void srand(unsigned int); extern void *calloc(size_t, size_t); extern void free(void *); extern void *malloc(size_t); extern void *realloc(void *, size_t); extern void abort(void); extern int atexit(void (*)(void)); extern void exit(int); extern char *getenv(const char *); extern int system(const char *); extern void *bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *)); extern int (abs)(int); extern div_t div(int, int); extern long labs(long); extern ldiv_t ldiv(long, long); extern int mbtowc(wchar_t *, const char *, size_t); extern int mblen(const char *, size_t); extern int wctomb(char *, wchar_t); extern size_t mbstowcs(wchar_t *, const char *, size_t); extern size_t wcstombs(char *, const wchar_t *, size_t); extern long a64l(const char *); extern int dup2(int, int); extern char *ecvt(double, int, int *, int *); extern char *ecvtl(long double, int, int *, int *); extern char *fcvt(double, int, int *, int *); extern char *fcvtl(long double, int, int *, int *); extern char *getcwd(char *, size_t); extern char *getlogin(void); extern int getopt(int, char *const *, const char *); extern int getsubopt(char **, char *const *, char **); extern char *initstate(unsigned, char *, int); extern int grantpt(int); extern char *optarg; extern int optind, opterr, optopt; extern char *getpass(const char *); extern int getpw(int, char *); extern char *gcvt(double, int, char *); extern char *gcvtl(long double, int, char *); extern int isatty(int); extern void l3tol(long *, const char *, int); extern char *l64a(long); extern char *l64a_r(long, char *, size_t); extern void ltol3(char *, const long *, int); extern void *memalign(size_t, size_t); extern char *mktemp(char *); extern int mkstemp(char *); extern char *ptsname(int); extern long random(void); extern int rand_r(unsigned int *); extern char *realpath(const char *, char *); extern char *setstate(char *); extern void srandom(unsigned); extern long double strtold(const char *, char **); extern void swab(const void *, void *, ssize_t); extern char *ttyname(int); extern int ttyslot(void); extern int unlockpt(int); extern void *valloc(size_t); extern double wcstod(const wchar_t *, wchar_t **); extern float wcstof(const wchar_t *, wchar_t **); extern long wcstol(const wchar_t *, wchar_t **, int); extern long double wcstold(const wchar_t *, wchar_t **); extern unsigned long wcstoul(const wchar_t *, wchar_t **, int); extern double drand48(void); extern double erand48(unsigned short *); extern long jrand48(unsigned short *); extern void lcong48(unsigned short *); extern long lrand48(void); extern long mrand48(void); extern long nrand48(unsigned short *); extern int putenv(const char *); extern unsigned short *seed48(unsigned short *); extern void setkey(const char *); extern void srand48(long); #pragma pack() #pragma comment(exestr, "xpg4plus @(#) string.h 20.1 94/12/04 ") extern void *memchr(const void *, int, size_t); extern void *memcpy(void *, const void *, size_t); extern void *memccpy(void *, const void *, int, size_t); extern void *memmove(void *, const void *, size_t); extern void *memset(void *, int, size_t); extern char *strchr(const char *, int); extern char *strcpy(char *, const char *); extern char *strncpy(char *, const char *, size_t); extern char *strcat(char *, const char *); extern char *strncat(char *, const char *, size_t); extern char *strpbrk(const char *, const char *); extern char *strrchr(const char *, int); extern char *strstr(const char *, const char *); extern char *strtok(char *, const char *); extern char *strtok_r(char *, const char *, char **); extern char *strerror(int); extern char *strlist(char *, const char *, ...); extern int memcmp(const void *, const void *, size_t); extern int strcmp(const char *, const char *); extern int strcoll(const char *, const char *); extern int strncmp(const char *, const char *, size_t); extern void perror(const char *); extern char *strdup(const char *); extern int strncoll(const char *, const char *, int); extern size_t strnxfrm(char *, const char *, size_t , int); extern size_t strxfrm(char *, const char *, size_t); extern size_t strcspn(const char *, const char *); extern size_t strspn(const char *, const char *); extern size_t strlen(const char *); #pragma int_to_unsigned strcspn #pragma int_to_unsigned strspn #pragma int_to_unsigned strlen extern int ffs(int); extern int nl_strcmp(char *, char *); extern int nl_strncmp(char *, char *, int n); #pragma comment(exestr, "xpg4plus @(#) malloc.h 20.1 94/12/04 ") #pragma pack(4) struct mallinfo { int arena; int ordblks; int smblks; int hblks; int hblkhd; int usmblks; int fsmblks; int uordblks; int fordblks; int keepcost; }; extern void *malloc(size_t); extern void free(void *); extern void *realloc(void *, size_t); extern int mallopt(int, int); extern struct mallinfo mallinfo(void); extern void *calloc(size_t, size_t); #pragma pack() #pragma comment(exestr, "xpg4plus @(#) limits.h 20.2 94/12/15 ") extern long _sysconf(int); extern void G_warning (char *msg); short dir_create ( ) ; short dir_pop ( ) ; short dir_push ( ) ; short dir_restore ( ) ; short dir_save ( ) ; short dir_current ( ) ; short file_spec_to_string ( ) ; FILE *file_open (); int muse_access (); long muse_filelength (); void muse_check_path (); extern void G_warning (char *msg); typedef struct { long size; char * buf ; void * buf_handle ; } set_type; set_type set_init (); int set_empty (); void set_insert (); void set_delete (); int set_member (); long set_min (); long set_max (); long num_in_set (); void set_on (); void set_off (); int set_equal (); void set_assign (); set_type set_union (); set_type set_intersection (); set_type set_difference (); void set_nuke (); #pragma comment(exestr, "xpg4plus @(#) math.h 20.1 94/12/04 ") #pragma pack(4) struct exception { int type; char *name; double arg1; double arg2; double retval; }; extern int matherr(struct exception *); extern double acos(double); extern double asin(double); extern double atan(double); extern double atan2(double, double); extern double cos(double); extern double sin(double); extern double tan(double); extern double cosh(double); extern double sinh(double); extern double tanh(double); extern double exp(double); extern double frexp(double, int *); extern double ldexp(double, int); extern double log(double); extern double log10(double); extern double modf(double, double *); extern double pow(double, double); extern double sqrt(double); extern double ceil(double); extern double fabs(double); extern double floor(double); extern double fmod(double, double); extern const double __huge_val; extern double erf(double); extern double erfc(double); extern double gamma(double); extern double hypot(double, double); extern double j0(double); extern double j1(double); extern double jn(int, double); extern double y0(double); extern double y1(double); extern double yn(int, double); extern double lgamma(double); extern int isnan(double); extern long double frexpl(long double, int *); extern long double ldexpl(long double, int); extern long double modfl(long double, long double *); extern float acosf(float); extern float asinf(float); extern float atanf(float); extern float atan2f(float, float); extern float cosf(float); extern float sinf(float); extern float tanf(float); extern float coshf(float); extern float sinhf(float); extern float tanhf(float); extern float expf(float); extern float logf(float); extern float log10f(float); extern float powf(float, float); extern float sqrtf(float); extern float ceilf(float); extern float fabsf(float); extern float floorf(float); extern float fmodf(float, float); extern float modff(float, float *); extern double atof(const char *); extern double scalb(double, double); extern double logb(double); extern double log1p(double); extern double nextafter(double, double); extern double acosh(double); extern double asinh(double); extern double atanh(double); extern double cbrt(double); extern double copysign(double, double); extern double expm1(double); extern int ilogb(double); extern double remainder(double, double); extern double rint(double); extern int unordered(double, double); extern int finite(double); extern long double scalbl(long double, long double); extern long double logbl(long double); extern long double nextafterl(long double, long double); extern int unorderedl(long double, long double); extern int finitel(long double); extern int signgam; #pragma pack() extern void G_warning (char *msg); typedef struct { long machine; long input; long output; } xBYTE_ORDER; typedef enum { VpfNull, VpfChar, VpfShort, VpfInteger, VpfFloat, VpfDouble, VpfDate, VpfKey, VpfCoordinate, VpfTriCoordinate, VpfDoubleCoordinate, VpfDoubleTriCoordinate, VpfUndefined } VpfDataType ; long VpfRead (); long VpfWrite (); typedef char date_type[21] ; typedef union { char *Char; short int Short; long int Int; float Float; double Double; date_type Date; char Other; } null_field; typedef struct { char *name; char *tdx; char *narrative; long int count; char description[81]; char keytype; char vdt[13]; char type; null_field nullval ; } header_cell, *header_type; typedef enum { ram, disk, either, compute } storage_type; typedef enum { Read, Write } file_mode ; typedef struct { long count; void *ptr; } column_type; typedef column_type *row_type; typedef column_type * ROW ; typedef struct { unsigned long pos; unsigned long length; } index_cell; typedef index_cell * index_type ; typedef struct { char *path; long nfields; long nrows; long reclen; long ddlen; FILE *fp; FILE *xfp; index_type index; void * idx_handle ; storage_type storage; storage_type xstorage; header_type header; ROW *row; void * row_handle ; file_mode mode; char *defstr ; char name[13]; char description[81]; char narrative[13]; unsigned char status; unsigned char byte_order; } vpf_table_type; typedef struct { float x,y; } coordinate_type; typedef struct { double x,y; } double_coordinate_type; typedef struct { float x,y,z; } tri_coordinate_type; typedef struct { double x,y, z; } double_tri_coordinate_type; typedef union { unsigned char f1; unsigned short f2; unsigned long f3; } key_field; typedef struct { unsigned char type; long id, tile, exid; } id_triplet_type; double quiet_nan (); void vpf_nullify_table (); vpf_table_type vpf_open_table (); void vpf_close_table (); char *read_text_defstr (); long index_length (); long index_pos (); id_triplet_type read_key (); long row_offset (); row_type read_next_row (); row_type rowcpy (); row_type read_row (); void free_row (); row_type get_row (); long table_pos (); void *get_table_element (); void *named_table_element (); void *table_element (); long is_vpf_table (); long is_vpf_null_float (); long is_vpf_null_double (); long parse_data_def (); long int write_key (); long int write_next_row (); long int write_row (); row_type create_row (); void nullify_table_element (); long put_table_element (); void swap_two (); void swap_four (); void swap_eight (); void format_date (); extern FILE * errorfp; typedef struct linked_list_cell { void *element; size_t element_size; struct linked_list_cell *next; } cell_type, *linked_list_type, *position_type; linked_list_type ll_init (); long ll_empty (); position_type ll_first (); position_type ll_last (); position_type ll_next (); position_type ll_previous (); long ll_end (); void ll_element (); void ll_insert (); void ll_delete (); void ll_reset (); position_type ll_locate (); void ll_replace (); size_t ll_element_size (); typedef enum { VPF_0_7, VPF_0_8, VPF_0_9, VPF_1_0 } vpf_version_type; typedef enum { LINE=1, AREA, ANNO, VPFPOINTS, VPFCOMPLEX=6 } vpf_feature_type; typedef enum { EDGE=1, FACE, TEXT, ENTITY_NODE, CONNECTED_NODE } vpf_primitive_type; typedef struct { unsigned char edge; unsigned char face; unsigned char text; unsigned char entity_node; unsigned char connected_node; } primitive_class_type; typedef enum { UNKNOWN_SECURITY, UNCLASSIFIED, RESTRICTED, CONFIDENTIAL, SECRET, TOP_SECRET } security_type; typedef enum { UNKNOWN_UNITS, METERS, FEET, INCHES, KILOMETERS, OTHER_UNITS, DEC_DEGREES } vpf_units_type; typedef enum { DDS, AC, AK, AL, GN, LE, LJ, MC, OC, OD, PG, TC, UT, PC } vpf_projection_code; typedef struct { vpf_projection_code code; double parm1, parm2, parm3, parm4; vpf_units_type units; double false_easting, false_northing; long (*forward_proj)(); long (*inverse_proj)(); char name[21]; } vpf_projection_type; typedef unsigned char boolean; typedef struct { double x1, y1, x2, y2; } extent_type, line_segment_type; typedef struct { float x1, y1, x2, y2; } fextent_type; typedef enum { Miles, Meters, Degrees, Feet, Inches, Kilometers } coord_units_type; typedef struct { long degrees; long minutes; float seconds; } dms_type; double dms_to_float (); double gc_distance (); long contained (); long geo_intersect (); long completely_within (); long fwithin (); long intersect (); long perpendicular_intersection (); dms_type float_to_dms (); double dms_to_float (); typedef struct { char name[9]; boolean viewable; char *path; long int ntiles; set_type tile_set; vpf_projection_code projection; vpf_units_type units; } library_type; typedef struct { char name[9]; char *path; library_type *library; long nlibraries; } database_type; typedef struct { long point_color; long point; long line_color; long line; long area_color; long area; long text_color; long text; } theme_symbol_type; typedef struct { char *description; char *database; char *library; char *coverage; char *fc; char *ftable; primitive_class_type primclass; char *expression; } theme_type; typedef struct { char name[9]; database_type *database; long ndb; char *path; long nthemes; theme_type *theme; set_type selected; set_type displayed; linked_list_type sellist; extent_type extent; double tileheight; char sympath[255]; } view_type; typedef struct { extent_type mapextent; boolean mapchanged; boolean mapdisplayed; boolean user_escape; boolean study_area_selected; boolean latlongrid; boolean scale_bar; vpf_projection_type projection; coord_units_type distance_unit; coord_units_type scale_bar_unit; vpf_units_type locator_unit; } map_environment_type; typedef struct { extent_type mapextent; boolean mapdisplayed; boolean latlongrid; boolean tilegrid; boolean points; boolean text; vpf_units_type locator_unit; } libref_map_environment_type; set_type query_table (); linked_list_type parse_expression (); typedef struct { long int nbytes , nbins , table_nrows ; char index_type , column_type ; long int type_count ; char id_data_type , vpf_table_name[13] , vpf_column_name[25] , sort , padding[3] ; } ThematicIndexHeader ; typedef union { char cval , *strval; long ival; short sval; float fval; double dval; } ThematicIndexValue; typedef struct { ThematicIndexValue value; long int binid, start_offset , num_items ; } ThematicIndexDirectory ; typedef struct { ThematicIndexHeader h; ThematicIndexDirectory *d, *gid; FILE *fp; } ThematicIndex; long create_thematic_index (); set_type read_thematic_index (); ThematicIndex open_thematic_index (); set_type search_thematic_index (); void close_thematic_index (); long create_gazetteer_index (); set_type search_gazetteer_index (); set_type read_gazetteer_index (); typedef struct { char table1[40]; char key1[40]; char table2[40]; char key2[40]; } vpf_relate_struct; typedef struct { long nchain; vpf_table_type *table; linked_list_type relate_list; } feature_class_relate_type, fcrel_type; long num_relate_paths (); linked_list_type fcs_relate_list (); long related_row (); linked_list_type related_rows (); fcrel_type select_feature_class_relate (); long fc_row_number (); linked_list_type fc_row_numbers (); void deselect_feature_class_relate (); set_type get_fit_tile_primitives (); set_type get_fit_tile_primitives (covpath, primclass, expression, feature_table, tile, fca_id, numprims, status) char *covpath; long primclass; char *expression; vpf_table_type feature_table; long tile, fca_id, numprims, *status; { set_type primitives, tileset, fcset, selset; long i, start, end, prim_id, tile_id, fc_id, feature_id, count; short short_tile_id; long PRIM_ID_, TILE_ID_, FC_ID_, FEATURE_ID_; vpf_table_type fit; row_type row, frow; char path[255]; static char *ptable[] = {"","EDG","FAC","TXT","END","CND"}; primitives = set_init (numprims+1); __std_hdr_strcpy ( path , covpath ) ; strcat (path, ptable[primclass]); strcat (path, ".FIT"); muse_check_path (path); if (muse_access (path,0) != 0) return primitives; fit = vpf_open_table (path, disk, "rb", 0 ) ; if (!fit.fp) return primitives; TILE_ID_ = table_pos ("TILE_ID", fit); PRIM_ID_ = table_pos ("PRIM_ID", fit); FC_ID_ = table_pos ("FC_ID", fit); if (FC_ID_ < 0) FC_ID_ = table_pos ("FCA_ID", fit); FEATURE_ID_ = table_pos ("FEATURE_ID", fit); if ((TILE_ID_ < 0 && tile) || PRIM_ID_ < 0 || FC_ID_ < 0 || FEATURE_ID_ < 0) { vpf_close_table (&fit); *status = 0; return primitives; } tileset.size = 0; if (tile) { if (fit.header[TILE_ID_].tdx) { __std_hdr_strcpy ( path , covpath ) ; strcat (path, fit.header[TILE_ID_].tdx); muse_check_path (path); if (muse_access (path,0) == 0) { if (fit.header[TILE_ID_].type == 'I') { tile_id = (long int)tile; tileset = read_thematic_index (path, (char*)&tile_id); } else if (fit.header[TILE_ID_].type == 'S') { short_tile_id = tile; tileset = read_thematic_index(path,(char *)&short_tile_id); } } } } if (!tileset.size) { tileset = set_init (fit.nrows+1); set_on (tileset); set_delete (0, tileset); } fcset.size = 0; if (fit.header[FC_ID_].tdx) { __std_hdr_strcpy ( path , covpath ) ; strcat (path, fit.header[FC_ID_].tdx); muse_check_path (path); if (muse_access (path, 0) == 0) { fc_id = (long)fca_id; fcset = read_thematic_index (path, (char*)&fc_id); } } if (!fcset.size) { fcset = set_init (fit.nrows+1); set_on (fcset); set_delete (0, fcset); } selset = set_intersection (tileset, fcset); set_nuke (&tileset); set_nuke (&fcset); if (set_empty (selset)) { vpf_close_table (&fit); set_nuke (&selset); *status = 1; return primitives; } start = set_min (selset); end = set_max (selset); fseek (fit.fp, index_pos (start, fit), 0 ) ; for (i=start; i<=end; i++) { row = read_next_row (fit); if (set_member (i, selset)) { get_table_element(PRIM_ID_,row,fit,&prim_id,&count); get_table_element(FC_ID_,row,fit,&fc_id,&count); get_table_element(FEATURE_ID_,row,fit,&feature_id,&count); tile_id = 0; if (tile) { if (fit.header[TILE_ID_].type == 'I') { get_table_element (TILE_ID_, row, fit, &tile_id, &count); } else if (fit.header[TILE_ID_].type == 'S') { get_table_element(TILE_ID_, row, fit, &short_tile_id, &count); tile_id = short_tile_id; } } free_row (row, fit); if (tile_id != tile || fc_id != fca_id) continue; frow = get_row (feature_id, feature_table); if (query_table_row (expression, frow, feature_table)) set_insert (prim_id, primitives); free_row(frow,feature_table); } free_row (row, fit); } vpf_close_table (&fit); set_nuke (&selset); *status = 1; return primitives; } #ident "acomp: Release 5.0.0a 16Mar95" ogdi-ogdi_4_1_0/vpflib/vpfspx.c000066400000000000000000000277621345660466700166150ustar00rootroot00000000000000 /*****************************************************************************/ /* VPFSPX.C */ /* */ /* Purpose: */ /* This module contains functions for reading the VPF spatial index */ /* file. A VPF spatial index is a modified quad-tree index with a */ /* cross-over bin for features spanning more than one spatial cell. */ /* There is one interface function in this module - */ /* spatial_index_search(). The spatial index creation function is */ /* not included. */ /*****************************************************************************/ #ifndef INCL_XVTH #include "xvt.h" #endif #include #include #include #include #ifdef _UNIX #define O_BINARY 0 #include #include #include #endif #ifdef _MSDOS #include #include #include #include #include #endif #ifdef _UNIX #include #endif #include #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef __VPFSPX_H__ #include "vpfspx.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif /******* cellmap definitions **/ #define START 0 #define NUMFEAT 1 #define OUT 0 #define IN 1 #define ID 1 #define BOUND 0 #define TOTAL_NUMBER 0 #define BOUND_START 1 #define CELLMAP_SIZE 5 #define XMIN 0 #define YMIN 1 #define XMAX 2 #define YMAX 3 typedef struct { int32 start, numfeat; } cellmap_rec_type; typedef struct { int32 bound, id; } spx_rec_type; typedef struct { FILE *fp; /* File pointer */ int32 maplen; /* Number of cells in the tree */ cellmap_rec_type *cellmap; /* The tree of cells */ int32 shift; /* Size of data before real cell records */ unsigned char box[4]; /* Search box */ } spx_type; /************************************************************************* * *N is_over * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Determine if two boxes overlap. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * box1 ==(unsigned char[4]) first box to check. * box2 ==(unsigned char[4]) second box to check. * return ==(int) 1 if the boxes overlap, * 0 if the boxes do not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Mody Buchbinder Jul 1991 *E *************************************************************************/ #ifdef PROTO static int is_over( unsigned char box1[4], unsigned char box2[4] ) #else static int is_over( box1, box2 ) unsigned char box1[4]; unsigned char box2[4]; #endif { int xmin,xmax,ymin,ymax; if(box2[XMIN] >= box1[XMIN] && box2[XMIN] <= box1[XMAX]) xmin = IN; else xmin = OUT; if(box2[XMAX] >= box1[XMIN] && box2[XMAX] <= box1[XMAX]) xmax = IN; else xmax = OUT; if(box2[YMIN] >= box1[YMIN] && box2[YMIN] <= box1[YMAX]) ymin = IN; else ymin = OUT; if(box2[YMAX] >= box1[YMIN] && box2[YMAX] <= box1[YMAX]) ymax = IN; else ymax = OUT; /* complete overlap */ if(xmin == OUT && xmax == OUT && box2[XMIN] <= box1[XMIN] && box2[XMAX] >= box1[XMAX]) xmin = IN; if(ymin == OUT && ymax == OUT && box2[YMIN] <= box1[YMIN] && box2[YMAX] >= box1[YMAX]) ymin = IN; if((xmin == IN || xmax == IN) && (ymin == IN || ymax == IN)) return 1; return 0; } /************************************************************************* * *N get_record * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Read spatial index record 'num'. Insert the record into the search * set if it falls within the search box. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * num ==(int32) record number. * spx ==(spx_type *) spatial index record structure. * set ==(set_type) search set to be updated. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Mody Buchbinder Jul 1991 *E *************************************************************************/ #ifdef PROTO static void get_record(int32 num, spx_type *spx, set_type set ) #else static void get_record (num, spx, set ) int32 num; spx_type *spx; set_type set; #endif { int32 offset; int32 i,j,index; /* DGM */ unsigned char box[4]; int32 ltmp; spx_rec_type *rec; int32 machine_byte_order = MACHINE_BYTE_ORDER; /* DGM */ index = num -1; offset = spx->cellmap[index].start + spx->shift; fseek(spx->fp,offset,SEEK_SET); rec = (spx_rec_type *)xvt_zmalloc(spx->cellmap[index].numfeat* sizeof(spx_rec_type)); ogdi_fread(rec,sizeof(spx_rec_type),spx->cellmap[index].numfeat,spx->fp); if(machine_byte_order != LEAST_SIGNIFICANT) /* DGM */ for(i=0;icellmap[index].numfeat;i++){ /* spx->buf[i][0] is a four byte buffer - don't swap */ /* spx->buf[i][ID] is an integer - swap */ ltmp = rec[i].id; swap_four((char*)<mp,(char*)&rec[i].id); } for(j=0;jcellmap[index].numfeat;j++) { memcpy(&box,&(rec[j].bound),4*sizeof(unsigned char)); if (is_over(box,spx->box)) { set_insert(rec[j].id,set); } } xvt_free((char*)rec); } /************************************************************************* * *N search_cell * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Search the current cell for local records and, if the box is in the * search area, search the cell's children. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * record ==(int32) record number. * level ==(int) level of the index tree. * bnd ==(unsigned char[4]) bounding box. * spx ==(spx_type *) spatial index record structure. * set ==(set_type) search set to be updated. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Mody Buchbinder Jul 1991 *E *************************************************************************/ #ifdef PROTO static void search_cell( int32 record, int level, unsigned char bnd[4], spx_type *spx, set_type set ) #else static void search_cell( record, level, bnd, spx, set ) int32 record; int level; unsigned char bnd[4]; spx_type *spx; set_type set; #endif { int i; unsigned char locbnd[4],cut; if (record > spx->maplen) return; for(i=0;i<4;i++) locbnd[i] = bnd[i]; if(level != 0) { /* level even -> cut on x , level odd -> cut on y */ if(level%2 == 1) cut = bnd[0] + ((bnd[2] - bnd[0]) >> 1); else cut = bnd[1] + ((bnd[3] - bnd[1]) >> 1); /* cut on x right cell */ if(level%2 == 1 && record%2 == 0) locbnd[0] = cut; /* cut on x left cell */ if(level%2 == 1 && record%2 == 1) locbnd[2] = cut; /* cut on y upper cell */ if(level%2 == 0 && record%2 == 0) locbnd[1] = cut; /* cut on y lower cell */ if(level%2 == 0 && record%2 == 1) locbnd[3] = cut; } if(is_over(locbnd,spx->box) == 1) { get_record(record,spx,set); if(record*2 <= spx->maplen) { search_cell(record*2, level+1,locbnd, spx, set); search_cell(record*2+1,level+1,locbnd, spx, set); } } } /************************************************************************* * *N spatial_index_search * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Search the named spatial index file to find all records falling * within the specified extent. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * fname ==(char *) path name to a VPF spatial index file. * x1 ==(float) left coordinate of the search box. * y1 ==(float) bottom coordinate of the search box. * x2 ==(float) right coordinate of the search box. * y2 ==(float) top coordinate of the search box. * set ==(set_type) search set to be filled. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Mody Buchbinder Jul 1991 *E *************************************************************************/ #ifdef PROTO set_type spatial_index_search( char *fname, float x1, float y1, float x2, float y2 ) #else set_type spatial_index_search( fname, x1, y1, x2, y2 ) char *fname; float x1; float y1; float x2; float y2; #endif { int32 head[6]; int32 htmp[6]; int32 ltmp; float bnd[4],xf,yf; unsigned char tempbox[4]; set_type set; spx_type spx; int32 i; int32 machine_byte_order = MACHINE_BYTE_ORDER; spx.fp = muse_file_open (fname, "rb"); if (!spx.fp) { set.size = 0; set.buf = NULL; return set; } /* read basic header - int 0 -> number of features in coverage */ /* int 1 - 4 -> boundaries of coverage */ /* int 5 -> size of tree in records - each */ /* record = 2 integers (8 byte) */ ogdi_fread (htmp, sizeof (int32), 6, spx.fp); if (machine_byte_order != LEAST_SIGNIFICANT) for (i=0; i<6; i++) swap_four ((char*)&htmp[i], (char*)&head[i]); else memcpy (head, htmp, 6*sizeof (int32)); spx.shift = 6*sizeof (int32); spx.maplen = head[CELLMAP_SIZE]; #if 0 /* DGM */ set = set_init(head[TOTAL_NUMBER]+1L); #endif set = set_init (head[TOTAL_NUMBER]); memcpy (&bnd[0], &head[BOUND_START], 4*sizeof (float)); /* If the boundaries of the cellmap are completely within the */ /* search area, all features are on */ if ( (x1 <= bnd[XMIN]) && (x2 >= bnd[XMAX]) && (y1 <= bnd[YMIN]) && (y2 >= bnd[YMAX]) ) { set_on(set); fclose(spx.fp); return set; } /* allocate cells */ spx.cellmap = (cellmap_rec_type *)xvt_zmalloc(spx.maplen* sizeof(cellmap_rec_type)); if (!spx.cellmap) { /* Memory allocation failed - return null set */ fclose(spx.fp); set_nuke(&set); set.size=0; return set; } /* read the cell tree */ ogdi_fread(spx.cellmap,sizeof(cellmap_rec_type),spx.maplen,spx.fp); if(machine_byte_order != LEAST_SIGNIFICANT) /* DGM */ for(i=0;i= bnd[XMAX]) spx.box[XMIN] = 255; spx.box[YMIN] = (char)((y1 - bnd[YMIN]) * yf); if (y1 <= bnd[YMIN]) spx.box[YMIN] = 0; if (y1 >= bnd[YMAX]) spx.box[YMIN] = 255; spx.box[XMAX] = (char)(((x2 - bnd[XMIN]) * xf) + 1); if (x2 <= bnd[XMIN]) spx.box[XMAX] = 0; if (x2 >= bnd[XMAX]) spx.box[XMAX] = 255; spx.box[YMAX] = (char)(((y2 - bnd[YMIN]) * yf) + 1); if (y2 <= bnd[YMIN]) spx.box[YMAX] = 0; if (y2 >= bnd[YMAX]) spx.box[YMAX] = 255; /** start search **/ tempbox[XMIN] = 0; tempbox[YMIN] = 0; tempbox[XMAX] = 0xff; tempbox[YMAX] = 0xff; search_cell(1,0,tempbox,&spx,set); fclose(spx.fp); xvt_free((char*)spx.cellmap); return set; } ogdi-ogdi_4_1_0/vpflib/vpfspx.h000066400000000000000000000005151345660466700166050ustar00rootroot00000000000000#ifndef __VPFSPX_H__ #define __VPFSPX_H__ #ifndef __SET_H__ #include "set.h" #endif /* Function Definitions */ #ifdef PROTO set_type spatial_index_search( char *spxname, float x1, float y1, float x2, float y2 ); #else set_type spatial_index_search (); #endif #endif /* ifdef __VPFSPX_H__ */ ogdi-ogdi_4_1_0/vpflib/vpftable.c000066400000000000000000001165321345660466700170640ustar00rootroot00000000000000/*****************************************************************************/ /* */ /* VPFTABLE.C */ /* */ /* This module contains functions to open, close and parse VPF relational */ /* tables. VPF tables are defined as being a set of rows and columns. */ /* Each column may contain a single value, a fixed array of values, */ /* or a variable number of values. */ /* */ /* FUNCTIONS: */ /* quiet_nan */ /* cpy_del */ /* parse_get_string */ /* parse_get_char */ /* parse_get_number */ /* swap_two */ /* swap_four */ /* swap_eight */ /* parse_data_def */ /* vpf_nullify_table */ /* vpf_open_check */ /* vpf_open_table */ /* vpf_close_table */ /* is_vpf_table */ /* is_vpf_null_float */ /* is_vpf_null_double */ /* format_date */ /*****************************************************************************/ #ifndef INCL_XVTH #include #endif #ifdef _MAC #include #endif #ifdef _MSDOS #include #endif #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif /* * per heap block byte overhead */ #define HEAP_OVERHEAD 4 /* Global variable shared by VPFTABLE.C, VPFREAD.C, and VPFWRITE.C */ /* The above modules are logically one, only separated by file size */ /* constraints. */ int32 STORAGE_BYTE_ORDER = LEAST_SIGNIFICANT; /* default */ /* Return floating point Not a Number (for NULL values) */ #ifdef PROTO double quiet_nan( int32 unused ) #else double quiet_nan( unused ) int32 unused; #endif { static char nanstr[8] = {-1,-1,-1,-1,-1,-1,-1,127}; double n; memcpy((char *) &n,&nanstr[0],sizeof(n)); if (unused) return n; return n; } #ifdef PROTO float float_quiet_nan( int32 unused ) #else float float_quiet_nan( unused ) int32 unused; #endif { static char nanstr[4] = {-1,-1,-1,127}; float n; memcpy((char *) &n,&nanstr[0],sizeof(n)); if (unused) return n; return n; } /***************************************************************/ /* cpy_del */ /* get string until delimeter */ /***************************************************************/ #ifdef PROTO static char *cpy_del(char *src, char delimiter, int32 *ind ) #else static char *cpy_del(src, delimiter, ind ) char *src; char delimiter; int32 *ind; #endif { int32 i = 0L, skipchar = 0L; char *temp = (char *)NULL, *tempstr = (char *)NULL; size_t size = 0; /* remove all blanks ahead of good data */ while ( *(src + skipchar) == SPACE || *(src + skipchar) == TAB ) skipchar++ ; temp = (char *)(src + skipchar); /* If the first character is a COMMENT, goto LINE_CONTINUE */ if ( *temp == (char)COMMENT ) { while ( *temp != (char)LINE_CONTINUE && *temp != (char)END_OF_FIELD && *temp != '\0'){ temp++ ; skipchar ++ ; } skipchar++ ; temp++ ; /* skip past LC, EOF, or NULL */ } /* Start with temporary string value */ size = (size_t)strlen (temp); tempstr = (char*)xvt_zmalloc ((size_t)(size + 10)*sizeof(char)); if ( *temp == '"' ) { /* If field is quoted, do no error checks */ temp++ ; /* skip past quote character */ skipchar++ ; /* update the position pointer */ for ( i=0 ; *temp != '\0'; temp++,i++) { if ( *temp == (char)LINE_CONTINUE || *temp == (char)TAB ) { temp++ ; skipchar++ ; } else if ( *temp == '"' ) break ; /* Now copy the char into the output string */ *(tempstr + i) = *temp ; } *(tempstr + i) = '\0' ; /* terminate string */ *ind += ( i + skipchar + 2L) ; /* Increment position locate past */ return tempstr ; /* quote and semicolon */ } /* search for delimiter to end, or end of string */ i=0L ; /* initialize */ if ( *temp != (char)END_OF_FIELD ) { /* backward compatability check */ for ( i=0L; *temp != '\0';temp++,i++){ /* Stop on NULL*/ if ( ( *temp == (char)LINE_CONTINUE && *(temp+1) == '\n') || *temp == (char)TAB ) { temp++ ; skipchar++ ; } else if ( *temp == delimiter ) break ; /* break for delimiter */ /* Now copy the char into the output string */ *(tempstr + i) = *temp ; } /* Eat the delimiter from ind also */ *ind += ( i + skipchar + 1L) ; /* Increment position locate */ } *(tempstr + i) = '\0' ; /* terminate string */ return tempstr; } /* parse the next string token from the input string */ #ifdef PROTO char *parse_get_string(int32 *ind, char *src,char delimeter ) #else char *parse_get_string( ind, src, delimeter ) int32 *ind; char *src; char delimeter; #endif { char *temp = (char *)NULL; temp = cpy_del((src + (*ind)),delimeter, ind); if( ! strcmp ( temp, (char *)TEXT_NULL )) strcpy ( temp, "" ) ; return temp; } /* parse the next character from the input string */ #ifdef PROTO char parse_get_char(int32 *ind, char *src) #else char parse_get_char( ind, src) int32 *ind; char *src; #endif { char temp; while ( *(src + (*ind)) == (char)SPACE || *(src + (*ind)) == (char)TAB ) (*ind)++ ; temp = *(src + (*ind)); *ind += 2L; return temp; } /* parse the next numeric token from the input string */ #ifdef PROTO int32 parse_get_number(int32 *ind, char *src,char delimeter) #else int32 parse_get_number( ind, src, delimeter) int32 *ind; char *src; char delimeter; #endif { char *temp = (char *)NULL; int32 num = 0L; temp = cpy_del((src + (*ind)),delimeter, ind); if (strchr(temp, (int)VARIABLE_COUNT ) == NULL) num = (int32)atoi(temp); /****should this be atol ?****/ else num = -1L; if(temp != (char *)NULL) { xvt_free(temp); temp = (char *)NULL; } return num; } /*****************************************************************************/ /* swap_two */ /* */ /* Purpose: */ /* This function performs a byte swap for a two-byte numeric field. */ /* This may be necessary if the data is stored in the opposite */ /* order of significance than the host platform. Both parameters */ /* should point to a two-byte data element. */ /* */ /* Parameters: */ /* in == (char *) pointer to the input value. */ /* out == (char *) pointer to the returned swapped value. */ /*****************************************************************************/ #ifdef PROTO void swap_two ( char *in, char *out ) #else void swap_two ( in, out ) char *in; char *out ; #endif { out[0] = in[1] ; out[1] = in[0] ; } /*****************************************************************************/ /* swap_four */ /* */ /* Purpose: */ /* This function performs a byte swap for a four-byte numeric field. */ /* This may be necessary if the data is stored in the opposite */ /* order of significance than the host platform. Both parameters */ /* should point to a four-byte data element. */ /* */ /* Parameters: */ /* in == (char *) pointer to the input value. */ /* out == (char *) pointer to the returned swapped value. */ /*****************************************************************************/ #ifdef PROTO void swap_four (char *in, char *out) #else void swap_four (in, out) char *in; char *out; #endif { out[0] = in[3]; out[1] = in[2]; out[2] = in[1]; out[3] = in[0]; return; } /*****************************************************************************/ /* swap_eight */ /* */ /* Purpose: */ /* This function performs a byte swap for an eight-byte numeric field. */ /* This may be necessary if the data is stored in the opposite */ /* order of significance than the host platform. Both parameters */ /* should point to an eight-byte data element. */ /* */ /* Parameters: */ /* in == (char *) pointer to the input value. */ /* out == (char *) pointer to the returned swapped value. */ /*****************************************************************************/ #ifdef PROTO void swap_eight (char *in, char *out) #else void swap_eight (in, out) char *in; char *out; #endif { out[0] = in[7]; out[1] = in[6]; out[2] = in[5]; out[3] = in[4]; out[4] = in[3]; out[5] = in[2]; out[6] = in[1]; out[7] = in[0]; return; } /****************************************************************************/ /* PARSE_DATA_DEF */ /* */ /* This function parses a table's data definition and creates a header */ /* in memory that is associated with the table. */ /* */ /* Parameters: */ /* table == (vpf_table_type *) vpf table structure. */ /* ddlen == (int32) length of the table's data definition. */ /* */ /* return value is the record length if all items are fixed length, or */ /* -1 if the record contains variable length items */ /****************************************************************************/ #ifdef PROTO int32 parse_data_def (vpf_table_type *table) #else int32 parse_data_def (table) vpf_table_type *table; #endif { register int32 n,i; int32 p, k; char *buf,*des,*nar,*vdt, *tdx, *doc, byte ; /*temporary storage */ char end_of_rec; int32 status; int32 ddlen; int32 reclen = 0; if (table->mode == Read) { ogdi_fread ((void*)&ddlen, sizeof(ddlen), 1, table->fp); /* Check the next byte to see if the byte order is specified */ ogdi_fread (&byte, 1, 1, table->fp); p = 0; table->byte_order = LEAST_SIGNIFICANT; /* default */ switch (toupper (byte)) { case 'L': p++; break; case 'M': table->byte_order = MOST_SIGNIFICANT; p++; break; } if (MACHINE_BYTE_ORDER != table->byte_order) { k = ddlen; swap_four ((char*)&k, (char*)&ddlen); } STORAGE_BYTE_ORDER = table->byte_order; if (ddlen < 0) { xvt_note ("parse_data_def: Bad VPF file."); return (0); } /* header without first 4 bytes */ table->ddlen = ddlen + sizeof (int32); buf = (char*)xvt_zmalloc ((size_t)ddlen + 3); if (buf == NULL) { xvt_note ("Parse_data_definition: malloc failed."); return (0); } buf[0] = byte; /* already have the first byte of the buffer */ Read_Vpf_Char(&buf[1],table->fp,ddlen-1) ; } else { table->ddlen = strlen (table->defstr); ddlen = table->ddlen; buf = (char*)xvt_zmalloc((size_t)ddlen + 3); if (buf == NULL) { xvt_note ("Parse_data_definition: Malloc failed."); return (0); } strncpy (buf, table->defstr, (size_t)ddlen); p = 0; table->byte_order = LEAST_SIGNIFICANT; /* default */ byte = buf[0]; switch (toupper(byte)) { case 'L': p++; break; case 'M': table->byte_order = MOST_SIGNIFICANT; p++; break; } STORAGE_BYTE_ORDER = table->byte_order; } buf[ddlen-1] = '\0'; /* mark end of string for reading functions */ if (buf[p] == ';') p++; /* buf[p] is semi-colon */ /* Get "description" field */ des = parse_get_string (&p, buf, (char)COMPONENT_SEPERATOR); strncpy (table->description, des, 80); if(des != (char *)NULL) { xvt_free (des); des = (char *)NULL; } /* Get "narrative" field */ nar = parse_get_string (&p, buf, (char)COMPONENT_SEPERATOR); strncpy (table->narrative ,nar, 12); if(nar != (char *)NULL) {xvt_free (nar);nar = (char *)NULL;} n = 0 ; /* get number of fields */ for (i=p; infields = n; table->header = (header_type)xvt_zmalloc ((size_t)(n + 1) * sizeof(header_cell)); if (table->header == NULL) { xvt_note ("Parse_data_definition: malloc failed."); return (0); } /* Loop the the number of fields in the record */ for (i=0; iheader[i].name = parse_get_string (&p, buf, FIELD_COUNT); if (i == 0) if ((strcmp (table->header[0].name, "ID") != 0) && (strcmp (table->header[0].name, "id") != 0)) { xvt_note ("parse_data_def: No 'ID' in header definition."); return (0); } /* Get the "type" field */ table->header[i].type = (parse_get_char (&p,buf)); table->header[i].type = (char)toupper (table->header[i].type); /* Get the "count" field */ table->header[i].count = parse_get_number(&p,buf,FIELD_SEPERATOR ); /* Check for variable length flag (-1) */ if (table->header[i].count == -1) reclen = -1; /* Now set null values and add up record length, if fixed length */ status = 0; switch (table->header[i].type) { case 'I': if (reclen >= 0) reclen += (sizeof (int32) * table->header[i].count); table->header[i].nullval.Int = (int32) NULLINT ; break; case 'S': if (reclen >= 0) reclen += (sizeof (short) * table->header[i].count); table->header[i].nullval.Short = NULLSHORT; break; case 'F': if (reclen >= 0) reclen += (sizeof (float) * table->header[i].count); table->header[i].nullval.Float = NULLFLOAT; break; case 'R': if (reclen >= 0) reclen += (sizeof (double) * table->header[i].count); table->header[i].nullval.Double = NULLDOUBLE; break; case 'L': case 'T': if (reclen >= 0) { /* if fixed length */ reclen += (sizeof (char) * table->header[i].count); table->header[i].nullval.Char = (char*)xvt_zmalloc ((size_t)table->header[i].count + 1); for (k=0; kheader[i].count; k++) table->header[i].nullval.Char[k] = NULLCHAR; table->header[i].nullval.Char[k] = '\0'; } else { /* variable length */ table->header[i].nullval.Char = (char*)xvt_zmalloc (VARIABLE_STRING_NULL_LENGTH + 1); for (k=0; kheader[i].nullval.Char[k] = NULLCHAR; table->header[i].nullval.Char[k] = '\0'; } break; case 'C': if (reclen >= 0) reclen += (sizeof (coordinate_type) * table->header[i].count); table->header[i].nullval.Other = '\0'; break; case 'Z': if (reclen >= 0) reclen += (sizeof (tri_coordinate_type)*table->header[i].count); table->header[i].nullval.Other = '\0'; break; case 'B': if (reclen >= 0) reclen += (sizeof(double_coordinate_type)*table->header[i].count); table->header[i].nullval.Other = '\0'; break; case 'Y': if (reclen >= 0) reclen += (sizeof(double_tri_coordinate_type) * table->header[i].count); table->header[i].nullval.Other = '\0'; break; case 'D': if (reclen >= 0) reclen += ((sizeof (date_type)-1) * table->header[i].count); strcpy (table->header[i].nullval.Date, NULLDATE); break; case 'K': reclen = -1; table->header[i].nullval.Other = '\0'; break; case 'X': /* do nothing */ table->header[i].nullval.Other = '\0'; break ; default: xvt_note ("parse_data_def: no such type %c", table->header[i].type ) ; /*DGM*/ status = 1; break; } /* switch type */ if (status) return (0); /* Get "keytype" field */ table->header[i].keytype = parse_get_char (&p, buf); /* Get "description" field */ des = parse_get_string (&p, buf, FIELD_SEPERATOR); strncpy (table->header[i].description, des, 80); if(des != (char *)NULL) {xvt_free(des);des = (char *)NULL;} /* Get "value description table" field */ vdt = parse_get_string (&p, buf, FIELD_SEPERATOR); strncpy (table->header[i].vdt, vdt, 12); if(vdt != (char *)NULL) {xvt_free (vdt);vdt = (char *)NULL;} /* Get "thematic index" field */ table->header[i].tdx = (char*)NULL; table->header[i].narrative = (char*)NULL; tdx = parse_get_string (&p, buf, FIELD_SEPERATOR); if (! strcmp (tdx, "")) { table->header[i].tdx = (char*)NULL; } else { if (strcmp (tdx,"-") != 0) { table->header[i].tdx = (char*)xvt_zmalloc (strlen (tdx)+ 1); strcpy (table->header[i].tdx, tdx); } else table->header[i].tdx = (char *)NULL; } if(tdx != (char *)NULL) {xvt_free(tdx);tdx = (char *)NULL;} /* Test for end of record */ if (buf[p] == ':') end_of_rec = TRUE; /* Retreive "doc" field if present */ if (!end_of_rec) { doc = parse_get_string (&p, buf, FIELD_SEPERATOR); if (! strcmp (doc, "")) { table->header[i].narrative = (char*)NULL; end_of_rec = TRUE; } else { if (strcmp (doc, "-") != 0) { table->header[i].narrative = (char*)xvt_zmalloc (strlen (doc) + 1); strcpy (table->header[i].narrative, doc); } else table->header[i].narrative = (char*)NULL; } if(doc != (char *)NULL) {xvt_free(doc);doc = (char *)NULL;} } else table->header[i].narrative = (char*)NULL; p += 1; /* Skip over the RECORD_SEPARATOR (:) */ } if(buf != (char *)NULL) {xvt_free(buf);buf = (char *)NULL;} return reclen; } /************************************************************************** * *N vpf_nullify_table * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Nullify the given VPF table structure. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels DOS Turbo C *E *************************************************************************/ #ifdef PROTO void vpf_nullify_table( vpf_table_type *table ) #else void vpf_nullify_table( table ) vpf_table_type *table ; #endif { if (!table) return; strcpy(table->name,""); table->path = NULL; table->nfields = 0; strcpy(table->description,""); strcpy(table->narrative,""); table->header = NULL; table->xfp = NULL; table->index = NULL; table->xstorage = 0; table->fp = NULL; table->nrows = 0; table->row = NULL; table->reclen = 0; table->ddlen = 0; table->defstr = NULL; table->storage = 0; table->mode = 0; table->byte_order = LEAST_SIGNIFICANT; table->status = CLOSED; return; } /****************************************************************************/ /* VPFOPENCHECK */ /* Purpose: */ /* */ /* Parameters: */ /* filename == (char *) full path name of the file to be opened. */ /* mode == (char *) mode of the file. */ /* diskname == (char *) descriptive name of the disk the file is */ /* on. */ /* return == (FILE *) file pointer newly associated with */ /* filename. */ /****************************************************************************/ #ifdef PROTO FILE *vpfopencheck (char *filename, char *mode) #else FILE *vpfopencheck(filename, mode) char *filename; char *mode; #endif { FILE *fp; int32 retry; size_t len; char *copy; len = strlen (filename); copy = (char*)xvt_zmalloc (sizeof(char)*(len+1)); strcpy(copy,filename); copy[len] = '.'; copy[len+1] = '\0'; fp = NULL; while (fp == NULL) { fp = muse_file_open(filename,mode); if ((fp == NULL) && ((fp = muse_file_open(copy,mode)) == NULL)) { retry = FALSE; if (!retry) break; } } if(copy != (char *)NULL) {xvt_free(copy);copy = (char *)NULL;} return (fp); } /****************************************************************************/ /* VPF_OPEN_TABLE */ /* */ /* Purpose: */ /* This function opens a vpf table and either loads it into RAM or sets */ /* up the structure to read off of disk. */ /* */ /* Parameters: */ /* tablename == (char *) file name of the table. As stated */ /* in the VPF standard, the table name */ /* must not end in 'x'. */ /* storage == (storage_type) table storage mode - */ /* MUST be ram, disk, or either. */ /* mode == (char *) file mode for opening the table - */ /* MUST be the same as fopen() mode in C. */ /* defstr == (char *) table definition string used for */ /* creating a writable table. */ /* If write mode this MUST be a valid */ /* VPF table definition string. */ /* vpf_open_table == (vpf_table_type) VPF table structure. */ /****************************************************************************/ #ifdef PROTO vpf_table_type vpf_open_table (char *tablename, storage_type storage, char *mode, char *defstr) #else vpf_table_type vpf_open_table (tablename, storage, mode, defstr) char *tablename; storage_type storage; char *mode; char *defstr; #endif { vpf_table_type table; char tablepath[255], *idxname,*ptr; int32 i, j, tablesize, idxsize, qty; uint32 ulval; char idxext,idxmaj; memset( &table, 0, sizeof(table) ); strcpy(tablepath,tablename); /* Parse out name and path */ j = -1; i=strlen(tablepath); while (i>0) { if (tablepath[i] == '\\' || tablepath[i] == '/' || tablepath[i] == ':' ) { j = i; break; } i--; } strncpy(table.name,&(tablepath[j+1]),12); table.path = (char*)xvt_zmalloc (strlen (tablepath) + 5); strcpy(table.path, tablepath); /* Establish a read or write table operation */ if (mode[0] == 'r') table.mode = Read; else table.mode = Write; table.fp = muse_file_open (tablepath, mode); table.storage = storage; if (table.fp == NULL) { xvt_note ("\nvpf_open_table: error opening <%s>\n",tablepath); /*DGM*/ if (table.path != (char*)NULL) { xvt_free (table.path); table.path = (char*)NULL; } return table; } /* If file is to be created, copy the def string ptr into header for now */ if (table.mode == Write) table.defstr = defstr; tablesize = muse_filelength (table.path); /* Populate table structure with correct data, either for read or write */ table.reclen = parse_data_def (&table); if (table.mode == Write) { /* write out header */ rewind (table.fp); Write_Vpf_Int (&table.ddlen, table.fp, 1); Write_Vpf_Char (table.defstr, table.fp, table.ddlen); if (table.defstr != (char*)NULL) { xvt_free (table.defstr); table.defstr = (char*)NULL; } table.defstr = (char*)NULL; table.nrows = 0; } if (table.reclen > 0) { /* Index file does not exist */ table.xstorage = COMPUTE; if (table.mode != Write) table.nrows = (tablesize - table.ddlen)/table.reclen; table.xfp = (FILE*)NULL; } else { qty = strlen(tablename); ptr = &(tablename[qty-3]); if (!strnicmp ("fcs", ptr, 3)) { idxext = 'z'; /* index for fcs is 'fcz' not 'fcx' */ idxmaj = 'Z'; } else { idxext = 'x'; idxmaj = 'X'; } /* Index file does exist */ idxname = (char*)xvt_zmalloc (sizeof (char) * (strlen (tablepath)+2)); strcpy(idxname,tablepath); /* Test for UNIX CD-ROM filename terminator "." */ if (idxname[strlen(tablepath)-1] == '.') idxname[strlen(tablepath)-2] = idxext; else idxname[strlen(tablepath)-1] = idxext; table.xfp = muse_file_open(idxname, mode); if (table.xfp == NULL) { /* Test for UNIX CD-ROM filename terminator "." */ if (idxname[strlen(tablepath)-1] == '.') idxname[strlen(tablepath)-2] = idxmaj; else idxname[strlen(tablepath)-1] = idxmaj; table.xfp = muse_file_open(idxname, mode); } /* The FCX CASE */ if (table.xfp == NULL && idxext == 'z') { idxext = 'x'; idxmaj = 'X'; /* Test for UNIX CD-ROM filename terminator "." */ if (idxname[strlen(tablepath)-1] == '.') idxname[strlen(tablepath)-2] = idxext; else idxname[strlen(tablepath)-1] = idxext; table.xfp = muse_file_open(idxname, mode); if (table.xfp == NULL) { /* Test for UNIX CD-ROM filename terminator "." */ if (idxname[strlen(tablepath)-1] == '.') idxname[strlen(tablepath)-2] = idxmaj; else idxname[strlen(tablepath)-1] = idxmaj; table.xfp = muse_file_open(idxname, mode); } } if (idxname != (char*)NULL) { xvt_free (idxname); idxname = (char*)NULL; } /* If mode is READ and no variable length index exists then */ if ((!table.xfp) && (table.mode == Read)) { /* build in-memory index by reading the whole table file */ int pos; table.nrows = 0; table.xstorage = RAM; table.index = NULL; pos = table.ddlen; fseek (table.fp, pos,SEEK_SET); /*fprintf(stderr, "%s\n", tablepath);*/ while(pos != tablesize) { int nextPos; free_row(read_next_row(table), table); table.nrows++; table.index = realloc(table.index, table.nrows * sizeof (index_cell)); nextPos = ftell(table.fp); table.index[table.nrows-1].pos = pos; table.index[table.nrows-1].length = nextPos - pos; /*fprintf(stderr, "%d : %d %d\n", table.nrows-1, pos,nextPos - pos);*/ pos = nextPos; } table.idx_handle = table.index; #if 0 /* something has gone wrong so free up memory and return NULL */ for (i=0; i 100 * 1024 * 1024 ) { xvt_note ("vpf_open_table: <%s> : table.nrows = %d\n",tablepath, table.nrows); fclose(table.xfp); table.nrows = 0; return table; } idxsize = table.nrows * sizeof (index_cell) + 10L; /* Load the index into RAM */ table.xstorage = RAM; #if 1 table.idx_handle = xvt_zmalloc (idxsize); table.index = table.idx_handle; #else table.idx_handle = galloc (idxsize); table.index = (index_type)glock (table.idx_handle) #endif for (i=0; i 0 */ if ((storage != disk) && ( table.mode == Read)) { fseek (table.fp, index_pos (1L, table),SEEK_SET); #if 1 table.row_handle = xvt_zmalloc ((table.nrows + 1) * sizeof (row_type)); table.row = table.row_handle; #else table.row_handle = galloc ((table.nrows + 1) * sizeof (row_type)); table.row = (ROW*)glock (table.row_handle); #endif for (i=0; i == (vpf_table_type) VPF table structure. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void vpf_close_table( vpf_table_type *table ) #else void vpf_close_table( table ) vpf_table_type *table; #endif { register int32 i; if (!table) return; if (table->status != OPENED) return; /* If the table is writable, write out the final record count */ if (table->mode == Write && table->xfp) { rewind (table->xfp); Write_Vpf_Int ( &table->nrows, table->xfp, 1 ) ; Write_Vpf_Int ( &table->ddlen, table->xfp, 1 ) ; } for (i=0; infields; i++) { if (table->header[i].name != (char*)NULL) { xvt_free (table->header[i].name); table->header[i].name = (char*)NULL; } /* free up null text string */ if (table->header[i].type == 'T' || table->header[i].type == 'L') if (table->header[i].nullval.Char != (char *)NULL) { xvt_free (table->header[i].nullval.Char); table->header[i].nullval.Char = (char*)NULL; } /* free up index file string */ if (table->header[i].tdx != (char*)NULL) { xvt_free (table->header[i].tdx); table->header[i].tdx = (char*)NULL; } /* free up narrative table string */ if (table->header[i].narrative != (char*)NULL) { xvt_free (table->header[i].narrative); table->header[i].narrative = (char*)NULL; } } if (table->header != (header_type)NULL) { xvt_free ((char*)table->header); table->header = (header_type)NULL; } switch (table->storage) { case RAM: for (i=0; inrows; i++) free_row (table->row[i], *table); if (table->row != (ROW*)NULL) { // gunlock (table->row_handle); gfree (table->row_handle); table->row = (ROW*)NULL; } break; case DISK: if( table->fp != NULL ) fclose (table->fp); break; default: xvt_note ("%s%s: unknown storage flag: %d\n",table->path,table->name, table->storage); break; } switch (table->xstorage) { case RAM: if (table->index != (index_type)NULL) { // gunlock (table->idx_handle); gfree (table->idx_handle); table->index = (index_type)NULL; } break; case DISK: fclose (table->xfp); break; case COMPUTE: break; default: xvt_note ("%s%s: unknown index storage flag: %d\n", table->path,table->name,table->storage); break; } table->nfields = 0; if(table->path != (char *)NULL) {xvt_free(table->path);table->path = (char *)NULL;} table->status = CLOSED; } /************************************************************************* * *N is_vpf_table * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines if the file at the specified location * is a valid VPF table. It returns TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * fname == (char *) file system path. * return == (int32) TRUE (1) if the file is a VPF table; * FALSE (0) if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 is_vpf_table( char *fname ) #else int32 is_vpf_table( fname ) char *fname; #endif { FILE *fp; int32 n, ok; fp = muse_file_open( fname, "rb" ); if (!fp) { return FALSE; } Read_Vpf_Int ( &n, fp, 1 ) ; fseek( fp, n-1, SEEK_CUR ); if (fgetc(fp) == ';') ok = TRUE; else ok = FALSE; fclose(fp); return ok; } /************************************************************************* * *N is_vpf_null_float * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether a floating point number is the * same as the VPF representation of the floating point NULL value. * It returns TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * num == (float) number to evaluate. * return == (int32) TRUE (1) if the number is VPF NULL; * FALSE (0) if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 is_vpf_null_float( float num ) #else int32 is_vpf_null_float( num ) float num; #endif { float nan; nan = (float)float_quiet_nan(0); if (memcmp(&nan,&num,sizeof(float))==0) return 1; return 0; } /************************************************************************* * *N is_vpf_null_double * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function determines whether a double precision floating point * number is the same as the VPF representation of the double * precision floating point NULL value. It returns TRUE or FALSE. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * num == (double) number to evaluate. * return == (int32) TRUE (1) if the number is VPF NULL; * FALSE (0) if not. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels April 1991 DOS Turbo C *E *************************************************************************/ #ifdef PROTO int32 is_vpf_null_double( double num ) #else int32 is_vpf_null_double( num ) double num; #endif { double nan; nan = (double)quiet_nan(0); if (memcmp(&nan,&num,sizeof(double))==0) return 1; return 0; } /**************************************************************************/ /* FORMAT_DATE */ /**************************************************************************/ #if XVT_CC_PROTO void format_date (date_type date, char *fmtdate) #else void format_date (date, fmtdate) date_type date; char *fmtdate; #endif { char year[8], month[8], day[8], hour[8], mn[8], sec[8]; date[20]='\0'; strncpy (year, date, 4); year[4]='\0'; strncpy (month, &date[4], 2); month[2]='\0'; strncpy (day, &date[6], 2); day[2]='\0'; strncpy (hour, &date[8], 2); hour[2]='\0'; strncpy (mn, &date[10], 2); mn[2]='\0'; strncpy (sec, &date[12], 2); sec[2]='\0'; sprintf (fmtdate,"%s/%s/%s %s:%s:%s", month, day, year, hour, mn, sec); } ogdi-ogdi_4_1_0/vpflib/vpftable.h000066400000000000000000000220201345660466700170550ustar00rootroot00000000000000 /* VPFTABLE.H */ #ifndef _VPF_TABLE_H_ #define _VPF_TABLE_H_ #include #include #include #ifdef _MSC #define MAXLONG LONG_MAX #endif #ifdef _UNIX #define MAXLONG LONG_MAX #endif #ifndef _MACHINE_H_ #include "machine.h" #endif #ifndef _VPF_IO_ #include "vpfio.h" #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define VPF_DIR_SEPARATOR '\\' /* This should be the ISO definition of date */ typedef char date_type[21] ; /* Include null end of string */ /* NULL value type */ typedef union { char *Char; short int Short; int32 Int; float Float; double Double; date_type Date; char Other; } null_field; /* The basic information carried for each field in the table */ typedef struct { char *name; /* Name of the field */ char *tdx; /* Thematic index file name */ char *narrative; /* Name of a narrative table describing the field*/ int32 count; /* Number of items in this column (-1 =>variable)*/ char description[81]; /* Field description */ char keytype; /* Type of key - (P)rimary, (F)oreign, (N)onkey */ char vdt[13]; /* Value description table name */ char type; /* Data type - T,I,F,K,D */ null_field nullval ; /* This is used for the converter */ } header_cell, *header_type; typedef enum { ram, disk, either, compute } storage_type; #define RAM 0 #define DISK 1 #define EITHER 2 #define COMPUTE 3 typedef enum { Read, Write } file_mode ; #define CLOSED 0 #define OPENED 1 /* Each column in a table row has a count and a pointer to the data */ /* and a null value default */ typedef struct { int32 count; void *ptr; } column_type; /* A table row is an array of columns */ typedef column_type *row_type; typedef column_type /*huge*/ *ROW; /* Index for variable width tables. */ /* One index cell for each row in the table. */ typedef struct { uint32 pos; uint32 length; } index_cell; typedef index_cell /*huge*/ *index_type; /* VPF table structure: */ typedef struct { char *path; /* Directory path to the table */ int32 nfields; /* Number of fields */ int32 nrows; /* Number of rows in the table */ int32 reclen; /* Table record length (-1 => variable */ int32 ddlen; /* Data definition string length */ FILE *fp; /* Table file pointer */ FILE *xfp; /* Index file pointer */ index_type index; /* Index structure */ GHANDLE idx_handle; /* Huge data handle for index structure */ storage_type storage; /* Flag indicating table storage method */ storage_type xstorage; /* Flag indicating where index stored */ header_type header; /* Table header structure */ ROW *row; /* Array of table rows */ GHANDLE row_handle; /* Huge data handle for row structure */ file_mode mode; /* Table is either reading or writing */ char *defstr ; /* rdf, definition string */ char name[13]; /* Name of the VPF table */ char description[81]; /* Table description */ char narrative[13]; /* Table narrative file name */ unsigned char status; /* VPF table status - OPENED or CLOSED */ unsigned char byte_order; /* Byte order of the table's data */ } vpf_table_type; typedef struct { float x,y; } coordinate_type; typedef struct { double x,y; } double_coordinate_type; typedef struct { float x,y,z; } tri_coordinate_type; typedef struct { double x,y, z; } double_tri_coordinate_type; /* VPF id triplet field union structure. Only one of the elements actually stores the data correctly at any one time. */ typedef union { unsigned char f1; unsigned short f2; uint32 f3; } key_field; /* id triplet internal storage type */ typedef struct { unsigned char type; int32 id, tile, exid; } id_triplet_type; /* These macros help determine the type in the key datatype */ #define TYPE0(cell) ((cell>>6)&(3)) #define TYPE1(cell) ((cell>>4)&(3)) #define TYPE2(cell) ((cell>>2)&(3)) #define TYPE3(cell) ((cell)&(3)) /* These macros set the value in the key datatype */ #define SETTYPE0(cell,value) cell = (((cell)&(~(3<<6)))|(((3)&(value))<<6)) #define SETTYPE1(cell,value) cell = (((cell)&(~(3<<4)))|(((3)&(value))<<4)) #define SETTYPE2(cell,value) cell = (((cell)&(~(3<<2)))|(((3)&(value))<<2)) #define SETTYPE3(cell,value) cell = (((cell)&(~(3)))|(((3)&(value)))) /* This macro helps to write out a key */ #define ASSIGN_KEY (tYPE,kEY,loc,val) { \ if (val < 1) { \ tYPE(kEY.type,0); \ } else if (val < (1<<8)) { \ tYPE(kEY.type,1); \ kEY.loc = val ; \ } else if ( val < (1<<16)) { \ tYPE(kEY.type,2); \ kEY.loc = val; \ } else { \ tYPE(kEY.type,3); \ kEY.loc = val; }} /* define NULL values */ #define VARIABLE_STRING_NULL_LENGTH 10 #define NULLCHAR ' ' #define NULLTEXT " " #define NULLSHORT -MAXSHORT #define NULLINT -MAXLONG #define NULLDATE " " #define NULLFLOAT ((float) float_quiet_nan (0)) #define NULLDOUBLE ((double) quiet_nan (0)) /* Functions: */ #ifdef PROTO double quiet_nan (int32 unused); double float_quiet_nan (int32 unused); void vpf_nullify_table (vpf_table_type *table); vpf_table_type vpf_open_table (char *tablename, storage_type storage, char *mode, char *defstr); void vpf_close_table (vpf_table_type *table); char *read_text_defstr (FILE *infile, FILE *outerr); int32 index_length (int32 row_number, vpf_table_type table); int32 index_pos (int32 row_number, vpf_table_type table); id_triplet_type read_key (vpf_table_type table); int32 row_offset (int32 field, row_type row, vpf_table_type table); row_type read_next_row (vpf_table_type table); row_type rowcpy (row_type origrow, vpf_table_type table); row_type read_row (int32 row_number, vpf_table_type table); void free_row (row_type row, vpf_table_type table); row_type get_row (int32 row_number, vpf_table_type table); int32 table_pos (char *field_name, vpf_table_type table); void *get_table_element (int32 field_number, row_type row, vpf_table_type table, void *value, int32 *count); void *named_table_element (char *field_name, int32 row_number, vpf_table_type table, void *value, int32 *count); void *table_element (int32 field_number, int32 row_number, vpf_table_type table, void *value, int32 *count); int32 is_vpf_table (char *fname); int32 is_vpf_null_float (float num); int32 is_vpf_null_double (double num); char *parse_get_string (int32*, char*, char); FILE *vpfopencheck (char *filename, char *mode); int32 parse_data_def (vpf_table_type *table); /* Write functions */ int32 write_key( id_triplet_type key, FILE *fp ); int32 write_next_row( row_type row, vpf_table_type *table ); int32 write_row( int32 rownum, row_type row, vpf_table_type *table ); row_type create_row( vpf_table_type table ); void nullify_table_element( int32 field, row_type row, vpf_table_type table ); int32 put_table_element( int32 field, row_type row, vpf_table_type table, void *value, int32 count ); void swap_two ( char *in, char *out ); void swap_four ( char *in, char *out ); void swap_eight ( char *in, char *out ); void format_date (date_type date, char *fmtdate); #else double quiet_nan (); float float_quiet_nan (); void vpf_nullify_table (); vpf_table_type vpf_open_table (); void vpf_close_table (); char *read_text_defstr (); int32 index_length (); int32 index_pos (); id_triplet_type read_key (); int32 row_offset (); row_type read_next_row (); row_type rowcpy (); row_type read_row (); void free_row (); row_type get_row (); int32 table_pos (); void *get_table_element (); void *named_table_element (); void *table_element (); int32 is_vpf_table (); int32 is_vpf_null_float (); int32 is_vpf_null_double (); int32 parse_data_def (); /* Write functions */ int32 write_key (); int32 write_next_row (); int32 write_row (); row_type create_row (); void nullify_table_element (); int32 put_table_element (); void swap_two (); void swap_four (); void swap_eight (); void format_date (); #endif /* If PROTO */ #ifdef MAIN FILE * errorfp = stderr; #else extern FILE * errorfp; #endif #ifndef max #define max(a,b) ((a > b) ? a : b) #endif #ifndef min #define min(a,b) ((a < b) ? a : b) #endif #endif /* #ifndef _VPF_TABLE_H_ */ ogdi-ogdi_4_1_0/vpflib/vpftidx.c000066400000000000000000002160711345660466700167440ustar00rootroot00000000000000 /************************************************************************* * * Environmental Systems Research Institute (ESRI) Applications Programming * *N Module VPFTIDX * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * *P * Purpose: Subroutines to create and read both the thematic index * or a gazeteer index on a VPF table column. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn September/October 1991 * Barry Michaels January 1992 A few adjustments for DOS. * Added sets to create function to * take advantage of SET's disk- * swapping ability when low on memory. * Dec 1992 Added sorted directory per RFC#67 * to VPF. Fixed text, added dates, * rearranged create to use a scratch * file instead of sets. *E * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions: *F * * set_type read_thematic_index ( char *tablename, * char *value ) ; * * ThematicIndex open_thematic_index ( char *tablename ); * * set_type search_thematic_index ( ThematicIndex *themindex, * char *value ) ; * * void close_thematic_index ( ThematicIndex *themindex ); * * set_type read_gazetteer_index (char * vpfname, char * query_str ) ; * * set_type search_gazetteer_index (ThematicIndex *idx, * char * query_str ) ; * * int32 read_gazetteer_index_directory ( * ThematicIndexDirectory ** gid, * ThematicIndexHeader * gi, * FILE * idx_fp); * * int32 write_thematic_index_header ( ThematicIndexHeader h , * FILE *fp ) ; * * int32 read_thematic_index_header ( ThematicIndexHeader *h , * FILE *fp ) ; * * int32 write_thematic_index_directory ( * ThematicIndexHeader h , * ThematicIndexDirectory *d, * int32 size, * FILE *fp ) ; * * int32 write_gazetteer_index_directory ( * ThematicIndexHeader h , * ThematicIndexDirectory *d, * int32 size, * FILE *fp ) ; * * int32 create_thematic_index ( char indextype, * char *tablename, * char *idxname , * char *columnname, * char *idx_set ); * * int32 create_gazetteer_index (char *tablename, * char *idx_fname , * char *columnname, * char *idx_set); * *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * * Portability: *O * This module should be ANSI C compatible. Created on UNIX first *E *************************************************************************/ #ifndef INCL_XVTH #include #endif #if 0 #include #include #include #include #include #endif #ifndef __VPF_H__ #include "vpf.h" #endif #ifndef _MACHINE_ #include "machine.h" #endif #ifndef H_MUSEDIR #include "musedir.h" #endif #ifndef __STRFUNC_H__ #include "strfunc.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __VPFTIDX_H__ #include "vpftidx.h" #endif #ifndef __USE_BSD #define bcopy(src,dest,size) memcpy(dest,src,size) #endif #ifdef PROTO int32 read_gazetteer_index_directory( ThematicIndexDirectory **gid, ThematicIndexHeader *gi, FILE *idx_fp); int32 read_thematic_index_header ( ThematicIndexHeader *h, FILE *ifp ); int32 write_thematic_index_header ( ThematicIndexHeader h, FILE *ifp ); int32 write_thematic_index_directory ( ThematicIndexHeader h, ThematicIndexDirectory *d, int32 idsize, /* size of data */ FILE *ifp ); int32 write_gazetteer_index_directory ( ThematicIndexHeader h, ThematicIndexDirectory *d, int32 idsize, /* size of data */ FILE *ifp ); #else int32 read_gazetteer_index_directory(); int32 read_thematic_index_header ( ); int32 write_thematic_index_header ( ); int32 write_thematic_index_directory ( ); int32 write_gazetteer_index_directory ( ); #endif #define Whimper(str) { \ xvt_note ("\nvpftidx: < %s >\n", str );} #define SWhimper(str) { \ set_type err; err = set_init (1) ;\ xvt_note ("\nvpftidx: < %s >\n", str ) ;\ return err ; } #define OWhimper(str) { \ xvt_note ("\nvpftidx: < %s >\n", str ) ;\ return idx ; } /* * an index file directory entry takes up a different amount * of space in memory than it does on disk; the following constant * should be used to calculate the starting offset for * index data * * example: if the number of items to be indexed is t, and each item is * s bytes long, then use * * sizeof(ThematicIndexHeader) + t * (s + DIR_ON_DISK_INCR) * * to find out where the first byte of indexing data will be placed. * * That first byte is what must be stored as the value of Header.nbytes */ #define DIR_ON_DISK_INCR (2 * sizeof(int32)) #ifdef PROTO int Icmpval (const void *elem1, const void *elem2 ) #else int Icmpval (elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.value.ival < d2.value.ival) return -1; if (d1.value.ival > d2.value.ival) return 1; return 0; } #ifdef PROTO int Scmpval( const void *elem1, const void *elem2 ) #else int Scmpval( elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.value.sval < d2.value.sval) return -1; if (d1.value.sval > d2.value.sval) return 1; return 0; } #ifdef PROTO int Fcmpval( const void *elem1, const void *elem2 ) #else int Fcmpval( elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.value.fval < d2.value.fval) return -1; if (d1.value.fval > d2.value.fval) return 1; return 0; } #ifdef PROTO int Dcmpval( const void *elem1, const void *elem2 ) #else int Dcmpval( elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.value.dval < d2.value.dval) return -1; if (d1.value.dval > d2.value.dval) return 1; return 0; } #ifdef PROTO int Ccmpval( const void *elem1, const void *elem2 ) #else int Ccmpval( elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.value.cval < d2.value.cval) return -1; if (d1.value.cval > d2.value.cval) return 1; return 0; } #ifdef PROTO int STRcmpval( const void *elem1, const void *elem2 ) #else int STRcmpval( elem1, elem2 ) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); return (strcmp(d1.value.strval,d2.value.strval)); } #ifdef PROTO int bincmp (const void *elem1, const void *elem2) #else int bincmp (elem1, elem2) const void *elem1; const void *elem2; #endif { ThematicIndexDirectory d1,d2; memcpy(&d1,elem1,sizeof(ThematicIndexDirectory)); memcpy(&d2,elem2,sizeof(ThematicIndexDirectory)); if (d1.binid < d2.binid) return -1; if (d1.binid > d2.binid) return 1; return 0; } #define KEY_ID 1 #define KEY_TILE 2 #define KEY_EXT 3 /************************************************************************* * *N create_thematic_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: * * Create a thematic index file on a given vpf table. *P * *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * indextype == (char) either 'T' for thematic index or * 'G' for gazetteer. * tablename == (char *) path name of the vpf table. * idxname == (char *) name of the index file to be created. * columnname == (char *) name of column to create index on * if the column is a triplet id, the columnname * should be as such: EDG_ID\ID * EDG_ID\TILE_ID * EDG_ID\EXT_ID * idxset == (char *) array of character values to index on * if the index type is gazetteer. Not used for * index type = 'T'. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * void *vpfmalloc VPFMISC.C * vpf_open_table VPFTABLE.C * table_pos * table_element * vpf_close_table * write_thematic_index_header see below * write_thematic_index_directory see below * Vpf_Write_* macros * set_init SET.C * set_insert *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. developed on UNIX *E *************************************************************************/ #ifdef PROTO int32 create_thematic_index ( char indextype, char *tablename, char *idxname , char *columnname, char *idx_set ) #else int32 create_thematic_index ( indextype, tablename, idxname , columnname, idx_set ) char indextype; char *tablename; char *idxname; char *columnname; char *idx_set; #endif { FILE *ifp, *tmpfp ; int32 i, j, tablepos, k, keycolumn = 0 , /* 1 if key column */ itemp , n, idsize , /* either 2 or 4 bytes */ totalids = 0, bin, binoff, datasize = 0; /* Directory value data size */ char *buf , ch , hack[255] ; vpf_table_type table ; ThematicIndexHeader h ; ThematicIndexDirectory *d; short int stemp ; float ftemp ; double dtemp ; date_type datetemp ; id_triplet_type key ; if (!tablename) Whimper("Unspecified table name"); if (!idxname) Whimper("Unspecified index name"); if (!columnname) Whimper("Unspecified column name"); if ( indextype == 'G' ) { if (!idx_set) Whimper("Unspecified index set"); return ( create_gazetteer_index ( tablename, idxname,columnname,idx_set)) ; } /* convert columnname to uppercase and check for id triplet */ for ( i=0 ; i < (int32)strlen(columnname); i++ ) /* copy into header structure */ h.vpf_column_name[i] = (char)toupper ( columnname[i] ) ; h.vpf_column_name[i] = '\0'; h.index_type = 'T' ; /* default */ h.type_count = 1 ; for ( i=0 ; i < (int32)strlen(columnname); i++ ) { columnname[i] = (char)toupper ( columnname[i] ) ; /* check if request is on a triplet id field */ if ( columnname[i] == '\\' ) { columnname[i+1] = (char)toupper ( columnname[i+1] ) ; switch ( columnname[i+1] ) { /* locate sub-column key */ case 'I': /* ID of triplet id */ keycolumn = KEY_ID ; break ; case 'T': /* TILE_ID of triplet id */ keycolumn = KEY_TILE ; break ; case 'E': /* EXT_ID of triplet id */ keycolumn = KEY_EXT ; break ; default: Whimper ("error in key column request") ; /* break ; Whimper contains a return */ } /* end of switch */ strcpy( h.vpf_column_name, strupr ( columnname )) ; columnname[i] = '\0' ; } /* end of if columnname == \ */ } /* end of for loop */ table = vpf_open_table ( tablename, disk, "rb", '\0') ; if (!table.fp) { sprintf(hack,"Error opening %s\n",tablename); Whimper(hack); } /* Determine the id_data_size. This will save 50% of file size */ if ( table.nrows > MAX_ID ) { h.id_data_type = 'I' ; /* int32s */ idsize = sizeof ( int32 ) ; } else { h.id_data_type = 'S' ; /* short ints */ idsize = sizeof ( short int ) ; } /* Find position of column in input table */ tablepos = table_pos ( columnname, table ) ; if (tablepos < 0) { vpf_close_table(&table); sprintf(hack,"Invalid column name (%s) for %s",columnname,tablename); Whimper(hack); } /* Now check data type */ switch (table.header[tablepos].type) { case 'X': vpf_close_table(&table); Whimper ("Cannot make index on Null Column") ; /* A return is in Whimper - break statement cannot be reached */ case 'T': if ( table.header[tablepos].count <= 0 ) { vpf_close_table(&table); Whimper ("Cannot make bin index on variable length text column") ; } datasize = table.header[tablepos].count ; h.type_count = datasize ; /* the special case */ break; case 'D': datasize = sizeof ( date_type ) ; break; case 'I': case 'K': /* treat keys like integers */ datasize = sizeof ( int32 ) ; break ; case 'S': datasize = sizeof ( short int ) ; break ; case 'F': datasize = sizeof ( float ) ; break ; case 'R': datasize = sizeof ( double ) ; break ; case 'C': case 'Z': case 'B': case 'Y': vpf_close_table(&table); Whimper ("Cannot make index on Coordinate Column") ; default: vpf_close_table(&table); sprintf (hack,"No such type < %c >", table.header[tablepos].type ) ; Whimper ( hack ) ; } /* end of switch */ /* open output index file */ if (( ifp = muse_file_open ( idxname, "w+b" )) == NULL ) { vpf_close_table(&table); Whimper ( idxname ) ; } /* open scratch file of (bin,binpos) for each table id */ if (( tmpfp = tmpfile() ) == NULL ) { vpf_close_table(&table); fclose(ifp); Whimper ( "Error creating scratch file" ) ; } /* Create directory size as big as table, for worst case */ d = (ThematicIndexDirectory *) xvt_malloc (sizeof (ThematicIndexDirectory)); h.nbins = 0 ; /* initialize the directory counter */ #define REALLOC_DIRECTORY(loc) { \ if ((d = (ThematicIndexDirectory *) \ realloc(d,sizeof(ThematicIndexDirectory) * (loc+1))) == NULL ) {\ vpf_close_table(&table); \ fclose(ifp); \ fclose(tmpfp); \ Whimper ("error in reallocing directory") ; \ } \ d[loc].binid = loc; \ d[loc].num_items = 0 ; } #define INCR_ID(loc,id) { \ UNUSED_RET(fwrite(&loc,sizeof(int32),1,tmpfp)); \ j = d[loc].num_items; \ UNUSED_RET(fwrite(&j,sizeof(int32),1,tmpfp)); \ d[loc].num_items++ ; \ if (d[loc].num_items == 1) \ d[loc].start_offset = id; \ else if (d[loc].num_items == 2) \ totalids += 2; \ else \ totalids++; } /* Count up bins */ switch ( table.header[tablepos].type ) { case 'I': for ( i=1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element ( tablepos,i,table,&itemp,&n); for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.ival == itemp ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.ival = itemp ; h.nbins++ ; } INCR_ID(k,i) ; } /* end of for i loop */ break ; case 'T': for ( i = 1; i <= table.nrows; i++ ) { if (h.type_count > 1) { /* read in record from disk */ buf = (char *) table_element (tablepos,i,table,NULL,&n); /* strlen ( buf ) should equal datasize */ for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( ! strcmp ( d[k].value.strval, buf ) ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.strval = (char*)xvt_malloc (strlen (buf)); (void) bcopy ( buf, d[k].value.strval, strlen(buf) ) ; d[k].value.strval[n] = '\0'; h.nbins++ ; } INCR_ID(k,i) ; xvt_free(buf); } else { /* read in record from disk */ table_element (tablepos,i,table,&ch,&n); for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.cval == ch ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.cval = ch; h.nbins++ ; } INCR_ID(k,i) ; } } /* end of for i loop */ break ; case 'S': for ( i=1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element ( tablepos,i,table,&stemp,&n); for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.sval == stemp ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.sval = stemp ; h.nbins++ ; } INCR_ID (k,i) ; } /* end of for i loop */ break ; case 'F': for ( i=1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element ( tablepos,i,table,&ftemp,&n); for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.fval == ftemp ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.fval = ftemp ; h.nbins++ ; } INCR_ID (k,i) ; } /* end of for i loop */ break ; case 'R': for ( i=1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element ( tablepos,i,table,&dtemp,&n); for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.dval == dtemp ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.dval = dtemp ; h.nbins++ ; } INCR_ID (k,i) ; } /* end of for i loop */ break ; case 'K': for ( i=1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element ( tablepos,i,table,&key,&n); if ( keycolumn == KEY_ID ) itemp = key.id ; else if ( keycolumn == KEY_TILE ) itemp = key.tile ; else itemp = key.exid ; for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( d[k].value.ival == itemp ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.ival = itemp ; h.nbins++ ; } INCR_ID (k,i) ; } /* end of for i loop */ break ; case 'D': for ( i = 1; i <= table.nrows; i++ ) { /* read in record from disk */ table_element (tablepos,i,table,datetemp,&n); datetemp[sizeof(date_type)-1]='\0'; /* strlen ( datetemp ) should equal datasize */ for ( k=0; k < h.nbins; k++ ) /* Search directory for value*/ if ( ! strcmp ( d[k].value.strval, datetemp ) ) break ;/* Found a match */ if ( k == h.nbins ) { /* New value in column */ REALLOC_DIRECTORY ((size_t)k); d[k].value.strval = (char*)xvt_malloc ( sizeof (date_type) + 1); (void) bcopy ( datetemp, d[k].value.strval, sizeof(date_type) ) ; d[k].value.strval[sizeof(date_type)-1] = '\0'; h.nbins++ ; } INCR_ID(k,i) ; } /* end of for i loop */ break ; default: vpf_close_table(&table); fclose(ifp); fclose(tmpfp); if (h.column_type == 'T' && h.type_count > 1) { for ( i=0; i < h.nbins; i++ ) xvt_free(d[i].value.strval); } xvt_free ((char*)d); Whimper ("error in table reading switch, no such type") ; } /* end of switch */ /* set up header and write it out */ /* h.id_data_size and columnname set up above */ /* h.type_count set above */ h.nbytes = THEMATIC_INDEX_HEADER_SIZE + h.nbins * ( datasize + DIRECTORY_SIZE ) ; h.column_type = table.header[tablepos].type ; if ( h.column_type == 'K' ) /* It's really an I */ h.column_type = 'I' ; h.sort = 'S'; for ( i=0; i < 3; i++ ) h.padding[i] = '\0'; /* only write the table name, no pathname */ for ( i = strlen ( tablename ); i > 0; i-- ) if ( tablename[i] == DIR_SEPARATOR ) break ; if ( tablename[i] == DIR_SEPARATOR ) #ifdef _MSDOS strncpy ( h.vpf_table_name, strupr ( &tablename[i+1] ), 13 ) ; #else strncpy ( h.vpf_table_name, &tablename[i+1], 13 ) ; #endif else #ifdef _MSDOS strncpy( h.vpf_table_name, strupr ( tablename), 13 ); #else strncpy( h.vpf_table_name, tablename, 13 ); #endif for ( i=strlen(h.vpf_table_name); i < 12 ; i++ ) h.vpf_table_name[i] = ' ' ; h.vpf_table_name[12] = '\0'; /* columnname setup above */ h.table_nrows = table.nrows ; if (write_thematic_index_header (h, ifp) == 0L) { vpf_close_table(&table); fclose(ifp); fclose(tmpfp); if (h.column_type == 'T' && h.type_count > 1) { for ( i=0; i < h.nbins; i++ ) xvt_free(d[i].value.strval); } xvt_free ((char*)d); Whimper ( "error writing index header" ) ; } /* Now write out the rest of the header directory */ /* ... First, sort the directory ... */ switch (h.column_type) { case 'I': qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Icmpval); break; case 'S': qsort((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Scmpval); break; case 'F': qsort((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Fcmpval); break; case 'R': qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Dcmpval); break; case 'T': if (h.type_count == 1) qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Ccmpval); else qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), STRcmpval); break; case 'D': qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), STRcmpval); break; case 'K': qsort ((void*)d, (size_t)h.nbins, sizeof(ThematicIndexDirectory), Icmpval); break; } if (write_thematic_index_directory (h, d, idsize, ifp) == 0L) { vpf_close_table(&table); fclose(ifp); fclose(tmpfp); if (h.column_type == 'T' && h.type_count > 1) { for ( i=0; i < h.nbins; i++ ) xvt_free(d[i].value.strval); } xvt_free ((char*)d); Whimper ( "error writing index directory" ) ; } /* now write the data */ /* First, fill up all id slots with 0 placeholders */ itemp = 0; stemp = 0; if ( h.id_data_type == 'I' ) for (i=0;i 1) { for ( i=0; i < h.nbins; i++ ) xvt_free(d[i].value.strval); } xvt_free ((char*)d); return ( h.nbins ) ; } #ifdef PROTO ThematicIndexDirectory tidx_linear_search( char *value, ThematicIndexHeader h, FILE *ifp ) #else ThematicIndexDirectory tidx_linear_search( value, h, ifp ) char *value; ThematicIndexHeader h; FILE *ifp; #endif { int32 i , ival = 0; short sval = 0 , Match = (-1) ; float fval = (float)0.0; double dval = 0.0 , atof () ; date_type dateval; char *buf = (char *) NULL, bufalloc=0 ; ThematicIndexDirectory d; d.value.ival = 0; d.start_offset = 0; d.num_items = 0; if ( value ) /* search for pattern */ switch ( h.column_type ) { /* using address */ case 'I': memcpy ( &ival, value, sizeof (int32)) ; break ; case 'S': memcpy ( &sval, value, sizeof (short int)) ; break ; case 'F': memcpy ( &fval, value, sizeof (float)) ; break ; case 'R': memcpy ( &dval, value, sizeof (double)) ; break ; case 'T': buf = (char*)xvt_malloc ((size_t)h.type_count); /* leave value as is */ bufalloc = 1; break ; case 'D': /* leave value as is */ break; } else return d; for ( i=0; i < h.nbins; i++ ) { switch ( h.column_type ) { case 'I': Read_Vpf_Int ( &d.value.ival, ifp, 1) ; if ( ival == d.value.ival ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; case 'S': Read_Vpf_Short ( &d.value.sval, ifp, 1) ; if ( sval == d.value.sval ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; case 'F': Read_Vpf_Float ( &d.value.fval, ifp, 1) ; if ( fval == d.value.fval ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; case 'R': Read_Vpf_Float ( &d.value.dval, ifp, 1) ; if ( dval == d.value.dval ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; case 'T': Read_Vpf_Char ( buf, ifp, h.type_count ) ; bufalloc = 1; if ( ! strcmp ( value, buf ) ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; case 'D': Read_Vpf_Char ( dateval, ifp, sizeof(date_type) ) ; dateval[sizeof(date_type)-1] = '\0'; if ( ! strncmp ( value, dateval, sizeof(date_type) ) ) { /* found the match */ Match = (short)i; i = h.nbins ; /* exit */ } break ; } /* end of switch */ Read_Vpf_Int ( &d.start_offset, ifp, 1) ; Read_Vpf_Int ( &d.num_items, ifp, 1) ; } /* end of i loop */ if ( bufalloc ) xvt_free ( buf ) ; if (Match < 0) { d.value.ival = 0; d.start_offset = 0; d.num_items = 0; } return d; } #ifdef PROTO ThematicIndexDirectory tidx_binary_search( char *value, ThematicIndexHeader h, FILE *ifp ) #else ThematicIndexDirectory tidx_binary_search( value, h, ifp ) char *value; ThematicIndexHeader h; FILE *ifp; #endif { int32 i , ival = 0, left, right; short int sval = 0 , found = 0 , recsize = 0; float fval = (float)0.0 ; double dval = 0.0 , atof () ; date_type dateval; char *buf = (char *) NULL, bufalloc=0 ; ThematicIndexDirectory d ; d.value.ival = 0; d.start_offset = 0; d.num_items = 0; if ( value ) /* search for pattern */ switch ( h.column_type ) { /* using address */ case 'I': memcpy ( &ival, value, sizeof (int32)) ; recsize = sizeof(int32) + 8; break ; case 'S': memcpy ( &sval, value, sizeof (short int)) ; recsize = sizeof(short int) + 8; break ; case 'F': memcpy ( &fval, value, sizeof (float)) ; recsize = sizeof(float) + 8; break ; case 'R': memcpy ( &dval, value, sizeof (double)) ; recsize = sizeof(double) + 8; break ; case 'T': buf = (char*)xvt_malloc ((size_t)h.type_count); /* leave value as is */ bufalloc = 1; recsize = (short)(h.type_count * sizeof(char) + 8); break ; case 'D': recsize = sizeof(date_type) + 8; break; } else return d; left = 0; right = h.nbins-1; do { i = (left+right)/2; fseek(ifp,THEMATIC_INDEX_HEADER_SIZE+(i*recsize),0); switch ( h.column_type ) { case 'I': Read_Vpf_Int ( &d.value.ival, ifp, 1) ; if ( ival == d.value.ival ) found = 1; else if ( d.value.ival > ival ) right = i-1; else left = i+1; break ; case 'S': Read_Vpf_Short ( &d.value.sval, ifp, 1) ; if ( sval == d.value.sval ) found = 1; else if ( d.value.sval > sval ) right = i-1; else left = i+1; break ; case 'F': Read_Vpf_Float ( &d.value.fval, ifp, 1) ; if ( fval == d.value.fval ) found = 1; else if ( d.value.fval > fval ) right = i-1; else left = i+1; break ; case 'R': Read_Vpf_Float ( &d.value.dval, ifp, 1) ; if ( dval == d.value.dval ) found = 1; else if ( d.value.dval > dval ) right = i-1; else left = i+1; break ; case 'T': Read_Vpf_Char ( buf, ifp, h.type_count ) ; bufalloc = 1; if ( strcmp ( value, buf ) == 0 ) found = 1; else if ( strcmp( value, buf ) < 0 ) right = i-1; else left = i+1; break; case 'D': Read_Vpf_Char ( dateval, ifp, sizeof(date_type) ) ; dateval[sizeof(date_type)-1]='\0'; bufalloc = 1; if ( strncmp ( value, dateval, sizeof(date_type) ) == 0 ) found = 1; else if ( strncmp( value, dateval, sizeof(date_type) ) < 0 ) right = i-1; else left = i+1; break; } /* end of switch */ } while ((!found) && (left <= right)); if (found) { Read_Vpf_Int ( &d.start_offset, ifp, 1) ; Read_Vpf_Int ( &d.num_items, ifp, 1) ; } else { d.value.ival = 0; } if ( bufalloc ) xvt_free ( buf ) ; return d; } /************************************************************************* * *N read_thematic_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To read an index file, regardless of its type ( T or G ) and * return a set type array *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * idxname == (char *) name of index file * value == (char *) address of value to search on. * THE PROGRAMMER MUST INSURE THAT THIS ADDRESS * CORRESPONDS TO THE TABLE COLUMN AND INDEX FILE. * * Returns: * * set_type a set corresponding to the vpf table, where each * bit relates to the ID in the table. This set is * allocated here and should be nuked when no longer * needed. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* VPFREAD.C *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO set_type read_thematic_index ( char *idxname, char *value ) #else set_type read_thematic_index ( idxname, value ) char *idxname; char *value; #endif { int32 i , ival = 0; short int sval = 0; FILE *ifp ; char hack[80] ; ThematicIndexHeader h ; ThematicIndexDirectory d ; set_type s ; /* open output index file */ if (( ifp = muse_file_open ( idxname, "rb" )) == NULL ) { sprintf ( hack, "No such index < %s >", idxname ) ; SWhimper ( hack ) ; } if (read_thematic_index_header (&h, ifp) == 0L ) { fclose(ifp); SWhimper ( "error reading index header" ) ; } if ( h.index_type == 'G' ) { fclose ( ifp ) ; s = read_gazetteer_index ( idxname, value ) ; return s ; } s = set_init ( h.table_nrows ) ; if (h.sort == 'S') d = tidx_binary_search(value,h,ifp); else d = tidx_linear_search(value,h,ifp); if ( d.start_offset == 0 ) { fclose(ifp); return s; } if ( d.num_items == 0) { set_insert( d.start_offset, s ); fclose(ifp); return s; } if ( fseek ( ifp, d.start_offset, 0 ) != 0 ) { fclose(ifp); SWhimper ( "error in fseek") ; } /* read data into user-defined pointer. User must free this pointer */ if ( h.id_data_type == 'I' ) for ( i=0 ; i < d.num_items; i++ ) { Read_Vpf_Int ( &ival, ifp, 1 ) ; set_insert ( ival, s ) ; /* set the id in the set */ } else for ( i=0 ; i < d.num_items; i++ ) { Read_Vpf_Short ( &sval, ifp, 1 ) ; set_insert ( (int32) sval, s ) ; } fclose ( ifp ) ; return s ; /* also return set */ } /*end of read_index */ /************************************************************************* * *N open_thematic_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Open and initialize a thematic index. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * idxname == (char *) name of index file * * Returns: * * ThematicIndex Thematic index structure. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO ThematicIndex open_thematic_index ( char *idxname, int32 storage ) #else ThematicIndex open_thematic_index ( idxname, storage ) char *idxname; int32 storage; #endif { char hack[80]; ThematicIndex idx ; int32 i; idx.d = NULL; idx.gid = NULL; /* open output index file */ if (( idx.fp = muse_file_open ( idxname, "rb" )) == NULL ) { sprintf ( hack, "No such index < %s >", idxname ) ; OWhimper ( hack ) ; } if (read_thematic_index_header (&idx.h, idx.fp) == 0L) OWhimper ( "error reading index header" ) ; if ( idx.h.index_type == 'G' ) { /* gazetteer_index */ if (read_gazetteer_index_directory(&idx.gid,&idx.h,idx.fp) == 0L) { fclose(idx.fp); idx.fp = NULL; } return idx; } if (storage == RAM) { idx.d = (ThematicIndexDirectory*)xvt_malloc ((size_t)idx.h.nbins * sizeof(ThematicIndexDirectory)); if (idx.d) { for ( i=0; i < idx.h.nbins; i++ ) { switch ( idx.h.column_type ) { case 'I': Read_Vpf_Int ( &idx.d[i].value.ival, idx.fp, 1) ; break ; case 'S': Read_Vpf_Short ( &idx.d[i].value.sval, idx.fp, 1) ; break ; case 'F': Read_Vpf_Float ( &idx.d[i].value.fval, idx.fp, 1) ; break ; case 'R': Read_Vpf_Float ( &idx.d[i].value.dval, idx.fp, 1) ; break ; case 'T': if (idx.h.type_count == 1) { Read_Vpf_Char ( &idx.d[i].value.cval, idx.fp, idx.h.type_count ) ; } else { idx.d[i].value.strval = (char*)xvt_malloc ((size_t)idx.h.type_count+1); Read_Vpf_Char ( idx.d[i].value.strval, idx.fp, idx.h.type_count ) ; idx.d[i].value.strval[idx.h.type_count] = '\0'; } break ; case 'D': idx.d[i].value.strval = (char*)xvt_malloc (sizeof(date_type)+1); Read_Vpf_Char ( idx.d[i].value.strval, idx.fp, sizeof(date_type) ); idx.d[i].value.strval[sizeof(date_type)-1] = '\0'; break ; } /* end of switch */ Read_Vpf_Int ( &idx.d[i].start_offset, idx.fp, 1) ; Read_Vpf_Int ( &idx.d[i].num_items, idx.fp, 1) ; } /* end of i loop */ if (idx.h.sort != 'S') { /* Sort the directory in memory */ switch ( idx.h.column_type ) { case 'I': qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof (ThematicIndexDirectory), Icmpval); break ; case 'S': qsort((void*)idx.d, (size_t)idx.h.nbins, sizeof(ThematicIndexDirectory), Scmpval); break ; case 'F': qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof(ThematicIndexDirectory), Fcmpval); break ; case 'R': qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof(ThematicIndexDirectory), Dcmpval); break ; case 'T': if (idx.h.type_count == 1) { qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof (ThematicIndexDirectory), Ccmpval); } else { qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof (ThematicIndexDirectory), STRcmpval); } break ; case 'D': qsort ((void*)idx.d, (size_t)idx.h.nbins, sizeof (ThematicIndexDirectory), STRcmpval); break ; } /* end of switch */ } } } else { idx.d = NULL; } return idx; } /************************************************************************* * *N search_thematic_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To search an index file, regardless of its type ( T or G ) and * return a set type array *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * idx == (ThematicIndex) thematic index structure * previously initialized with open_thematic_index(). * value == (char *) address of value to search on. * THE PROGRAMMER MUST INSURE THAT THIS ADDRESS * CORRESPONDS TO THE TABLE COLUMN AND INDEX FILE. * It should never be NULL. * * Returns: * * set_type a set corresponding to the vpf table, where each * bit relates to the ID in the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO set_type search_thematic_index ( ThematicIndex *idx, char *value ) #else set_type search_thematic_index ( idx, value ) ThematicIndex *idx; char *value; #endif { int32 i , ival = 0; short int sval = 0 ; ThematicIndexDirectory d, dsearch, *dptr = NULL; set_type s ; /* open output index file */ if (!idx->fp) { s = set_init(1); return s; } if ( idx->h.index_type == 'G' ) { s = search_gazetteer_index ( idx, value ) ; return s ; } /* create set */ s = set_init ( idx->h.table_nrows ) ; /* Look for a matching directory entry */ d.start_offset = 0; if (idx->d) { /* Directory in memory */ switch ( idx->h.column_type ) { case 'I': memcpy( &dsearch.value.ival, value, sizeof(int32) ); dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), Icmpval); break ; case 'S': memcpy( &dsearch.value.sval, value, sizeof(short int) ); dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), Scmpval); break ; case 'F': memcpy( &dsearch.value.fval, value, sizeof(float) ); dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), Fcmpval); break ; case 'R': memcpy( &dsearch.value.dval, value, sizeof(double) ); dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), Dcmpval); break ; case 'T': if (idx->h.type_count == 1) { memcpy( &dsearch.value.cval, value, sizeof(char) ); dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), Ccmpval); } else { dsearch.value.strval = (char*)xvt_malloc((size_t)idx->h.type_count+1); memcpy (dsearch.value.strval, value, (size_t)idx->h.type_count); dsearch.value.strval[idx->h.type_count] = '\0'; dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), STRcmpval); xvt_free(dsearch.value.strval); } break ; case 'D': dsearch.value.strval = (char*)xvt_malloc(sizeof(date_type)+1); memcpy( dsearch.value.strval, value, sizeof(date_type) ); dsearch.value.strval[sizeof(date_type)-1] = '\0'; dptr = (ThematicIndexDirectory *)bsearch( (void *)&dsearch, (void *)idx->d, (size_t)idx->h.nbins, sizeof(ThematicIndexDirectory), STRcmpval); xvt_free(dsearch.value.strval); break ; } /* end of switch */ if (dptr) d = *dptr; else d.start_offset = 0; } else { /* Search directory on disk */ if (idx->h.sort == 'S') d = tidx_binary_search(value,idx->h,idx->fp); else d = tidx_linear_search(value,idx->h,idx->fp); } if ( d.start_offset == 0 ) { return s; } if ( d.num_items == 0) { set_insert( d.start_offset, s ); return s; } /* We've got a match, so now read the ids in */ if ( fseek ( idx->fp, d.start_offset, 0 ) != 0 ) { set_nuke(&s); SWhimper ( "error in fseek") ; } /* read data into user-defined pointer. User must free this pointer */ if ( idx->h.id_data_type == 'I' ) for ( i=0 ; i < d.num_items; i++ ) { Read_Vpf_Int ( &ival, idx->fp, 1 ) ; set_insert ( ival, s ) ; /* set the id in the set */ } else for ( i=0 ; i < d.num_items; i++ ) { Read_Vpf_Short ( &sval, idx->fp, 1 ) ; set_insert ( (int32) sval, s ) ; } return s ; /* also return set */ } /*end of search_index */ /************************************************************************* * *N close_thematic_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Close a thematic index. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * idx == (ThematicIndex *) thematic index *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO void close_thematic_index ( ThematicIndex *idx ) #else void close_thematic_index ( idx ) ThematicIndex *idx; #endif { int32 i; fclose ( idx->fp ) ; if (idx->d) { if ( (idx->h.column_type == 'T' && idx->h.type_count > 1) || (idx->h.column_type == 'D') ) { for (i=0;ih.nbins;i++) if (idx->d[i].value.strval) xvt_free(idx->d[i].value.strval); } xvt_free ((char*)idx->d); } if (idx->gid) xvt_free ((char*)idx->gid); } /************************************************************************* * *N create_gazetteer_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To create a gazetteer file *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * * tablename == (char *) the name of an existing file * <= 11 chars long * idx_fname == (char *) name of index file * columnname == (char *) is a column existing in tablename * <= 24 chars long * * idx_set == (char *) is an array of printable ASCII characters * with no duplicates * * return value < 0 * * -1 some OS error, check errno for something more exact * -2 tablename is not a vpf table * -3 columnname is not in the vpf table * -4 column type not text * * return value = 0 * an index record for each character in index_set has been created * * the index file name is the same as tablename but with .?ti *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Jim Tenbrink * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 create_gazetteer_index (char *tablename, char *idx_fname , char *columnname, char *idx_set) #else int32 create_gazetteer_index (tablename, idx_fname, columnname, idx_set) char *tablename; char *idx_fname; char *columnname; char *idx_set; #endif { vpf_table_type t; row_type r; int32 c; FILE *idx_fp; ThematicIndexHeader gi; ThematicIndexDirectory *gid; set_type *idx_bit_sets; register int32 i, j, l; int32 set_byte_size; if (!tablename) return -2; if (!idx_fname) return -1; if (!columnname) return -3; if (!idx_set) return -1; t = vpf_open_table(tablename, disk, "rb", '\0'); if (!t.fp) return -2; #ifdef _MSDOS c = table_pos(strupr(columnname), t); #else c = table_pos(columnname, t); #endif if (c<0) return -3; if (t.header[c].type != 'T') { vpf_close_table(&t); return -4; } idx_fp = muse_file_open(idx_fname, "wb"); if (idx_fp == NULL) { vpf_close_table(&t); return -1; } /* only write out the table name, not the rest */ for ( i = strlen ( tablename ); i > 0; i-- ) if ( tablename[i] == DIR_SEPARATOR ) break ; if ( tablename[i] == DIR_SEPARATOR ) #ifdef _MSDOS strncpy ( gi.vpf_table_name, strupr ( &tablename[i+1] ), 13 ) ; #else strncpy ( gi.vpf_table_name, &tablename[i+1], 13 ) ; #endif else #ifdef _MSDOS strncpy(gi.vpf_table_name, strupr ( tablename), 13 ); #else strncpy(gi.vpf_table_name, tablename, 13); #endif strncpy(gi.vpf_column_name, columnname,25); gi.column_type = 'T'; gi.index_type = 'G'; gi.type_count = 1 ; gi.id_data_type = 'S' ; gi.nbins = strlen(idx_set); gi.table_nrows = t.nrows; gi.sort = ' '; gi.padding[0] = ' '; gi.padding[1] = ' '; gi.padding[2] = ' '; set_byte_size = (int32)ceil(t.nrows/8.0); /* force input string to lower case , rdf */ for ( i=0; i < gi.nbins; i++ ) idx_set[i] = (char)tolower (idx_set[i]); /* * ti.nbytes is the offset into the index file at which the * bit arrays start */ gi.nbytes = THEMATIC_INDEX_HEADER_SIZE + gi.nbins * ( sizeof (char) + DIRECTORY_SIZE ) ; gid = (ThematicIndexDirectory*)xvt_malloc (sizeof (ThematicIndexDirectory) * (size_t)gi.nbins); idx_bit_sets = (set_type*)xvt_malloc (sizeof(set_type) * (size_t)gi.nbins); for (i = 0; i < gi.nbins; i++) { idx_bit_sets[i] = set_init(t.nrows); gid[i].value.cval = idx_set[i]; gid[i].num_items = 1; } /* * lets suck up some CPU cycles here */ for (l = 0; l < t.nrows; l++) { r = get_row(l+1, t); for (i = 0; i < gi.nbins; i++) for (j = 0; j < r[c].count; j++) /* No matter the input character, make it lower case , rdf added */ if ( tolower (*((char *) r[c].ptr + j)) == idx_set[i]) { set_insert(l, idx_bit_sets[i]); break; } free_row(r, t); } vpf_close_table(&t); if (write_thematic_index_header (gi, idx_fp) == '\0') { fclose(idx_fp); for (i = 0; i < gi.nbins; i++) set_nuke(&idx_bit_sets[i]); xvt_free ((char*)idx_bit_sets); xvt_free ((char*)gid); return -1; } if (write_gazetteer_index_directory(gi, gid, set_byte_size, idx_fp) == 0 ) { fclose(idx_fp); for (i = 0; i < gi.nbins; i++) set_nuke(&idx_bit_sets[i]); xvt_free ((char*)idx_bit_sets); xvt_free ((char*)gid); return -1; } for (i = 0; i < gi.nbins; i++) { if ( ! Write_Vpf_Char(idx_bit_sets[i].buf, idx_fp, set_byte_size) ) { fclose(idx_fp); for (i = 0; i < gi.nbins; i++) set_nuke(&idx_bit_sets[i]); return -1; } } fclose(idx_fp); for (i = 0; i < gi.nbins; i++) set_nuke(&idx_bit_sets[i]); xvt_free ((char*)idx_bit_sets); xvt_free ((char*)gid); return 0; } /************************************************************************* * *N read_gazetteer_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To read an gazeeteer index file, and return a set type array *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * idx_fname == (char *) the name of a vpf gazetteer index * created with a call to to create_gaz_index. * * query_str == (char *) string that contains only characters * which form a subset of the characters passed * to create_gaz_index when idx_fname was created. * * the vpf table from which the file idx_fname was derived must * exist in the same directory as idx_fname * * out: case the returned set size > 0 * a bit array which can be used as a rough filter for the * vpf table from which the index file idx_fname was derived. * * bits which are set in the array are the record numbers in the vpf table * (from which idx_fname was derived) which may contain query_string * * case the returned set size = 0 * some system error occurred * most likely the indexed vpf table couldn't be found in the * same directory * * note: query_str is treated as a set, so duplicate occurrences * of the same character are ignored. I need a way of flagging * those duplicate occurrences. Instead of sorting the string * and removing duplicates, I use the num_items field in each * element of the directory array. * * Returns: * * set_type a set corresponding to the vpf table, where each * bit relates to the ID in the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Jim Tenbrink * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO set_type read_gazetteer_index (char *idx_fname, char *query_str ) #else set_type read_gazetteer_index (idx_fname, query_str ) char *idx_fname; char *query_str; #endif { ThematicIndexHeader gi; ThematicIndexDirectory * gid; FILE * idx_fp; static set_type query_set = {0, 0}, xsect_set, result_set; register int32 query_len = strlen(query_str), i, j; int32 set_byte_size; char query_char; if (!idx_fname) return query_set; if (!query_str) return query_set; idx_fp = muse_file_open(idx_fname, "rb"); if (idx_fp == NULL) return query_set; if (read_thematic_index_header (&gi, idx_fp) == '\0') { fclose(idx_fp); return query_set; } if (read_gazetteer_index_directory (&gid, &gi, idx_fp) == '\0') { fclose(idx_fp); return query_set; } for (j = 0; j < gi.nbins; j++) gid[j].num_items = 0; query_set = set_init(gi.table_nrows); xsect_set = set_init(gi.table_nrows); set_on(query_set); set_byte_size = (int32)ceil (gi.table_nrows/8.0); for (i = 0; i < query_len; i++) { query_char = (char)tolower (query_str[i]); for (j = 0; j < gi.nbins; j++) if (gid[j].value.cval == query_char) { gid[j].num_items++; break; } if (gid[j].num_items > 1) continue; fseek(idx_fp, gid[j].start_offset, 0); if ( ! Read_Vpf_Char(xsect_set.buf, idx_fp, set_byte_size) ) { xvt_note ("read_gazetteer_index: error reading index"); /*DGM*/ set_off(query_set); set_nuke(&xsect_set); fclose(idx_fp); xvt_free ((char*)gid); return query_set ; } result_set = set_intersection(query_set, xsect_set); set_assign(&query_set, result_set); set_nuke(&result_set); } fclose(idx_fp); xvt_free ((char*)gid); set_nuke(&xsect_set); return query_set; } /************************************************************************* * *N search_gazetteer_index * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To search an gazeeteer index file, and return a set type array *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * in : idx is the gazetteer index opened with open_thematic_index * * query_str contains only characters which form a subset of * the characters passed to create_gaz_index when idx_fname * was created * * the vpf table from which the file idx_fname was derived must * exist in the same directory as idx_fname * * out: case the returned set size > 0 * a bit array which can be used as a rough filter for the * vpf table from which the index file idx_fname was derived. * * bits which are set in the array are the record numbers in the vpf table * (from which idx_fname was derived) which may contain query_string * * case the returned set size = 0 * some system error occurred * most likely the indexed vpf table couldn't be found in the * same directory * * note: query_str is treated as a set, so duplicate occurrences * of the same character are ignored. I need a way of flagging * those duplicate occurrences. Instead of sorting the string * and removing duplicates, I use the num_items field in each * element of the directory array. * * Returns: * * set_type a set corresponding to the vpf table, where each * bit relates to the ID in the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Jim Tenbrink * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO set_type search_gazetteer_index (ThematicIndex *idx, char *query_str ) #else set_type search_gazetteer_index ( idx, query_str ) ThematicIndex *idx; char *query_str; #endif { static set_type query_set = {0, 0}, xsect_set, result_set; register int32 query_len = strlen(query_str), i, j; int32 set_byte_size; char query_char; if (idx->fp == NULL) return query_set; for (j = 0; j < idx->h.nbins; j++) idx->gid[j].num_items = 0; query_set = set_init(idx->h.table_nrows); xsect_set = set_init(idx->h.table_nrows); set_on(query_set); set_byte_size = (int32)ceil (idx->h.table_nrows / 8.0); for (i = 0; i < query_len; i++) { query_char = (char)tolower (query_str[i]); for (j = 0; j < idx->h.nbins; j++) if (idx->gid[j].value.cval == query_char) { idx->gid[j].num_items++; break; } if (idx->gid[j].num_items > 1) continue; fseek(idx->fp, idx->gid[j].start_offset, 0); if ( ! Read_Vpf_Char(xsect_set.buf, idx->fp, set_byte_size) ) { set_type err; err = set_init ( 1 ) ; xvt_note ("read_gazetteer_index: error reading index"); /*DGM*/ return err ; } result_set = set_intersection(query_set, xsect_set); set_assign(&query_set, result_set); set_nuke(&result_set); } set_nuke(&xsect_set); return query_set; } /************************************************************************* * *N read_gazetteer_index_directory * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To read a gazetteer index directory. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * in : *gid is undefined * * *gi is the gazetteer index header for the open index file * referenced by idx_fp * * out: case return value is one * *gid is an array of directory entries with gi->nbin elements * * the sval member of the value union contains the indexed character * * the start_offset member of the directory structure contains the * disk offset for the start of the indexed characters bit array * * case zero return value * an error was probably encountered during the read * *gid is undefined *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * read_thematic_index_header see below * set_init SET.C * set_insert * Vpf_Read_* macros *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 read_gazetteer_index_directory( ThematicIndexDirectory **gid, ThematicIndexHeader *gi, FILE *idx_fp) #else int32 read_gazetteer_index_directory(gid, gi, idx_fp) ThematicIndexDirectory **gid; ThematicIndexHeader *gi; FILE *idx_fp; #endif { int32 i; if ( fseek ( idx_fp, THEMATIC_INDEX_HEADER_SIZE, 0 )!= 0 ) return 0 ; *gid = (ThematicIndexDirectory *) xvt_malloc (sizeof (ThematicIndexDirectory) * (size_t)gi->nbins); if (*gid == NULL) return 0; for (i = 0; i < gi->nbins; i++) { if ( ( ! Read_Vpf_Char( &( (*gid)[i].value.cval ), idx_fp, 1) ) || ( ! Read_Vpf_Int( &( (*gid)[i].start_offset ), idx_fp, 1) ) || ( ! Read_Vpf_Int( &( (*gid)[i].num_items ), idx_fp, 1) )) { xvt_note ("read_gazetteer_index_directory: error reading dir"); /*DGM*/ return ('\0'); } } return 1; } /************************************************************************* * *N read_thematic_index_header * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To read the thematic index header in a standard way *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * h < in/out > == (ThematicIndexHeader *) header structure to be filled * ifp == ( FILE *ifp ) index file pointer *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * Read_Vpf_Int * Read_Vpf_Char *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #define RWhimper() { \ xvt_note ("\nread_thematic_index_header: error reading header");\ } /*DGM*/ #ifdef PROTO int32 read_thematic_index_header ( ThematicIndexHeader *h, FILE *ifp ) #else int32 read_thematic_index_header ( h, ifp ) ThematicIndexHeader *h; FILE *ifp; #endif { /* char *valid_index_types = "TG"; DGM */ char *valid_index_types = "TGIB"; /* DGM */ char *valid_column_types = "TDISFR"; char *valid_id_data_types = "IS"; char *valid_sort = "S "; if ( fseek ( ifp, 0, 0 ) != 0 ) /* rewind, just in case */ return 0 ; /* error */ if ( ! Read_Vpf_Int ( &h->nbytes, ifp, 1 ) ) RWhimper(); if ( ! Read_Vpf_Int ( &h->nbins, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Int ( &h->table_nrows, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Char ( &h->index_type, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Char ( &h->column_type, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Int ( &h->type_count, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Char ( &h->id_data_type, ifp, 1 ) ) RWhimper() ; if ( ! Read_Vpf_Char ( &h->vpf_table_name, ifp, 12 ) ) RWhimper() ; h->vpf_table_name[12] = '\0'; if ( ! Read_Vpf_Char ( &h->vpf_column_name, ifp, 24 ) ) RWhimper() ; h->vpf_column_name[24] = '\0'; if ( ! Read_Vpf_Char ( &h->sort, ifp, 1 ) ) RWhimper() ; h->sort = (char)toupper(h->sort); if ( ! Read_Vpf_Char ( &h->padding, ifp, 3 ) ) RWhimper() ; /* Perform a simple (but theoretically not foolproof) validity check */ if (!strchr (valid_index_types,(char)toupper(h->index_type))) return ('\0'); if (!strchr (valid_column_types,(char)toupper(h->column_type))) return ('\0'); if (!strchr (valid_id_data_types,(char)toupper(h->id_data_type))) return ('\0'); if (!strchr (valid_sort,(char)toupper(h->sort))) return ('\0'); return 1 ; } /************************************************************************* * *N write_thematic_index_header * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To write the thematic index header in a standard way *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * h < input > == (ThematicIndexHeader) header structure to write from * ifp == ( FILE *ifp ) index file pointer *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * Write_Vpf_Int * Write_Vpf_Char *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #define WWhimper() {\ xvt_note ("write_thematic_index_header: error reading header");} #ifdef PROTO int32 write_thematic_index_header ( ThematicIndexHeader h, FILE *ifp ) #else int32 write_thematic_index_header ( h, ifp ) ThematicIndexHeader h; FILE *ifp; #endif { if ( fseek ( ifp, 0, 0 ) != 0 ) /* rewind, just in case */ WWhimper() ; /* error */ if ( ! Write_Vpf_Int ( &h.nbytes, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Int ( &h.nbins, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Int ( &h.table_nrows, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.index_type, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.column_type, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Int ( &h.type_count, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.id_data_type, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.vpf_table_name, ifp, 12 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.vpf_column_name, ifp, 25 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.sort, ifp, 1 ) ) WWhimper() ; if ( ! Write_Vpf_Char ( &h.padding, ifp, 3 ) ) WWhimper() ; return 1 ; } /************************************************************************* * *N write_thematic_index_directory * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To write the thematic index header in a standard way *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * h < input > == (ThematicIndexHeader) header structure * d < input > == (ThematicIndexDirectory *) directory array structure * idsize < input > == (int32) size of each data element. * for T indexes, this is either 2 bytes or 4 bytes * for G indexes, it will be num_in_set (set) * or the size of the bit array. * ifp == ( FILE *ifp ) index file pointer *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * Vpf_Write_* *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #define WTWhimper() { \ xvt_note ("write_thematic_index_directory: error reading header");} #ifdef PROTO int32 write_thematic_index_directory ( ThematicIndexHeader h, ThematicIndexDirectory *d, int32 idsize , /* size of data */ FILE *ifp ) #else int32 write_thematic_index_directory ( h, d, idsize , ifp ) ThematicIndexHeader h; ThematicIndexDirectory *d; int32 idsize;/* size of data */ FILE *ifp; #endif { int32 offset = h.nbytes , i, zero=0 ; /* rewind, just in case */ if ( fseek ( ifp, THEMATIC_INDEX_HEADER_SIZE, 0 ) != 0 ) WTWhimper() ; for ( i=0; i < h.nbins; i++ ) { switch ( h.column_type ) { case 'I': if ( ! Write_Vpf_Int ( &d[i].value.ival, ifp, 1 ) ) WTWhimper() ; break ; case 'T': if (h.type_count == 1) { if ( ! Write_Vpf_Char ( &d[i].value.cval, ifp, h.type_count ) ) WTWhimper() ; } else { if ( ! Write_Vpf_Char ( d[i].value.strval, ifp, h.type_count ) ) WTWhimper() ; } break ; case 'D': if ( ! Write_Vpf_Char ( d[i].value.strval, ifp, sizeof(date_type) ) ) WTWhimper() ; break ; case 'S': if ( ! Write_Vpf_Short ( &d[i].value.sval, ifp, 1 ) ) WTWhimper() ; break ; case 'F': if ( ! Write_Vpf_Float ( &d[i].value.fval, ifp, 1 ) ) WTWhimper() ; break ; case 'R': if ( ! Write_Vpf_Double ( &d[i].value.dval, ifp, 1 ) ) WTWhimper() ; break ; } /* end of switch */ if (d[i].num_items > 1) { if ( ! Write_Vpf_Int ( &offset, ifp, 1 ) ) WTWhimper() ; d[i].start_offset = offset; if ( ! Write_Vpf_Int ( &d[i].num_items, ifp, 1 ) ) WTWhimper() ; /* this offset is constant, no matter the data type */ offset += ( idsize * d[i].num_items ) ; } else { /* start_offset has been set to the only id value above */ if ( ! Write_Vpf_Int ( &d[i].start_offset, ifp, 1 ) ) WTWhimper() ; if ( ! Write_Vpf_Int ( &zero, ifp, 1 ) ) WTWhimper() ; } } /* end of i loop */ return 1 ; } /* end of write_directory */ /************************************************************************* * *N write_gazetteer_index_directory * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * To write the gazetteer thematic index header in a standard way *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * h < input > == (ThematicIndexHeader) header structure * d < input > == (ThematicIndexDirectory *) directory array structure * idsize < input > == (int32) size of each data element. * for T indexes, this is either 2 bytes or 4 bytes * for G indexes, it will be num_in_set (set) * or the size of the bit array. * ifp == ( FILE *ifp ) index file pointer *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn October 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * Vpf_Write_* *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #define WTGWhimper() { \ xvt_note ("write_gazetteer_index_directory: error writing header");} #ifdef PROTO int32 write_gazetteer_index_directory ( ThematicIndexHeader h, ThematicIndexDirectory *d, int32 idsize , /* size of data */ FILE *ifp ) #else int32 write_gazetteer_index_directory ( h, d, idsize, ifp ) ThematicIndexHeader h; ThematicIndexDirectory *d; int32 idsize; FILE *ifp; #endif { int32 offset = h.nbytes , i ; /* rewind, just in case */ if ( fseek ( ifp, THEMATIC_INDEX_HEADER_SIZE, 0 )!= 0 ) WTGWhimper() ; for ( i=0; i < h.nbins; i++ ) { if ( ! Write_Vpf_Char ( &d[i].value.cval, ifp, 1 ) ) WTGWhimper() ; if ( ! Write_Vpf_Int ( &offset, ifp, 1 ) ) WTGWhimper() ; if ( ! Write_Vpf_Int ( &d[i].num_items, ifp, 1 ) ) WTGWhimper() ; /* this offset is constant, no matter the data type */ offset += ( idsize * d[i].num_items ) ; } /* end of i loop */ return 1 ; } /* end of write_directory */ ogdi-ogdi_4_1_0/vpflib/vpftidx.h000066400000000000000000000045701345660466700167500ustar00rootroot00000000000000 #ifndef __VPFTIDX_H__ #define __VPFTIDX_H__ 1 #include #ifndef __SET_H__ #include "set.h" #endif typedef struct { /* Total of 40 bytes */ int32 nbytes , /* 40 + directory length */ nbins , /* Directory size */ table_nrows ; /* Num rows in original table */ char index_type , /* T = thematic, G = gazetteer */ column_type ; /* T, I, R, S, F, K */ int32 type_count ; /* usually 1, but more for T */ char id_data_type , /* I if > 32767, else S */ vpf_table_name[13] , vpf_column_name[25] , /* 16 bytes + 9 for TILE_ID */ sort , /* 'S' if directory sorted */ padding[3] ; /* To make it a nice 60 bytes */ } ThematicIndexHeader ; #define THEMATIC_INDEX_HEADER_SIZE 60 #define DIRECTORY_SIZE (sizeof(int32)*2) #define MAX_ID 32767 /* Threshold between S and I ids */ typedef union { char cval , *strval; int32 ival; short sval; float fval; double dval; } ThematicIndexValue; typedef struct { /* length = sizeof (datatype) + */ ThematicIndexValue value; /* 8 * nbins */ int32 binid, start_offset , num_items ; /* For each value, count the ids */ } ThematicIndexDirectory ; typedef struct { ThematicIndexHeader h; ThematicIndexDirectory *d, *gid; FILE *fp; } ThematicIndex; /* Prototype Definitions */ #ifdef PROTO int32 create_thematic_index (char, char*, char*, char*, char*); set_type read_thematic_index (char*, char*); ThematicIndex open_thematic_index (char*, int32); set_type search_thematic_index (ThematicIndex*, char*); void close_thematic_index (ThematicIndex*); int32 create_gazetteer_index (char*, char*, char*, char*); set_type search_gazetteer_index (ThematicIndex*, char*); set_type read_gazetteer_index (char*, char*); #else int32 create_thematic_index (); set_type read_thematic_index (); ThematicIndex open_thematic_index (); set_type search_thematic_index (); void close_thematic_index (); int32 create_gazetteer_index (); set_type search_gazetteer_index (); set_type read_gazetteer_index (); #endif #endif ogdi-ogdi_4_1_0/vpflib/vpfview.h000066400000000000000000000115111345660466700167430ustar00rootroot00000000000000/* VPFVIEW.H */ #ifndef __VPFVIEW_H__ #define __VPFVIEW_H__ 1 #ifndef __SET_H__ #include "set.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif #ifndef __LINKLIST_H__ #include "linklist.h" #endif #ifndef __VPF_H__ #include "vpf.h" #endif #ifndef __COORGEOM_H__ #include "coorgeom.h" #endif /* VPF library internal structure */ typedef struct { char name[9]; /* Name of the library */ boolean viewable; /* Is this library accessible to the view? */ char *path; /* DOS path name to the library */ int32 ntiles; /* Number of tiles in the library */ set_type tile_set; /* Set of 'active' tiles in the library */ vpf_projection_code projection; /* Projection of stored coord data */ vpf_units_type units; /* Units of the stored coordinate data */ } library_type; /* VPF database internal structure */ typedef struct { char name[9]; /* Name of the VPF database */ char *path; /* UNIX path name to the database */ library_type *library; /* Array of library structures for the database */ int32 nlibraries; /* Number of libraries in the database */ } database_type; /* Each theme has a symbol structure associated with it. Themes on */ /* simple feature classes just have relevant symbol information for */ /* one of the four primitive types, but complex feature themes may */ /* have any or all of the primitive type symbols. */ typedef struct { int32 point_color; int32 point; int32 line_color; int32 line; int32 area_color; int32 area; int32 text_color; int32 text; } theme_symbol_type; /* A theme is a single entry for a view of the database. It can be */ /* thought of as a stored query with a description and symbology. */ /* Each theme is associated with a feature class. */ typedef struct { char *description; /* Description of the theme */ char *database; /* Source Database path */ char *library; /* Source Library name */ char *coverage; /* Source coverage name */ char *fc; /* Feature class name for the theme */ char *ftable; /* Feature table path for the fc */ primitive_class_type primclass; /* Primitive class(es) of theme */ char *expression; /* Logical selection expression */ #if 0 theme_symbol_type symbol; /* Drawing symbol */ #endif } theme_type; /* View structure. Each view is associated with a particular database */ /* and a particular library within that datbase. */ typedef struct { char name[9]; /* View name */ database_type *database; /* Array of Databases in the view */ int32 ndb; /* Number of databases in the view */ char *path; /* Directory path to the view */ int32 nthemes; /* Number of themes in the view */ theme_type *theme; /* Array of themes */ set_type selected; /* Set of themes selected for display */ set_type displayed; /* Set of displayed themes */ linked_list_type sellist; /* List of selected themes (ordered) */ extent_type extent; /* MBR of all library extents */ double tileheight; /* Min of all library tile heights */ char sympath[255]; /* Symbol set path */ #if 0 symbol_set_type sym; /* Symbol set for the view */ #endif } view_type; /* Map environment information */ typedef struct { extent_type mapextent; /* Current map extent */ boolean mapchanged; /* Flag - has anything changed? */ boolean mapdisplayed; /* Flag - has the map been displayed? */ boolean user_escape; /* Flag - has the user hit escape? */ boolean study_area_selected; /* Flag - study area selected? */ boolean latlongrid; /* Flag - lat-lon grid to be displayed?*/ boolean scale_bar; /* Flag - scale bar to be displayed? */ vpf_projection_type projection; /* Current map display projection */ coord_units_type distance_unit; /* Units for distance display */ coord_units_type scale_bar_unit; /* Units for scale bar display */ vpf_units_type locator_unit; /* Units for map locate display */ } map_environment_type; typedef struct { extent_type mapextent; /* Current map extent */ boolean mapdisplayed; /* Flag - has the map been displayed? */ boolean latlongrid; /* Flag - lat-lon grid to be displayed? */ boolean tilegrid; /* Flag - tile boundaries to be displayed? */ boolean points; /* Flag - libref points to be displayed? */ boolean text; /* Flag - libref text to be displayed? */ vpf_units_type locator_unit; /* Units for libref map locate display */ } libref_map_environment_type; /* Window specifier flags */ #define COVERAGE_WINDOW 0 #define LIBREF_WINDOW 1 /* Functions: */ /* main() */ #endif ogdi-ogdi_4_1_0/vpflib/vpfwrite.c000066400000000000000000000641151345660466700171260ustar00rootroot00000000000000/************************************************************************* * *N Module VPFWRITE.C * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This contains functions for writing data to VPF tables. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * N/A *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Original Coding: Tom Wood Fall 1990 * Modifications: David Flinn January 1991 * July 1991 * Barry Michaels October 1991 * Modified from converter * software (UNIX) for * VPFVIEW software (DOS). * Jim TenBrink October 1991 * Made vpfread.c and vpfwrite.c * disjoint *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifndef INCL_XVTH #include #endif #if 0 #if _MSDOS #include #include #include #include #include #include #include #endif #endif #ifndef _MACHINE_ #include "machine.h" #endif #ifdef _UNIX #include #define SEEK_SET 0 /* Turbo C fseek value */ #define SEEK_CUR 1 #endif #ifdef __VPF_H__ #include "vpf.h" #endif #ifndef _VPFTABLE_H_ #include "vpftable.h" #endif extern int32 STORAGE_BYTE_ORDER; /* Include statically to reduce external module dependencies */ #ifdef PROTO void *vpfmalloc( uint32 size ) #else void *vpfmalloc( size ) uint32 size; #endif { void *p; p = (void *)xvt_zmalloc ((size_t)size); if (p == (void *)NULL) { xvt_note ("out of memory in vpfwrite\n"); } return p; } /************************************************************************* * *N write_key * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function writes an id triplet key from the specified file. * It is assumed that there is enough free disk space to write to the * file. It is also assumed that the file pointer (fp) is already opened * for writing. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * key == (id_triplet_type) id triplet key. * fp == (FILE *) input file pointer. * return == (int32) size of the key. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn July 1991 Based on read_key in vpftable.c *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 write_key( id_triplet_type key, FILE *fp ) #else int32 write_key( key, fp ) id_triplet_type key; FILE *fp; #endif { int32 size = 0 ; /* to count size of key write */ unsigned char tint ; short int tshort ; /* Assume that any count value has been written before this */ /* Only write one key in this subroutine, do not write more */ Write_Vpf_Char (&(key.type),fp,1); size += sizeof ( char ) ; switch (TYPE0(key.type)) { case 0: break; case 1: tint = (unsigned char) key.id ; Write_Vpf_Char ( &tint, fp, 1 ) ; size += sizeof ( char ) ; break; case 2: tshort = (short) key.id ; Write_Vpf_Short ( &tshort, fp, 1 ) ; size += sizeof ( short int ) ; break; case 3: Write_Vpf_Int (&(key.id), fp, 1 ) ; size += sizeof ( int32 ) ; break; } switch (TYPE1(key.type)) { case 0: break; case 1: tint = (unsigned char) key.tile ; Write_Vpf_Char ( &tint, fp, 1 ) ; size += sizeof ( char ) ; break; case 2: tshort = (short) key.tile ; Write_Vpf_Short ( &tshort, fp, 1 ) ; size += sizeof ( short int ) ; break; case 3: Write_Vpf_Int (&(key.tile), fp, 1 ) ; size += sizeof ( int32 ) ; break; } switch (TYPE2(key.type)) { case 0: break; case 1: tint = (unsigned char) key.exid ; Write_Vpf_Char ( &tint, fp, 1 ) ; size += sizeof ( char ) ; break; case 2: tshort = (short) key.exid ; Write_Vpf_Short ( &tshort, fp, 1 ) ; size += sizeof ( short int ) ; break; case 3: Write_Vpf_Int (&(key.exid), fp, 1 ) ; size += sizeof ( int32 ) ; break; } return size ; } /************************************************************************* * *N write_next_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function writes the next row of the table. * The parameter row must be initialized prior to this functional, either * by being read in from an existing table or set to valid values. * A row with any empty columns should not be written out. * The parameter table must be a valid table and initialized prior to * this function, by vpf_open_table. It is assumed that there is * enough free disk space to write to the file. It is also assumed that * the file pointer (table->fp) is already opened for writing. The * variable count, set to the values in row, must be greater than 0, * otherwise, if count is -1 the vpf_write functions will lock up * (row[].count should never have a value of 0). Note that if errorfp * is used, it must be opened prior to this function. * *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * row == (row_type) the row to write to the table. * table == (vpf_table_type *) vpf table structure. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Dave Flinn July 1991 Based on read_next_row. * Barry Michaels Oct 1991 Added row as a parameter. * JTB 10/91 guaranteed function always * returns a value: * 0: record written * -1: unknown field type *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO int32 write_next_row(row_type row, vpf_table_type * table ) #else int32 write_next_row( row, table ) row_type row; vpf_table_type * table; #endif { register int32 i, j; char * tptr, * output ; int32 recordsize = 0; int32 count; id_triplet_type * keys; uint32 pos_for_ndx, length; int32 retn_val = 0; static coordinate_type dummycoord = {(float)0.0, (float)0.0}; STORAGE_BYTE_ORDER = table->byte_order; table->nrows++; fseek(table->fp, 0L, SEEK_END); pos_for_ndx = ftell(table->fp); /* begining of new row */ for (i = 0; i < table->nfields; i++) { /* for each column */ count = row[i].count ; /* Retrieve count from row. Should be 0 if variable length null */ /* In case this column is variable length, write out count */ if (count == 0) count = 1; if ( table->header[i].count < 0 ) { Write_Vpf_Int ( &count, table->fp, 1 ) ; recordsize += sizeof ( int32 ) ; } /* Now write out the data type */ switch (table->header[i].type) { case 'T': if ( count == 0 ) /* Assume this is variable length text and don't do anything */ break ; /* This loop insures that the exact number of characters are written out to disk. */ output = (char *) vpfmalloc ( count + 1 ) ; /* include null byte */ for (j = 0, tptr = row[i].ptr; j < count; j++, tptr++) if ( *tptr ) output[j] = *tptr ; else output[j] = SPACE ; output[count] = '\0' ; Write_Vpf_Char( output ,table->fp, count) ; if(output != (char *)NULL) {xvt_free ( output ) ;output = (char *)NULL;} recordsize += sizeof ( char ) * count ; break; case 'I': Write_Vpf_Int (row[i].ptr, table->fp, count ) ; recordsize += sizeof ( int32 ) * count ; break; case 'S': Write_Vpf_Short (row[i].ptr, table->fp, count ) ; recordsize += sizeof ( short int ) * count ; break; case 'F': Write_Vpf_Float (row[i].ptr, table->fp, count ) ; recordsize += sizeof ( float ) * count ; break; case 'R': Write_Vpf_Double (row[i].ptr, table->fp, count ) ; recordsize += sizeof ( double ) * count ; break; case 'D': /* date has 21 chars in memory, not on disk */ Write_Vpf_Date (row[i].ptr, table->fp, count ) ; recordsize += ( sizeof ( date_type ) - 1 ) * count ; break; case 'C': if (row[i].ptr) { Write_Vpf_Coordinate(row[i].ptr,table->fp,count); } else { for (j=0;jfp,count); } recordsize += sizeof ( coordinate_type ) * count ; break; case 'B': Write_Vpf_DoubleCoordinate(row[i].ptr,table->fp,count); recordsize += sizeof ( double_coordinate_type ) * count ; break; case 'Z': Write_Vpf_CoordinateZ(row[i].ptr,table->fp,count); recordsize += sizeof ( tri_coordinate_type ) * count ; break; case 'Y': Write_Vpf_DoubleCoordinateZ(row[i].ptr,table->fp,count); recordsize += sizeof ( double_tri_coordinate_type ) * count ; break; case 'K': keys = (id_triplet_type *) vpfmalloc (count*sizeof(id_triplet_type)) ; memcpy (keys, row[i].ptr, (size_t)count * sizeof(id_triplet_type) ) ; for (j=0;jfp); if(keys != (id_triplet_type *)NULL) {xvt_free ((char*)keys);keys = (id_triplet_type *)NULL;} break; case 'X': /* do nothing */ break; default: xvt_note ("write_next_row: no such type < %c >", table->header[i].type ) ; /*DGM*/ return(-1); } } if ( table->xfp ) { /* only for variable length columns */ length = recordsize ; fseek( table->xfp, 0, SEEK_END ); Write_Vpf_Int ( &pos_for_ndx, table->xfp, 1 ) ; Write_Vpf_Int ( &length, table->xfp, 1 ) ; } return retn_val; } /************************************************************************* * *N create_row * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function creates a null row for the given table. * The parameter table must be a valid table and initialized prior to * this function, by vpf_open_table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * table == (vpf_table_type) vpf table structure. * return == (row_type) row of the table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels Oct 1991 *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * External Variables: *X * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Functions Called: *F * None *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Portability: *O * This module should be ANSI C compatible. *E *************************************************************************/ #ifdef PROTO row_type create_row( vpf_table_type table ) #else row_type create_row( table ) vpf_table_type table; #endif { int32 i; row_type row; row = (row_type)vpfmalloc(table.nfields*sizeof(column_type)); for (i=0;i == (int32) column offset. * row == (row_type) row containing element to be removed. * table == (vpf_table_type) VPF table owning row. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * RDF 7/91 original * JTB 10/91 removed call to exit(); *E *************************************************************************/ #ifdef PROTO void nullify_table_element( int32 field, row_type row, vpf_table_type table ) #else void nullify_table_element( field, row, table ) int32 field; row_type row; vpf_table_type table; #endif { if (field < 0 || field >= table.nfields) return; if (row[field].ptr) { if(row[field].ptr != (void *)NULL) xvt_free((char *)row[field].ptr); row[field].ptr = NULL; row[field].count = table.header[field].count; } } /************************************************************************* * *N put_table_element * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Copies one element into the designated field. * The parameter row must be initialized prior to this functional, either * buy being read in from an existing table or set to valid values. The * parameter table must be a valid table and initialized prior to this * function, by vpf_open_table. Note that if errorfp is used, it must * be opened prior to this function. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * field == (int32) column offset. * row == (row_type) row containing target field. * table == (vpf_table_type) VPF table owning row. * value == (void *) source field element. * count == (int32) number of items in value. * put_table_element == (int32) * 0 --> element write succeeded * 1 --> unknown element type or * invalid column offset *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * RDF 7/91 original * JTB 10/91 removed call to exit(); * guaranteed function always returns value * 0: element write succeeded * -1: unknown element type or invalid column (field) offset *E *************************************************************************/ #ifdef PROTO int32 put_table_element( int32 field, row_type row, vpf_table_type table, void * value, int32 count ) #else int32 put_table_element( field, row, table, value, count ) int32 field; row_type row; vpf_table_type table; void *value; int32 count; #endif { int32 i, len, stat; char *str; stat=0; if ((count != table.header[field].count) && (table.header[field].count > 0)) { xvt_note ("Invalid element count! (%d, %d)\n", count,table.header[field].count); return -1; } if (field < 0 || field >= table.nfields) return -1; row[field].count = count; if (row[field].ptr != (void *)NULL) { xvt_free(row[field].ptr); row[field].ptr = NULL; } switch ( table.header[field].type ) { case 'T': len = (int32)max(count,table.header[field].count); str = (char *) vpfmalloc( len + 1 ); row[field].ptr = (char *) vpfmalloc ( len + 1 ) ; strcpy( str, value ); for ( i = strlen(value) ; i < table.header[field].count; i++ ) str[i] = SPACE ; str[len] = '\0'; memcpy (row[field].ptr, str, (size_t)(len+1)); if(str != (char *)NULL) {xvt_free(str);str = (char *)NULL;} break ; case 'D': row[field].ptr = (date_type *) vpfmalloc (count*sizeof(date_type)); memcpy (row[field].ptr, value, sizeof (date_type) * (size_t)count); break; case 'I' : row[field].ptr = (int32 *) vpfmalloc (count*sizeof(int32)); memcpy (row[field].ptr, value, sizeof (int32) * (size_t)count); break; case 'S' : row[field].ptr = (short int *) vpfmalloc (count*sizeof(short int)); memcpy (row[field].ptr, value, sizeof (short) * (size_t)count); break; case 'F': row[field].ptr = (float *) vpfmalloc (count*sizeof(float)); memcpy (row[field].ptr, value, sizeof (float) * (size_t)count); break; case 'R': row[field].ptr = (double *) vpfmalloc (count*sizeof(double)); memcpy (row[field].ptr, value, sizeof (double) * (size_t)count); break; case 'K': row[field].ptr = (id_triplet_type *) vpfmalloc ( count*sizeof(id_triplet_type )); memcpy (row[field].ptr, value, sizeof(id_triplet_type) * (size_t)count); break; case 'C': if (value) { row[field].ptr = (coordinate_type*) xvt_zmalloc ((size_t)count * sizeof (coordinate_type)); if (row[field].ptr) memcpy (row[field].ptr, value, sizeof (coordinate_type) * (size_t)count); } else { row[field].ptr = NULL; } break; case 'Z': if (value) { row[field].ptr = (tri_coordinate_type *) xvt_zmalloc ((size_t)count * sizeof(tri_coordinate_type)); if (row[field].ptr) memcpy (row[field].ptr, value, sizeof(tri_coordinate_type) * (size_t)count); } else { row[field].ptr = NULL; } break; case 'B': if (value) { row[field].ptr = (double_coordinate_type *) xvt_zmalloc ((size_t)count * sizeof (double_coordinate_type)); if (row[field].ptr) memcpy (row[field].ptr, value, sizeof (double_coordinate_type) * (size_t)count); } else { row[field].ptr = NULL; } break; case 'Y': if (value) { row[field].ptr = (double_tri_coordinate_type *) xvt_zmalloc ((size_t)count * sizeof (double_tri_coordinate_type)); if (row[field].ptr) memcpy( row[field].ptr, value, sizeof (double_tri_coordinate_type) * (size_t)count); } else { row[field].ptr = NULL; } break; default: xvt_note ("text2vpf: No such data type < %c > in vpf\n", table.header[field].type ) ; /*DGM*/ stat = -1; break ; } return stat; } /* ======================================================================== Environmental Systems Research Institute (ESRI) Applications Programming Project: Conversion from ARC/INFO to VPF Original Coding: Tom Wood Fall 1990 Modifications: David Flinn January 1991 July 1991 JTB 10/91 The following functions are used when writing from a big-endian machine. VPF requires little-endian words, so byte-swapping must be performed. ======================================================================== */ /* #ifdef UNIX */ #ifdef PROTO int32 VpfWrite ( void *from, VpfDataType type, int32 count, FILE *to ) #else int32 VpfWrite ( from, type, count, to ) void *from; VpfDataType type; int32 count; FILE *to; #endif { int32 retval = 0; int32 i; switch ( type ) { case VpfChar: retval = fwrite (from, sizeof (char), (size_t)count, to); break ; case VpfShort: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { short int stemp , *sptr = (short *) from ; for ( i=0; i < count; i++, sptr++ ) { swap_two ((char*)sptr,(char*)&stemp); retval = fwrite ( &stemp, sizeof (short), 1, to ) ; } } else { retval = fwrite (from, sizeof (short), (size_t)count, to); } } break ; case VpfInteger: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { int32 itemp, *iptr = (int32 *) from ; for ( i=0; i < count; i++, iptr++ ) { swap_four ((char*)iptr, (char*)&itemp); retval = fwrite ( &itemp, sizeof (int32), 1, to ) ; } } else { retval = fwrite (from, sizeof (int32), (size_t)count, to); } } break ; case VpfFloat: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { float ftemp , *fptr = (float *) from ; for ( i=0; i < count; i++, fptr++ ) { swap_four ((char*)fptr, (char*)&ftemp); retval = fwrite ( &ftemp, sizeof (float), 1, to ) ; } } else { retval = fwrite (from, sizeof (int32), (size_t)count, to); } } break ; case VpfDouble: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { double dtemp , *dptr = (double *) from ; for ( i=0; i < count; i++, dptr++ ) { swap_eight ((char*)dptr, (char*)&dtemp); retval = fwrite ( &dtemp, sizeof (double), 1, to ) ; } } else { retval = fwrite (from, sizeof (double), (size_t)count, to); } } break ; case VpfDate: /* only write out 20, not 21 chars */ retval = fwrite (from, sizeof (date_type) - 1, (size_t)count, to); break ; case VpfCoordinate: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { coordinate_type ctemp , *cptr = (coordinate_type *) from ; for ( i=0; i < count; i++, cptr++ ) { swap_four ((char*)&cptr->x, (char*)&ctemp.x); swap_four ((char*)&cptr->y, (char*)&ctemp.y); retval = fwrite ( &ctemp, sizeof (coordinate_type), 1, to ) ; } } else { retval = fwrite (from, sizeof (coordinate_type), (size_t)count, to); } } break ; case VpfDoubleCoordinate: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { double_coordinate_type dctemp , *dcptr = (double_coordinate_type *) from ; for ( i=0; i < count; i++, dcptr++ ) { swap_eight ((char*)&dcptr->x, (char*)&dctemp.x); swap_eight ((char*)&dcptr->y, (char*)&dctemp.y); retval = fwrite ( &dctemp, sizeof (double_coordinate_type), 1, to ) ; } } else { retval = fwrite (from, sizeof (double_coordinate_type), (size_t)count, to); } } break ; case VpfTriCoordinate: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { tri_coordinate_type ttemp , *tptr = (tri_coordinate_type *) from ; for ( i=0; i < count; i++, tptr++ ) { swap_four ((char*)&tptr->x, (char*)&ttemp.x); swap_four ((char*)&tptr->y, (char*)&ttemp.y); swap_four ((char*)&tptr->z, (char*)&ttemp.z); retval = fwrite ( &ttemp, sizeof (tri_coordinate_type), 1, to ) ; } } else { retval = fwrite (from, sizeof (tri_coordinate_type), (size_t)count, to); } } break ; case VpfDoubleTriCoordinate: { if (MACHINE_BYTE_ORDER != STORAGE_BYTE_ORDER) { double_tri_coordinate_type dttemp , *dtptr = (double_tri_coordinate_type *) from ; for ( i=0; i < count; i++, dtptr++ ) { swap_eight ((char*)&dtptr->x, (char*)&dttemp.x); swap_eight ((char*)&dtptr->y, (char*)&dttemp.y); swap_eight ((char*)&dtptr->z, (char*)&dttemp.z); retval = fwrite ( &dttemp,sizeof (double_tri_coordinate_type), 1, to); } } else { retval = fwrite ( from,sizeof (double_tri_coordinate_type), (size_t)count, to); } } break ; case VpfNull: /* Do Nothing */ break ; default: xvt_note ("VpfWrite: error on data type < %s >",(char*) type ) ; /*DGM*/ break ; } return retval; } /* #endif */ ogdi-ogdi_4_1_0/vpflib/xvt.h000066400000000000000000000017111345660466700160770ustar00rootroot00000000000000#include #include #include #include #include #include #ifdef __GNU_LIBRARY__ #include #endif #include extern void G_warning (char *msg); #define XVT_OS NONE #ifdef unix #define XVT_OS_WIN NULL #endif #define MAXLONG LONG_MAX #define MAXSHORT SHRT_MAX #ifdef _WINDOWS #define MAXFLOAT DBL_MAX #endif #define DIR_SEPARATOR '\\' #define OS_SEPARATOR '\\' #define OS_SEPARATOR_STRING "\\" #define SZ_FNAME 256 /* typedef void * GHANDLE; */ #define GHANDLE void * #define xvt_zmalloc(n) calloc(n,1) #define xvt_free(a) free(a) #define xvt_note printf #define xvt_malloc(a) malloc(a) #define xvt_realloc(m,s) realloc(m,s) #define gmemset memset #define xvt_fatal printf #define gunlock #define gfree(a) free(a) #define xvt_error printf #define XVT_CC_ARGS(p) p #define BOOLEAN unsigned char /* typedef unsigned char BOOLEAN; */ #define UNUSED_RET(x) do { if(x) {} } while(0)