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
419 memcpy(pszFullname, pszFilename, nLenWithoutExtension);
420 memcpy(pszFullname + nLenWithoutExtension, ".dbf", 5);
421
423 psDBF->
fp = psHooks->
FOpen( pszFullname, pszAccess );
425
427 {
428 memcpy(pszFullname + nLenWithoutExtension, ".DBF", 5);
430 }
431
432 memcpy(pszFullname + nLenWithoutExtension, ".cpg", 5);
433 pfCPG = psHooks->
FOpen( pszFullname,
"r" );
435 {
436 memcpy(pszFullname + nLenWithoutExtension, ".CPG", 5);
437 pfCPG = psHooks->
FOpen( pszFullname,
"r" );
438 }
439
441
443 {
445 if( pfCPG ) psHooks->
FClose( pfCPG );
447 }
448
452
453
454
455
458 {
464 }
465
467
469 pabyBuf[4]|(pabyBuf[5]<<8)|(pabyBuf[6]<<16)|((pabyBuf[7]&0x7f)<<24);
470
471 psDBF->
nHeaderLength = nHeadLen = pabyBuf[8]|(pabyBuf[9]<<8);
474
476 {
482 }
483
485
486
488
489
490
491
492
494 if( pfCPG )
495 {
496 size_t n;
497 memset( pabyBuf, 0, nBufSize);
498 psDBF->
sHooks.
FRead( pabyBuf, nBufSize - 1, 1, pfCPG );
500 if( n > 0 )
501 {
502 pabyBuf[n] = '\0';
505 }
507 }
509 {
513 }
514
515
516
517
518
521
525 {
532 }
533
538
539 for( iField = 0; iField < nFields; iField++ )
540 {
541 unsigned char *pabyFInfo;
542
545 {
547 break;
548 }
549
550 if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' )
551 {
554 }
555 else
556 {
559
560
561
562
563
564
565
566
567
568 }
569
571 if( iField == 0 )
573 else
576 }
577
578
582 {
585 }
586
588
590
591 return( psDBF );
592}
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)