Browse Source

update to tdbf svn

git-svn-id: trunk@5873 -
micha 18 years ago
parent
commit
650bb51d31

+ 32 - 12
fcl/db/dbase/dbf.pas

@@ -258,7 +258,8 @@ type
     function  IsCursorOpen: Boolean; override; {virtual abstract}
     procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override; {virtual abstract}
     procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override; {virtual abstract}
-    procedure SetFieldData(Field: TField; Buffer: Pointer); overload; override; {virtual abstract}
+    procedure SetFieldData(Field: TField; Buffer: Pointer); 
+      {$ifdef SUPPORT_OVERLOAD} overload; {$endif} override; {virtual abstract}
 
     { virtual methods (mostly optionnal) }
     function  GetDataSource: TDataSource; {$ifndef VER1_0}override;{$endif}
@@ -288,7 +289,8 @@ type
     destructor Destroy; override;
 
     { abstract methods }
-    function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; override; {virtual abstract}
+    function GetFieldData(Field: TField; Buffer: Pointer): Boolean; 
+      {$ifdef SUPPORT_OVERLOAD} overload; {$endif} override; {virtual abstract}
     { virtual methods (mostly optionnal) }
     procedure Resync(Mode: TResyncMode); override;
     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; {virtual}
@@ -298,10 +300,12 @@ type
     procedure Translate(Src, Dest: PChar; ToOem: Boolean); override; {virtual}
 {$endif}
 
+{$ifdef SUPPORT_OVERLOAD}
     function  GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload;
       {$ifdef SUPPORT_BACKWARD_FIELDDATA} override; {$endif}
     procedure SetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean); overload;
       {$ifdef SUPPORT_BACKWARD_FIELDDATA} override; {$endif}
+{$endif}
 
     function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
     procedure CheckDbfFieldDefs(ADbfFieldDefs: TDbfFieldDefs);
@@ -698,11 +702,6 @@ begin
     Result := @PDbfRecord(Result)^.DeletedFlag;
 end;
 
-function TDbf.GetFieldData(Field: TField; Buffer: Pointer): Boolean; {override virtual abstract from TDataset}
-begin
-  Result := GetFieldData(Field, Buffer, true);
-end;
-
 // we don't want converted data formats, we want native :-)
 // it makes coding easier in TDbfFile.GetFieldData
 //  ftCurrency:
@@ -710,7 +709,19 @@ end;
 //  ftBCD:
 // ftDateTime is more difficult though
 
+function TDbf.GetFieldData(Field: TField; Buffer: Pointer): Boolean; {override virtual abstract from TDataset}
+{$ifdef SUPPORT_OVERLOAD}
+begin
+  { calling through 'old' delphi 3 interface, use compatible/'native' format }
+  Result := GetFieldData(Field, Buffer, true);
+end;
+
 function TDbf.GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; {overload; override;}
+{$else}
+const
+  { no overload => delphi 3 => use compatible/'native' format }
+  NativeFormat = true;
+{$endif}
 var
   Src: PChar;
 begin
@@ -732,7 +743,19 @@ begin
   end;
 end;
 
+procedure TDbf.SetFieldData(Field: TField; Buffer: Pointer); {override virtual abstract from TDataset}
+{$ifdef SUPPORT_OVERLOAD}
+begin
+  { calling through 'old' delphi 3 interface, use compatible/'native' format }
+  SetFieldData(Field, Buffer, true);
+end;
+
 procedure TDbf.SetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean); {overload; override;}
+{$else}
+const
+  { no overload => delphi 3 => use compatible/'native' format }
+  NativeFormat = true;
+{$endif}
 var
   Dst: PChar;
 begin
@@ -1542,7 +1565,9 @@ begin
       lPhysFieldDefs.Assign(TDbf(DataSet).DbfFieldDefs);
       IndexDefs.Assign(TDbf(DataSet).IndexDefs);
     end else begin
+{$ifdef SUPPORT_FIELDDEF_TPERSISTENT}
       lPhysFieldDefs.Assign(DataSet.FieldDefs);
+{$endif}      
       IndexDefs.Clear;
     end;
     // convert list of tfields into a list of tdbffielddefs
@@ -2076,11 +2101,6 @@ begin
   pDbfRecord(Buffer)^.BookmarkData := pBookmarkData(Data)^;
 end;
 
-procedure TDbf.SetFieldData(Field: TField; Buffer: Pointer); {override virtual abstract from TDataset}
-begin
-  SetFieldData(Field, Buffer, true);
-end;
-
 // this function counts real number of records: skip deleted records, filter, etc.
 // warning: is very slow, compared to GetRecordCount
 function TDbf.GetExactRecordCount: Integer;

+ 9 - 0
fcl/db/dbase/dbf_common.inc

@@ -164,11 +164,13 @@
 
   {$define SUPPORT_VARIANTS}
   {$define WINDOWS}
+  {$define ENDIAN_LITTLE}
 
 {$ifdef DELPHI_4}
 
   {$define SUPPORT_DEFCHANGED}
   {$define SUPPORT_DEFAULT_PARAMS}
+  {$define SUPPORT_OVERLOAD}
   {$define SUPPORT_NEW_TRANSLATE}
   {$define SUPPORT_INT64}
   {$define SUPPORT_REINTRODUCE}
@@ -216,6 +218,7 @@
 
   {$define SUPPORT_INT64}
   {$define SUPPORT_DEFAULT_PARAMS}
+  {$define SUPPORT_OVERLOAD}
   {$define SUPPORT_NEW_TRANSLATE}
   {$define SUPPORT_FIELDDEF_TPERSISTENT}
   {$define SUPPORT_FIELDTYPES_V4}
@@ -256,3 +259,9 @@
 
 {$endif}
 
+{$ifndef ENDIAN_LITTLE}
+{$ifndef ENDIAN_BIG}
+{$error Neither ENDIAN_LITTLE nor ENDIAN_BIG defined!}
+{$endif}
+{$endif}
+

+ 66 - 18
fcl/db/dbase/dbf_common.pas

@@ -4,13 +4,6 @@ interface
 
 {$I dbf_common.inc}
 
-{$ifdef FPC}
- {$ifndef FPC_LITTLE_ENDIAN}
-  {$message error TDbf is not compatible with non little-endian CPUs. Please contact the author.}
- {$endif}
-{$endif}
-
-
 uses
   SysUtils, Classes, DB
 {$ifndef WINDOWS}
