mirror of
https://github.com/QB64Official/qb64.git
synced 2024-07-03 07:41:21 +00:00
Reduces INI-Manager to the bare minimum.
This commit is contained in:
parent
75642c31dc
commit
346b50d80a
|
@ -1,130 +1,6 @@
|
||||||
'INI Manager v1.01
|
'INI Manager v1.01
|
||||||
'Fellippe Heitor, 2017-2021 - fellippe@qb64.org - @fellippeheitor
|
'Fellippe Heitor, 2017-2021 - fellippe@qb64.org - @fellippeheitor
|
||||||
|
|
||||||
SUB IniSortSection (file$, __section$)
|
|
||||||
SHARED IniCODE, IniLastKey$, IniWholeFile$
|
|
||||||
SHARED IniDisableAutoCommit
|
|
||||||
|
|
||||||
REDIM Keys(1 TO 100) AS STRING
|
|
||||||
DIM TotalKeys, tempValue$, i AS LONG, Backup$, CommitBackup
|
|
||||||
|
|
||||||
IF IniFormatSection$(__section$) = "[]" THEN IniCODE = 15: EXIT SUB
|
|
||||||
|
|
||||||
DO
|
|
||||||
tempValue$ = ReadSetting(file$, __section$, "")
|
|
||||||
IF LEFT$(IniINFO$, 7) = "ERROR: " THEN EXIT SUB
|
|
||||||
IF IniCODE = 10 THEN EXIT DO
|
|
||||||
|
|
||||||
TotalKeys = TotalKeys + 1
|
|
||||||
IF TotalKeys > UBOUND(Keys) THEN
|
|
||||||
REDIM _PRESERVE Keys(1 TO UBOUND(Keys) + 100) AS STRING
|
|
||||||
END IF
|
|
||||||
|
|
||||||
Keys(TotalKeys) = IniLastKey$ + "=" + tempValue$
|
|
||||||
LOOP
|
|
||||||
|
|
||||||
REDIM _PRESERVE Keys(1 TO TotalKeys) AS STRING
|
|
||||||
IF IniArraySort(Keys()) = 0 THEN IniCODE = 23: EXIT SUB
|
|
||||||
|
|
||||||
CommitBackup = IniDisableAutoCommit
|
|
||||||
IniDisableAutoCommit = -1 'Prevent every minor change from being written to disk
|
|
||||||
Backup$ = IniWholeFile$
|
|
||||||
|
|
||||||
FOR i = 1 TO TotalKeys
|
|
||||||
IniDeleteKey file$, __section$, LEFT$(Keys(i), INSTR(Keys(i), "=") - 1)
|
|
||||||
IF LEFT$(IniINFO$, 7) = "ERROR: " THEN
|
|
||||||
IniDisableAutoCommit = CommitBackup
|
|
||||||
IniWholeFile$ = Backup$
|
|
||||||
EXIT SUB
|
|
||||||
END IF
|
|
||||||
NEXT
|
|
||||||
|
|
||||||
FOR i = 1 TO TotalKeys
|
|
||||||
WriteSetting file$, __section$, LEFT$(Keys(i), INSTR(Keys(i), "=") - 1), MID$(Keys(i), INSTR(Keys(i), "=") + 1)
|
|
||||||
IF LEFT$(IniINFO$, 7) = "ERROR: " THEN
|
|
||||||
IniDisableAutoCommit = CommitBackup
|
|
||||||
IniWholeFile$ = Backup$
|
|
||||||
EXIT SUB
|
|
||||||
END IF
|
|
||||||
NEXT
|
|
||||||
|
|
||||||
IniDisableAutoCommit = CommitBackup 'Restore writing to disk (or previously set state) and
|
|
||||||
IniCommit ' commit changes.
|
|
||||||
|
|
||||||
IniCODE = 22
|
|
||||||
END SUB
|
|
||||||
|
|
||||||
SUB IniDeleteSection (file$, __section$)
|
|
||||||
SHARED IniNewFile$, IniCODE, currentIniFileName$
|
|
||||||
SHARED IniLF$, IniWholeFile$, currentIniFileLOF AS _UNSIGNED LONG
|
|
||||||
|
|
||||||
IniLoad file$
|
|
||||||
IF IniCODE THEN EXIT SUB
|
|
||||||
|
|
||||||
DIM a$
|
|
||||||
IniCODE = 0
|
|
||||||
a$ = IniGetSection(__section$)
|
|
||||||
IF IniCODE THEN EXIT SUB
|
|
||||||
|
|
||||||
IniNewFile$ = LEFT$(IniWholeFile$, INSTR(IniWholeFile$, a$) - 1)
|
|
||||||
IniNewFile$ = IniNewFile$ + MID$(IniWholeFile$, INSTR(IniWholeFile$, a$) + LEN(a$ + IniLF$))
|
|
||||||
|
|
||||||
IniCommit
|
|
||||||
IniCODE = 13
|
|
||||||
END SUB
|
|
||||||
|
|
||||||
SUB IniDeleteKey (file$, __section$, __key$)
|
|
||||||
SHARED IniPosition AS _UNSIGNED LONG, IniCODE
|
|
||||||
SHARED IniLF$, IniWholeFile$, IniSectionData$
|
|
||||||
SHARED IniLastSection$, IniLastKey$, IniNewFile$
|
|
||||||
|
|
||||||
DIM tempValue$
|
|
||||||
DIM section$, key$
|
|
||||||
DIM FoundLF AS _UNSIGNED LONG
|
|
||||||
|
|
||||||
IniCODE = 0
|
|
||||||
|
|
||||||
'prepare variables for the write operation
|
|
||||||
section$ = IniFormatSection$(__section$)
|
|
||||||
IF IniCODE THEN EXIT SUB
|
|
||||||
|
|
||||||
key$ = LTRIM$(RTRIM$(__key$))
|
|
||||||
IF key$ = "" THEN IniCODE = 12: EXIT SUB
|
|
||||||
IniLastKey$ = key$
|
|
||||||
|
|
||||||
'Read the existing key to fill IniPosition
|
|
||||||
tempValue$ = ReadSetting$(file$, section$, key$)
|
|
||||||
IF IniCODE > 0 AND IniCODE <> 2 THEN EXIT SUB 'key not found
|
|
||||||
|
|
||||||
'map IniPosition (set in the section block) to the global file position
|
|
||||||
IniPosition = INSTR(IniWholeFile$, IniSectionData$) + IniPosition - 1
|
|
||||||
|
|
||||||
FoundLF = INSTR(IniPosition, IniWholeFile$, IniLF$)
|
|
||||||
IF FoundLF = 0 THEN FoundLF = LEN(IniWholeFile$)
|
|
||||||
|
|
||||||
IniNewFile$ = LEFT$(IniWholeFile$, IniPosition - 1) + MID$(IniWholeFile$, FoundLF + LEN(IniLF$))
|
|
||||||
|
|
||||||
IniCommit
|
|
||||||
IniCODE = 19
|
|
||||||
END SUB
|
|
||||||
|
|
||||||
SUB IniMoveKey (file$, __section$, __key$, __newsection$)
|
|
||||||
'A move operation is a copy operation + a delete operation
|
|
||||||
|
|
||||||
SHARED IniCODE
|
|
||||||
|
|
||||||
DIM tempValue$
|
|
||||||
|
|
||||||
tempValue$ = ReadSetting(file$, __section$, __key$)
|
|
||||||
IF IniCODE > 0 AND IniCODE <> 2 THEN EXIT SUB
|
|
||||||
|
|
||||||
WriteSetting file$, __newsection$, __key$, tempValue$
|
|
||||||
IF IniCODE > 0 AND IniCODE <> 2 AND IniCODE <> 7 AND IniCODE <> 9 THEN EXIT SUB
|
|
||||||
|
|
||||||
IniDeleteKey file$, __section$, __key$
|
|
||||||
IF IniCODE = 19 THEN IniCODE = 20
|
|
||||||
END SUB
|
|
||||||
|
|
||||||
SUB IniCommit
|
SUB IniCommit
|
||||||
SHARED currentIniFileName$, IniWholeFile$, currentIniFileLOF AS _UNSIGNED LONG
|
SHARED currentIniFileName$, IniWholeFile$, currentIniFileLOF AS _UNSIGNED LONG
|
||||||
SHARED IniNewFile$, IniDisableAutoCommit, IniCODE
|
SHARED IniNewFile$, IniDisableAutoCommit, IniCODE
|
||||||
|
@ -273,15 +149,7 @@ FUNCTION ReadSetting$ (file$, __section$, __key$)
|
||||||
|
|
||||||
key$ = LTRIM$(RTRIM$(__key$))
|
key$ = LTRIM$(RTRIM$(__key$))
|
||||||
IniLastKey$ = ""
|
IniLastKey$ = ""
|
||||||
IF key$ = "" THEN
|
IF key$ = "" THEN IniCODE = 12: EXIT FUNCTION
|
||||||
IF section$ = "[]" THEN IniSectionData$ = IniWholeFile$
|
|
||||||
key$ = IniNextKey
|
|
||||||
IF IniCODE THEN EXIT FUNCTION
|
|
||||||
IF key$ = "" THEN
|
|
||||||
IniCODE = 10
|
|
||||||
EXIT FUNCTION
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
|
|
||||||
IF LEFT$(key$, 1) = ";" OR LEFT$(key$, 1) = "'" OR INSTR(key$, "[") > 0 OR INSTR(key$, "]") > 0 OR INSTR(key$, "=") > 0 THEN
|
IF LEFT$(key$, 1) = ";" OR LEFT$(key$, 1) = "'" OR INSTR(key$, "[") > 0 OR INSTR(key$, "]") > 0 OR INSTR(key$, "=") > 0 THEN
|
||||||
IniCODE = 12
|
IniCODE = 12
|
||||||
|
@ -582,20 +450,6 @@ SUB IniSetAutoCommit (state AS _BYTE)
|
||||||
END IF
|
END IF
|
||||||
END SUB
|
END SUB
|
||||||
|
|
||||||
SUB IniClose
|
|
||||||
SHARED currentIniFileName$
|
|
||||||
DIM CommitBackup
|
|
||||||
|
|
||||||
IF currentIniFileName$ = "" THEN EXIT SUB
|
|
||||||
|
|
||||||
CommitBackup = IniDisableAutoCommit
|
|
||||||
IniDisableAutoCommit = 0
|
|
||||||
IniCommit
|
|
||||||
IniDisableAutoCommit = CommitBackup
|
|
||||||
|
|
||||||
currentIniFileName$ = ""
|
|
||||||
END SUB
|
|
||||||
|
|
||||||
SUB IniLoad (file$)
|
SUB IniLoad (file$)
|
||||||
SHARED IniCODE, currentIniFileName$, IniLF$, IniWholeFile$
|
SHARED IniCODE, currentIniFileName$, IniLF$, IniWholeFile$
|
||||||
SHARED currentIniFileLOF AS _UNSIGNED LONG
|
SHARED currentIniFileLOF AS _UNSIGNED LONG
|
||||||
|
@ -603,7 +457,6 @@ SUB IniLoad (file$)
|
||||||
DIM fileNum AS INTEGER
|
DIM fileNum AS INTEGER
|
||||||
|
|
||||||
'Error messages are returned with IniCODE
|
'Error messages are returned with IniCODE
|
||||||
'Error descriptions can be fetched with function IniINFO$
|
|
||||||
IniCODE = 0
|
IniCODE = 0
|
||||||
|
|
||||||
IF file$ <> "" AND currentIniFileName$ <> file$ THEN currentIniFileName$ = ""
|
IF file$ <> "" AND currentIniFileName$ <> file$ THEN currentIniFileName$ = ""
|
||||||
|
@ -646,148 +499,3 @@ SUB IniLoad (file$)
|
||||||
GOTO IniFileNotFound
|
GOTO IniFileNotFound
|
||||||
END IF
|
END IF
|
||||||
END SUB
|
END SUB
|
||||||
|
|
||||||
FUNCTION IniNextKey$
|
|
||||||
SHARED IniCODE, IniLF$, currentIniFileName$, IniSectionData$
|
|
||||||
SHARED IniPosition AS _UNSIGNED LONG
|
|
||||||
STATIC lastDataBlock$, position AS _UNSIGNED LONG, tempLF$
|
|
||||||
|
|
||||||
IF currentIniFileName$ = "" THEN IniCODE = 18: EXIT FUNCTION
|
|
||||||
|
|
||||||
IF IniSectionData$ <> lastDataBlock$ THEN
|
|
||||||
position = 0
|
|
||||||
lastDataBlock$ = IniSectionData$
|
|
||||||
|
|
||||||
'data blocks must end with a line feed for parsing purposes
|
|
||||||
IF RIGHT$(IniSectionData$, LEN(IniLF$)) <> IniLF$ THEN tempLF$ = IniLF$ ELSE tempLF$ = ""
|
|
||||||
END IF
|
|
||||||
|
|
||||||
DIM Equal AS _UNSIGNED LONG, tempKey$
|
|
||||||
|
|
||||||
FindKey:
|
|
||||||
Equal = INSTR(position, IniSectionData$ + tempLF$, "=")
|
|
||||||
IF Equal = 0 THEN position = 0: EXIT FUNCTION
|
|
||||||
|
|
||||||
tempKey$ = LTRIM$(RTRIM$(MID$(IniSectionData$ + tempLF$, position + 1, Equal - position - 1)))
|
|
||||||
|
|
||||||
IF INSTR(tempKey$, CHR$(10)) > 0 THEN
|
|
||||||
position = position + INSTR(tempKey$, CHR$(10)) + 1
|
|
||||||
tempKey$ = MID$(tempKey$, INSTR(tempKey$, CHR$(10)) + 1)
|
|
||||||
END IF
|
|
||||||
|
|
||||||
DO WHILE LEFT$(tempKey$, LEN(IniLF$)) = IniLF$
|
|
||||||
tempKey$ = MID$(tempKey$, LEN(IniLF$) + 1)
|
|
||||||
position = position + LEN(IniLF$)
|
|
||||||
LOOP
|
|
||||||
|
|
||||||
position = INSTR(position + 1, IniSectionData$ + tempLF$, IniLF$)
|
|
||||||
|
|
||||||
IF LEFT$(tempKey$, 1) = ";" OR LEFT$(tempKey$, 1) = "'" OR INSTR(tempKey$, "[") > 0 OR INSTR(tempKey$, "]") > 0 OR INSTR(tempKey$, "=") > 0 THEN
|
|
||||||
GOTO FindKey
|
|
||||||
END IF
|
|
||||||
|
|
||||||
IniNextKey$ = tempKey$
|
|
||||||
IniPosition = Equal
|
|
||||||
END FUNCTION
|
|
||||||
|
|
||||||
FUNCTION IniNextSection$ (file$)
|
|
||||||
SHARED IniCODE, IniLF$, IniWholeFile$
|
|
||||||
|
|
||||||
STATIC sectionStart AS _UNSIGNED LONG
|
|
||||||
|
|
||||||
IniLoad file$
|
|
||||||
IF LEFT$(IniINFO$, 6) = "ERROR:" THEN EXIT FUNCTION
|
|
||||||
|
|
||||||
IniCODE = 0
|
|
||||||
|
|
||||||
DIM foundSection AS _UNSIGNED LONG, endSection AS _UNSIGNED LONG
|
|
||||||
DIM i AS _UNSIGNED LONG, Bracket1 AS _UNSIGNED LONG, Bracket2 AS _UNSIGNED LONG
|
|
||||||
|
|
||||||
FindNext:
|
|
||||||
sectionStart = INSTR(sectionStart + 1, IniWholeFile$, "[")
|
|
||||||
IF sectionStart = 0 THEN IniCODE = 24: EXIT FUNCTION
|
|
||||||
|
|
||||||
'make sure it's a valid section header
|
|
||||||
foundSection = 0
|
|
||||||
FOR i = sectionStart - 1 TO 1 STEP -1
|
|
||||||
IF ASC(IniWholeFile$, i) = 10 THEN foundSection = i + 1: EXIT FOR
|
|
||||||
IF ASC(IniWholeFile$, i) <> 32 THEN GOTO FindNext
|
|
||||||
NEXT
|
|
||||||
|
|
||||||
IF i = 0 THEN foundSection = 1
|
|
||||||
|
|
||||||
IF foundSection > 0 THEN
|
|
||||||
'we found it; time to identify where this section ends
|
|
||||||
'(either another [section] or the end of the file
|
|
||||||
Bracket2 = INSTR(sectionStart + 1, IniWholeFile$, "]")
|
|
||||||
IF Bracket2 = 0 THEN IniCODE = 24: EXIT FUNCTION
|
|
||||||
Bracket1 = INSTR(sectionStart + 1, IniWholeFile$, "[")
|
|
||||||
IF Bracket1 > 0 THEN
|
|
||||||
FOR i = Bracket1 - 1 TO 1 STEP -1
|
|
||||||
IF ASC(IniWholeFile$, i) = 10 THEN endSection = i + 1 - LEN(IniLF$): EXIT FOR
|
|
||||||
IF i <= foundSection THEN EXIT FOR
|
|
||||||
NEXT
|
|
||||||
IniNextSection$ = MID$(IniWholeFile$, foundSection, Bracket2 - foundSection + 1)
|
|
||||||
ELSE
|
|
||||||
IniNextSection$ = MID$(IniWholeFile$, foundSection, Bracket2 - foundSection + 1)
|
|
||||||
IniCODE = 24
|
|
||||||
sectionStart = 0
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
IniCODE = 24
|
|
||||||
END IF
|
|
||||||
END FUNCTION
|
|
||||||
|
|
||||||
FUNCTION IniINFO$
|
|
||||||
SHARED IniCODE
|
|
||||||
SELECT CASE IniCODE
|
|
||||||
CASE 0: IniINFO$ = "Operation successful"
|
|
||||||
Case 1: IniINFO$ = "ERROR: File not found"
|
|
||||||
CASE 2: IniINFO$ = "Empty value"
|
|
||||||
CASE 3: IniINFO$ = "ERROR: Key not found"
|
|
||||||
CASE 4: IniINFO$ = "Key updated"
|
|
||||||
CASE 5: IniINFO$ = "Global key created"
|
|
||||||
CASE 7: IniINFO$ = "Key created in existing section"
|
|
||||||
CASE 8: IniINFO$ = "No changes applied (same value)"
|
|
||||||
CASE 9: IniINFO$ = "New section created; key created"
|
|
||||||
CASE 10: IniINFO$ = "No more keys"
|
|
||||||
CASE 11: IniINFO$ = "File created; new key added"
|
|
||||||
CASE 12: IniINFO$ = "ERROR: Invalid key"
|
|
||||||
CASE 13: IniINFO$ = "Section deleted"
|
|
||||||
CASE 14: IniINFO$ = "ERROR: Section not found"
|
|
||||||
CASE 15: IniINFO$ = "ERROR: Invalid section"
|
|
||||||
CASE 16: IniINFO$ = "New section created; existing key moved"
|
|
||||||
CASE 17: IniINFO$ = "ERROR: Empty file"
|
|
||||||
CASE 18: IniINFO$ = "ERROR: No file open"
|
|
||||||
CASE 19: IniINFO$ = "Key deleted"
|
|
||||||
CASE 20: IniINFO$ = "Key moved"
|
|
||||||
CASE 21: IniINFO$ = "ERROR: Invalid file name/path"
|
|
||||||
CASE 22: IniINFO$ = "Section sorted"
|
|
||||||
CASE 23: IniINFO$ = "No changes applied; section already sorted"
|
|
||||||
CASE 24: IniINFO$ = "No more sections"
|
|
||||||
CASE ELSE: IniINFO$ = "ERROR: <invalid error code>"
|
|
||||||
END SELECT
|
|
||||||
END FUNCTION
|
|
||||||
|
|
||||||
'Written in BASIC by Luke Ceddia for ide_methods.bas (QB64)
|
|
||||||
'After Cormen, Leiserson, Rivest & Stein "Introduction To Algoritms" via Wikipedia
|
|
||||||
'Adapted for use in .INI Manager
|
|
||||||
FUNCTION IniArraySort%% (arr() AS STRING)
|
|
||||||
DIM i&, x$, j&, moves&
|
|
||||||
|
|
||||||
FOR i& = LBOUND(arr) + 1 TO UBOUND(arr)
|
|
||||||
x$ = arr(i&)
|
|
||||||
j& = i& - 1
|
|
||||||
WHILE j& >= LBOUND(arr)
|
|
||||||
IF arr(j&) <= x$ THEN EXIT WHILE
|
|
||||||
moves& = moves& + 1
|
|
||||||
arr$(j& + 1) = arr$(j&)
|
|
||||||
j& = j& - 1
|
|
||||||
WEND
|
|
||||||
arr$(j& + 1) = x$
|
|
||||||
NEXT i&
|
|
||||||
|
|
||||||
'Returns -1 (true) if any changes were made
|
|
||||||
IniArraySort%% = moves& > 0
|
|
||||||
END FUNCTION
|
|
||||||
|
|
||||||
|
|
2
source/utilities/ini-manager/readme.txt
Normal file
2
source/utilities/ini-manager/readme.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
This is a reduced version of INI-Manager. The full package can be downloaded
|
||||||
|
from https://github.com/FellippeHeitor/INI-Manager.
|
Loading…
Reference in a new issue