0
Hello world!
Whatever
210453397503
But the numbers should be 42 and 6724, of course. I've checked the index *stream\pos but just cannot see the problem. It must be something really simple. Does some of you perhaps spot the bug?
Code: Select all
DeclareModule MemoryHelpers
#MH_DefaultBufferSize=104857600
Structure MemoryStream
pos.i
buff.i
EndStructure
Declare NewMemoryStream(*stream.MemoryStream, size=#MH_DefaultBufferSize)
Declare OpenAsMemoryStream(*stream.MemoryStream, *buffer)
Declare SeekMemoryStream(*stream.MemoryStream, position.i)
Declare ResetMemoryStream(*stream.MemoryStream)
Declare IsMemoryStream(*stream.MemoryStream)
Declare FreeMemoryStream(*stream.MemoryStream)
Declare WriteMemoryString(*stream.MemoryStream, s.s)
Declare WriteMemoryQuad(*stream.MemoryStream, v.q)
Declare.s ReadMemoryString(*stream.MemoryStream)
Declare.q ReadMemoryQuad(*stream.MemoryStream)
Declare ReadMemoryStream(*stream.MemoryStream, length, file)
Declare WriteMemoryStream(*stream.MemoryStream, file)
EndDeclareModule
Module MemoryHelpers
EnableExplicit
CompilerIf #PB_Compiler_Unicode
#CHARLEN=2
CompilerElse
#CHARLEN=1
CompilerEndIf
Procedure NewMemoryStream(*stream.MemoryStream, size=#MH_DefaultBufferSize)
Protected result
*stream\buff=AllocateMemory(size)
If *stream\buff>0
*stream\pos=0
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure OpenAsMemoryStream(*stream.MemoryStream,*buffer)
Protected result
If *buffer
*stream\buff=*buffer
*stream\pos=0
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure SeekMemoryStream(*stream.MemoryStream, position.i)
Protected result
If position<=MemorySize(*stream\buff)
*stream\pos=position
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure ResetMemoryStream(*stream.MemoryStream)
*stream\pos=0
EndProcedure
Procedure IsMemoryStream(*stream.MemoryStream)
Protected result
If *stream\buff>0 And *stream\pos<=MemorySize(*stream\buff)
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure FreeMemoryStream(*stream.MemoryStream)
Protected result
If *stream\buff>0
FreeMemory(*stream\buff)
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure AdjustMaybe(*stream.MemoryStream, len.i)
Protected *buff2, result
If *stream\buff>0 And *stream\pos+len<=MemorySize(*stream\buff)
result=#True
Else
*buff2=AllocateMemory(MemorySize(*stream\buff)+#MH_DefaultBufferSize)
If *buff2>0 And CopyMemory(*stream\buff, *buff2, *stream\pos)
FreeMemory(*stream\buff)
*stream\buff=*buff2
result=#True
EndIf
EndIf
ProcedureReturn result
EndProcedure
Procedure WriteMemoryString(*stream.MemoryStream, s.s)
Protected result, le.q, blen
le=Len(s)
blen=le*#CHARLEN+#CHARLEN
If AdjustMaybe(*stream, blen+8)
PokeQ(*stream\buff+*stream\pos, le)
PokeS(*stream\buff+*stream\pos+8, s)
*stream\pos=*stream\pos+blen+8
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure.s ReadMemoryString(*stream.MemoryStream)
Protected le.q, result.s
le = PeekQ(*stream\buff+*stream\pos)
If le>0
result=PeekS(*stream\buff+*stream\pos+8, le)
*stream\pos=*stream\pos+(le*#CHARLEN+#CHARLEN+8)
EndIf
ProcedureReturn result
EndProcedure
Procedure WriteMemoryQuad(*stream.MemoryStream, v.q)
Protected result
If AdjustMaybe(*stream, 8)
PokeQ(*stream\buff+*stream\pos, v)
*stream\pos=*stream\pos+8
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure.q ReadMemoryQuad(*stream.MemoryStream)
Protected v.q
v=PeekQ(*stream.MemoryStream+*stream\pos)
*stream\pos=*stream\pos+8
ProcedureReturn v
EndProcedure
Procedure ReadMemoryStream(*stream.MemoryStream, length, file)
Protected result
If IsFile(file) And *stream\buff>0 And ReadData(file, *stream\buff, length)
result=#True
EndIf
ProcedureReturn result
EndProcedure
Procedure WriteMemoryStream(*stream.MemoryStream, file)
Protected result
If IsFile(file) And *stream\buff>0 And WriteData(file, *stream\buff, *stream\pos-1)
result=#True
EndIf
ProcedureReturn result
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
UseModule MemoryHelpers
Define test.MemoryStream
If NewMemoryStream(@test)
WriteMemoryQuad(@test,42)
WriteMemoryString(@test, "Hello world!")
WriteMemoryString(@test, "Whatever")
WriteMemoryQuad(@test, 6724)
ResetMemoryStream(@test)
Debug Str(ReadMemoryQuad(@test))
Debug ReadMemoryString(@test)
Debug ReadMemoryString(@test)
Debug Str(ReadMemoryQuad(@test))
FreeMemoryStream(@test)
Else
Debug "ERROR: Creating the memory stream failed."
EndIf
CompilerEndIf