645{
646 DBFHandle psDBF;
648 char *pszFullname, *pszBasename;
649 int i, ldid = -1;
650 char chZero = '\0';
651
652
653
654
655
656 pszBasename = (
char *)
malloc(strlen(pszFilename) + 5);
657 strcpy(pszBasename, pszFilename);
658 for (i = strlen(pszBasename) - 1;
659 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\';
660 i--)
661 {}
662
663 if (pszBasename[i] == '.')
664 pszBasename[i] = '\0';
665
666 pszFullname = (
char *)
malloc(strlen(pszBasename) + 5);
667 sprintf(pszFullname, "%s.dbf", pszBasename);
668
669
670
671
672 fp = psHooks->
FOpen(pszFullname,
"wb");
673 if (fp == NULL)
674 {
677 return (NULL);
678 }
679
680 psHooks->
FWrite(&chZero, 1, 1, fp);
682
683 fp = psHooks->
FOpen(pszFullname,
"rb+");
684 if (fp == NULL)
685 {
688 return (NULL);
689 }
690
691 sprintf(pszFullname, "%s.cpg", pszBasename);
692 if (pszCodePage != NULL)
693 {
694 if (strncmp(pszCodePage, "LDID/", 5) == 0)
695 {
696 ldid = atoi(pszCodePage + 5);
697 if (ldid > 255)
698 ldid = -1;
699 }
700 if (ldid < 0)
701 {
703 psHooks->
FWrite((
char *)pszCodePage, strlen(pszCodePage), 1, fpCPG);
705 }
706 }
707 if (pszCodePage == NULL || ldid >= 0)
708 {
709 psHooks->
Remove(pszFullname);
710 }
711
714
715
716
717
718 psDBF = (DBFHandle)calloc(1, sizeof(DBFInfo));
719
720 memcpy(&(psDBF->sHooks), psHooks,
sizeof(
SAHooks));
721 psDBF->fp = fp;
722 psDBF->nRecords = 0;
723 psDBF->nFields = 0;
724 psDBF->nRecordLength = 1;
725 psDBF->nHeaderLength = 33;
726
727 psDBF->panFieldOffset = NULL;
728 psDBF->panFieldSize = NULL;
729 psDBF->panFieldDecimals = NULL;
730 psDBF->pachFieldType = NULL;
731 psDBF->pszHeader = NULL;
732
733 psDBF->nCurrentRecord = -1;
734 psDBF->bCurrentRecordModified =
FALSE;
735 psDBF->pszCurrentRecord = NULL;
736
737 psDBF->bNoHeader =
TRUE;
738
739 psDBF->iLanguageDriver = ldid > 0 ? ldid : 0;
740 psDBF->pszCodePage = NULL;
741 if (pszCodePage)
742 {
743 psDBF->pszCodePage = (
char *)
malloc(strlen(pszCodePage) + 1);
744 strcpy(psDBF->pszCodePage, pszCodePage);
745 }
746
747 return (psDBF);
748}
SAFile(* FOpen)(const char *filename, const char *access)
SAOffset(* FWrite)(void *p, SAOffset size, SAOffset nmemb, SAFile file)
int(* Remove)(const char *filename)
int(* FClose)(SAFile file)