@@ -93,11 +86,14 @@ procedure FindNextName(BaseName: string; var OutName: string; var Modifier: Inte
 function GetFreeMemory: Integer;
 {$endif}
 
-// OH 2000-11-15 dBase7 support. Swap Byte order for 4 and 8 Byte Integer
-function SwapWord(const Value: word): word;
-function SwapInt(const Value: dword): dword;
-{ SwapInt64 NOTE: do not call with same value for Value and Result ! }
-procedure SwapInt64(Value, Result: Pointer); register;
+function SwapWordBE(const Value: word): word;
+function SwapWordLE(const Value: word): word;
+function SwapIntBE(const Value: dword): dword;
+function SwapIntLE(const Value: dword): dword;
+{$ifdef SUPPORT_INT64}
+procedure SwapInt64BE(Value, Result: Pointer); register;
+procedure SwapInt64LE(Value, Result: Pointer); register;
+{$endif}
 
 function TranslateString(FromCP, ToCP: Cardinal; Src, Dest: PChar; Length: Integer): Integer;
 
@@ -255,19 +251,55 @@ end;
 // Utility routines
 //====================================================================
 
-function SwapWord(const Value: word): word;
+{$ifdef ENDIAN_LITTLE}
+function SwapWordBE(const Value: word): word;
+{$else}
+function SwapWordLE(const Value: word): word;
+{$endif}
 begin
   Result := ((Value and $FF) shl 8) or ((Value shr 8) and $FF);
 end;
 
+{$ifdef ENDIAN_LITTLE}
+function SwapWordLE(const Value: word): word;
+{$else}
+function SwapWordBE(const Value: word): word;
+{$endif}
+begin
+  Result := Value;
+end;
+
+{$ifdef FPC}
+
+function SwapIntBE(const Value: dword): dword;
+begin
+  Result := BEtoN(Value);
+end;
+
+function SwapIntLE(const Value: dword): dword;
+begin
+  Result := LEtoN(Value);
+end;
+
+procedure SwapInt64BE(Value, Result: Pointer);
+begin
+  PInt64(Result)^ := BEtoN(PInt64(Value)^);
+end;
+
+procedure SwapInt64LE(Value, Result: Pointer);
+begin
+  PInt64(Result)^ := LEtoN(PInt64(Value)^);
+end;
+
+{$else}
 {$ifdef USE_ASSEMBLER_486_UP}
 
-function SwapInt(const Value: dword): dword; register; assembler;
+function SwapIntBE(const Value: dword): dword; register; assembler;
 asm
   BSWAP EAX;
 end;
 
-procedure SwapInt64(Value {EAX}, Result {EDX}: Pointer); register; assembler;
+procedure SwapInt64BE(Value {EAX}, Result {EDX}: Pointer); register; assembler;
 asm
   MOV ECX, dword ptr [EAX] 
   MOV EAX, dword ptr [EAX + 4] 
@@ -279,7 +311,7 @@ end;
 
 {$else}
 
-function SwapInt(const Value: Cardinal): Cardinal;
+function SwapIntBE(const Value: Cardinal): Cardinal;
 begin
   PByteArray(@Result)[0] := PByteArray(@Value)[3];
   PByteArray(@Result)[1] := PByteArray(@Value)[2];
@@ -287,7 +319,7 @@ begin
   PByteArray(@Result)[3] := PByteArray(@Value)[0];
 end;
 
-procedure SwapInt64(Value, Result: Pointer); register;
+procedure SwapInt64BE(Value, Result: Pointer); register;
 var
   PtrResult: PByteArray;
   PtrSource: PByteArray;
@@ -307,6 +339,22 @@ end;
 
 {$endif}
 
+function SwapIntLE(const Value: dword): dword;
+begin
+  Result := Value;
+end;
+
+{$ifdef SUPPORT_INT64}
+
+procedure SwapInt64LE(Value, Result: Pointer);
+begin
+  PInt64(Result)^ := PInt64(Value)^;
+end;
+
+{$endif}
+
+{$endif}
+
 function TranslateString(FromCP, ToCP: Cardinal; Src, Dest: PChar; Length: Integer): Integer;
 var
   WideCharStr: array[0..1023] of WideChar;
@@ -328,7 +376,7 @@ begin
   end else begin
     // does this work on Win95/98/ME?
     wideBytes := MultiByteToWideChar(FromCP, MB_PRECOMPOSED, Src, Length, LPWSTR(@WideCharStr[0]), 1024);
-    WideCharToMultiByte(ToCP, 0, LPWSTR(@WideCharStr[0]), wideBytes, Dest, Length, nil, nil);
+    Result := WideCharToMultiByte(ToCP, 0, LPWSTR(@WideCharStr[0]), wideBytes, Dest, Length, nil, nil);
   end;
 end;
 

+ 44 - 42
fcl/db/dbase/dbf_dbffile.pas

@@ -662,8 +662,7 @@ begin
         lFieldDescVII.FieldType := lFieldDef.NativeFieldType;
         lFieldDescVII.FieldSize := lSize;
         lFieldDescVII.FieldPrecision := lPrec;
-        // TODO: bug-endianness
-        lFieldDescVII.NextAutoInc := lFieldDef.AutoInc;
+        lFieldDescVII.NextAutoInc := SwapIntLE(lFieldDef.AutoInc);
         //lFieldDescVII.MDXFlag := ???
       end else begin
         FillChar(lFieldDescIII, SizeOf(lFieldDescIII), #0);
@@ -671,9 +670,8 @@ begin
         lFieldDescIII.FieldType := lFieldDef.NativeFieldType;
         lFieldDescIII.FieldSize := lSize;
         lFieldDescIII.FieldPrecision := lPrec;
-        // TODO: bug-endianness
         if FDbfVersion = xFoxPro then
-          lFieldDescIII.FieldOffset := lFieldOffset;
+          lFieldDescIII.FieldOffset := SwapIntLE(lFieldOffset);
         if (PDbfHdr(Header)^.VerDBF = $02) and (lFieldDef.NativeFieldType in ['0', 'Y', 'T', 'O', '+']) then
           PDbfHdr(Header)^.VerDBF := $30;
         if (PDbfHdr(Header)^.VerDBF = $30) and (lFieldDef.NativeFieldType = '+') then
@@ -847,8 +845,7 @@ begin
         lSize := lFieldDescVII.FieldSize;
         lPrec := lFieldDescVII.FieldPrecision;
         lNativeFieldType := lFieldDescVII.FieldType;
-        // TODO: big-endianness
-        lAutoInc := lFieldDescVII.NextAutoInc;
+        lAutoInc := SwapIntLE(lFieldDescVII.NextAutoInc);
         if lNativeFieldType = '+' then
           FAutoIncPresent := true;
       end else begin
@@ -1496,23 +1493,23 @@ begin
           Result := PDWord(Src)^ <> 0;
           if Result and (Dst <> nil) then
           begin
-            PDWord(Dst)^ := SwapInt(PDWord(Src)^);
+            PDWord(Dst)^ := SwapIntBE(PDWord(Src)^);
             if Result then
               PInteger(Dst)^ := Integer(PDWord(Dst)^ xor $80000000);
           end;
         end else begin
           Result := true;
           if Dst <> nil then
-            PInteger(Dst)^ := PInteger(Src)^;
+            PInteger(Dst)^ := SwapIntLE(PInteger(Src)^);
         end;
       end;
     'O':
       begin
 {$ifdef SUPPORT_INT64}
-        Result := (PInt64(Src)^ <> 0);
+        Result := PInt64(Src)^ <> 0;
         if Result and (Dst <> nil) then
         begin
-          SwapInt64(Src, Dst);
+          SwapInt64BE(Src, Dst);
           if PInt64(Dst)^ > 0 then
             PInt64(Dst)^ := not PInt64(Dst)^
           else
@@ -1525,7 +1522,7 @@ begin
         Result := (PInteger(Src)^ <> 0) and (PInteger(PChar(Src)+4)^ <> 0);
         if Result and (Dst <> nil) then
         begin
-          SwapInt64(Src, Dst);
+          SwapInt64BE(Src, Dst);
           if FDateTimeHandling = dtBDETimeStamp then
             date := BDETimeStampToDateTime(PDouble(Dst)^)
           else
@@ -1536,11 +1533,15 @@ begin
     'T':
       begin
         // all binary zeroes -> empty datetime
+{$ifdef SUPPORT_INT64}        
+        Result := PInt64(Src)^ <> 0;
+{$else}        
         Result := (PInteger(Src)^ <> 0) or (PInteger(PChar(Src)+4)^ <> 0);
+{$endif}        
         if Result and (Dst <> nil) then
         begin
-          timeStamp.Date := PInteger(Src)^ - JulianDateDelta;
-          timeStamp.Time := PInteger(PChar(Src)+4)^;
+          timeStamp.Date := SwapIntLE(PInteger(Src)^) - JulianDateDelta;
+          timeStamp.Time := SwapIntLE(PInteger(PChar(Src)+4)^);
           date := TimeStampToDateTime(timeStamp);
           SaveDateToDst;
         end;
@@ -1551,17 +1552,9 @@ begin
         Result := true;
         if Dst <> nil then
         begin
-          // TODO: data is little endian;
-          case DataType of
-            ftCurrency:
-            begin
-              PDouble(Dst)^ := PInt64(Src)^ / 10000.0;
-            end;
-            ftBCD:
-            begin
-              PCurrency(Dst)^ := PCurrency(Src)^;
-            end;
-          end;
+          PInt64(Dst)^ := SwapIntLE(PInt64(Src)^);
+          if DataType = ftCurrency then
+            PDouble(Dst)^ := PInt64(Dst)^ / 10000.0;
         end;
 {$endif}
       end;
@@ -1571,7 +1564,7 @@ begin
         begin
           Result := true;
           if Dst <> nil then
-            PDouble(Dst)^ := PDouble(Src)^;
+            PInt64(Dst)^ := SwapIntLE(PInt64(Src)^);
         end else
           asciiContents := true;
       end;
@@ -1581,7 +1574,7 @@ begin
         begin
           Result := PInteger(Src)^ <> 0;
           if Dst <> nil then
-            PInteger(Dst)^ := PInteger(Src)^;
+            PInteger(Dst)^ := SwapIntLE(PInteger(Src)^);
         end else
           asciiContents := true;
       end;
@@ -1753,12 +1746,12 @@ begin
             IntValue := 0
           else
             IntValue := PDWord(Src)^ xor $80000000;
-          PDWord(Dst)^ := SwapInt(IntValue);
+          PDWord(Dst)^ := SwapIntBE(IntValue);
         end else begin
           if Src = nil then
             PDWord(Dst)^ := 0
           else
-            PDWord(Dst)^ := PDWord(Src)^;
+            PDWord(Dst)^ := SwapIntLE(PDWord(Src)^);
         end;
       end;
     'O':
@@ -1769,10 +1762,10 @@ begin
           PInt64(Dst)^ := 0;
         end else begin
           if PDouble(Src)^ < 0 then
-            PLargeInt(Dst)^ := not PLargeInt(Src)^
+            PInt64(Dst)^ := not PInt64(Src)^
           else
             PDouble(Dst)^ := (PDouble(Src)^) * -1;
-          SwapInt64(Dst, Dst);
+          SwapInt64BE(Dst, Dst);
         end;
 {$endif}
       end;
@@ -1780,13 +1773,17 @@ begin
       begin
         if Src = nil then
         begin
+{$ifdef SUPPORT_INT64}
+          PInt64(Dst)^ := 0;
+{$else}          
           PInteger(Dst)^ := 0;
           PInteger(PChar(Dst)+4)^ := 0;
+{$endif}
         end else begin
           LoadDateFromSrc;
           if FDateTimeHandling = dtBDETimeStamp then
             date := DateTimeToBDETimeStamp(date);
-          SwapInt64(@date, Dst);
+          SwapInt64BE(@date, Dst);
         end;
       end;
     'T':
@@ -1794,13 +1791,17 @@ begin
         // all binary zeroes -> empty datetime
         if Src = nil then
         begin
+{$ifdef SUPPORT_INT64}
+          PInt64(Dst)^ := 0;
+{$else}          
           PInteger(Dst)^ := 0;
           PInteger(PChar(Dst)+4)^ := 0;
+{$endif}          
         end else begin
           LoadDateFromSrc;
           timeStamp := DateTimeToTimeStamp(date);
-          PInteger(Dst)^ := timeStamp.Date + JulianDateDelta;
-          PInteger(PChar(Dst)+4)^ := timeStamp.Time;
+          PInteger(Dst)^ := SwapIntLE(timeStamp.Date + JulianDateDelta);
+          PInteger(PChar(Dst)+4)^ := SwapIntLE(timeStamp.Time);
         end;
       end;
     'Y':
@@ -1808,7 +1809,7 @@ begin
 {$ifdef SUPPORT_INT64}
         if Src = nil then
         begin
-          PInt64(Dst)^ := 0
+          PInt64(Dst)^ := 0;
         end else begin
           case DataType of
             ftCurrency:
@@ -1816,8 +1817,8 @@ begin
             ftBCD:
               PCurrency(Dst)^ := PCurrency(Src)^;
           end;
+          SwapInt64LE(Dst, Dst);
         end;
-        // TODO: data is little endian
 {$endif}
       end;
     'B':
@@ -1827,7 +1828,7 @@ begin
           if Src = nil then
             PDouble(Dst)^ := 0
           else
-            PDouble(Dst)^ := PDouble(Src)^;
+            SwapInt64LE(Src, Dst);
         end else
           asciiContents := true;
       end;
@@ -1838,7 +1839,7 @@ begin
           if Src = nil then
             PInteger(Dst)^ := 0
           else
-            PInteger(Dst)^ := PInteger(Src)^;
+            PInteger(Dst)^ := SwapIntLE(PInteger(Src)^);
         end else
           asciiContents := true;
       end;
@@ -1969,18 +1970,19 @@ begin
         // read current auto inc, from header or field, depending on sharing
         lAutoIncOffset := sizeof(rDbfHdr) + sizeof(rAfterHdrVII) + 
           FieldDescVII_AutoIncOffset + I * sizeof(rFieldDescVII);
-        // TODO: big-endianness
         if NeedLocks then
-          ReadBlock(@NextVal, 4, lAutoIncOffset)
-        else
+        begin
+          ReadBlock(@NextVal, 4, lAutoIncOffset);
+          NextVal := SwapIntLE(NextVal);
+        end else
           NextVal := TempFieldDef.AutoInc;
         // store to buffer, positive = high bit on, so flip it
-        PCardinal(DestBuf+TempFieldDef.Offset)^ := SwapInt(NextVal or $80000000);
+        PCardinal(DestBuf+TempFieldDef.Offset)^ := SwapIntBE(NextVal or $80000000);
         // increase
         Inc(NextVal);
         TempFieldDef.AutoInc := NextVal;
         // write new value to header buffer
-        PCardinal(FHeader+lAutoIncOffset)^ := NextVal;
+        PCardinal(FHeader+lAutoIncOffset)^ := SwapIntLE(NextVal);
       end;
     end;
 

+ 120 - 110
fcl/db/dbase/dbf_idxfile.pas

@@ -626,6 +626,16 @@ var
 
   LCIDList: TLCIDList;
 
+procedure IncWordLE(var AVariable: Word; Amount: Integer);
+begin
+  AVariable := SwapWordLE(SwapWordLE(AVariable + Amount));
+end;
+
+procedure IncIntLE(var AVariable: Integer; Amount: Integer);
+begin
+  AVariable := SwapIntLE(SwapIntLE(AVariable + Amount));
+end;
+
 //==========================================================
 // Locale support for all versions of Delphi/C++Builder
 
@@ -729,7 +739,7 @@ begin
   // check assertions
   lNumEntries := GetNumEntries;
   // if this is inner node, we can only store one less than max entries
-  numKeysAvail := PIndexHdr(FIndexFile.IndexHeader)^.NumKeys - lNumEntries;
+  numKeysAvail := SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.NumKeys) - lNumEntries;
   if FLowerPage <> nil then
     dec(numKeysAvail);
   // check if free space
@@ -737,7 +747,7 @@ begin
   // first free up some space
   source := FEntry;
   dest := GetEntry(FEntryNo + 1);
-  size := (lNumEntries - EntryNo) * PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen;
+  size := (lNumEntries - EntryNo) * SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen);
   // if 'rightmost' entry, copy pageno too
   if (FLowerPage <> nil) or (numKeysAvail > 1) then
     size := size + FIndexFile.EntryHeaderSize;
