184
184
RecordSize := GetBlockLen;
185
185
// checking for right blocksize not needed for foxpro?
186
if FDbfVersion <> xFoxPro then
186
// mod 128 <> 0 <-> and 0x7F <> 0
187
if (RecordSize = 0) and ((FDbfVersion = xFoxPro) or ((RecordSize and $7F) <> 0)) then
188
// mod 128 <> 0 <-> and 0x7F <> 0
189
if (RecordSize = 0) or ((RecordSize and $7F) <> 0) then
197
194
// get memory for temporary buffer
234
231
if (BlockNo<=0) or (RecordSize=0) then
236
233
// read first block
237
if ReadRecord(BlockNo, @FBuffer[0]) = 0 then
234
numBytes := ReadRecord(BlockNo, @FBuffer[0]);
240
if numBytes < RecordSize then
241
FillChar(FBuffer[RecordSize-numBytes], numBytes, #0);
242
243
bytesLeft := GetMemoSize;
243
244
// bytesLeft <> -1 -> memo size is known (FoxPro, dBase4)
244
245
// bytesLeft = -1 -> memo size unknown (dBase3)
372
373
totsize := Src.Size + bytesBefore + bytesAfter;
373
374
if FDbfVersion <> xFoxPro then
375
PBlockHdr(FBuffer).MemoType := $0008FFFF;
376
PBlockHdr(FBuffer).MemoSize := totsize;
376
PBlockHdr(FBuffer)^.MemoType := $0008FFFF;
377
PBlockHdr(FBuffer)^.MemoSize := totsize;
378
PBlockHdr(FBuffer).MemoType := $01000000;
379
PBlockHdr(FBuffer).MemoSize := SwapInt(Src.Size);
379
PBlockHdr(FBuffer)^.MemoType := $01000000;
380
PBlockHdr(FBuffer)^.MemoSize := SwapInt(Src.Size);
383
384
// read bytes, don't overwrite header
384
read := Src.Read(FBuffer[bytesBefore], RecordSize{PDbtHdr(Header).BlockLen}-bytesBefore);
385
readBytes := Src.Read(FBuffer[bytesBefore], RecordSize{PDbtHdr(Header).BlockLen}-bytesBefore);
385
386
// end of input data reached ? check if need to write block terminators
386
while (read < RecordSize - bytesBefore) and (bytesAfter > 0) do
387
while (readBytes < RecordSize - bytesBefore) and (bytesAfter > 0) do
388
FBuffer[read] := #$1A;
389
FBuffer[readBytes] := #$1A;
392
393
// have we read anything that is to be written?
394
if readBytes > 0 then
395
396
// clear any unused space
396
FillChar(FBuffer[bytesBefore+read], RecordSize-read-bytesBefore, ' ');
397
FillChar(FBuffer[bytesBefore+readBytes], RecordSize-readBytes-bytesBefore, ' ');
398
399
WriteRecord(tmpRecNo, @FBuffer[0]);
422
423
if FDbfVersion = xBaseIII then
425
Result := PDbtHdr(Header).BlockLen;
426
Result := PDbtHdr(Header)^.BlockLen;
428
429
function TDbaseMemoFile.GetMemoSize: Integer;
430
431
// dBase4 memofiles contain small 'header'
431
432
if PInteger(@FBuffer[0])^ = $0008FFFF then
432
Result := PBlockHdr(FBuffer).MemoSize-8
433
Result := PBlockHdr(FBuffer)^.MemoSize-8
437
438
function TDbaseMemoFile.GetNextFreeBlock: Integer;
439
Result := PDbtHdr(Header).NextBlock;
440
Result := PDbtHdr(Header)^.NextBlock;
442
443
procedure TDbaseMemoFile.SetNextFreeBlock(BlockNo: Integer);
444
PDbtHdr(Header).NextBlock := BlockNo;
445
PDbtHdr(Header)^.NextBlock := BlockNo;
447
448
procedure TDbaseMemoFile.SetBlockLen(BlockLen: Integer);
449
PDbtHdr(Header).BlockLen := BlockLen;
450
PDbtHdr(Header)^.BlockLen := BlockLen;
452
453
// ------------------------------------------------------------------
456
457
function TFoxProMemoFile.GetBlockLen: Integer;
458
Result := Swap(PFptHdr(Header).BlockLen);
459
Result := SwapWord(PFptHdr(Header)^.BlockLen);
461
462
function TFoxProMemoFile.GetMemoSize: Integer;
463
Result := SwapInt(PBlockHdr(FBuffer).MemoSize);
464
Result := SwapInt(PBlockHdr(FBuffer)^.MemoSize);
466
467
function TFoxProMemoFile.GetNextFreeBlock: Integer;
468
Result := SwapInt(PFptHdr(Header).NextBlock);
469
Result := SwapInt(PFptHdr(Header)^.NextBlock);
471
472
procedure TFoxProMemoFile.SetNextFreeBlock(BlockNo: Integer);
473
PFptHdr(Header).NextBlock := SwapInt(BlockNo);
474
PFptHdr(Header)^.NextBlock := SwapInt(dword(BlockNo));
476
477
procedure TFoxProMemoFile.SetBlockLen(BlockLen: Integer);
478
PFptHdr(Header).BlockLen := Swap(BlockLen);
479
PFptHdr(Header)^.BlockLen := SwapWord(dword(BlockLen));
481
482
// ------------------------------------------------------------------