>SET PROCEDURE TO MEMOREPAIR.PRG >? RepairMemoHeader( "SO.FPT" ) >>
>>Function RepairMemoHeader >>Lparameters tcMemoFilename >>Local handle, lnFileSize, lnNextBlockPointer, lnBlockSize, lnFirstBlock, lnCalculatedFileSize >> >>handle=fopen(tcMemoFilename,12) && Opened readwrite >>lnFileSize = fseek(handle,0,2) && Get file size >>* Read header info >>lnNextBlockPointer = ReadBytes(handle, 0,4,.T.) && Stored in left-to-right format >>lnBlockSize = ReadBytes(handle, 6,2,.T.) && Stored in left-to-right format >> >>* Specific to me - no blocksize setting to something other than default 0x40 >>If lnBlockSize # 0x40 >> WriteBytes(handle, 6,2,0x40,.T.) >> lnBlockSize=0x40 >>Endif >>* >> >>lnFirstBlock = ceiling(512/lnBlockSize) && Possible min lnNextblockpointer >>lnCalculatedFileSize = lnNextBlockPointer*lnBlockSize >> >>* Fix if needs repair >>If !(lnFileSize >= 512 ; >> and lnNextBlockPointer >= lnFirstBlock ; >> and lnCalculatedFileSize >= lnFileSize) && Memo needs repair >> lnNextBlockPointer = max(lnNextBlockPointer, lnFirstBlock) >> lnFileSize = lnNextBlockPointer * lnBlockSize >> WriteBytes(handle, 0,4,lnNextBlockPointer,.T.) && Fix next block pointer >> =fchsize(handle, lnFileSize) && Fix filesize >>Endif >>=fclose(handle) >> >>Function ReadBytes >>Lparameters tnHandle, tnPos, tnSize, tlLR >>Local lcString, lnRetValue,ix >>=fseek(tnHandle, tnPos,0) && Go to pos >>lcString = fread(tnHandle, tnSize) && Read tnSize bytes >>lnRetValue = 0 >>For ix=0 to tnSize-1 && Convert to a number >> lnRetValue = lnRetValue + asc(substr(lcString,ix+1)) * ; >> iif(tlLR,256^(tnSize-1-ix),256^ix) >>Endfor >>Return int(lnRetValue) >> >>Function WriteBytes >>Lparameters tnHandle, tnPos, tnSize, tnNumber, tlLR >>Local lcString, lnLowDword, lnHighDword,ix >>lcString='' >>If tlLR >> For ix=tnSize-1 to 0 step -1 >> lcString=lcString+chr(tnNumber/256^ix%256) >> Endfor >>Else >> For ix=0 to tnSize-1 >> lcString=lcString+chr(tnNumber/256^ix%256) >> Endfor >>Endif >>=fseek(tnHandle, tnPos,0) && Go to pos >>Return fwrite(tnHandle,lcString) >>Cetin