@@ -774,7 +784,7 @@ begin
   begin
     source := GetEntry(EntryNo + 1);
     dest := FEntry;
-    size := (FHighIndex - EntryNo) * PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen;
+    size := (FHighIndex - EntryNo) * SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen);
     Move(source^, dest^, size);
   end else
   // no need to update when we're about to remove the only entry
@@ -938,7 +948,7 @@ begin
     UpperPage.SetEntry(0, AKey, FPageNo);
 {  if PIndexHdr(FIndexFile.IndexHeader).KeyType = 'C' then  }
     if AKey <> nil then
-      Move(AKey^, keyData^, PIndexHdr(FIndexFile.IndexHeader)^.KeyLen)
+      Move(AKey^, keyData^, SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyLen))
     else
       PChar(keyData)^ := #0;
 {
@@ -1052,7 +1062,7 @@ begin
     // compute source, dest
     dest := NewPage.GetEntry(0);
     source := GetEntry(splitRight);
-    size := numEntriesNew * PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen;
+    size := numEntriesNew * SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen);
     // if inner node, copy rightmost entry too
     if FLowerPage <> nil then
       size := size + FIndexFile.EntryHeaderSize;
@@ -1159,7 +1169,7 @@ procedure TIndexPage.RecalcWeight;
 begin
   if FLowerPage <> nil then
   begin
