PeekStringFormat() & PokeStringFormat()

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
User avatar
nco2k
Addict
Addict
Posts: 1344
Joined: Mon Sep 15, 2003 5:55 am

PeekStringFormat() & PokeStringFormat()

Post by nco2k »

then we could also read/write a bom from/to a memory buffer. :)

Code: Select all

Procedure PeekStringFormat(*MemoryBuffer)
  If PeekW(*MemoryBuffer) = -17425 And PeekB(*MemoryBuffer + SizeOf(Word)) = -65
    Result = #PB_UTF8
  ElseIf PeekW(*MemoryBuffer) = -257
    Result = #PB_Unicode
  Else
    Result = #PB_Ascii
  EndIf
  ProcedureReturn Result
EndProcedure

Procedure PokeStringFormat(*MemoryBuffer, Format)
  Select Format
    Case #PB_UTF8
      PokeW(*MemoryBuffer, -17425)
      PokeB(*MemoryBuffer + SizeOf(Word), -65)
    Case #PB_Unicode
      PokeW(*MemoryBuffer, -257)
  EndSelect
EndProcedure

Procedure BOMSize(Format=-1)
  If Format = -1
    Select SizeOf(Character)
      Case 1
        Format = #PB_Ascii
      Case 2
        Format = #PB_UTF8
    EndSelect
  EndIf
  Select Format
    Case #PB_Ascii
      Result = 0
    Case #PB_Unicode
      Result = 2
    Case #PB_UTF8
      Result = 3
  EndSelect
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 300, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  StringGadget(0, 5, 5, 200, 20, "")
  StringGadget(1, 5, 30, 200, 20, "")
  StringGadget(2, 5, 55, 200, 20, "")
  
  Format = PeekStringFormat(?UTF8)
  Offset = BOMSize(Format)
  SetGadgetText(0, PeekS(?UTF8 + Offset, -1, Format))
  
  Format = PeekStringFormat(?UTF16LE)
  Offset = BOMSize(Format)
  SetGadgetText(1, PeekS(?UTF16LE + Offset, -1, Format))
  
  Format = PeekStringFormat(?ASCII)
  Offset = BOMSize(Format)
  SetGadgetText(2, PeekS(?ASCII + Offset, -1, Format))
  
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf : End

;zero terminated strings in different formats including bom
DataSection
  UTF8:;#PB_UTF8
    Data.b $EF,$BB,$BF,$55,$54,$46,$38,$00
  UTF16LE:;#PB_Unicode
    Data.b $FF,$FE,$55,$00,$54,$00,$46,$00,$31,$00,$36,$00,$4C,$00,$45,$00,$00,$00
  ASCII:;#PB_Ascii
    Data.b $41,$53,$43,$49,$49,$00
EndDataSection
c ya,
nco2k
If OSVersion() = #PB_OS_Windows_ME : End : EndIf