484{
485 char *pszFullname, *pszBasename;
487
489 int i;
490 double dValue;
491
492
493
494
495
496
497 if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0
498 || strcmp(pszAccess,"r+") == 0 )
499 pszAccess = "r+b";
500 else
501 pszAccess = "rb";
502
503
504
505
506 i = 1;
507 if( *((
uchar *) &i) == 1 )
509 else
511
512
513
514
516
519
520
521
522
523
524 pszBasename = (
char *)
malloc(strlen(pszLayer)+5);
525 strcpy( pszBasename, pszLayer );
526 for( i = strlen(pszBasename)-1;
527 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
528 && pszBasename[i] != '\\';
529 i-- ) {}
530
531 if( pszBasename[i] == '.' )
532 pszBasename[i] = '\0';
533
534
535
536
537
538 pszFullname = (
char *)
malloc(strlen(pszBasename) + 5);
539 sprintf( pszFullname, "%s.shp", pszBasename ) ;
541 if( psSHP->
fpSHP == NULL )
542 {
543 sprintf( pszFullname, "%s.SHP", pszBasename );
545 }
546
547 if( psSHP->
fpSHP == NULL )
548 {
549 char *pszMessage = (
char *)
malloc(strlen(pszBasename)*2+256);
550 sprintf( pszMessage, "Unable to open %s.shp or %s.SHP.",
551 pszBasename, pszBasename );
552 psHooks->
Error( pszMessage );
557 return( NULL );
558 }
559
560 sprintf( pszFullname, "%s.shx", pszBasename );
562 if( psSHP->
fpSHX == NULL )
563 {
564 sprintf( pszFullname, "%s.SHX", pszBasename );
566 }
567
568 if( psSHP->
fpSHX == NULL )
569 {
570 char *pszMessage = (
char *)
malloc(strlen(pszBasename)*2+256);
571 sprintf( pszMessage, "Unable to open %s.shx or %s.SHX.",
572 pszBasename, pszBasename );
573 psHooks->
Error( pszMessage );
575
580 return( NULL );
581 }
582
585
586
587
588
591
592 psSHP->
nFileSize = ((
unsigned int)pabyBuf[24] * 256 * 256 * 256
593 + (unsigned int)pabyBuf[25] * 256 * 256
594 + (unsigned int)pabyBuf[26] * 256
595 + (unsigned int)pabyBuf[27]) * 2;
596
597
598
599
601 || pabyBuf[0] != 0
602 || pabyBuf[1] != 0
603 || pabyBuf[2] != 0x27
604 || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) )
605 {
606 psSHP->
sHooks.
Error(
".shx file is unreadable, or corrupt." );
610
611 return( NULL );
612 }
613
614 psSHP->
nRecords = pabyBuf[27] + pabyBuf[26] * 256
615 + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256;
617
619
621 {
622 char szError[200];
623
624 sprintf( szError,
625 "Record count in .shp header is %d, which seems\n"
626 "unreasonable. Assuming header is corrupt.",
633
634 return( NULL );
635 }
636
637
638
639
641 memcpy( &dValue, pabyBuf+36, 8 );
643
645 memcpy( &dValue, pabyBuf+44, 8 );
647
649 memcpy( &dValue, pabyBuf+52, 8 );
651
653 memcpy( &dValue, pabyBuf+60, 8 );
655
657 memcpy( &dValue, pabyBuf+68, 8 );
659
661 memcpy( &dValue, pabyBuf+76, 8 );
663
665 memcpy( &dValue, pabyBuf+84, 8 );
667
669 memcpy( &dValue, pabyBuf+92, 8 );
671
673
674
675
676
677
679
685
688 pabyBuf == NULL)
689 {
690 char szError[200];
691
692 sprintf(szError,
693 "Not enough memory to allocate requested memory (nRecords=%d).\n"
694 "Probably broken SHP file",
701 if (pabyBuf)
free( pabyBuf );
703 return( NULL );
704 }
705
708 {
709 char szError[200];
710
711 sprintf( szError,
712 "Failed to read all values for %d records in .shx file.",
715
716
723
724 return( NULL );
725 }
726
727
728 if (strcmp(pszAccess, "rb") == 0)
729 {
732 }
733
734 for( i = 0; i < psSHP->
nRecords; i++ )
735 {
736 int32 nOffset, nLength;
737
738 memcpy( &nOffset, pabyBuf + i * 8, 4 );
740
741 memcpy( &nLength, pabyBuf + i * 8 + 4, 4 );
743
746 }
748
749 return( psSHP );
750}
static void SwapWord(int length, void *wordP)
void(* Error)(const char *message)
SAFile(* FOpen)(const char *filename, const char *access)
int(* FClose)(SAFile file)
SAOffset(* FRead)(void *p, SAOffset size, SAOffset nmemb, SAFile file)
unsigned int * panRecSize
unsigned int * panRecOffset