-    FWeight := FLowerPage.Weight * PIndexHdr(FIndexFile.IndexHeader)^.NumKeys;
+    FWeight := FLowerPage.Weight * SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.NumKeys);
   end else begin
     FWeight := 1;
   end;
@@ -1221,7 +1231,7 @@ end;
 
 function TMdxPage.GetIsInnerNode: Boolean;
 begin
-  Result := PMdxPage(FPageBuffer)^.NumEntries < PIndexHdr(FIndexFile.IndexHeader)^.NumKeys;
+  Result := SwapIntLE(PMdxPage(FPageBuffer)^.NumEntries) < SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.NumKeys);
   // if there is still an entry after the last one, this has to be an inner node
   if Result then
     Result := PMdxEntry(GetEntry(PMdxPage(FPageBuffer)^.NumEntries))^.RecBlockNo <> 0;
@@ -1383,8 +1393,8 @@ end;
 function TMdxPage.GetEntry(AEntryNo: Integer): Pointer;
 begin
   // get base + offset
-  Result := PChar(@PMdxPage(PageBuffer)^.FirstEntry) + (PIndexHdr(
-    IndexFile.IndexHeader)^.KeyRecLen * AEntryNo);
+  Result := PChar(@PMdxPage(PageBuffer)^.FirstEntry) + (SwapWordLE(PIndexHdr(
+    IndexFile.IndexHeader)^.KeyRecLen) * AEntryNo);
 end;
 
 function TMdxPage.GetLowerPageNo: Integer;
@@ -1393,7 +1403,7 @@ begin
 //  if LowerPage = nil then
 //    Result := 0
 //  else
-    Result := PMdxEntry(Entry)^.RecBlockNo;
+    Result := SwapIntLE(PMdxEntry(Entry)^.RecBlockNo);
 end;
 
 function TMdxPage.GetKeyData: PChar;
@@ -1403,7 +1413,7 @@ end;
 
 function TMdxPage.GetNumEntries: Integer;
 begin
-  Result := PMdxPage(PageBuffer)^.NumEntries;
+  Result := SwapWordLE(PMdxPage(PageBuffer)^.NumEntries);
 end;
 
 function TMdxPage.GetKeyDataFromEntry(AEntry: Integer): PChar;
@@ -1413,40 +1423,40 @@ end;
 
 function TMdxPage.GetRecNo: Integer;
 begin
-  Result := PMdxEntry(Entry)^.RecBlockNo;
+  Result := SwapIntLE(PMdxEntry(Entry)^.RecBlockNo);
 end;
 
 procedure TMdxPage.SetNumEntries(NewNum: Integer);
 begin
-  PMdxPage(PageBuffer)^.NumEntries := NewNum;
+  PMdxPage(PageBuffer)^.NumEntries := SwapIntLE(NewNum);
 end;
 
 procedure TMdxPage.IncNumEntries;
 begin
-  Inc(PMdxPage(PageBuffer)^.NumEntries);
+  IncIntLE(PMdxPage(PageBuffer)^.NumEntries, 1);
 end;
 
 procedure TMdxPage.SetRecLowerPageNo(NewRecNo, NewPageNo: Integer);
 begin
   if FLowerPage = nil then
-    PMdxEntry(Entry)^.RecBlockNo := NewRecNo
+    PMdxEntry(Entry)^.RecBlockNo := SwapIntLE(NewRecNo)
   else
-    PMdxEntry(Entry)^.RecBlockNo := NewPageNo;
+    PMdxEntry(Entry)^.RecBlockNo := SwapIntLE(NewPageNo);
 end;
 
 procedure TMdxPage.SetRecLowerPageNoOfEntry(AEntry, NewRecNo, NewPageNo: Integer);
 begin
   if FLowerPage = nil then
-    PMdxEntry(GetEntry(AEntry))^.RecBlockNo := NewRecNo
+    PMdxEntry(GetEntry(AEntry))^.RecBlockNo := SwapIntLE(NewRecNo)
   else
-    PMdxEntry(GetEntry(AEntry))^.RecBlockNo := NewPageNo;
+    PMdxEntry(GetEntry(AEntry))^.RecBlockNo := SwapIntLE(NewPageNo);
 end;
 
 {$ifdef TDBF_UPDATE_FIRST_LAST_NODE}
 
 procedure TMdxPage.SetPrevBlock(NewBlock: Integer);
 begin
-  PMdxPage(PageBuffer)^.PrevBlock := NewBlock;
+  PMdxPage(PageBuffer)^.PrevBlock := SwapIntLE(NewBlock);
 end;
 
 {$endif}
@@ -1458,7 +1468,8 @@ end;
 function TNdxPage.GetEntry(AEntryNo: Integer): Pointer;
 begin
   // get base + offset
-  Result := PChar(@PNdxPage(PageBuffer)^.FirstEntry) + (PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen * AEntryNo);
+  Result := PChar(@PNdxPage(PageBuffer)^.FirstEntry) + 
+    (SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen) * AEntryNo);
 end;
 
 function TNdxPage.GetLowerPageNo: Integer;
@@ -1467,12 +1478,12 @@ begin
 //  if LowerPage = nil then
 //    Result := 0
 //  else
-    Result := PNdxEntry(Entry)^.LowerPageNo
+    Result := SwapIntLE(PNdxEntry(Entry)^.LowerPageNo)
 end;
 
 function TNdxPage.GetRecNo: Integer;
 begin
-  Result := PNdxEntry(Entry)^.RecNo;
+  Result := SwapIntLE(PNdxEntry(Entry)^.RecNo);
 end;
 
 function TNdxPage.GetKeyData: PChar;
@@ -1487,29 +1498,29 @@ end;
 
 function TNdxPage.GetNumEntries: Integer;
 begin
-  Result := PNdxPage(PageBuffer)^.NumEntries;
+  Result := SwapIntLE(PNdxPage(PageBuffer)^.NumEntries);
 end;
 
 procedure TNdxPage.IncNumEntries;
 begin
-  Inc(PNdxPage(PageBuffer)^.NumEntries);
+  IncIntLE(PNdxPage(PageBuffer)^.NumEntries, 1);
 end;
 
 procedure TNdxPage.SetNumEntries(NewNum: Integer);
 begin
-  PNdxPage(PageBuffer)^.NumEntries := NewNum;
+  PNdxPage(PageBuffer)^.NumEntries := SwapIntLE(NewNum);
 end;
 
 procedure TNdxPage.SetRecLowerPageNo(NewRecNo, NewPageNo: Integer);
 begin
-  PNdxEntry(Entry)^.RecNo := NewRecNo;
-  PNdxEntry(Entry)^.LowerPageNo := NewPageNo;
+  PNdxEntry(Entry)^.RecNo := SwapIntLE(NewRecNo);
+  PNdxEntry(Entry)^.LowerPageNo := SwapIntLE(NewPageNo);
 end;
 
 procedure TNdxPage.SetRecLowerPageNoOfEntry(AEntry, NewRecNo, NewPageNo: Integer);
 begin
-  PNdxEntry(GetEntry(AEntry))^.RecNo := NewRecNo;
-  PNdxEntry(GetEntry(AEntry))^.LowerPageNo := NewPageNo;
+  PNdxEntry(GetEntry(AEntry))^.RecNo := SwapIntLE(NewRecNo);
+  PNdxEntry(GetEntry(AEntry))^.LowerPageNo := SwapIntLE(NewPageNo);
 end;
 
 //==============================================================================
@@ -1518,7 +1529,7 @@ end;
 
 function TMdx4Tag.GetHeaderPageNo: Integer;
 begin
-  Result := PMdx4Tag(Tag)^.HeaderPageNo;
+  Result := SwapIntLE(PMdx4Tag(Tag)^.HeaderPageNo);
 end;
 
 function TMdx4Tag.GetTagName: string;
