Page 1 of 1

fast file lib bug?

Posted: Sun Apr 18, 2004 2:08 am
by Dreglor
i get a double tone pc speaker beep when i execute the Copytorealfile() procedure
have no calls to beep so i sure it not a misplaced endif or somthing...
the code below deals with alot of memory reading and writing,as the include shows :)
but when the beeping happens during the reading test so this suggests that it the lib
note: make c:\test.txt and fill it with some text before running anything

Code: Select all

;RamFile.pb
;by Dreglor
;4-17-04
;1.0 Beta
;
;requires "Fast File" lib
;
;CreateRamFile.b(id)
;DestroyRamFile.b(id)
;RamFileSeek.b(id,byte)
;ReadRamFileByte.b(id)
;ReadRamFileWord.w(id)
;ReadRamFileLong.l(id)
;ReadRamFileFloat.f(id)
;ReadRamFileString.s(id)
;WriteRamFileByte.b(id)
;WriteRamFileWord.b(id)
;WriteRamFileLong.b(id)
;WriteRamFileFloat.b(id)
;WriteRamFileString.b(id)
;WriteRamFileStringN.b(id)
;CopyToRealFile.b(id,file)
;CopyFromRealFile.b(id,file)
;RamFileEOF.b(id)
;RamFileLEN.l(id)
;RamFileAddress.l(id)

