|
From: <md...@us...> - 2003-05-22 19:47:52
|
Update of /cvsroot/tdbf/tdbf
In directory sc8-pr-cvs1:/tmp/cvs-serv21618
Modified Files:
Dbf.pas Dbf_DbfFile.pas
Log Message:
fixed: codepage problems with dbase3
Index: Dbf.pas
===================================================================
RCS file: /cvsroot/tdbf/tdbf/Dbf.pas,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** Dbf.pas 16 May 2003 06:50:57 -0000 1.22
--- Dbf.pas 22 May 2003 19:47:49 -0000 1.23
***************
*** 1081,1086 ****
// check codepage settings
! codePage := FDbfFile.CodePage;
! // if no codepage, then use default codepage
if codePage = 0 then
codePage := DbfGlobals.DefaultOpenCodePage;
--- 1081,1085 ----
// check codepage settings
! codePage := FDbfFile.UseCodePage;
if codePage = 0 then
codePage := DbfGlobals.DefaultOpenCodePage;
***************
*** 1142,1146 ****
function TDbf.GetCodePage: Cardinal;
begin
! Result := FDbfFile.CodePage;
end;
--- 1141,1145 ----
function TDbf.GetCodePage: Cardinal;
begin
! Result := FDbfFile.UseCodePage;
end;
***************
*** 1659,1665 ****
begin
FromCP := GetACP;
! ToCP := FDbfFile.CodePage;
end else begin
! FromCP := FDbfFile.CodePage;
ToCP := GetACP;
end;
--- 1658,1664 ----
begin
FromCP := GetACP;
! ToCP := FDbfFile.UseCodePage;
end else begin
! FromCP := FDbfFile.UseCodePage;
ToCP := GetACP;
end;
Index: Dbf_DbfFile.pas
===================================================================
RCS file: /cvsroot/tdbf/tdbf/Dbf_DbfFile.pas,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** Dbf_DbfFile.pas 22 May 2003 17:13:56 -0000 1.12
--- Dbf_DbfFile.pas 22 May 2003 19:47:49 -0000 1.13
***************
*** 53,56 ****
--- 53,58 ----
FLockFieldLen: DWORD;
FLockUserLen: DWORD;
+ FFileCodePage: Cardinal;
+ FUseCodePage: Cardinal;
FCountUse: Integer;
FCurIndex: Integer;
***************
*** 71,76 ****
function GetLanguageId: Integer;
function GetLanguageStr: string;
- function GetCodePage: Cardinal;
- // function GetLocale: Cardinal;
function GetUseFloatFields: Boolean;
procedure SetUseFloatFields(NewUse: Boolean);
--- 73,76 ----
***************
*** 117,122 ****
property LanguageId: Integer read GetLanguageId;
property LanguageStr: string read GetLanguageStr;
! property CodePage: Cardinal read GetCodePage;
! // property Locale: Cardinal read GetLocale;
property DbfVersion: xBaseVersion read FDbfVersion write FDbfVersion;
property PrevBuffer: PChar read FPrevBuffer;
--- 117,122 ----
property LanguageId: Integer read GetLanguageId;
property LanguageStr: string read GetLanguageStr;
! property FileCodePage: Cardinal read FFileCodePage;
! property UseCodePage: Cardinal read FUseCodePage;
property DbfVersion: xBaseVersion read FDbfVersion write FDbfVersion;
property PrevBuffer: PChar read FPrevBuffer;
***************
*** 325,328 ****
--- 325,329 ----
I: Integer;
deleteLink: Boolean;
+ LangStr: PChar;
begin
// check if not already opened
***************
*** 384,387 ****
--- 385,423 ----
WriteHeader; // Correct it
end;
+ // determine codepage
+ if FDbfVersion >= xBaseVII then
+ begin
+ // cache language str
+ LangStr := @PAfterHdrVII(PChar(Header) + SizeOf(rDbfHdr)).LanguageDriverName;
+ // VdBase 7 Language strings
+ // 'DBWIN...' -> Charset 1252 (ansi)
+ // 'DB999...' -> Code page 999, 9 any digit
+ // 'DBHEBREW' -> Code page 1255 ??
+ // 'FOX..999' -> Code page 999, 9 any digit
+ // 'FOX..WIN' -> Charset 1252 (ansi)
+ if (LangStr[0] = 'D') and (LangStr[1] = 'B') then
+ if StrLComp(LangStr+2, 'WIN', 3) = 0 then
+ FFileCodePage := 1252
+ else
+ if StrLComp(LangStr+2, 'HEBREW', 6) = 0 then
+ FFileCodePage := 1255
+ else
+ FFileCodePage := GetIntFromStrLength(LangStr+2, 3, 0)
+ else
+ if StrLComp(LangStr, 'FOX', 3) = 0 then
+ if StrLComp(LangStr+5, 'WIN', 3) = 0 then
+ FFileCodePage := 1252
+ else
+ FFileCodePage := GetIntFromStrLength(LangStr+5, 3, 0)
+ else
+ FFileCodePage := 0;
+ end else begin
+ // FDbfVersion <= xBaseV
+ FFileCodePage := LangId_To_CodePage[PDbfHdr(Header).Language];
+ end;
+ // determine used codepage, if no codepage, then use default codepage
+ FUseCodePage := FFileCodePage;
+ if FUseCodePage = 0 then
+ FUseCodePage := DbfGlobals.DefaultOpenCodePage;
// get list of fields
ConstructFieldDefs;
***************
*** 416,420 ****
FMdxFile.AutoCreate := false;
FMdxFile.OnLocaleError := FOnLocaleError;
! FMdxFile.CodePage := CodePage;
FMdxFile.Open;
// is index ready for use?
--- 452,456 ----
FMdxFile.AutoCreate := false;
FMdxFile.OnLocaleError := FOnLocaleError;
! FMdxFile.CodePage := UseCodePage;
FMdxFile.Open;
// is index ready for use?
***************
*** 866,912 ****
end;
- function TDbfFile.GetCodePage: Cardinal;
- var
- LangStr: PChar;
- begin
- if FDbfVersion >= xBaseVII then
- begin
- // cache language str
- LangStr := @PAfterHdrVII(PChar(Header) + SizeOf(rDbfHdr)).LanguageDriverName;
- // VdBase 7 Language strings
- // 'DBWIN...' -> Charset 1252 (ansi)
- // 'DB999...' -> Code page 999, 9 any digit
- // 'DBHEBREW' -> Code page 1255 ??
- // 'FOX..999' -> Code page 999, 9 any digit
- // 'FOX..WIN' -> Charset 1252 (ansi)
- if (LangStr[0] = 'D') and (LangStr[1] = 'B') then
- if StrLComp(LangStr+2, 'WIN', 3) = 0 then
- Result := 1252
- else
- if StrLComp(LangStr+2, 'HEBREW', 6) = 0 then
- Result := 1255
- else
- Result := GetIntFromStrLength(LangStr+2, 3, 0)
- else
- if StrLComp(LangStr, 'FOX', 3) = 0 then
- if StrLComp(LangStr+5, 'WIN', 3) = 0 then
- Result := 1252
- else
- Result := GetIntFromStrLength(LangStr+5, 3, 0)
- else
- Result := 0;
- end else begin
- // FDbfVersion <= xBaseV
- Result := LangId_To_CodePage[PDbfHdr(Header).Language];
- end;
- end;
-
- {
- function TDbfFile.GetLocale: Cardinal;
- begin
- Result := 0;
- end;
- }
-
{
I fill the holes with the last records.
--- 902,905 ----
***************
*** 1672,1676 ****
lIndexFile.Mode := IndexOpenMode[Mode, CreateIndex];
lIndexFile.AutoCreate := CreateIndex or (Length(IndexField) > 0);
! lIndexFile.CodePage := CodePage;
lIndexFile.OnLocaleError := FOnLocaleError;
lIndexFile.Open;
--- 1665,1669 ----
lIndexFile.Mode := IndexOpenMode[Mode, CreateIndex];
lIndexFile.AutoCreate := CreateIndex or (Length(IndexField) > 0);
! lIndexFile.CodePage := UseCodePage;
lIndexFile.OnLocaleError := FOnLocaleError;
lIndexFile.Open;
|