@@ -1558,7 +1569,7 @@ end;
 
 procedure TMdx4Tag.SetHeaderPageNo(NewPageNo: Integer);
 begin
-  PMdx4Tag(Tag)^.HeaderPageNo := NewPageNo;
+  PMdx4Tag(Tag)^.HeaderPageNo := SwapIntLE(NewPageNo);
 end;
 
 procedure TMdx4Tag.SetTagName(NewName: string);
@@ -1603,7 +1614,7 @@ end;
 
 function TMdx7Tag.GetHeaderPageNo: Integer;
 begin
-  Result := PMdx7Tag(Tag)^.HeaderPageNo;
+  Result := SwapIntLE(PMdx7Tag(Tag)^.HeaderPageNo);
 end;
 
 function TMdx7Tag.GetTagName: string;
@@ -1643,7 +1654,7 @@ end;
 
 procedure TMdx7Tag.SetHeaderPageNo(NewPageNo: Integer);
 begin
-  PMdx7Tag(Tag)^.HeaderPageNo := NewPageNo;
+  PMdx7Tag(Tag)^.HeaderPageNo := SwapIntLE(NewPageNo);
 end;
 
 procedure TMdx7Tag.SetTagName(NewName: string);
@@ -1989,7 +2000,7 @@ end;
 procedure TIndexFile.Clear;
 var
   year, month, day: Word;
-  pos, prevSelIndex: Integer;
+  pos, prevSelIndex, pageno: Integer;
   DbfLangId: Byte;
 begin
   // flush cache to prevent reading corrupted data
@@ -2006,15 +2017,14 @@ begin
     PMdxHdr(Header)^.Month := month;
     PMdxHdr(Header)^.Day := day;
     WriteDBFileName(PMdxHdr(Header), FileName);
-    PMdxHdr(Header)^.BlockSize := 2;
-    PMdxHdr(Header)^.BlockAdder := 1024;
+    PMdxHdr(Header)^.BlockSize := SwapWordLE(2);
+    PMdxHdr(Header)^.BlockAdder := SwapWordLE(1024);
     PMdxHdr(Header)^.ProdFlag := 1;
     PMdxHdr(Header)^.NumTags := 48;
     PMdxHdr(Header)^.TagSize := 32;
-//    PMdxHdr(Header)^.TagsUsed := 0;
     PMdxHdr(Header)^.Dummy2 := 0;
     PMdxHdr(Header)^.Language := GetDbfLanguageID;
-    PMdxHdr(Header)^.NumPages := HeaderSize div PageSize;    // = 4
+    PMdxHdr(Header)^.NumPages := SwapIntLE(HeaderSize div PageSize);  // = 4
     TouchHeader(Header);
     PMdxHdr(Header)^.TagFlag := 1;
     // use locale id of parent
@@ -2025,11 +2035,12 @@ begin
       FCollation := GetCollationTable(DbfLangId);
     // write index headers
     prevSelIndex := FSelectedIndex;
-    for pos := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for pos := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       SelectIndexVars(pos);
-      FMdxTag.HeaderPageNo := GetNewPageNo;
-      WriteRecord(FMdxTag.HeaderPageNo, FIndexHeader);
+      pageno := GetNewPageNo;
+      FMdxTag.HeaderPageNo := SwapIntLE(pageno);
+      WriteRecord(pageno, FIndexHeader);
     end;
     // reselect previously selected index
     SelectIndexVars(prevSelIndex);
@@ -2041,11 +2052,11 @@ begin
     FTagSize := 32;
     FTagOffset := 544;
     // clear entries
-    RecordCount := PMdxHdr(Header)^.NumPages;
+    RecordCount := SwapIntLE(PMdxHdr(Header)^.NumPages);
   end else begin
     // clear single index entry
     ClearIndex;
-    RecordCount := PIndexHdr(FIndexHeader)^.NumPages;
+    RecordCount := SwapIntLE(PIndexHdr(FIndexHeader)^.NumPages);
   end;
 end;
 
@@ -2065,15 +2076,15 @@ begin
     FHeaderLocked := 0;
   end;
   // initially, we have 1 page: header
-  PIndexHdr(FIndexHeader)^.NumPages := HeaderSize div PageSize;
+  PIndexHdr(FIndexHeader)^.NumPages := SwapIntLE(HeaderSize div PageSize);
   // clear memory of root
   FRoot.Clear;
   // get new page for root
   FRoot.GetNewPage;
   // store new root page
-  PIndexHdr(FIndexHeader)^.RootPage := FRoot.PageNo;
+  PIndexHdr(FIndexHeader)^.RootPage := SwapIntLE(FRoot.PageNo);
 {$ifdef TDBF_UPDATE_FIRSTLAST_NODE}
-  PIndexHdr(FIndexHeader)^.FirstNode := FRoot.PageNo;
+  PIndexHdr(FIndexHeader)^.FirstNode := SwapIntLE(FRoot.PageNo);
 {$endif}
   // update leaf pointers
   FLeaves[FSelectedIndex] := FRoot;
@@ -2092,15 +2103,12 @@ end;
 
 procedure TIndexFile.CalcKeyProperties;
   // given KeyLen, this func calcs KeyRecLen and NumEntries
-var
-  remainder: Integer;
 begin
   // now adjust keylen to align on DWORD boundaries
-  PIndexHdr(FIndexHeader)^.KeyRecLen := PIndexHdr(FIndexHeader)^.KeyLen + FEntryHeaderSize;
-  remainder := (PIndexHdr(FIndexHeader)^.KeyRecLen) mod 4;
-  if (remainder > 0) then
-    PIndexHdr(FIndexHeader)^.KeyRecLen := PIndexHdr(FIndexHeader)^.KeyRecLen + 4 - remainder;
-  PIndexHdr(FIndexHeader)^.NumKeys := (RecordSize - FPageHeaderSize) div PIndexHdr(FIndexHeader)^.KeyRecLen;
+  PIndexHdr(FIndexHeader)^.KeyRecLen := SwapWordLE((SwapWordLE(
+    PIndexHdr(FIndexHeader)^.KeyLen) + FEntryHeaderSize + 3) and 3);
+  PIndexHdr(FIndexHeader)^.NumKeys := SwapWordLE((RecordSize - FPageHeaderSize) div 
+    SwapWordLE(PIndexHdr(FIndexHeader)^.KeyRecLen));
 end;
 
 function TIndexFile.GetName: string;
@@ -2139,7 +2147,7 @@ begin
   if FIndexVersion >= xBaseIV then
   begin
     // get next entry no
-    tagNo := PMdxHdr(Header)^.TagsUsed;
+    tagNo := SwapWordLE(PMdxHdr(Header)^.TagsUsed);
     // check if too many indexes
     if tagNo = MaxIndexes then
       raise EDbfError.Create(STRING_TOO_MANY_INDEXES);
@@ -2182,7 +2190,7 @@ begin
     FHeaderPageNo := GetNewPageNo;
     FTempMdxTag.HeaderPageNo := FHeaderPageNo;
     // increase number of indexes active
-    inc(PMdxHdr(Header)^.TagsUsed);
+    IncWordLE(PMdxHdr(Header)^.TagsUsed, 1);
     // update updatemode
     UpdateMode := umAll;
     // index header updated
@@ -2220,11 +2228,11 @@ begin
   end;
   // keylen is exact length of field
   if fieldType = 'C' then
-    PIndexHdr(FIndexHeader)^.KeyLen := FCurrentParser.ResultLen
+    PIndexHdr(FIndexHeader)^.KeyLen := SwapWordLE(FCurrentParser.ResultLen)
   else if FIndexVersion >= xBaseIV then
-    PIndexHdr(FIndexHeader)^.KeyLen := 12
+    PIndexHdr(FIndexHeader)^.KeyLen := SwapWordLE(12)
   else
-    PIndexHdr(FIndexHeader)^.KeyLen := 8;
+    PIndexHdr(FIndexHeader)^.KeyLen := SwapWordLE(8);
   CalcKeyProperties;
   // key desc
   StrPLCopy(PIndexHdr(FIndexHeader)^.KeyDesc, FieldDesc, 219);
