390{
393 unsigned char *pabyBuf;
394 int nFields, nHeadLen, iField;
395 char *pszFullname;
396 int nBufSize = 500;
397 int nLenWithoutExtension;
398
399
400
401
402 if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0
403 && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0
404 && strcmp(pszAccess,"r+b") != 0 )
406
407 if( strcmp(pszAccess,"r") == 0 )
408 pszAccess = "rb";
409
410 if( strcmp(pszAccess,"r+") == 0 )
411 pszAccess = "rb+";
412
413
414
415
416
421 memcpy(pszFullname, pszFilename, nLenWithoutExtension);
422 memcpy(pszFullname + nLenWithoutExtension, ".dbf", 5);
423
426 {
429 }
430 psDBF->
fp = psHooks->
FOpen( pszFullname, pszAccess );
432
434 {
435 memcpy(pszFullname + nLenWithoutExtension, ".DBF", 5);
437 }
438
439 memcpy(pszFullname + nLenWithoutExtension, ".cpg", 5);
440 pfCPG = psHooks->
FOpen( pszFullname,
"r" );
442 {
443 memcpy(pszFullname + nLenWithoutExtension, ".CPG", 5);
444 pfCPG = psHooks->
FOpen( pszFullname,
"r" );
445 }
446
448
450 {
452 if( pfCPG ) psHooks->
FClose( pfCPG );
454 }
455
459
460
461
462
465 {
471 }
472
474
476 pabyBuf[4]|(pabyBuf[5]<<8)|(pabyBuf[6]<<16)|((pabyBuf[7]&0x7f)<<24);
477
478 psDBF->
nHeaderLength = nHeadLen = pabyBuf[8]|(pabyBuf[9]<<8);
481
483 {
489 }
490
492
493
495
496
497
498
499
501 if( pfCPG )
502 {
503 size_t n;
504 memset( pabyBuf, 0, nBufSize);
505 psDBF->
sHooks.
FRead( pabyBuf, nBufSize - 1, 1, pfCPG );
507 if( n > 0 )
508 {
509 pabyBuf[n] = '\0';
512 }
514 }
516 {
520 }
521
522
523
524
525
528
532 {
539 }
540
545
546 for( iField = 0; iField < nFields; iField++ )
547 {
548 unsigned char *pabyFInfo;
549
552 {
554 break;
555 }
556
557 if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' )
558 {
561 }
562 else
563 {
566
567
568
569
570
571
572
573
574
575 }
576
578 if( iField == 0 )
580 else
583 }
584
585
589 {
592 }
593
595
597
598 return( psDBF );
599}
static void * SfRealloc(void *pMem, int nNewSize)
static int DBFGetLenWithoutExtension(const char *pszBasename)
#define STATIC_CAST(type, x)
#define HEADER_RECORD_TERMINATOR
#define REINTERPRET_CAST(type, x)
void SHPAPI_CALL DBFClose(DBFHandle psDBF)
void SHPAPI_CALL DBFSetLastModifiedDate(DBFHandle psDBF, int nYYSince1900, int nMM, int nDD)
void SHPAPI_CALL DBFSetWriteEndOfFileChar(DBFHandle psDBF, int bWriteFlag)
int bCurrentRecordModified
int bRequireNextWriteSeek
SAFile(* FOpen)(const char *filename, const char *access)
int(* FClose)(SAFile file)
SAOffset(* FRead)(void *p, SAOffset size, SAOffset nmemb, SAFile file)
SAOffset(* FSeek)(SAFile file, SAOffset offset, int whence)