[Source] Memory Preferences

Share your advanced PureBasic knowledge/code with the community.
User avatar
Mijikai
Addict
Addict
Posts: 1520
Joined: Sun Sep 11, 2016 2:17 pm

[Source] Memory Preferences

Post by Mijikai »

Some code to use preferences stored im memory (basically CatchPreference).

Code:

Code: Select all


EnableExplicit

;PB 6.10 beta 1 (x64)

;MEM PREFERENCE
;Author: Mijikai
;Version: dev

;Note: 
;- Ignores comments & order (improve if needed)
;- Not all pref functions have beed "translated"

Structure PREFERENCE_GROUP
  Map key.s()
EndStructure

Structure PREFERENCE
  *buffer
  bytes.i
  lookup.s
  Map group.PREFERENCE_GROUP()
EndStructure

Procedure.i prefProcess(*p.PREFERENCE)
  Protected text.s
  Protected token.s
  Protected pos.i
  Protected group.s
  Protected key.s
  With *p
    text = PeekS(\buffer,\bytes,#PB_UTF8|#PB_ByteLength)
    If text
      Repeat
        pos + 1
        token = StringField(text,pos,#CRLF$)
        If token = #Null$
          Break
        ElseIf Not Left(token,1) = ";"
          If Left(token,1) = "["
            group = Mid(token,2,Len(token) - 2)
            If AddMapElement(\group(),group) = #Null
              ProcedureReturn #False
            EndIf 
          ElseIf FindString(token," = ") And group
            key = StringField(token,1," = ")
            If AddMapElement(\group(group)\key(),key)
              \group(group)\key(key) = StringField(token,2," = ")  
            Else
              ProcedureReturn #False
            EndIf  
          EndIf
        EndIf
      ForEver
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure.i prefOpen(File.s,*Buffer = #Null,BufferSize.i = #Null)
  Protected handle.i
  Protected *p.PREFERENCE
  With *p
    If File
      handle = ReadFile(#PB_Any,File)
      If IsFile(handle)
        *p = AllocateMemory(SizeOf(PREFERENCE) + Lof(handle))
        If *p
          InitializeStructure(*p,PREFERENCE)
          \bytes = Lof(handle)
          \buffer = *p + SizeOf(PREFERENCE)
          If ReadData(handle,\buffer,\bytes) = \bytes
            If prefProcess(*p)
              CloseFile(handle)
              ProcedureReturn *p
            EndIf
          EndIf
          ClearStructure(*p,PREFERENCE)
          FreeMemory(*p)
        EndIf
        CloseFile(handle)
      EndIf
    ElseIf *Buffer > 0 And BufferSize > 0
      *p = AllocateMemory(SizeOf(PREFERENCE))
      If *p
        InitializeStructure(*p,PREFERENCE)
        \buffer = *Buffer
        \bytes = BufferSize
        If prefProcess(*p)
          ProcedureReturn *p
        EndIf
        ClearStructure(*p,PREFERENCE)
        FreeMemory(*p)
      EndIf
    EndIf
    ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i prefClose(*p.PREFERENCE)
  With *p
    ClearStructure(*p,PREFERENCE)
    FreeMemory(*p)
    ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i prefGroupExamine(*p.PREFERENCE)
  With *p
    ResetMap(\group())
    ProcedureReturn MapSize(\group())
  EndWith
EndProcedure

Procedure.i prefGroupNext(*p.PREFERENCE)
  With *p
    ProcedureReturn NextMapElement(\group())
  EndWith
EndProcedure

Procedure.s prefGroupKey(*p.PREFERENCE)
  With *p
    ProcedureReturn MapKey(\group())
  EndWith
EndProcedure

Procedure.i prefKeyExamine(*p.PREFERENCE,Group.s)
  With *p
    If FindMapElement(\group(),Group)
      \lookup = Group
      ResetMap(\group(\lookup)\key())
      ProcedureReturn MapSize(\group(\lookup)\key())
    EndIf
    ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i prefKeyNext(*p.PREFERENCE)
  With *p
    If \lookup
      ProcedureReturn NextMapElement(\group(\lookup)\key())
    EndIf
  EndWith
EndProcedure

Procedure.s prefKeyName(*p.PREFERENCE)
  With *p
    ProcedureReturn MapKey(\group(\lookup)\key())
  EndWith
EndProcedure

Procedure.s prefKeyValue(*p.PREFERENCE)
  With *p
    ProcedureReturn \group(\lookup)\key()
  EndWith
EndProcedure

Procedure.q prefKeyQuad(*p.PREFERENCE,Key.s)
  Protected val.q
  With *p
    PushMapPosition(\group(\lookup)\key())
    If FindMapElement(\group(\lookup)\key(),Key)
      val = Val(\group(\lookup)\key(Key))
    EndIf
    PopMapPosition(\group(\lookup)\key())
    ProcedureReturn val
  EndWith
EndProcedure

Procedure.i prefKeyInteger(*p.PREFERENCE,Key.s)
  With *p
    ProcedureReturn prefKeyQuad(*p,Key.s)
  EndWith
EndProcedure

Procedure.l prefKeyLong(*p.PREFERENCE,Key.s)
  With *p
    ProcedureReturn prefKeyQuad(*p,Key.s)
  EndWith
EndProcedure

Procedure.f prefKeyFloat(*p.PREFERENCE,Key.s)
  Protected val.f
  With *p
    PushMapPosition(\group(\lookup)\key())
    If FindMapElement(\group(\lookup)\key(),Key)
      val = ValF(\group(\lookup)\key(Key))
    EndIf
    PopMapPosition(\group(\lookup)\key())
    ProcedureReturn val
  EndWith
EndProcedure

Procedure.d prefKeyDouble(*p.PREFERENCE,Key.s)
  Protected val.d
  With *p
    PushMapPosition(\group(\lookup)\key())
    If FindMapElement(\group(\lookup)\key(),Key)
      val = ValD(\group(\lookup)\key(Key))
    EndIf
    PopMapPosition(\group(\lookup)\key())
    ProcedureReturn val
  EndWith
EndProcedure

Procedure.s prefKeyString(*p.PREFERENCE,Key.s)
  Protected val.s
  With *p
    PushMapPosition(\group(\lookup)\key())
    If FindMapElement(\group(\lookup)\key(),Key)
      val = \group(\lookup)\key(Key)
    EndIf
    PopMapPosition(\group(\lookup)\key())
    ProcedureReturn val
  EndWith
EndProcedure

Procedure.i prefSave(*p.PREFERENCE,File.s)
  Protected handle.i
  Protected group.s
  Protected key.s
  Protected value.s
  Protected error.i
  With *p
    If File And MapSize(\group())
      handle = CreateFile(#PB_Any,File)
      If IsFile(handle)
        If prefGroupExamine(*p)
          While prefGroupNext(*p)
            group = prefGroupKey(*p)
            If WriteStringN(handle,"[" + group + "]") = #Null
              error = #True
              Break
            EndIf
            If prefKeyExamine(*p,group)
              While prefKeyNext(*p)
                key = prefKeyName(*p)
                value = prefKeyValue(*p)
                If WriteStringN(handle,key + " = " + value) = #Null
                  error = #True
                  Break 2
                EndIf
              Wend  
            EndIf
          Wend  
        EndIf
        CloseFile(handle)
        If error
          DeleteFile(File)
          ProcedureReturn #False
        EndIf
      EndIf
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure.i Main()
  Protected handle.i
  handle = prefOpen(#Null$,?prefs,?eod - ?prefs)
  If handle
    If prefGroupExamine(handle)
      While prefGroupNext(handle)
        Debug prefGroupKey(handle)
      Wend  
    EndIf
    If prefKeyExamine(handle,"Window")
      While prefKeyNext(handle)
        Debug prefKeyName(handle) + " = " + prefKeyValue(handle)
      Wend  
      Debug prefKeyLong(handle,"WindowX")
      Debug prefKeyLong(handle,"WindowY")
      Debug prefKeyFloat(handle,"WindowZ")
    EndIf
    ;prefSave(handle,"Test2.prefs")
    prefClose(handle)
  EndIf
  ProcedureReturn #Null
EndProcedure

End Main()

DataSection
  prefs:
  IncludeBinary "Test.prefs";<- pref example from the Help!
  eod:
EndDataSection

User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: [Source] Memory Preferences

Post by Kwai chang caine »

Hello Mijikai :D

Thanks for sharing your nice code 8)
Apparently, that works here, with v5.73 :wink:
Folding
AutoComplete
ToolsPanel
CompilerDefaults
AsciiTable
StructureViewer
FindWindow
Debugger
CustomKeywords
Explorer
ToolbarNew
ToolsPanelMetrics
OpenedFiles
DiffWindow
FormPanel
GrepWindow
GrepOutput
Editor
ColorPicker
Projects
Indentation
Shortcuts
RecentFiles
FileViewer
MiscWindows
MoreCompilers
Global
VariableViewer
Issues
MacroErrorWindow
AddTools
Form
Templates
EditHistory
ProcedureBrowser
ImageThe happiness is a road...
Not a destination
Post Reply