Page 1 of 1

Append value to memory?

Posted: Fri Feb 04, 2011 8:40 pm
by BigB0ss
Is there any way to "append" a value or a string to the memory, and reading them later out?
I'm looking for this for ages...

I have made a work-around for what I exactly mean, using a string as buffer:

Code: Select all

Global ReadPos = 1
Global Buffer$ = ""

;===
;WRITING FUNCTIONS
;===

Procedure WriteBufferSmall(Value) ;// MAX VALUE OF 99
Buffer$ + RSet(Str(Value),2,"0")
EndProcedure

Procedure WriteBufferMedium(Value) ;// MAX VALUE OF 9999
Buffer$ + RSet(Str(Value),4,"0")
EndProcedure

Procedure WriteBufferLarge(Value) ;// MAX VALUE OF 99999999
Buffer$ + RSet(Str(Value),8,"0")
EndProcedure

Procedure WriteBufferString(String$) ;// MAX STRING LENGTH OF 9999
Protected Length
Length = Len(String$)
WriteBufferMedium(Length)
Buffer$ + String$
EndProcedure

;===
;READING FUNCTIONS
;===

Procedure ReadBufferSmall()
Protected RetVal
RetVal = Val(Mid(Buffer$,ReadPos,2))
ReadPos + 2
ProcedureReturn RetVal
EndProcedure

Procedure ReadBufferMedium()
Protected RetVal
RetVal = Val(Mid(Buffer$,ReadPos,4))
ReadPos + 4
ProcedureReturn RetVal
EndProcedure

Procedure ReadBufferLarge()
Protected RetVal
RetVal = Val(Mid(Buffer$,ReadPos,8))
ReadPos + 8
ProcedureReturn RetVal
EndProcedure

Procedure.s ReadBufferString()
Protected Length, RetVal$
Length = ReadBufferMedium()
RetVal$ = Mid(Buffer$,ReadPos,Length)
ReadPos + Length
ProcedureReturn RetVal$
EndProcedure

;===
;CLEARING THE BUFFER
;===

Procedure ClearBuffer()
ReadPos = 1
Buffer$ = ""
EndProcedure

;===
;SIMPLE TEST
;===

WriteBufferSmall(12)
WriteBufferString("TEST STRING")
WriteBufferLarge(12345678)
WriteBufferMedium(1234)

Debug ReadBufferSmall()      ;//-> 12
Debug ReadBufferString()      ;//-> TEST STRING
Debug ReadBufferLarge()      ;//-> 12345678
Debug ReadBufferMedium()      ;//-> 1234
Debug "----------"
Debug "BUFFER: "+Buffer$

ClearBuffer()
I hope you guys know what I mean, my english is not so good so it's hard to explain.

Thanks in advance!

Re: Append value to memory?

Posted: Sat Feb 05, 2011 2:57 am
by Demivec
I recommend using a memory buffer instead of a string buffer.

Here is your updated code with minimal error handling:

Code: Select all

Global ReadPos = 0
Global bufferSize = 1000
Global *buffer = AllocateMemory(bufferSize)
Global WritePos = 0


Procedure handleError(p_result.l, p_text.s) ;display error message if result= 0 and then END program
  If p_result = 0
    MessageRequester("Error", p_text, #PB_MessageRequester_Ok)
    End
  EndIf
EndProcedure

;===
;WRITING FUNCTIONS
;===
Procedure writeStringToBuffer(string$)
  ;always adds #Null after string but WritePos is advanced only by string length (not including the #Null)
  Protected length = MemoryStringLength(@string$)
  If (WritePos + length + SizeOf(Character)) >= bufferSize
    Protected *newBuffer, newBufferSize = bufferSize + 1000 
    *newBuffer = ReAllocateMemory(*buffer, newBufferSize)

    handleError(*newBuffer, "Can't allocate buffer.")
    *buffer = *newBuffer
    bufferSize = newBufferSize
  EndIf 
  
  PokeS(*buffer + WritePos, string$)
  WritePos + length
  ProcedureReturn #True
EndProcedure


Procedure WriteBufferSmall(Value) ;// MAX VALUE OF 99
  Protected buffer$ = RSet(Str(Value), 2, "0")
  ProcedureReturn writeStringToBuffer(buffer$)
EndProcedure

Procedure WriteBufferMedium(Value) ;// MAX VALUE OF 9999
  Protected buffer$ = RSet(Str(Value), 4, "0")
  ProcedureReturn writeStringToBuffer(buffer$)
EndProcedure

Procedure WriteBufferLarge(Value) ;// MAX VALUE OF 99999999
  Protected buffer$ = RSet(Str(Value), 8, "0")
  ProcedureReturn writeStringToBuffer(buffer$)
EndProcedure

Procedure WriteBufferString(string$) ;// MAX STRING LENGTH OF 9999
  WriteBufferMedium(Len(string$))
  writeStringToBuffer(string$)
  ProcedureReturn
EndProcedure

;===
;READING FUNCTIONS
;===
Procedure readBufferValue(Size = 1)
  Protected RetVal
  RetVal = Val(PeekS(*buffer + ReadPos, Size))
  ReadPos + Size
  ProcedureReturn RetVal
EndProcedure


Procedure ReadBufferSmall()
  ProcedureReturn readBufferValue(2)
EndProcedure

Procedure ReadBufferMedium()
  ProcedureReturn readBufferValue(4)
EndProcedure

Procedure ReadBufferLarge()
  ProcedureReturn readBufferValue(8)
EndProcedure

Procedure.s ReadBufferString()
  Protected length, RetVal$
  length = ReadBufferMedium()
  RetVal$ = PeekS(*buffer + ReadPos,length)
  ReadPos + length
  ProcedureReturn RetVal$
EndProcedure

;===
;CLEARING THE BUFFER
;===

Procedure ClearBuffer()
  ReadPos = 0
  WritePos = 0
  FillMemory(*buffer, bufferSize, 0, #PB_Long) ;or reallocate the memory with a defined bufferSize
EndProcedure

;===
;SIMPLE TEST
;===

WriteBufferSmall(12)
WriteBufferString("TEST STRING")
WriteBufferLarge(12345678)
WriteBufferMedium(1234)
Debug ReadBufferSmall()      ;//-> 12
Debug ReadBufferString()      ;//-> TEST STRING
Debug ReadBufferLarge()      ;//-> 12345678
Debug ReadBufferMedium()      ;//-> 1234
Debug "----------"
Debug "BUFFER: " + PeekS(*buffer) ;reads string from buffer starting at the beginning and continuing until a #Null is hit . . .

ClearBuffer()