PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ SHPCreateLL()

SHPHandle SHPAPI_CALL SHPCreateLL ( const char *  pszLayer,
int  nShapeType,
SAHooks psHooks 
)

Definition at line 846 of file shpopen.c.

848{
849 char *pszBasename = NULL, *pszFullname = NULL;
850 int i;
851 SAFile fpSHP = NULL, fpSHX = NULL;
852 uchar abyHeader[100];
853 int32 i32;
854 double dValue;
855
856/* -------------------------------------------------------------------- */
857/* Establish the byte order on this system. */
858/* -------------------------------------------------------------------- */
859 i = 1;
860 if( *((uchar *) &i) == 1 )
862 else
864
865/* -------------------------------------------------------------------- */
866/* Compute the base (layer) name. If there is any extension */
867/* on the passed in filename we will strip it off. */
868/* -------------------------------------------------------------------- */
869 pszBasename = (char *) malloc(strlen(pszLayer)+5);
870 strcpy( pszBasename, pszLayer );
871 for( i = strlen(pszBasename)-1;
872 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
873 && pszBasename[i] != '\\';
874 i-- ) {}
875
876 if( pszBasename[i] == '.' )
877 pszBasename[i] = '\0';
878
879/* -------------------------------------------------------------------- */
880/* Open the two files so we can write their headers. */
881/* -------------------------------------------------------------------- */
882 pszFullname = (char *) malloc(strlen(pszBasename) + 5);
883 sprintf( pszFullname, "%s.shp", pszBasename );
884 fpSHP = psHooks->FOpen(pszFullname, "wb" );
885 if( fpSHP == NULL )
886 {
887 psHooks->Error( "Failed to create file .shp file." );
888 goto error;
889 }
890
891 sprintf( pszFullname, "%s.shx", pszBasename );
892 fpSHX = psHooks->FOpen(pszFullname, "wb" );
893 if( fpSHX == NULL )
894 {
895 psHooks->Error( "Failed to create file .shx file." );
896 goto error;
897 }
898
899 free( pszFullname ); pszFullname = NULL;
900 free( pszBasename ); pszBasename = NULL;
901
902/* -------------------------------------------------------------------- */
903/* Prepare header block for .shp file. */
904/* -------------------------------------------------------------------- */
905 for( i = 0; i < 100; i++ )
906 abyHeader[i] = 0;
907
908 abyHeader[2] = 0x27; /* magic cookie */
909 abyHeader[3] = 0x0a;
910
911 i32 = 50; /* file size */
912 ByteCopy( &i32, abyHeader+24, 4 );
913 if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
914
915 i32 = 1000; /* version */
916 ByteCopy( &i32, abyHeader+28, 4 );
917 if( bBigEndian ) SwapWord( 4, abyHeader+28 );
918
919 i32 = nShapeType; /* shape type */
920 ByteCopy( &i32, abyHeader+32, 4 );
921 if( bBigEndian ) SwapWord( 4, abyHeader+32 );
922
923 dValue = 0.0; /* set bounds */
924 ByteCopy( &dValue, abyHeader+36, 8 );
925 ByteCopy( &dValue, abyHeader+44, 8 );
926 ByteCopy( &dValue, abyHeader+52, 8 );
927 ByteCopy( &dValue, abyHeader+60, 8 );
928
929/* -------------------------------------------------------------------- */
930/* Write .shp file header. */
931/* -------------------------------------------------------------------- */
932 if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 )
933 {
934 psHooks->Error( "Failed to write .shp header." );
935 goto error;
936 }
937
938/* -------------------------------------------------------------------- */
939/* Prepare, and write .shx file header. */
940/* -------------------------------------------------------------------- */
941 i32 = 50; /* file size */
942 ByteCopy( &i32, abyHeader+24, 4 );
943 if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
944
945 if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 )
946 {
947 psHooks->Error( "Failed to write .shx header." );
948 goto error;
949 }
950
951/* -------------------------------------------------------------------- */
952/* Close the files, and then open them as regular existing files. */
953/* -------------------------------------------------------------------- */
954 psHooks->FClose( fpSHP );
955 psHooks->FClose( fpSHX );
956
957 return( SHPOpenLL( pszLayer, "r+b", psHooks ) );
958
959error:
960 if (pszFullname) free(pszFullname);
961 if (pszBasename) free(pszBasename);
962 if (fpSHP) psHooks->FClose( fpSHP );
963 if (fpSHX) psHooks->FClose( fpSHX );
964 return NULL;
965}
void * malloc(YYSIZE_T)
void free(void *)
int * SAFile
Definition shapefil.h:242
SHPHandle SHPAPI_CALL SHPOpenLL(const char *pszLayer, const char *pszAccess, SAHooks *psHooks)
Definition shpopen.c:482
static int bBigEndian
Definition shpopen.c:293
unsigned int int32
Definition shpopen.c:273
unsigned char uchar
Definition shpopen.c:268
static void SwapWord(int length, void *wordP)
Definition shpopen.c:302
#define TRUE
Definition shpopen.c:278
#define FALSE
Definition shpopen.c:277
#define ByteCopy(a, b, c)
Definition shpopen.c:281
void(* Error)(const char *message)
Definition shapefil.h:264
SAFile(* FOpen)(const char *filename, const char *access)
Definition shapefil.h:255
SAOffset(* FWrite)(void *p, SAOffset size, SAOffset nmemb, SAFile file)
Definition shapefil.h:257
int(* FClose)(SAFile file)
Definition shapefil.h:261

References bBigEndian, ByteCopy, SAHooks::Error, FALSE, SAHooks::FClose, SAHooks::FOpen, free(), SAHooks::FWrite, malloc(), SHPOpenLL(), SwapWord(), and TRUE.

Referenced by SHPCreate().

Here is the call graph for this function:
Here is the caller graph for this function: