1 #ifndef SHAPEFILE_H_INCLUDED
2 #define SHAPEFILE_H_INCLUDED
3 
4 /******************************************************************************
5  *
6  * Project:  Shapelib
7  * Purpose:  Primary include file for Shapelib.
8  * Author:   Frank Warmerdam, warmerdam@pobox.com
9  *
10  ******************************************************************************
11  * Copyright (c) 1999, Frank Warmerdam
12  *
13  * This software is available under the following "MIT Style" license,
14  * or at the option of the licensee under the LGPL (see LICENSE.LGPL).  This
15  * option is discussed in more detail in shapelib.html.
16  *
17  * --
18  *
19  * Permission is hereby granted, free of charge, to any person obtaining a
20  * copy of this software and associated documentation files (the "Software"),
21  * to deal in the Software without restriction, including without limitation
22  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
23  * and/or sell copies of the Software, and to permit persons to whom the
24  * Software is furnished to do so, subject to the following conditions:
25  *
26  * The above copyright notice and this permission notice shall be included
27  * in all copies or substantial portions of the Software.
28  *
29  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
30  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
32  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
34  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
35  * DEALINGS IN THE SOFTWARE.
36  ******************************************************************************
37  *
38  * $Log: shapefil.h,v $
39  * Revision 1.51  2011-07-24 05:59:25  fwarmerdam
40  * minimize use of CPLError in favor of SAHooks.Error()
41  *
42  * Revision 1.50  2011-05-13 17:35:17  fwarmerdam
43  * added DBFReorderFields() and DBFAlterFields() functions (from Even)
44  *
45  * Revision 1.49  2011-04-16 14:38:21  fwarmerdam
46  * avoid warnings with gcc on SHP_CVSID
47  *
48  * Revision 1.48  2010-08-27 23:42:52  fwarmerdam
49  * add SHPAPI_CALL attribute in code
50  *
51  * Revision 1.47  2010-01-28 11:34:34  fwarmerdam
52  * handle the shape file length limits more gracefully (#3236)
53  *
54  * Revision 1.46  2008-11-12 14:28:15  fwarmerdam
55  * DBFCreateField() now works on files with records
56  *
57  * Revision 1.45  2008/11/11 17:47:10  fwarmerdam
58  * added DBFDeleteField() function
59  *
60  * Revision 1.44  2008/01/16 20:05:19  bram
61  * Add file hooks that accept UTF-8 encoded filenames on some platforms.  Use SASetupUtf8Hooks
62  *  tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability.  Currently, this
63  *  is only available on the Windows platform that decodes the UTF-8 filenames to wide
64  *  character strings and feeds them to _wfopen and _wremove.
65  *
66  * Revision 1.43  2008/01/10 16:35:30  fwarmerdam
67  * avoid _ prefix on #defined symbols (bug 1840)
68  *
69  * Revision 1.42  2007/12/18 18:28:14  bram
70  * - create hook for client specific atof (bugzilla ticket 1615)
71  * - check for NULL handle before closing cpCPG file, and close after reading.
72  *
73  * Revision 1.41  2007/12/15 20:25:32  bram
74  * dbfopen.c now reads the Code Page information from the DBF file, and exports
75  * this information as a string through the DBFGetCodePage function.  This is
76  * either the number from the LDID header field ("LDID/<number>") or as the
77  * content of an accompanying .CPG file.  When creating a DBF file, the code can
78  * be set using DBFCreateEx.
79  *
80  * Revision 1.40  2007/12/06 07:00:25  fwarmerdam
81  * dbfopen now using SAHooks for fileio
82  *
83  * Revision 1.39  2007/12/04 20:37:56  fwarmerdam
84  * preliminary implementation of hooks api for io and errors
85  *
86  * Revision 1.38  2007/11/21 22:39:56  fwarmerdam
87  * close shx file in readonly mode (GDAL #1956)
88  *
89  * Revision 1.37  2007/10/27 03:31:14  fwarmerdam
90  * limit default depth of tree to 12 levels (gdal ticket #1594)
91  *
92  * Revision 1.36  2007/09/10 23:33:15  fwarmerdam
93  * Upstreamed support for visibility flag in SHPAPI_CALL for the needs
94  * of GDAL (gdal ticket #1810).
95  *
96  * Revision 1.35  2007/09/03 19:48:10  fwarmerdam
97  * move DBFReadAttribute() static dDoubleField into dbfinfo
98  *
99  * Revision 1.34  2006/06/17 15:33:32  fwarmerdam
100  * added pszWorkField - bug 1202 (rso)
101  *
102  * Revision 1.33  2006/02/15 01:14:30  fwarmerdam
103  * added DBFAddNativeFieldType
104  *
105  * Revision 1.32  2006/01/26 15:07:32  fwarmerdam
106  * add bMeasureIsUsed flag from Craig Bruce: Bug 1249
107  *
108  * Revision 1.31  2006/01/05 01:27:27  fwarmerdam
109  * added dbf deletion mark/fetch
110  *
111  * Revision 1.30  2005/01/03 22:30:13  fwarmerdam
112  * added support for saved quadtrees
113  *
114  * Revision 1.29  2004/09/26 20:09:35  fwarmerdam
115  * avoid rcsid warnings
116  *
117  * Revision 1.28  2003/12/29 06:02:18  fwarmerdam
118  * added cpl_error.h option
119  *
120  * Revision 1.27  2003/04/21 18:30:37  warmerda
121  * added header write/update public methods
122  *
123  * Revision 1.26  2002/09/29 00:00:08  warmerda
124  * added FTLogical and logical attribute read/write calls
125  *
126  * Revision 1.25  2002/05/07 13:46:30  warmerda
127  * added DBFWriteAttributeDirectly().
128  *
129  * Revision 1.24  2002/04/10 16:59:54  warmerda
130  * added SHPRewindObject
131  *
132  * Revision 1.23  2002/01/15 14:36:07  warmerda
133  * updated email address
134  *
135  * Revision 1.22  2002/01/15 14:32:00  warmerda
136  * try to improve SHPAPI_CALL docs
137  */
138 
139 #define _FILE_OFFSET_BITS 64
140 #include <stdio.h>
141 #include <sys/types.h>
142 
143 #ifdef USE_DBMALLOC
144 #include <dbmalloc.h>
145 #endif
146 
147 #ifdef __cplusplus
148 extern "C" {
149 #endif
150 
151 /************************************************************************/
152 /*                        Configuration options.                        */
153 /************************************************************************/
154 
155 /* -------------------------------------------------------------------- */
156 /*      Should the DBFReadStringAttribute() strip leading and           */
157 /*      trailing white space?                                           */
158 /* -------------------------------------------------------------------- */
159 #define TRIM_DBF_WHITESPACE
160 
161 /* -------------------------------------------------------------------- */
162 /*      Should we write measure values to the Multipatch object?        */
163 /*      Reportedly ArcView crashes if we do write it, so for now it     */
164 /*      is disabled.                                                    */
165 /* -------------------------------------------------------------------- */
166 #define DISABLE_MULTIPATCH_MEASURE
167 
168 /* -------------------------------------------------------------------- */
169 /*      SHPAPI_CALL                                                     */
170 /*                                                                      */
171 /*      The following two macros are present to allow forcing           */
172 /*      various calling conventions on the Shapelib API.                */
173 /*                                                                      */
174 /*      To force __stdcall conventions (needed to call Shapelib         */
175 /*      from Visual Basic and/or Dephi I believe) the makefile could    */
176 /*      be modified to define:                                          */
177 /*                                                                      */
178 /*        /DSHPAPI_CALL=__stdcall                                       */
179 /*                                                                      */
180 /*      If it is desired to force export of the Shapelib API without    */
181 /*      using the shapelib.def file, use the following definition.      */
182 /*                                                                      */
183 /*        /DSHAPELIB_DLLEXPORT                                          */
184 /*                                                                      */
185 /*      To get both at once it will be necessary to hack this           */
186 /*      include file to define:                                         */
187 /*                                                                      */
188 /*        #define SHPAPI_CALL __declspec(dllexport) __stdcall           */
189 /*        #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall        */
190 /*                                                                      */
191 /*      The complexity of the situtation is partly caused by the        */
192 /*      peculiar requirement of Visual C++ that __stdcall appear        */
193 /*      after any "*"'s in the return value of a function while the     */
194 /*      __declspec(dllexport) must appear before them.                  */
195 /* -------------------------------------------------------------------- */
196 
197 #ifdef SHAPELIB_DLLEXPORT
198 #  define SHPAPI_CALL __declspec(dllexport)
199 #  define SHPAPI_CALL1(x)  __declspec(dllexport) x
200 #endif
201 
202 #ifndef SHPAPI_CALL
203 #  if defined(USE_GCC_VISIBILITY_FLAG)
204 #    define SHPAPI_CALL     __attribute__ ((visibility("default")))
205 #    define SHPAPI_CALL1(x) __attribute__ ((visibility("default")))     x
206 #  else
207 #    define SHPAPI_CALL
208 #  endif
209 #endif
210 
211 #ifndef SHPAPI_CALL1
212 #  define SHPAPI_CALL1(x)      x SHPAPI_CALL
213 #endif
214 
215 /* -------------------------------------------------------------------- */
216 /*      Macros for controlling CVSID and ensuring they don't appear     */
217 /*      as unreferenced variables resulting in lots of warnings.        */
218 /* -------------------------------------------------------------------- */
219 #ifndef DISABLE_CVSID
220 #  if defined(__GNUC__) && __GNUC__ >= 4
221 #    define SHP_CVSID(string)     static char cpl_cvsid[] __attribute__((used)) = string;
222 #  else
223 #    define SHP_CVSID(string)     static char cpl_cvsid[] = string; \
224 static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : cpl_cvsid ); }
225 #  endif
226 #else
227 #  define SHP_CVSID(string)
228 #endif
229 
230 /* -------------------------------------------------------------------- */
231 /*      On some platforms, additional file IO hooks are defined that    */
232 /*      UTF-8 encoded filenames Unicode filenames                       */
233 /* -------------------------------------------------------------------- */
234 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
235 #	define SHPAPI_WINDOWS
236 #	define SHPAPI_UTF8_HOOKS
237 #endif
238 
239 /* -------------------------------------------------------------------- */
240 /*      IO/Error hook functions.                                        */
241 /* -------------------------------------------------------------------- */
242 typedef int *SAFile;
243 
244 #ifdef HAVE_SEEKO
245 #	ifndef SAOffset
246 	typedef off_t SAOffset;
247 #	endif
248 #else
249 #	ifndef SAOffset
250 	typedef unsigned long SAOffset;
251 #	endif
252 #endif
253 
254 typedef struct {
255     SAFile     (*FOpen) ( const char *filename, const char *access);
256     SAOffset   (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file);
257     SAOffset   (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file);
258     SAOffset   (*FSeek) ( SAFile file, SAOffset offset, int whence );
259     SAOffset   (*FTell) ( SAFile file );
260     int        (*FFlush)( SAFile file );
261     int        (*FClose)( SAFile file );
262     int        (*Remove) ( const char *filename );
263 
264     void       (*Error) ( const char *message );
265     double     (*Atof)  ( const char *str );
266 } SAHooks;
267 
268 void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks );
269 #ifdef SHPAPI_UTF8_HOOKS
270 void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks );
271 #endif
272 
273 /************************************************************************/
274 /*                             SHP Support.                             */
275 /************************************************************************/
276 typedef	struct
277 {
278     SAHooks sHooks;
279 
280     SAFile      fpSHP;
281     SAFile 	fpSHX;
282 
283     int		nShapeType;				/* SHPT_* */
284 
285     unsigned int 	nFileSize;				/* SHP file */
286 
287     int         nRecords;
288     int		nMaxRecords;
289     unsigned int		*panRecOffset;
290     unsigned int		*panRecSize;
291 
292     double	adBoundsMin[4];
293     double	adBoundsMax[4];
294 
295     int		bUpdated;
296 
297     unsigned char *pabyRec;
298     int         nBufSize;
299 } SHPInfo;
300 
301 typedef SHPInfo * SHPHandle;
302 
303 /* -------------------------------------------------------------------- */
304 /*      Shape types (nSHPType)                                          */
305 /* -------------------------------------------------------------------- */
306 #define SHPT_NULL	0
307 #define SHPT_POINT	1
308 #define SHPT_ARC	3
309 #define SHPT_POLYGON	5
310 #define SHPT_MULTIPOINT	8
311 #define SHPT_POINTZ	11
312 #define SHPT_ARCZ	13
313 #define SHPT_POLYGONZ	15
314 #define SHPT_MULTIPOINTZ 18
315 #define SHPT_POINTM	21
316 #define SHPT_ARCM	23
317 #define SHPT_POLYGONM	25
318 #define SHPT_MULTIPOINTM 28
319 #define SHPT_MULTIPATCH 31
320 
321 
322 /* -------------------------------------------------------------------- */
323 /*      Part types - everything but SHPT_MULTIPATCH just uses           */
324 /*      SHPP_RING.                                                      */
325 /* -------------------------------------------------------------------- */
326 
327 #define SHPP_TRISTRIP	0
328 #define SHPP_TRIFAN	1
329 #define SHPP_OUTERRING	2
330 #define SHPP_INNERRING	3
331 #define SHPP_FIRSTRING	4
332 #define SHPP_RING	5
333 
334 /* -------------------------------------------------------------------- */
335 /*      SHPObject - represents on shape (without attributes) read       */
336 /*      from the .shp file.                                             */
337 /* -------------------------------------------------------------------- */
338 typedef struct
339 {
340     int		nSHPType;
341 
342     int		nShapeId; /* -1 is unknown/unassigned */
343 
344     int		nParts;
345     int		*panPartStart;
346     int		*panPartType;
347 
348     int		nVertices;
349     double	*padfX;
350     double	*padfY;
351     double	*padfZ;
352     double	*padfM;
353 
354     double	dfXMin;
355     double	dfYMin;
356     double	dfZMin;
357     double	dfMMin;
358 
359     double	dfXMax;
360     double	dfYMax;
361     double	dfZMax;
362     double	dfMMax;
363 
364     int		bMeasureIsUsed;
365 } SHPObject;
366 
367 /* -------------------------------------------------------------------- */
368 /*      SHP API Prototypes                                              */
369 /* -------------------------------------------------------------------- */
370 
371 /* If pszAccess is read-only, the fpSHX field of the returned structure */
372 /* will be NULL as it is not necessary to keep the SHX file open */
373 SHPHandle SHPAPI_CALL
374       SHPOpen( const char * pszShapeFile, const char * pszAccess );
375 SHPHandle SHPAPI_CALL
376       SHPOpenLL( const char *pszShapeFile, const char *pszAccess,
377                  SAHooks *psHooks );
378 SHPHandle SHPAPI_CALL
379       SHPCreate( const char * pszShapeFile, int nShapeType );
380 SHPHandle SHPAPI_CALL
381       SHPCreateLL( const char * pszShapeFile, int nShapeType,
382                    SAHooks *psHooks );
383 void SHPAPI_CALL
384       SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
385                   double * padfMinBound, double * padfMaxBound );
386 
387 SHPObject SHPAPI_CALL1(*)
388       SHPReadObject( SHPHandle hSHP, int iShape );
389 int SHPAPI_CALL
390       SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject );
391 
392 void SHPAPI_CALL
393       SHPDestroyObject( SHPObject * psObject );
394 void SHPAPI_CALL
395       SHPComputeExtents( SHPObject * psObject );
396 SHPObject SHPAPI_CALL1(*)
397       SHPCreateObject( int nSHPType, int nShapeId, int nParts,
398                        const int * panPartStart, const int * panPartType,
399                        int nVertices,
400                        const double * padfX, const double * padfY,
401                        const double * padfZ, const double * padfM );
402 SHPObject SHPAPI_CALL1(*)
403       SHPCreateSimpleObject( int nSHPType, int nVertices,
404                              const double * padfX,
405                              const double * padfY,
406                              const double * padfZ );
407 
408 int SHPAPI_CALL
409       SHPRewindObject( SHPHandle hSHP, SHPObject * psObject );
410 
411 void SHPAPI_CALL SHPClose( SHPHandle hSHP );
412 void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP );
413 
414 const char SHPAPI_CALL1(*)
415       SHPTypeName( int nSHPType );
416 const char SHPAPI_CALL1(*)
417       SHPPartTypeName( int nPartType );
418 
419 /* -------------------------------------------------------------------- */
420 /*      Shape quadtree indexing API.                                    */
421 /* -------------------------------------------------------------------- */
422 
423 /* this can be two or four for binary or quad tree */
424 #define MAX_SUBNODE	4
425 
426 /* upper limit of tree levels for automatic estimation */
427 #define MAX_DEFAULT_TREE_DEPTH 12
428 
429 typedef struct shape_tree_node
430 {
431     /* region covered by this node */
432     double	adfBoundsMin[4];
433     double	adfBoundsMax[4];
434 
435     /* list of shapes stored at this node.  The papsShapeObj pointers
436        or the whole list can be NULL */
437     int		nShapeCount;
438     int		*panShapeIds;
439     SHPObject   **papsShapeObj;
440 
441     int		nSubNodes;
442     struct shape_tree_node *apsSubNode[MAX_SUBNODE];
443 
444 } SHPTreeNode;
445 
446 typedef struct
447 {
448     SHPHandle   hSHP;
449 
450     int		nMaxDepth;
451     int		nDimension;
452     int         nTotalCount;
453 
454     SHPTreeNode	*psRoot;
455 } SHPTree;
456 
457 SHPTree SHPAPI_CALL1(*)
458       SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth,
459                      double *padfBoundsMin, double *padfBoundsMax );
460 void    SHPAPI_CALL
461       SHPDestroyTree( SHPTree * hTree );
462 
463 int	SHPAPI_CALL
464       SHPWriteTree( SHPTree *hTree, const char * pszFilename );
465 
466 int	SHPAPI_CALL
467       SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject );
468 int	SHPAPI_CALL
469       SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject );
470 int	SHPAPI_CALL
471       SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId );
472 
473 void 	SHPAPI_CALL
474       SHPTreeTrimExtraNodes( SHPTree * hTree );
475 
476 int    SHPAPI_CALL1(*)
477       SHPTreeFindLikelyShapes( SHPTree * hTree,
478                                double * padfBoundsMin,
479                                double * padfBoundsMax,
480                                int * );
481 int     SHPAPI_CALL
482       SHPCheckBoundsOverlap( double *, double *, double *, double *, int );
483 
484 int SHPAPI_CALL1(*)
485 SHPSearchDiskTree( FILE *fp,
486                    double *padfBoundsMin, double *padfBoundsMax,
487                    int *pnShapeCount );
488 
489 /************************************************************************/
490 /*                             DBF Support.                             */
491 /************************************************************************/
492 typedef	struct
493 {
494     SAHooks sHooks;
495 
496     SAFile	fp;
497 
498     int         nRecords;
499 
500     int		nRecordLength;
501     int		nHeaderLength;
502     int		nFields;
503     int		*panFieldOffset;
504     int		*panFieldSize;
505     int		*panFieldDecimals;
506     char	*pachFieldType;
507 
508     char	*pszHeader;
509 
510     int		nCurrentRecord;
511     int		bCurrentRecordModified;
512     char	*pszCurrentRecord;
513 
514     int         nWorkFieldLength;
515     char        *pszWorkField;
516 
517     int		bNoHeader;
518     int		bUpdated;
519 
520     double      dfDoubleField;
521 
522     int         iLanguageDriver;
523     char        *pszCodePage;
524 } DBFInfo;
525 
526 typedef DBFInfo * DBFHandle;
527 
528 typedef enum {
529   FTString,
530   FTInteger,
531   FTDouble,
532   FTLogical,
533   FTDate,
534   FTInvalid
535 } DBFFieldType;
536 
537 #define XBASE_FLDHDR_SZ       32
538 
539 
540 DBFHandle SHPAPI_CALL
541       DBFOpen( const char * pszDBFFile, const char * pszAccess );
542 DBFHandle SHPAPI_CALL
543       DBFOpenLL( const char * pszDBFFile, const char * pszAccess,
544                  SAHooks *psHooks );
545 DBFHandle SHPAPI_CALL
546       DBFCreate( const char * pszDBFFile );
547 DBFHandle SHPAPI_CALL
548       DBFCreateEx( const char * pszDBFFile, const char * pszCodePage );
549 DBFHandle SHPAPI_CALL
550       DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks );
551 
552 int	SHPAPI_CALL
553       DBFGetFieldCount( DBFHandle psDBF );
554 int	SHPAPI_CALL
555       DBFGetRecordCount( DBFHandle psDBF );
556 int	SHPAPI_CALL
557       DBFAddField( DBFHandle hDBF, const char * pszFieldName,
558                    DBFFieldType eType, int nWidth, int nDecimals );
559 
560 int	SHPAPI_CALL
561       DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName,
562                              char chType, int nWidth, int nDecimals );
563 
564 int	SHPAPI_CALL
565       DBFDeleteField( DBFHandle hDBF, int iField );
566 
567 int SHPAPI_CALL
568       DBFReorderFields( DBFHandle psDBF, int* panMap );
569 
570 int SHPAPI_CALL
571       DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName,
572                          char chType, int nWidth, int nDecimals );
573 
574 DBFFieldType SHPAPI_CALL
575       DBFGetFieldInfo( DBFHandle psDBF, int iField,
576                        char * pszFieldName, int * pnWidth, int * pnDecimals );
577 
578 int SHPAPI_CALL
579       DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName);
580 
581 int 	SHPAPI_CALL
582       DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
583 double 	SHPAPI_CALL
584       DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
585 const char SHPAPI_CALL1(*)
586       DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
587 const char SHPAPI_CALL1(*)
588       DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField );
589 int     SHPAPI_CALL
590       DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
591 
592 int SHPAPI_CALL
593       DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
594                                 int nFieldValue );
595 int SHPAPI_CALL
596       DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
597                                double dFieldValue );
598 int SHPAPI_CALL
599       DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
600                                const char * pszFieldValue );
601 int SHPAPI_CALL
602      DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
603 
604 int SHPAPI_CALL
605      DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField,
606 			       const char lFieldValue);
607 int SHPAPI_CALL
608      DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
609                                void * pValue );
610 const char SHPAPI_CALL1(*)
611       DBFReadTuple(DBFHandle psDBF, int hEntity );
612 int SHPAPI_CALL
613       DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple );
614 
615 int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape );
616 int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape,
617                                       int bIsDeleted );
618 
619 DBFHandle SHPAPI_CALL
620       DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename );
621 
622 void	SHPAPI_CALL
623       DBFClose( DBFHandle hDBF );
624 void    SHPAPI_CALL
625       DBFUpdateHeader( DBFHandle hDBF );
626 char    SHPAPI_CALL
627       DBFGetNativeFieldType( DBFHandle hDBF, int iField );
628 
629 const char SHPAPI_CALL1(*)
630       DBFGetCodePage(DBFHandle psDBF );
631 
632 #ifdef __cplusplus
633 }
634 #endif
635 
636 #endif /* ndef SHAPEFILE_H_INCLUDED */
637