@@ -2234,22 +2242,22 @@ begin
   if FIndexVersion >= xBaseIV then
     PIndexHdr(FIndexHeader)^.Dummy := 0        // MDX -> language driver
   else
-    PIndexHdr(FIndexHeader)^.Dummy := $5800;   // NDX -> same ???
+    PIndexHdr(FIndexHeader)^.Dummy := SwapWordLE($5800);   // NDX -> same ???
   case fieldType of
     'C':
       PIndexHdr(FIndexHeader)^.sKeyType := 0;
     'D':
-      PIndexHdr(FIndexHeader)^.sKeyType := 1;
+      PIndexHdr(FIndexHeader)^.sKeyType := SwapWordLE(1);
     'N', 'F':
       if FIndexVersion >= xBaseIV then
         PIndexHdr(FIndexHeader)^.sKeyType := 0
       else
-        PIndexHdr(FIndexHeader)^.sKeyType := 1;
+        PIndexHdr(FIndexHeader)^.sKeyType := SwapWordLE(1);
   else
     PIndexHdr(FIndexHeader)^.sKeyType := 0;
   end;
 
-  PIndexHdr(FIndexHeader)^.Version := 2;     // this is what DB4 writes into file
+  PIndexHdr(FIndexHeader)^.Version := SwapWordLE(2);     // this is what DB4 writes into file
   PIndexHdr(FIndexHeader)^.Dummy2 := 0;
   PIndexHdr(FIndexHeader)^.Dummy3 := 0;
   PIndexHdr(FIndexHeader)^.ForExist := 0;    // false
@@ -2265,7 +2273,7 @@ begin
   UpdateIndexProperties;
 
   // for searches / inserts / deletes
-  FKeyBuffer[PIndexHdr(FIndexHeader)^.KeyLen] := #0;
+  FKeyBuffer[SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen)] := #0;
 end;
 
 procedure TIndexFile.ReadIndexes;
@@ -2274,13 +2282,14 @@ var
 
   procedure CheckHeaderIntegrity;
   begin
-    if integer(PIndexHdr(FIndexHeader)^.NumKeys * PIndexHdr(FIndexHeader)^.KeyRecLen) > RecordSize then
+    if integer(SwapWordLE(PIndexHdr(FIndexHeader)^.NumKeys) * 
+        SwapWordLE(PIndexHdr(FIndexHeader)^.KeyRecLen)) > RecordSize then
     begin
       // adjust index header so that integrity is correct
       // WARNING: we can't be sure this gives a correct result, but at
       // least we won't AV (as easily). user will probably have to regenerate this index
-      if PIndexHdr(FIndexHeader)^.KeyLen > 100 then
-        PIndexHdr(FIndexHeader)^.KeyLen := 100;
+      if SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen) > 100 then
+        PIndexHdr(FIndexHeader)^.KeyLen := SwapWordLE(100);
       CalcKeyProperties;
     end;
   end;
@@ -2293,10 +2302,10 @@ begin
   begin
     // clear all roots
     ClearRoots;
-    // tags are extended at beginning?
+    // tags are extended at beginning? tagsize is byte sized
     FTagSize := PMdxHdr(Header)^.TagSize;
     FTagOffset := 544 + FTagSize - 32;
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       // read page header
       FTempMdxTag.Tag := CalcTagOffset(I);
@@ -2312,7 +2321,7 @@ begin
       // check header integrity
       CheckHeaderIntegrity;
       // read tree
-      FRoots[I].PageNo := PIndexHdr(FIndexHeader)^.RootPage;
+      FRoots[I].PageNo := SwapIntLE(PIndexHdr(FIndexHeader)^.RootPage);
       // go to first record
       FRoots[I].RecurFirst;
       // store leaf
@@ -2328,7 +2337,7 @@ begin
     // check recordsize constraint
     CheckHeaderIntegrity;
     // just one index: read tree
-    FRoot.PageNo := PIndexHdr(FIndexHeader)^.RootPage;
+    FRoot.PageNo := SwapIntLE(PIndexHdr(FIndexHeader)^.RootPage);
     // go to first valid record
     FRoot.RecurFirst;
     // get leaf page
@@ -2362,7 +2371,7 @@ begin
     if found >= 0 then
     begin
       // just remove this tag by copying memory over it
-      numTags := PMdxHdr(Header)^.TagsUsed;
+      numTags := SwapWordLE(PMdxHdr(Header)^.TagsUsed);
       moveItems := numTags - found - 1;
       // anything to move?
       if moveItems > 0 then
@@ -2392,7 +2401,7 @@ begin
         FIndexHeaderModified[found + moveItems] := false;    // non-existant header
       end;
       // one entry less left
-      dec(PMdxHdr(Header)^.TagsUsed);
+      IncWordLE(PMdxHdr(Header)^.TagsUsed, -1);
       // ---*** numTags not valid from here ***---
       // file header changed
       WriteFileHeader;
@@ -2442,8 +2451,8 @@ var
     Result := newPageNo;
     Inc(newPageNo, PagesPerRecord);
     if FIndexVersion >= xBaseIV then
-      Inc(PMdxHdr(TempFile.Header)^.NumPages, PagesPerRecord);
-    Inc(TempIdxHeader^.NumPages, PagesPerRecord);
+      IncIntLE(PMdxHdr(TempFile.Header)^.NumPages, PagesPerRecord);
+    IncIntLE(TempIdxHeader^.NumPages, PagesPerRecord);
   end;
 
   function WriteTree(NewPage: TIndexPage): Integer;
@@ -2467,16 +2476,16 @@ var
     begin
       if FIndexVersion >= xBaseIV then
       begin
-        PMdxEntry(NewPage.UpperPage.Entry)^.RecBlockNo := Result;
+        PMdxEntry(NewPage.UpperPage.Entry)^.RecBlockNo := SwapIntLE(Result);
 {$ifdef TDBF_UPDATE_FIRSTLAST_NODE}
         // write previous node
         if FRoot = NewPage then
           PMdxPage(NewPage.PageBuffer)^.PrevBlock := 0
         else
-          PMdxPage(NewPage.PageBuffer)^.PrevBlock := Result - PagesPerRecord;
+          PMdxPage(NewPage.PageBuffer)^.PrevBlock := SwapIntLE(Result - PagesPerRecord);
 {$endif}
       end else begin
-        PNdxEntry(NewPage.UpperPage.Entry)^.LowerPageNo := Result;
+        PNdxEntry(NewPage.UpperPage.Entry)^.LowerPageNo := SwapIntLE(Result);
       end;
     end;
     // store page
@@ -2494,7 +2503,7 @@ var
     // allocate a page no for header
     hdrPageNo := AllocNewPageNo;
     // use recursive function to write all pages
-    TempIdxHeader^.RootPage := WriteTree(FRoot);
+    TempIdxHeader^.RootPage := SwapIntLE(WriteTree(FRoot));
 {$ifdef TDBF_UPDATE_FIRSTLAST_NODE}
     TempIdxHeader^.FirstNode := TempIdxHeader^.RootPage;
 {$endif}
@@ -2520,11 +2529,11 @@ begin
     Move(Header^, TempFile.Header^, HeaderSize);
     TouchHeader(TempFile.Header);
     // reset header
-    PMdxHdr(TempFile.Header)^.NumPages := HeaderSize div PageSize;
+    PMdxHdr(TempFile.Header)^.NumPages := SwapIntLE(HeaderSize div PageSize);
     TempFile.WriteHeader;
     GetMem(TempIdxHeader, RecordSize);
     // now recreate indexes to that file
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed - 1) do
     begin
       // select this index
       SelectIndexVars(I);
@@ -2566,8 +2575,8 @@ var
     Result := newPageNo;
     Inc(newPageNo, PagesPerRecord);
     if FIndexVersion >= xBaseIV then
-      Inc(PMdxHdr(TempFile.Header)^.NumPages, PagesPerRecord);
-    Inc(TempIdxHeader^.NumPages, PagesPerRecord);
+      IncIntLE(PMdxHdr(TempFile.Header)^.NumPages, PagesPerRecord);
+    IncIntLE(TempIdxHeader^.NumPages, PagesPerRecord);
   end;
 
   function  CreateNewPage: TIndexPage;
