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