#MaxFiles=32;who needs more?
Dim RF_(#MaxFiles)
Dim RFB_(#MaxFiles)
Dim RFS_(#MaxFiles)

Procedure.b CreateRamFile(id)
  Result=AllocateMemory(65536);a lenght of a string to start out with
  If Result<>0
    RF_(id)=Result
    RFB_(id)=0
    RFS_(id)=65536
    ProcedureReturn 0;created sucessfully
  Else
    ProcedureReturn 1;couldn't allocate memory
  EndIf
EndProcedure

Procedure.b DestroyRamFile(id)
  FreeMemory(RF_(id))
  RF_(id)=0
  RFB_(id)=0
  ProcedureReturn 0
EndProcedure

Procedure.b RamFileSeek(id,byte)
  RFB_(id)=byte
EndProcedure

Procedure.b ReadRamFileByte(id)
  Byte.b=PeekB(RF_(id)+RFB_(id))
  RFB_(id)=RFB_(id)+1
  ProcedureReturn Byte.b
EndProcedure

Procedure.w ReadRamFileWord(id)
  Word.w=PeekW(RF_(id)+RFB_(id))
  RFB_(id)=RFB_(id)+2
  ProcedureReturn Word.w
EndProcedure

Procedure.l ReadRamFileLong(id)
  Long.l=PeekL(RF_(id)+RFB_(id))
  RFB_(id)=RFB_(id)+4
  ProcedureReturn Long.l
EndProcedure

Procedure.f ReadRamFileFloat(id)
  Float.f=PeekF(RF_(id)+RFB_(id))
  RFB_(id)=RFB_(id)+4
  ProcedureReturn Float.f
EndProcedure

Procedure.s ReadRamFileString(id)
  Counter=0
  Repeat
    Char.b=PeekB(RF_(id)+RFB_(id)+Counter)
    Counter=Counter+1
  Until Char=13 Or Char=10 Or Char=0
  String.s=PeekS(RF_(id)+RFB_(id),Counter)
  RFB_(id)=RFB_(id)+Counter
  ProcedureReturn String.s
EndProcedure

Procedure.b WriteRamFileByte(id,Byte.b)
  ReAllocateMemory(RF_(id),RFS_(id)+1)
  RFS_(id)=RFS_(id)+1
  PokeB(RF_(id)+RFB_(id),Byte.b)
  RFB_(id)=RFB_(id)+1
  ProcedureReturn 0
EndProcedure

Procedure.b WriteRamFileWord(id,Word.w)
  ReAllocateMemory(RF_(id),RFS_(id)+2)
  RFS_(id)=RFS_(id)+2
  PokeW(RF_(id)+RFB_(id),Word.w)
  RFB_(id)=RFB_(id)+2
  ProcedureReturn 0
EndProcedure

Procedure.b WriteRamFileLong(id,Long.l)
  ReAllocateMemory(RF_(id),RFS_(id)+4)
  RFS_(id)=RFS_(id)+4
  PokeL(RF_(id)+RFB_(id),Long.l)
  RFB_(id)=RFB_(id)+4
  ProcedureReturn 0
EndProcedure

Procedure.b WriteRamFileFloat(id,Float.f)
  ReAllocateMemory(RF_(id),RFS_(id)+4)
  RFS_(id)=RFS_(id)+4
  PokeF(RF_(id)+RFB_(id),Float.f)
  RFB_(id)=RFB_(id)+4
  ProcedureReturn 0
EndProcedure

Procedure.b WriteRamFileString(id,String.s)
  ReAllocateMemory(RF_(id),RFS_(id)+Len(String))
  RFS_(id)=RFS_(id)+Len(String)
  For Counter=0 To Len(String)
    PokeB(RF_(id)+RFB_(id)+Counter,PeekB(@String+Counter))
  Next Counter
  RFB_(id)=RFB_(id)+Counter
  ProcedureReturn 
EndProcedure

Procedure.b WriteRamFileStringN(id,String.s)
  ReAllocateMemory(RF_(id),RFS_(id)+Len(String))
  RFS_(id)=RFS_(id)+Len(String)
  For Counter=0 To Len(String)
    PokeB(RF_(id)+RFB_(id)+Counter,PeekB(@String+Counter))
  Next Counter
  PokeB(RF_(id)+RFB_(id)+Counter,13)
  RFB_(id)=RFB_(id)+Counter+1
  ProcedureReturn ""
EndProcedure

Procedure.b CopyToRealFile(id,file.s)
  If FastOpenFile(File)<>0
    FastWriteData(0,RFS_(id),RF_(id))
    FastCloseFile()
    ProcedureReturn 0
  Else
    FastCloseFile()
    ProcedureReturn 1 ;failed to open file (fast file lib)
  EndIf
EndProcedure

Procedure.b CopyFromRealFile(id,file.s)
  If OpenFile(file)<>0
    FLen=Lof()
    CloseFile(0)
    If FastOpenFile(File)<>0
      FastReadData(0,Flen,RF_(id))
      FastCloseFile()
      ProcedureReturn 0
    Else
      FastCloseFile()
      ProcedureReturn 1 ;failed to open file (fast file lib)
    EndIf
  Else
    ProcedureReturn 2;faild to grab the file size
  EndIf
EndProcedure

Procedure.b RamFileEOF(id)
  If PeekB(RF_(id)+RFB_(id))=0
    ProcedureReturn 1;EORF (End Of Ram File)
  Else
    ProcedureReturn 0;Not EORF
  EndIf
EndProcedure

Procedure.l RamFileLEN(id)
  ProcedureReturn RFS_(id)
EndProcedure

Procedure.l RamFileAddress(id)
  ProcedureReturn RF_(id)
EndProcedure

next source

Code: Select all

;rftest.pb
IncludeFile "RamFile.pb"
;CreateRamFile.b(id)
;DestroyRamFile.b(id)
;RamFileSeek.b(id,byte)
;ReadRamFileByte.b(id)
;ReadRamFileWord.w(id)
;ReadRamFileLong.l(id)
;ReadRamFileFloat.f(id)
;ReadRamFileString.s(id)
;WriteRamFileByte.b(id)
;WriteRamFileWord.b(id)
;WriteRamFileLong.b(id)
;WriteRamFileFloat.b(id)
;WriteRamFileString.b(id)
;WriteRamFileStringN.b(id)
;CopyToRealFile.b(id,file)
;CopyFromRealFile.b(id,file)
;RamFileEOF.b(id)
;RamFileLEN.l(id)
;RamFileAddress.l(id)

CreateRamFile(0)
DestroyRamFile(0)
CreateRamFile(1)
CopyFromRealFile(1,"C:\test.txt")
RamFileSeek(1,0)
Repeat
  txt.s=txt+ReadRamFileString(1)
Until RamFileEOF(1)=1
MessageRequester("Debug",txt)
DestroyRamFile(1)
CreateRamFile(2)
WriteRamFileByte(2,87)
WriteRamFileWord(2,1987)
WriteRamFileLong(2,10191987)
WriteRamFileFloat(2,1019.1987)
WriteRamFileString(2,"10/19/87")
WriteRamFileStringN(2,"10/19/1987")
WriteRamfileString(2,"New Line Test")
RamFileSeek(2,0)
Debug ReadRamFileByte(2)
Debug ReadRamFileWord(2)
Debug ReadRamFileLong(2)
Debug ReadRamFileFloat(2)
txt=""
txt=ReadRamFileString(2)
txt=txt+ReadRamFileString(2)
MessageRequester("Debug2",txt)
address=RamFileAddress(2)
Debug PeekB(address)
Debug RamFileLen(2)
Debug RamFileEOF(2)
RamFileSeek(2,0)
CopyToRealFile(2,"c:\test2.txt")
DestroyRamFile(2)
OpenFile(0,"c:\test2.txt")
Debug Str(Lof())
CloseFile(0)
i don't like posting full code just becasue i afraid of some one stealing it :\
but in this case i have no clue of whats going on
on the other hand the code isn't fully working and it helps fix the bug :D
edit: opps i for got to mention that teh debug window doesn't do anything like if it was a problem..just pause until the beep is over

Posted: Mon Apr 19, 2004 8:00 am
by Rings
I havn't tested your example yet to find some specific error, but these are my general statement to 'BEEP's :

If something goes wrong, i fired up some beeps. This should not happend,
but it can in some cases.
For example if a Write Command overblows the filesize-area, in other words if Offset + Datalength bigger than filesize.
Also if Offset or Datalength is greater than filesize.
It can also beeps if a file cannot be open (locked by another one) .

anyway, i'm on the lib (and a lot of more goodies) for next release (Last release is long ago) .

Posted: Mon Apr 19, 2004 11:03 am
by Dreglor
oh good, any idea about how close it is being done?
and i cheack my code over on that...