@@ -2591,7 +2600,7 @@ var
     //  - do not set PageNo (= SetPageNo)
     //  - do not set EntryNo
   begin
-    if APage.HighIndex >= PIndexHdr(FIndexHeader)^.NumKeys-1 then
+    if APage.HighIndex >= SwapWordLE(PIndexHdr(FIndexHeader)^.NumKeys)-1 then
     begin
       if APage.UpperPage = nil then
       begin
@@ -2638,7 +2647,7 @@ var
     // copy current index settings
     Move(FIndexHeader^, TempIdxHeader^, RecordSize);
     // clear number of pages
-    TempIdxHeader^.NumPages := PagesPerRecord;
+    TempIdxHeader^.NumPages := SwapIntLE(PagesPerRecord);
     // allocate a page no for header
     hdrPageNo := AllocNewPageNo;
 
@@ -2661,9 +2670,9 @@ var
     until false;
 
     // copy index header + root page
-    TempIdxHeader^.RootPage := APage.PageNo;
+    TempIdxHeader^.RootPage := SwapIntLE(APage.PageNo);
 {$ifdef TDBF_UPDATE_FIRSTLAST_NODE}
-    TempIdxHeader^.FirstNode := APage.PageNo;
+    TempIdxHeader^.FirstNode := SwapIntLE(APage.PageNo);
 {$endif}
     // write index header now we know the root page
     TempFile.WriteRecord(hdrPageNo, TempIdxHeader);
@@ -2687,11 +2696,11 @@ begin
     Move(Header^, TempFile.Header^, HeaderSize);
     TouchHeader(TempFile.Header);
     // reset header
-    PMdxHdr(TempFile.Header)^.NumPages := HeaderSize div PageSize;
+    PMdxHdr(TempFile.Header)^.NumPages := SwapIntLE(HeaderSize div PageSize);
     TempFile.WriteHeader;
     GetMem(TempIdxHeader, RecordSize);
     // now recreate indexes to that file
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       // select this index
       SelectIndexVars(I);
@@ -2746,17 +2755,17 @@ begin
   end;
   if FIndexVersion >= xBaseIV then
   begin
-    Result := PMdxHdr(Header)^.NumPages;
-    PMdxHdr(Header)^.NumPages := PMdxHdr(Header)^.NumPages + PagesPerRecord;
+    Result := SwapIntLE(PMdxHdr(Header)^.NumPages);
+    IncIntLE(PMdxHdr(Header)^.NumPages, PagesPerRecord);
 {$ifdef TDBF_UPDATE_FIRSTLAST_NODE}
     // adjust high page
-    PIndexHdr(FIndexHeader)^.LastNode := Result;
+    PIndexHdr(FIndexHeader)^.LastNode := SwapIntLE(Result);
 {$endif}
     WriteFileHeader;
   end else begin
-    Result := PIndexHdr(FIndexHeader)^.NumPages;
+    Result := SwapIntLE(PIndexHdr(FIndexHeader)^.NumPages);
   end;
-  PIndexHdr(FIndexHeader)^.NumPages := PIndexHdr(FIndexHeader)^.NumPages + PagesPerRecord;
+  IncIntLE(PIndexHdr(FIndexHeader)^.NumPages, PagesPerRecord);
   WriteHeader;
   // done updating header -> unlock if locked
   if needLockHeader then
@@ -2773,7 +2782,7 @@ begin
   begin
     // remember currently selected index
     curSel := FSelectedIndex;
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       SelectIndexVars(I);
       InsertKey(Buffer);
@@ -2797,16 +2806,16 @@ begin
   if FIndexVersion = xBaseIV then
   begin
     curSel := FSelectedIndex;
-    I := 0;
-    while (I < PMdxHdr(Header)^.TagsUsed) and not Result do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       SelectIndexVars(I);
       if FUniqueMode = iuDistinct then
       begin
         FUserKey := ExtractKeyFromBuffer(Buffer);
         Result := FindKey(false) = 0;
+        if Result then
+          break;
       end;
-      Inc(I);
     end;
     SelectIndexVars(curSel);
   end else begin
@@ -3006,7 +3015,7 @@ begin
   begin
     // remember currently selected index
     curSel := FSelectedIndex;
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       SelectIndexVars(I);
       DeleteKey(Buffer);
@@ -3060,7 +3069,7 @@ begin
   begin
     // remember currently selected index
     curSel := FSelectedIndex;
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       SelectIndexVars(I);
       UpdateCurrent(PrevBuffer, NewBuffer);
@@ -3083,7 +3092,7 @@ begin
   begin
     // get key from newbuffer
     FUserKey := ExtractKeyFromBuffer(NewBuffer);
-    Move(FUserKey^, TempBuffer, PIndexHdr(FIndexHeader)^.KeyLen);
+    Move(FUserKey^, TempBuffer, SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen));
     // get key from prevbuffer
     FUserKey := ExtractKeyFromBuffer(PrevBuffer);
 
@@ -3119,7 +3128,7 @@ begin
   FHeaderLocked := FHeaderPageNo;
 
   // modify header
-  PIndexHdr(FIndexHeader)^.RootPage := lNewPage.PageNo;
+  PIndexHdr(FIndexHeader)^.RootPage := SwapIntLE(lNewPage.PageNo);
 
   // set new page properties
   lNewPage.SetNumEntries(0);
@@ -3160,7 +3169,7 @@ begin
   end else
     inherited ReadHeader;
   // reread tree
-  FRoot.PageNo := PIndexHdr(FIndexHeader)^.RootPage;
+  FRoot.PageNo := SwapIntLE(PIndexHdr(FIndexHeader)^.RootPage);
 end;
 
 function TIndexFile.SearchKey(Key: PChar; SearchType: TSearchKeyType): Boolean;
@@ -3280,7 +3289,7 @@ begin
       // check if this page is full, then split it
       numEntries := TempPage.NumEntries;
       // if this is inner node, we can only store one less than max entries
-      numKeysAvail := PIndexHdr(FIndexHeader)^.NumKeys - numEntries;
+      numKeysAvail := SwapWordLE(PIndexHdr(FIndexHeader)^.NumKeys) - numEntries;
       if TempPage.LowerPage <> nil then
         dec(numKeysAvail);
       // too few available -> split
@@ -3354,7 +3363,7 @@ end;
 procedure TIndexFile.SetUpdateMode(NewMode: TIndexUpdateMode);
 begin
   // if there is only one index, don't waste time and just set single
-  if (FIndexVersion = xBaseIII) or (PMdxHdr(Header)^.TagsUsed <= 1) then
+  if (FIndexVersion = xBaseIII) or (SwapWordLE(PMdxHdr(Header)^.TagsUsed) <= 1) then
     FUpdateMode := umCurrent
   else
     FUpdateMode := NewMode;
@@ -3467,7 +3476,7 @@ begin
     action := 1;
   end else begin
     // read current key into buffer
-    Move(FLeaf.Key^, FKeyBuffer, PIndexHdr(FIndexHeader)^.KeyLen);
+    Move(FLeaf.Key^, FKeyBuffer, SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen));
     recno := FLeaf.PhysicalRecNo;
     action := 2;
   end;
@@ -3533,7 +3542,7 @@ end;
 
 function TIndexFile.GetKeyLen: Integer;
 begin
-  Result := PIndexHdr(FIndexHeader)^.KeyLen;
+  Result := SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen);
 end;
 
 function TIndexFile.GetKeyType: Char;
@@ -3750,13 +3759,14 @@ var
 begin
   // get index of this index :-)
   Result := -1;
-  I := 0;
-  while (I < PMdxHdr(Header)^.TagsUsed) and (Result < 0) do
+  for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
   begin
     FTempMdxTag.Tag := CalcTagOffset(I);
     if AnsiCompareText(AIndexName, FTempMdxTag.TagName) = 0 then
+    begin
       Result := I;
-    inc(I);
+      break;
+    end;
   end;
 end;
 
@@ -3881,7 +3891,7 @@ begin
   // only applicable to MDX files
   if FIndexVersion >= xBaseIV then
   begin
-    for I := 0 to PMdxHdr(Header)^.TagsUsed - 1 do
+    for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
     begin
       FTempMdxTag.Tag := CalcTagOffset(I);
       AList.AddObject(FTempMdxTag.TagName, Self);

+ 15 - 15
fcl/db/dbase/dbf_memo.pas

@@ -373,11 +373,11 @@ begin
       totsize := Src.Size + bytesBefore + bytesAfter;
       if FDbfVersion <> xFoxPro then
       begin
-        PBlockHdr(FBuffer)^.MemoType := $0008FFFF;
-        PBlockHdr(FBuffer)^.MemoSize := totsize;
+        PBlockHdr(FBuffer)^.MemoType := SwapIntLE($0008FFFF);
+        PBlockHdr(FBuffer)^.MemoSize := SwapIntLE(totsize);
       end else begin
-        PBlockHdr(FBuffer)^.MemoType := $01000000;
-        PBlockHdr(FBuffer)^.MemoSize := SwapInt(Src.Size);
+        PBlockHdr(FBuffer)^.MemoType := SwapIntLE($01000000);
+        PBlockHdr(FBuffer)^.MemoSize := SwapIntBE(Src.Size);
       end;
     end;
     repeat
@@ -423,31 +423,31 @@ begin
   if FDbfVersion = xBaseIII then
     Result := 512
   else
-    Result := PDbtHdr(Header)^.BlockLen;
+    Result := SwapWordLE(PDbtHdr(Header)^.BlockLen);
 end;
 
 function  TDbaseMemoFile.GetMemoSize: Integer;
 begin
   // dBase4 memofiles contain small 'header'
-  if PInteger(@FBuffer[0])^ = $0008FFFF then
-    Result := PBlockHdr(FBuffer)^.MemoSize-8
+  if PInteger(@FBuffer[0])^ = Integer(SwapIntLE($0008FFFF)) then
+    Result := SwapIntLE(PBlockHdr(FBuffer)^.MemoSize)-8
   else
     Result := -1;
 end;
 
 function  TDbaseMemoFile.GetNextFreeBlock: Integer;
 begin
-  Result := PDbtHdr(Header)^.NextBlock;
+  Result := SwapIntLE(PDbtHdr(Header)^.NextBlock);
 end;
 
 procedure TDbaseMemoFile.SetNextFreeBlock(BlockNo: Integer);
 begin
-  PDbtHdr(Header)^.NextBlock := BlockNo;
+  PDbtHdr(Header)^.NextBlock := SwapIntLE(BlockNo);
 end;
 
 procedure TDbaseMemoFile.SetBlockLen(BlockLen: Integer);
 begin
-  PDbtHdr(Header)^.BlockLen := BlockLen;
+  PDbtHdr(Header)^.BlockLen := SwapWordLE(BlockLen);
 end;
 
 // ------------------------------------------------------------------
@@ -456,27 +456,27 @@ end;
 
 function  TFoxProMemoFile.GetBlockLen: Integer;
 begin
-  Result := SwapWord(PFptHdr(Header)^.BlockLen);
+  Result := SwapWordBE(PFptHdr(Header)^.BlockLen);
 end;
 
 function  TFoxProMemoFile.GetMemoSize: Integer;
 begin
-  Result := SwapInt(PBlockHdr(FBuffer)^.MemoSize);
+  Result := SwapIntBE(PBlockHdr(FBuffer)^.MemoSize);
 end;
 
 function  TFoxProMemoFile.GetNextFreeBlock: Integer;
 begin
-  Result := SwapInt(PFptHdr(Header)^.NextBlock);
+  Result := SwapIntBE(PFptHdr(Header)^.NextBlock);
 end;
 
 procedure TFoxProMemoFile.SetNextFreeBlock(BlockNo: Integer);
 begin
-  PFptHdr(Header)^.NextBlock := SwapInt(dword(BlockNo));
+  PFptHdr(Header)^.NextBlock := SwapIntBE(dword(BlockNo));
 end;
 
 procedure TFoxProMemoFile.SetBlockLen(BlockLen: Integer);
 begin
-  PFptHdr(Header)^.BlockLen := SwapWord(dword(BlockLen));
+  PFptHdr(Header)^.BlockLen := SwapWordBE(dword(BlockLen));
 end;
 
 // ------------------------------------------------------------------

+ 19 - 8
fcl/db/dbase/dbf_parser.pas

@@ -85,9 +85,13 @@ type
     FDbfFile: TDbfFile;
     FFieldName: string;
     FExprWord: TExprWord;
+
+    procedure SetExprWord(NewExprWord: TExprWord);
   protected
     function GetFieldVal: Pointer; virtual; abstract;
     function GetFieldType: TExpressionType; virtual; abstract;
+
+    property ExprWord: TExprWord read FExprWord write SetExprWord;
   public
     constructor Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
 
@@ -169,7 +173,8 @@ type
     procedure Refresh(Buffer: PChar); override;
   end;
 
-//--TFieldVar----------------------------------------------------------------
+{ TFieldVar }
+
 constructor TFieldVar.Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
 begin
   inherited Create;
@@ -180,10 +185,17 @@ begin
   FFieldName := UseFieldDef.FieldName;
 end;
 
-//--TStringFieldVar---------------------------------------------------------
+procedure TFieldVar.SetExprWord(NewExprWord: TExprWord);
+begin
+  FExprWord.FixedLen := FFieldDef.Size;
+end;
+
+{ TStringFieldVar }
+
 constructor TStringFieldVar.Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
 begin
   inherited;
+  FRawStringField := true;
 end;
 
 destructor TStringFieldVar.Destroy;
@@ -209,16 +221,15 @@ var
   Len: Integer;
   Src: PChar;
 begin
-  // copy field data
-  Len := FieldDef.Size;
   Src := Buffer+FieldDef.Offset;
-  // trim right side spaces by null-termination
   if not FRawStringField then
   begin
-    while (Len >= 1) and (Buffer[Len-1] = ' ') do Dec(Len);
-    FFieldVal[Len] := #0;
+    // copy field data
+    Len := FieldDef.Size;
+    while (Len >= 1) and (Src[Len-1] = ' ') do Dec(Len);
     // translate to ANSI
-    TranslateString(DbfFile.UseCodePage, GetACP, Src, FFieldVal, Len);
+    Len := TranslateString(DbfFile.UseCodePage, GetACP, Src, FFieldVal, Len);
+    FFieldVal[Len] := #0;
   end else
     FFieldVal := Src;
 end;

+ 4 - 6
fcl/db/dbase/dbf_prscore.pas

@@ -117,7 +117,9 @@ type
 procedure FuncFloatToStr(Param: PExpressionRec);
 procedure FuncIntToStr_Gen(Param: PExpressionRec; Val: {$ifdef SUPPORT_INT64}Int64{$else}Integer{$endif});
 procedure FuncIntToStr(Param: PExpressionRec);
+{$ifdef SUPPORT_INT64}
 procedure FuncInt64ToStr(Param: PExpressionRec);
+{$endif}
 procedure FuncDateToStr(Param: PExpressionRec);
 procedure FuncSubString(Param: PExpressionRec);
 procedure FuncUppercase(Param: PExpressionRec);
@@ -254,12 +256,8 @@ begin
     begin
       // copy pointer to variable
       Args[0] := ExprWord.AsPointer;
-      // is this a fixed length string variable?
-      if ExprWord.FixedLen >= 0 then
-      begin
-        // store length as second parameter
-        Args[1] := PChar(ExprWord.LenAsPointer);
-      end;
+      // store length as second parameter
+      Args[1] := PChar(ExprWord.LenAsPointer);
     end;
   end;
 end;

+ 2 - 0
fcl/db/dbase/history.txt

@@ -38,6 +38,8 @@ V6.9.1
 - fix last memo field getting truncated (patch by dhdorrough)
 - add dbf_collate unit to the packages
 - fix index result too long bug
+- add support for big endian
+- fix non-raw string field filter
 
 ------------------------
 V6.9.0