1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-06-26 17:10:38 +00:00

Incorporates INI-Manager to deal with the settings file.

Allows for multiple IDE instances using the same config file by default.
This commit is contained in:
Fellippe Heitor 2021-02-07 22:01:53 -03:00
parent d4a3d7f721
commit eac3074e30
6 changed files with 1382 additions and 741 deletions

1
.gitignore vendored
View file

@ -5,6 +5,7 @@ internal/temp*
*.exe
*.bas
internal/config*.txt
internal/config.ini
internal/help
internal/version.txt
tempfoldersearch.bin

File diff suppressed because it is too large Load diff

View file

@ -246,7 +246,7 @@ FUNCTION ide2 (ignore)
idecustomfonthandle = _LOADFONT(idecustomfontfile$, idecustomfontheight, "MONOSPACE")
IF idecustomfonthandle = -1 THEN
'failed! - revert to default settings
idecustomfont = 0: idecustomfontfile$ = "c:\windows\fonts\lucon.ttf": idecustomfontheight = 21
idecustomfont = 0: idecustomfontfile$ = "C:\Windows\Fonts\lucon.ttf": idecustomfontheight = 21
ELSE
_FONT idecustomfonthandle
END IF
@ -856,8 +856,8 @@ FUNCTION ide2 (ignore)
LOOP WHILE _RESIZE
IF retval = 1 THEN 'screen dimensions have changed and everything must be redrawn/reapplied
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Width", STR$(idewx)
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Height", STR$(idewy)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_Width", STR$(idewx)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_Height", STR$(idewy)
END IF
retval = 1
@ -1041,7 +1041,7 @@ FUNCTION ide2 (ignore)
PCOPY 3, 0: SCREEN , , 3, 0
IF result = 2 THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "WhiteListQB64FirstTimeMsg", "TRUE"
WriteConfigSetting generalSettingsSection$, "WhiteListQB64FirstTimeMsg", "True"
END IF
WhiteListQB64FirstTimeMsg = -1
END IF
@ -1236,8 +1236,8 @@ FUNCTION ide2 (ignore)
IF IDE_AutoPosition THEN
IF IDE_TopPosition <> _SCREENY OR IDE_LeftPosition <> _SCREENX THEN
IF _SCREENY >= -_HEIGHT * _FONTHEIGHT AND _SCREENX >= -_WIDTH * _FONTWIDTH THEN 'Don't record the position if it's off the screen, past the point where we can drag it back into a different position.
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_TopPosition", STR$(_SCREENY)
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_LeftPosition", STR$(_SCREENX)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_TopPosition", STR$(_SCREENY)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_LeftPosition", STR$(_SCREENX)
IDE_TopPosition = _SCREENY: IDE_LeftPosition = _SCREENX
END IF
END IF
@ -1518,7 +1518,7 @@ FUNCTION ide2 (ignore)
"Folder' in the Run menu.", "#OK;#Don't show this again;#Cancel")
END IF
IF result = 2 THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "ExeToSourceFolderFirstTimeMsg", "TRUE"
WriteConfigSetting generalSettingsSection$, "ExeToSourceFolderFirstTimeMsg", "True"
ExeToSourceFolderFirstTimeMsg = -1
ELSEIF result = 3 THEN
PCOPY 3, 0: SCREEN , , 3, 0
@ -2775,10 +2775,6 @@ FUNCTION ide2 (ignore)
GET #backupIncludeFile, 1, tempInclude1$
CLOSE #backupIncludeFile
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoPosition", "FALSE"
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Width", "80"
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Height", "25"
SCREEN , , 3, 0
clearStatusWindow
COLOR 15, 1
@ -2795,12 +2791,6 @@ FUNCTION ide2 (ignore)
END IF
SHELL p$
IF IDE_AutoPosition THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoPosition", "TRUE"
END IF
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Width", STR$(idewx)
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Height", STR$(idewy)
OPEN f$ FOR BINARY AS #backupIncludeFile
tempInclude2$ = SPACE$(LOF(backupIncludeFile))
GET #backupIncludeFile, 1, tempInclude2$
@ -4719,10 +4709,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
MouseButtonSwapped = NOT MouseButtonSwapped
IF MouseButtonSwapped THEN
WriteConfigSetting "'[MOUSE SETTINGS]", "SwapMouseButton", "TRUE"
WriteConfigSetting mouseSettingsSection$, "SwapMouseButton", "True"
menu$(OptionsMenuID, OptionsMenuSwapMouse) = CHR$(7) + "#Swap Mouse Buttons"
ELSE
WriteConfigSetting "'[MOUSE SETTINGS]", "SwapMouseButton", "FALSE"
WriteConfigSetting mouseSettingsSection$, "SwapMouseButton", "False"
menu$(OptionsMenuID, OptionsMenuSwapMouse) = "#Swap Mouse Buttons"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -4733,10 +4723,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
DisableSyntaxHighlighter = NOT DisableSyntaxHighlighter
IF DisableSyntaxHighlighter THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "DisableSyntaxHighlighter", "TRUE"
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "True"
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = "Syntax #Highlighter"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "DisableSyntaxHighlighter", "FALSE"
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "False"
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = CHR$(7) + "Syntax #Highlighter"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -4747,10 +4737,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
PasteCursorAtEnd = NOT PasteCursorAtEnd
IF PasteCursorAtEnd THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "PasteCursorAtEnd", "TRUE"
WriteConfigSetting generalSettingsSection$, "PasteCursorAtEnd", "True"
menu$(OptionsMenuID, OptionsMenuPasteCursor) = CHR$(7) + "Cursor After #Paste"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "PasteCursorAtEnd", "FALSE"
WriteConfigSetting generalSettingsSection$, "PasteCursorAtEnd", "False"
menu$(OptionsMenuID, OptionsMenuPasteCursor) = "Cursor After #Paste"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -4761,10 +4751,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
IDEShowErrorsImmediately = NOT IDEShowErrorsImmediately
IF IDEShowErrorsImmediately THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowErrorsImmediately", "TRUE"
WriteConfigSetting generalSettingsSection$, "ShowErrorsImmediately", "True"
menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately) = CHR$(7) + "Syntax Ch#ecker"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowErrorsImmediately", "FALSE"
WriteConfigSetting generalSettingsSection$, "ShowErrorsImmediately", "False"
menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately) = "Syntax Ch#ecker"
END IF
idechangemade = 1
@ -4776,11 +4766,11 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
IF IgnoreWarnings = 0 THEN
IgnoreWarnings = -1
WriteConfigSetting "'[GENERAL SETTINGS]", "IgnoreWarnings", "TRUE"
WriteConfigSetting generalSettingsSection$, "IgnoreWarnings", "True"
menu$(OptionsMenuID, OptionsMenuIgnoreWarnings) = CHR$(7) + "Ignore #Warnings"
ELSE
IgnoreWarnings = 0
WriteConfigSetting "'[GENERAL SETTINGS]", "IgnoreWarnings", "FALSE"
WriteConfigSetting generalSettingsSection$, "IgnoreWarnings", "False"
menu$(OptionsMenuID, OptionsMenuIgnoreWarnings) = "Ignore #Warnings"
END IF
idechangemade = 1
@ -4792,11 +4782,11 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
IF IdeAutoComplete = 0 THEN
IdeAutoComplete = -1
WriteConfigSetting "'[GENERAL SETTINGS]", "IdeAutoComplete", "TRUE"
WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "True"
menu$(OptionsMenuID, OptionsMenuAutoComplete) = CHR$(7) + "Code Suggest#ions"
ELSE
IdeAutoComplete = 0
WriteConfigSetting "'[GENERAL SETTINGS]", "IdeAutoComplete", "FALSE"
WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "False"
menu$(OptionsMenuID, OptionsMenuAutoComplete) = "Code Suggest#ions"
END IF
idechangemade = 1
@ -4808,10 +4798,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
SaveExeWithSource = NOT SaveExeWithSource
IF SaveExeWithSource THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "SaveExeWithSource", "TRUE"
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "True"
menu$(RunMenuID, RunMenuSaveExeWithSource) = CHR$(7) + "Output EXE to Source #Folder"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "SaveExeWithSource", "FALSE"
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "False"
menu$(RunMenuID, RunMenuSaveExeWithSource) = "Output EXE to Source #Folder"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -4823,10 +4813,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
EnableQuickNav = NOT EnableQuickNav
IF EnableQuickNav THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "EnableQuickNav", "TRUE"
WriteConfigSetting generalSettingsSection$, "EnableQuickNav", "True"
menu$(SearchMenuID, SearchMenuEnableQuickNav) = CHR$(7) + "#Quick Navigation"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "EnableQuickNav", "FALSE"
WriteConfigSetting generalSettingsSection$, "EnableQuickNav", "False"
menu$(SearchMenuID, SearchMenuEnableQuickNav) = "#Quick Navigation"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -5170,7 +5160,7 @@ FUNCTION ide2 (ignore)
IF menu$(m, s) = "#Show Line Numbers" THEN
PCOPY 2, 0
ShowLineNumbers = -1
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbers", "TRUE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbers", "True"
menu$(m, s) = "#Hide Line Numbers"
menu$(m, ViewMenuShowBGID) = MID$(menu$(m, ViewMenuShowBGID), 2)
menu$(m, ViewMenuShowSeparatorID) = MID$(menu$(m, ViewMenuShowSeparatorID), 2)
@ -5181,7 +5171,7 @@ FUNCTION ide2 (ignore)
IF menu$(m, s) = "#Hide Line Numbers" THEN
PCOPY 2, 0
ShowLineNumbers = 0
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbers", "FALSE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbers", "False"
menu$(m, s) = "#Show Line Numbers"
menu$(m, ViewMenuShowBGID) = "~" + menu$(m, ViewMenuShowBGID)
menu$(m, ViewMenuShowSeparatorID) = "~" + menu$(m, ViewMenuShowSeparatorID)
@ -5194,10 +5184,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
ShowLineNumbersUseBG = NOT ShowLineNumbersUseBG
IF ShowLineNumbersUseBG THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbersUseBG", "TRUE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersUseBG", "True"
menu$(m, s) = CHR$(7) + "#Background Color"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbersUseBG", "FALSE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersUseBG", "False"
menu$(m, s) = "#Background Color"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -5210,10 +5200,10 @@ FUNCTION ide2 (ignore)
PCOPY 2, 0
ShowLineNumbersSeparator = NOT ShowLineNumbersSeparator
IF ShowLineNumbersSeparator THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbersSeparator", "TRUE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersSeparator", "True"
menu$(m, s) = CHR$(7) + "Sho#w Separator"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "ShowLineNumbersSeparator", "FALSE"
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersSeparator", "False"
menu$(m, s) = "Sho#w Separator"
END IF
PCOPY 3, 0: SCREEN , , 3, 0
@ -8306,7 +8296,7 @@ SUB ideshowtext
IF timeElapsedSince(startTime) > 1 THEN
result = idemessagebox("Syntax Highlighter Disabled", "Syntax Highlighter has been disabled to avoid slowing down the IDE.\nYou can reenable the Highlighter in the 'Options' menu.", "")
DisableSyntaxHighlighter = -1
WriteConfigSetting "'[GENERAL SETTINGS]", "DisableSyntaxHighlighter", "TRUE"
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "True"
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = "Syntax #Highlighter"
GOTO noSyntaxHighlighting
END IF
@ -9055,15 +9045,15 @@ FUNCTION idesubs$
SaveSortSettings:
idesortsubs = SortedSubsFlag
IF idesortsubs THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_SortSUBs", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_SortSUBs", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_SortSUBs", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_SortSUBs", "False"
END IF
IF IDESubsLength THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_SUBsLength", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_SUBsLength", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_SUBsLength", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_SUBsLength", "False"
END IF
RETURN
@ -9204,7 +9194,7 @@ FUNCTION idelanguagebox
'save changes
v% = y: idecpindex = v%
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_CodePage", STR$(idecpindex)
WriteConfigSetting displaySettingsSection$, "IDE_CodePage", STR$(idecpindex)
EXIT FUNCTION
END IF
@ -10454,25 +10444,25 @@ FUNCTION idelayoutbox
IF ideindentsubs <> v% THEN ideindentsubs = v%: idelayoutbox = 1
IF ideautolayout THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoFormat", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoFormat", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoFormat", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoFormat", "False"
END IF
IF ideautolayoutkwcapitals THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_KeywordCapital", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_KeywordCapital", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_KeywordCapital", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_KeywordCapital", "False"
END IF
IF ideautoindent THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoIndent", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoIndent", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoIndent", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoIndent", "False"
END IF
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_IndentSize", STR$(ideautoindentsize)
WriteConfigSetting displaySettingsSection$, "IDE_IndentSize", STR$(ideautoindentsize)
IF ideindentsubs THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_IndentSUBs", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_IndentSUBs", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_IndentSUBs", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_IndentSUBs", "False"
END IF
EXIT FUNCTION
END IF
@ -10506,7 +10496,7 @@ FUNCTION idebackupbox
END IF
idebackupsize = v&
WriteConfigSetting "'[GENERAL SETTINGS]", "BackupSize", STR$(v&) + " 'in MB"
WriteConfigSetting generalSettingsSection$, "BackupSize", STR$(v&) + " 'in MB"
idebackupbox = 1
END FUNCTION
@ -10663,9 +10653,9 @@ FUNCTION ideadvancedbox
IF v% <> idedebuginfo THEN
idedebuginfo = v%
IF idedebuginfo THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "DebugInfo", "TRUE 'INTERNAL VARIABLE USE ONLY!! DO NOT MANUALLY CHANGE!"
WriteConfigSetting generalSettingsSection$, "DebugInfo", "True" + DebugInfoIniWarning$
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "DebugInfo", "FALSE 'INTERNAL VARIABLE USE ONLY!! DO NOT MANUALLY CHANGE!"
WriteConfigSetting generalSettingsSection$, "DebugInfo", "False" + DebugInfoIniWarning$
END IF
Include_GDB_Debugging_Info = idedebuginfo
IF os$ = "WIN" THEN
@ -11143,7 +11133,7 @@ FUNCTION idedisplaybox
idecustomfonthandle = _LOADFONT(v$, v%, "MONOSPACE")
IF idecustomfonthandle = -1 THEN
'failed! - revert to default settings
o(5).sel = 0: idetxt(o(6).txt) = "c:\windows\fonts\lucon.ttf": idetxt(o(7).txt) = "21": IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
o(5).sel = 0: idetxt(o(6).txt) = "C:\Windows\Fonts\lucon.ttf": idetxt(o(7).txt) = "21": IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
ELSE
_FONT idecustomfonthandle
END IF
@ -11186,25 +11176,25 @@ FUNCTION idedisplaybox
idecustomfontheight = v%
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Width", STR$(idewx)
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_Height", STR$(idewy)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_Width", STR$(idewx)
WriteConfigSetting windowSettingsSection$ + iniFolderIndex$, "IDE_Height", STR$(idewy)
IF idecustomfont THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_CustomFont", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_CustomFont", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont", "False"
END IF
IF IDE_UseFont8 THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_UseFont8", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_UseFont8", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_UseFont8", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_UseFont8", "False"
END IF
IF IDE_AutoPosition THEN
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoPosition", "TRUE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoPosition", "True"
ELSE
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_AutoPosition", "FALSE"
WriteConfigSetting displaySettingsSection$, "IDE_AutoPosition", "False"
END IF
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_CustomFont$", idecustomfontfile$
WriteConfigSetting "'[IDE DISPLAY SETTINGS]", "IDE_CustomFontSize", STR$(idecustomfontheight)
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont$", idecustomfontfile$
WriteConfigSetting displaySettingsSection$, "IDE_CustomFontSize", STR$(idecustomfontheight)
EXIT FUNCTION
@ -11327,7 +11317,7 @@ FUNCTION idechoosecolorsbox
o(i).txt = idenewtxt("#OK" + sep + "Restore #defaults" + sep + "#Cancel")
o(i).dft = 1
result = ReadConfigSetting("SchemeID", value$)
result = ReadConfigSetting(colorSettingsSection$, "SchemeID", value$)
SchemeID = VAL(value$)
IF SchemeID > TotalColorSchemes THEN SchemeID = 0
@ -11559,7 +11549,7 @@ FUNCTION idechoosecolorsbox
i = 0
DO
i = i + 1
result = ReadConfigSetting("Scheme" + str2$(i) + "$", value$)
result = ReadConfigSetting(colorSchemesSection$, "Scheme" + str2$(i) + "$", value$)
IF value$ = "" OR value$ = "0" THEN EXIT DO
LOOP
@ -11585,7 +11575,7 @@ FUNCTION idechoosecolorsbox
NEXT j
'Save user scheme
WriteConfigSetting "'[IDE COLOR SCHEMES]", "Scheme" + str2$(i) + "$", SchemeString$
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", SchemeString$
LoadColorSchemes
SchemeID = PresetColorSchemes + i
ChangedScheme = -1
@ -11623,7 +11613,7 @@ FUNCTION idechoosecolorsbox
NEXT j
'Save user scheme
WriteConfigSetting "'[IDE COLOR SCHEMES]", "Scheme" + str2$(i) + "$", SchemeString$
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", SchemeString$
LoadColorSchemes
SchemeID = PresetColorSchemes + i
ChangedScheme = -1
@ -11639,7 +11629,7 @@ FUNCTION idechoosecolorsbox
K$ = ""
IF what$ = "Y" THEN
i = SchemeID - PresetColorSchemes
WriteConfigSetting "'[IDE COLOR SCHEMES]", "Scheme" + str2$(i) + "$", "0"
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", "0"
LoadColorSchemes
SchemeID = SchemeID - 1
ChangedScheme = -1
@ -11898,7 +11888,7 @@ FUNCTION idechoosecolorsbox
'save changes
GOSUB enableHighlighter
WriteConfigSetting "'[IDE COLOR SETTINGS]", "SchemeID", str2$(SchemeID)
WriteConfigSetting colorSettingsSection$, "SchemeID", str2$(SchemeID)
FOR i = 1 TO 9
SELECT CASE i
CASE 1: CurrentColor~& = IDETextColor: colorid$ = "TextColor"
@ -11911,12 +11901,7 @@ FUNCTION idechoosecolorsbox
CASE 8: CurrentColor~& = IDEBackgroundColor2: colorid$ = "BackgroundColor2"
CASE 9: CurrentColor~& = IDEBracketHighlightColor: colorid$ = "HighlightColor"
END SELECT
r$ = str2$(_RED32(CurrentColor~&))
g$ = str2$(_GREEN32(CurrentColor~&))
b$ = str2$(_BLUE32(CurrentColor~&))
RGBString$ = "_RGB32(" + r$ + "," + g$ + "," + b$ + ")"
WriteConfigSetting "'[IDE COLOR SETTINGS]", colorid$, RGBString$
WriteConfigSetting colorSettingsSection$, colorid$, rgbs$(CurrentColor~&)
NEXT i
v% = o(5).sel
@ -11924,9 +11909,9 @@ FUNCTION idechoosecolorsbox
brackethighlight = v%
IF brackethighlight THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "BracketHighlight", "TRUE"
WriteConfigSetting generalSettingsSection$, "BracketHighlight", "True"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "BracketHighlight", "FALSE"
WriteConfigSetting generalSettingsSection$, "BracketHighlight", "False"
END IF
v% = o(6).sel
@ -11934,9 +11919,9 @@ FUNCTION idechoosecolorsbox
multihighlight = v%
IF multihighlight THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "MultiHighlight", "TRUE"
WriteConfigSetting generalSettingsSection$, "MultiHighlight", "True"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "MultiHighlight", "FALSE"
WriteConfigSetting generalSettingsSection$, "MultiHighlight", "False"
END IF
v% = o(7).sel
@ -11944,9 +11929,9 @@ FUNCTION idechoosecolorsbox
keywordHighlight = v%
IF keywordHighlight THEN
WriteConfigSetting "'[GENERAL SETTINGS]", "KeywordHighlight", "TRUE"
WriteConfigSetting generalSettingsSection$, "KeywordHighlight", "True"
ELSE
WriteConfigSetting "'[GENERAL SETTINGS]", "KeywordHighlight", "FALSE"
WriteConfigSetting generalSettingsSection$, "KeywordHighlight", "False"
END IF
EXIT FUNCTION
@ -11974,7 +11959,7 @@ FUNCTION idechoosecolorsbox
enableHighlighter:
IF DisableSyntaxHighlighter THEN
DisableSyntaxHighlighter = 0
WriteConfigSetting "'[GENERAL SETTINGS]", "DisableSyntaxHighlighter", "FALSE"
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "False"
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = CHR$(7) + "Syntax #Highlighter"
END IF
RETURN
@ -14449,7 +14434,7 @@ SUB LoadColorSchemes
i = 0
DO
i = i + 1
result = ReadConfigSetting("Scheme" + str2$(i) + "$", value$)
result = ReadConfigSetting(colorSchemesSection$, "Scheme" + str2$(i) + "$", value$)
IF result THEN
TotalColorSchemes = TotalColorSchemes + 1
IF TotalColorSchemes > UBOUND(ColorSchemes$) THEN
@ -14468,7 +14453,7 @@ SUB LoadColorSchemes
temp$ = temp$ + MID$(value$, FoundPipe + 1, 9) + "069147216245128177"
temp$ = temp$ + MID$(value$, FoundPipe + 10) + "000147177"
ColorSchemes$(TotalColorSchemes) = temp$
WriteConfigSetting "'[IDE COLOR SCHEMES]", "Scheme" + str2$(i) + "$", temp$
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", temp$
LastValidColorScheme = TotalColorSchemes
ELSE
GOTO DiscardInvalid

View file

@ -14,6 +14,7 @@ $SCREENHIDE
'$INCLUDE:'global\settings.bas'
'$INCLUDE:'global\constants.bas'
'$INCLUDE:'subs_functions\extensions\opengl\opengl_global.bas'
'$INCLUDE:'utilities\ini-manager\ini.bi'
DEFLNG A-Z
@ -12991,11 +12992,11 @@ FUNCTION ParseCMDLineArgs$ ()
IF SaveExeWithSource THEN PRINT "true" ELSE PRINT "false"
SYSTEM
CASE ":exewithsource=true"
WriteConfigSetting "'[GENERAL SETTINGS]", "SaveExeWithSource", "TRUE"
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "True"
PRINT "exewithsource = true"
SaveExeWithSource = -1
CASE ":exewithsource=false"
WriteConfigSetting "'[GENERAL SETTINGS]", "SaveExeWithSource", "FALSE"
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "False"
PRINT "exewithsource = false"
SaveExeWithSource = 0
CASE ":debuginfo"
@ -13004,7 +13005,7 @@ FUNCTION ParseCMDLineArgs$ ()
SYSTEM
CASE ":debuginfo=true"
PRINT "debuginfo = true"
WriteConfigSetting "'[GENERAL SETTINGS]", "DebugInfo", "TRUE 'INTERNAL VARIABLE USE ONLY!! DO NOT MANUALLY CHANGE!"
WriteConfigSetting generalSettingsSection$, "DebugInfo", "True" + DebugInfoIniWarning$
idedebuginfo = 1
Include_GDB_Debugging_Info = idedebuginfo
IF os$ = "WIN" THEN
@ -13024,7 +13025,7 @@ FUNCTION ParseCMDLineArgs$ ()
END IF
CASE ":debuginfo=false"
PRINT "debuginfo = false"
WriteConfigSetting "'[GENERAL SETTINGS]", "DebugInfo", "FALSE 'INTERNAL VARIABLE USE ONLY!! DO NOT MANUALLY CHANGE!"
WriteConfigSetting generalSettingsSection$, "DebugInfo", "False" + DebugInfoIniWarning$
idedebuginfo = 0
Include_GDB_Debugging_Info = idedebuginfo
IF os$ = "WIN" THEN
@ -25063,124 +25064,39 @@ SUB Give_Error (a$)
Error_Message = a$
END SUB
SUB WriteConfigSetting (heading$, item$, tvalue$)
value$ = tvalue$
SHARED ConfigFile$, ConfigBak$
InFile = FREEFILE: OPEN ConfigFile$ FOR BINARY AS #InFile
OutFile = FREEFILE: OPEN ConfigBak$ FOR OUTPUT AS #OutFile
placed = 0
'check for quotes where needed for strings
IF RIGHT$(RTRIM$(item$), 1) = "$" THEN
IF LEFT$(value$, 1) <> CHR$(34) THEN value$ = CHR$(34) + value$
IF RIGHT$(value$, 1) <> CHR$(34) THEN value$ = value$ + CHR$(34)
END IF
IF LOF(InFile) THEN
DO UNTIL EOF(InFile)
LINE INPUT #InFile, junk$
'we really don't care about heading$ here; it's only used to make things easier for the user to locate in the config file
junk$ = LTRIM$(RTRIM$(junk$))
l = INSTR(junk$, "=") 'compare the values to the left of the equal sign
compare$ = RTRIM$(LEFT$(junk$, l - 1))
IF UCASE$(compare$) = UCASE$(item$) THEN 'if it's a match, replace it
PRINT #OutFile, item$; " = "; value$
placed = -1
ELSE
PRINT #OutFile, junk$ 'otherwise put that line back and check the next one
END IF
LOOP
END IF
CLOSE #InFile, #OutFile
KILL ConfigFile$
IF NOT placed THEN 'we didn't find the proper setting already in the file somewhere.
'Either the file was corrupted, or the user deleted this particulat setting sometime in the past.
'Now we look to see if the heading exists in the file or not.
'If it does, then we place the new setting under that heading.
'If not then we write that heading to the end of the file to make it easier for the user to locate in the future
'and then we write it below there.
OPEN ConfigBak$ FOR BINARY AS #InFile
OPEN "internal/config.tmp" FOR OUTPUT AS #OutFile
out$ = item$ + " = " + value$
DO UNTIL EOF(InFile) OR LOF(InFile) = 0
LINE INPUT #InFile, temp$
PRINT #OutFile, temp$
IF INSTR(temp$, heading$) THEN PRINT #OutFile, out$: placed = -1 'If we have the heading, we want to print the item after it
LOOP
IF NOT placed THEN 'If the heading doesn't exist already then we'll make the heading and the item
PRINT #OutFile, ""
PRINT #OutFile, heading$
PRINT #OutFile, out$
END IF
CLOSE #InFile, #OutFile
KILL ConfigBak$
NAME "internal/config.tmp" AS ConfigFile$
ELSE
NAME ConfigBak$ AS ConfigFile$
END IF
SUB WriteConfigSetting (section$, item$, value$)
WriteSetting ConfigFile$, section$, item$, value$
END SUB
FUNCTION ReadConfigSetting (item$, value$)
SHARED ConfigFile$
value$ = "" 'We start by blanking the value$ as a default return state
InFile = FREEFILE: OPEN ConfigFile$ FOR BINARY AS #InFile
IF LOF(InFile) THEN
found = 0
DO UNTIL EOF(InFile)
LINE INPUT #InFile, temp$
temp$ = LTRIM$(RTRIM$(temp$))
l = INSTR(temp$, "=")
compare$ = LTRIM$(RTRIM$(LEFT$(temp$, l - 1)))
IF UCASE$(compare$) = UCASE$(item$) THEN found = -1: EXIT DO
LOOP
CLOSE #InFile
IF found THEN 'we found what we're looking for
IF l THEN
value$ = MID$(temp$, l + 1)
l = INSTR(value$, CHR$(13)) 'we only want what's before a CR
IF l THEN value$ = LEFT$(value$, l)
l = INSTR(value$, CHR$(10)) 'or a LineFeed
'These are basic text files; they shouldn't have stray CHR$(10) or CHR$(13) characters in them!
IF l THEN value$ = LEFT$(value$, l)
value$ = LTRIM$(RTRIM$(value$))
'check for quotes where needed for strings and remove them so our return value doesn't contain them
IF RIGHT$(RTRIM$(item$), 1) = "$" THEN
IF LEFT$(value$, 1) = CHR$(34) THEN value$ = MID$(value$, 2)
IF RIGHT$(value$, 1) = CHR$(34) THEN value$ = LEFT$(value$, LEN(value$) - 1)
END IF
ReadConfigSetting = -1
EXIT FUNCTION
END IF
END IF
END IF
CLOSE #InFile
ReadConfigSetting = 0 'failed to find the setting
FUNCTION ReadConfigSetting (section$, item$, value$)
value$ = ReadSetting$(ConfigFile$, section$, item$)
ReadConfigSetting = (LEN(value$) > 0)
END FUNCTION
FUNCTION VRGBS (text$, DefaultColor AS _UNSIGNED LONG)
FUNCTION VRGBS~& (text$, DefaultColor AS _UNSIGNED LONG)
'Value of RGB String = VRGBS without a ton of typing
'A function to get the RGB value back from a string such as _RGB32(255,255,255)
'text$ is the string that we send to check for a value
'DefaultColor is the value we send back if the string isn't in the proper format
VRGBS = DefaultColor 'A return the default value if we can't parse the string properly
VRGBS~& = DefaultColor 'A return the default value if we can't parse the string properly
IF UCASE$(LEFT$(text$, 4)) = "_RGB" THEN
rpos = INSTR(text$, "(")
gpos = INSTR(rpos, text$, ",")
bpos = INSTR(gpos + 1, text$, ",")
IF rpos <> 0 AND bpos <> 0 AND gpos <> 0 THEN
red = VAL(MID$(text$, rpos + 1))
green = VAL(MID$(text$, gpos + 1))
blue = VAL(MID$(text$, bpos + 1))
VRGBS = _RGB32(red, green, blue)
red = VAL(_TRIM$(MID$(text$, rpos + 1)))
green = VAL(_TRIM$(MID$(text$, gpos + 1)))
blue = VAL(_TRIM$(MID$(text$, bpos + 1)))
VRGBS~& = _RGB32(red, green, blue)
END IF
END IF
END FUNCTION
FUNCTION rgbs$ (c AS _UNSIGNED LONG)
rgbs$ = "_RGB32(" + _TRIM$(STR$(_RED32(c))) + ", " + _TRIM$(STR$(_GREEN32(c))) + ", " + _TRIM$(STR$(_BLUE32(c))) + ")"
END FUNCTION
FUNCTION EvalPreIF (text$, err$)
temp$ = text$ 'so we don't corrupt the string sent to us for evaluation
err$ = "" 'null the err message to begin with
@ -25593,8 +25509,8 @@ FUNCTION SCase2$ (t$)
END FUNCTION
'$INCLUDE:'utilities\strings.bas'
'$INCLUDE:'subs_functions\extensions\opengl\opengl_methods.bas'
'$INCLUDE:'utilities\ini-manager\ini.bm'
DEFLNG A-Z

View file

@ -0,0 +1,21 @@
'INI Manager
'Fellippe Heitor, 2017-2021 - fellippe@qb64.org - @fellippeheitor
'This file isn't required to be at the top of your programs,
'unless you intend to use OPTION _EXPLICIT
'Global variables declaration
DIM currentIniFileName$
DIM currentIniFileLOF AS _UNSIGNED LONG
DIM IniWholeFile$
DIM IniSectionData$
DIM IniPosition AS _UNSIGNED LONG
DIM IniNewFile$
DIM IniLastSection$
DIM IniLastKey$
DIM IniLF$
DIM IniDisableAutoCommit
DIM IniCODE
DIM IniAllowBasicComments
DIM IniForceReload
DIM IniDisableAddQuotes

View file

@ -0,0 +1,793 @@
'INI Manager v1.01
'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
SHARED currentIniFileName$, IniWholeFile$, currentIniFileLOF AS _UNSIGNED LONG
SHARED IniNewFile$, IniDisableAutoCommit, IniCODE
IF currentIniFileName$ = "" THEN IniCODE = 18: EXIT SUB
IniWholeFile$ = IniNewFile$
currentIniFileLOF = LEN(IniNewFile$)
IF NOT IniDisableAutoCommit THEN
DIM fileNum AS INTEGER
fileNum = FREEFILE
OPEN currentIniFileName$ FOR BINARY AS #fileNum
IF LEN(IniWholeFile$) < LOF(fileNum) THEN
CLOSE fileNum
OPEN currentIniFileName$ FOR OUTPUT AS #fileNum: CLOSE #fileNum
OPEN currentIniFileName$ FOR BINARY AS #fileNum
END IF
PUT #fileNum, 1, IniNewFile$
CLOSE #fileNum 'flush
END IF
END SUB
FUNCTION IniGetSection$ (__section$)
SHARED IniPosition AS _UNSIGNED LONG, IniCODE, currentIniFileName$
SHARED IniLF$, IniWholeFile$, currentIniFileLOF AS _UNSIGNED LONG
IF currentIniFileName$ = "" THEN IniCODE = 18: EXIT FUNCTION
IF currentIniFileLOF = 0 OR LEN(LTRIM$(RTRIM$(IniWholeFile$))) = 0 THEN IniCODE = 17: EXIT FUNCTION
IniCODE = 0
DIM section$, foundSection AS _UNSIGNED LONG, endSection AS _UNSIGNED LONG
DIM i AS _UNSIGNED LONG, Bracket1 AS _UNSIGNED LONG, sectionStart AS _UNSIGNED LONG
DIM inQuote AS _BYTE
section$ = IniFormatSection$(__section$)
IF IniCODE THEN EXIT FUNCTION
IF section$ = "[]" THEN
'fetch the "global" section, if present
sectionStart = INSTR(IniWholeFile$, "[")
IF sectionStart = 0 THEN IniGetSection$ = IniWholeFile$: EXIT FUNCTION
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 EXIT FOR
NEXT
IF i = 0 THEN foundSection = 1
IniGetSection$ = LEFT$(IniWholeFile$, foundSection - 1)
ELSE
DO
sectionStart = INSTR(sectionStart + 1, LCASE$(IniWholeFile$), LCASE$(section$))
IF sectionStart = 0 THEN IniCODE = 14: EXIT DO
'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 EXIT FOR
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
Bracket1 = sectionStart
checkAgain:
Bracket1 = INSTR(Bracket1 + 1, IniWholeFile$, "[")
IF Bracket1 > 0 THEN
'found a bracket; check if it's inside quotes
inQuote = 0
FOR i = 1 TO Bracket1 - 1
IF ASC(IniWholeFile$, i) = 34 THEN inQuote = NOT inQuote
NEXT
IF inQuote THEN GOTO checkAgain
FOR i = Bracket1 - 1 TO 1 STEP -1
IF ASC(IniWholeFile$, i) = 10 THEN endSection = i + 1 - LEN(IniLF$): EXIT FOR
IF ASC(IniWholeFile$, i) = 61 THEN GOTO checkAgain 'bracket is inside a key's value
IF i <= foundSection THEN EXIT FOR
NEXT
IniGetSection$ = MID$(IniWholeFile$, foundSection, endSection - foundSection)
ELSE
IniGetSection$ = MID$(IniWholeFile$, foundSection)
END IF
EXIT FUNCTION
END IF
LOOP
END IF
END FUNCTION
FUNCTION IniFormatSection$ (__section$)
SHARED IniCODE
DIM section$
section$ = LTRIM$(RTRIM$(__section$))
'sections are in the format [section name] - add brackets if not passed
IF LEFT$(section$, 1) <> "[" THEN section$ = "[" + section$
IF RIGHT$(section$, 1) <> "]" THEN section$ = section$ + "]"
IF INSTR(MID$(section$, 2, LEN(section$) - 3), "[") OR INSTR(MID$(section$, 2, LEN(section$) - 3), "]") THEN
IniCODE = 15
EXIT FUNCTION
END IF
IniFormatSection$ = section$
END FUNCTION
FUNCTION ReadSetting$ (file$, __section$, __key$)
SHARED IniLastSection$, IniLastKey$, IniWholeFile$, IniLF$
SHARED IniPosition AS _UNSIGNED LONG, IniSectionData$
SHARED IniCODE, IniAllowBasicComments
SHARED currentIniFileLOF AS _UNSIGNED LONG
IniLoad file$
IF IniCODE THEN EXIT FUNCTION
IF currentIniFileLOF = 0 OR LEN(LTRIM$(RTRIM$(IniWholeFile$))) = 0 THEN IniCODE = 17: EXIT FUNCTION
DIM Equal AS _UNSIGNED LONG, tempValue$, key$, section$
DIM Quote AS _UNSIGNED LONG, Comment AS _UNSIGNED LONG
DIM i AS LONG, FoundLF AS _UNSIGNED LONG
section$ = IniFormatSection(__section$)
IF IniCODE THEN EXIT FUNCTION
'fetch the desired section$
IniSectionData$ = IniGetSection(section$)
IF IniCODE > 0 AND IniCODE <> 17 THEN EXIT FUNCTION
IF LEN(IniSectionData$) = 0 AND section$ <> "[]" THEN IniCODE = 14: EXIT FUNCTION
IniLastSection$ = section$
IniPosition = 0
key$ = LTRIM$(RTRIM$(__key$))
IniLastKey$ = ""
IF key$ = "" THEN
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
IniCODE = 12
EXIT FUNCTION
END IF
IniLastKey$ = key$
IF IniPosition > 0 THEN Equal = IniPosition: GOTO KeyFound
CheckKey:
IniPosition = INSTR(IniPosition + 1, LCASE$(IniSectionData$), LCASE$(key$))
IF IniPosition > 0 THEN
'identify if this occurrence is actually a key and not part of a key name/value
FOR i = IniPosition - 1 TO 1 STEP -1
IF ASC(IniSectionData$, i) = 10 THEN EXIT FOR
IF ASC(IniSectionData$, i) <> 10 AND ASC(IniSectionData$, i) <> 32 THEN
'not a key
GOTO CheckKey
END IF
NEXT
'check if there's nothing but an equal sign ahead
FOR i = IniPosition + LEN(key$) TO LEN(IniSectionData$)
IF ASC(IniSectionData$, i) = ASC("=") THEN EXIT FOR
IF ASC(IniSectionData$, i) <> ASC("=") AND ASC(IniSectionData$, i) <> 32 THEN
'not the key
GOTO CheckKey
END IF
NEXT
'so far so good; check if there is an assignment
Equal = INSTR(IniPosition, IniSectionData$, "=")
KeyFound:
FoundLF = INSTR(IniPosition, IniSectionData$, IniLF$)
IF FoundLF > 0 THEN
IF Equal > FoundLF THEN GOTO CheckKey
ELSE
FoundLF = LEN(IniSectionData$) + 1
IF Equal = 0 THEN GOTO CheckKey
END IF
tempValue$ = LTRIM$(RTRIM$(MID$(IniSectionData$, Equal + 1, FoundLF - Equal - 1)))
IF LEN(tempValue$) > 0 THEN
IF LEFT$(tempValue$, 1) = CHR$(34) THEN
tempValue$ = MID$(tempValue$, 2)
Quote = INSTR(tempValue$, CHR$(34))
IF Quote > 0 THEN
tempValue$ = LEFT$(tempValue$, Quote - 1)
END IF
ELSE
IF IniAllowBasicComments THEN Comment = INSTR(tempValue$, "'") 'BASIC style comments accepted
IF Comment = 0 THEN Comment = INSTR(tempValue$, ";")
IF Comment > 0 THEN
tempValue$ = LTRIM$(RTRIM$(LEFT$(tempValue$, Comment - 1)))
END IF
END IF
ELSE
IniCODE = 2
END IF
ELSE
IniCODE = 3
EXIT FUNCTION
END IF
ReadSetting$ = tempValue$
IniLastSection$ = IniCurrentSection$
END FUNCTION
FUNCTION IniCurrentSection$
SHARED IniPosition AS _UNSIGNED LONG, IniSectionData$, IniWholeFile$
DIM GlobalPosition AS _UNSIGNED LONG, i AS _UNSIGNED LONG
DIM ClosingBracket AS _UNSIGNED LONG
GlobalPosition = INSTR(IniWholeFile$, IniSectionData$) + IniPosition - 1
CheckSection:
FOR i = GlobalPosition - 1 TO 1 STEP -1
IF ASC(IniWholeFile$, i) = ASC("[") THEN
GlobalPosition = i: EXIT FOR
END IF
NEXT
IF i = 0 THEN IniCurrentSection$ = "[]": EXIT FUNCTION
'identify if this occurrence is actually a section header and not something else
FOR i = GlobalPosition - 1 TO 1 STEP -1
IF ASC(IniWholeFile$, i) = 10 THEN EXIT FOR
IF ASC(IniWholeFile$, i) <> 10 AND ASC(IniWholeFile$, i) <> 32 THEN
'not a section header
GOTO CheckSection
END IF
NEXT
ClosingBracket = INSTR(GlobalPosition, IniWholeFile$, "]")
IF ClosingBracket > 0 THEN
IniCurrentSection$ = MID$(IniWholeFile$, GlobalPosition, ClosingBracket - GlobalPosition + 1)
END IF
END FUNCTION
SUB WriteSetting (file$, __section$, __key$, __value$)
SHARED IniPosition AS _UNSIGNED LONG, IniCODE, currentIniFileName$
SHARED IniLF$, IniWholeFile$, IniSectionData$
SHARED IniLastSection$, IniLastKey$, IniNewFile$
SHARED IniDisableAddQuotes
DIM tempValue$, section$, key$, value$
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$
value$ = LTRIM$(RTRIM$(__value$))
IF LTRIM$(STR$(VAL(value$))) <> value$ THEN
IF NOT IniDisableAddQuotes THEN
'if not a numeric value and value contains spaces, add quotation marks
IF INSTR(value$, CHR$(32)) THEN value$ = CHR$(34) + value$ + CHR$(34)
END IF
END IF
'Read the existing key to fill IniPosition
tempValue$ = ReadSetting$(file$, section$, key$)
'map IniPosition (set in the section block) to the global file position
IniPosition = INSTR(IniWholeFile$, IniSectionData$) + IniPosition - 1
IF IniCODE = 1 OR IniCODE = 17 THEN
'file not found or empty; create a new one
IF file$ = "" THEN file$ = currentIniFileName$
IF file$ = "" THEN IniCODE = 21: EXIT SUB
currentIniFileName$ = file$
IF section$ <> "[]" THEN
IniNewFile$ = section$ + IniLF$
END IF
IniNewFile$ = IniNewFile$ + key$ + "=" + value$
IniCODE = 0
IniCommit
IniLoad file$
IF IniCODE = 0 THEN IniCODE = 11
IniLastSection$ = section$
EXIT SUB
END IF
IF IniCODE = 0 OR IniCODE = 2 THEN 'key found and read back; write new value$
IF LCASE$(IniLastSection$) = LCASE$(section$) THEN
IF LTRIM$(RTRIM$(__value$)) = tempValue$ AND LEN(LTRIM$(RTRIM$(__value$))) > 0 THEN
'identical values skip the writing routine
IniCODE = 8
EXIT SUB
END IF
DIM nextLine AS _UNSIGNED LONG
nextLine = INSTR(IniPosition + 1, IniWholeFile$, IniLF$)
'create new file contents
IniNewFile$ = LEFT$(IniWholeFile$, IniPosition - 1)
IniNewFile$ = IniNewFile$ + key$ + "=" + value$
IF nextLine > 0 THEN
IniNewFile$ = IniNewFile$ + MID$(IniWholeFile$, nextLine)
END IF
IniCommit
IniCODE = 4
END IF
ELSEIF IniCODE = 3 OR IniCODE = 14 THEN 'Key not found, Section not found
IniCODE = 0
IF LCASE$(IniLastSection$) = LCASE$(section$) THEN
'find this section$ in the current ini file;
DIM Bracket1 AS _UNSIGNED LONG
DIM beginSection AS _UNSIGNED LONG, endSection AS _UNSIGNED LONG
DIM i AS _UNSIGNED LONG
beginSection = 0
endSection = 0
CheckSection:
beginSection = INSTR(beginSection + 1, LCASE$(IniWholeFile$), LCASE$(section$))
IF beginSection = 0 THEN GOTO CreateSection
'identify if this occurrence is actually the section header and not something else
FOR i = beginSection - 1 TO 1 STEP -1
IF ASC(IniWholeFile$, i) = 10 THEN EXIT FOR
IF ASC(IniWholeFile$, i) <> 10 AND ASC(IniWholeFile$, i) <> 32 THEN
'not the section header
GOTO CheckSection
END IF
NEXT
'we found it; time to identify where this section ends
'(either another [section], a blank line or the end of the file
Bracket1 = INSTR(beginSection + 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 <= beginSection THEN EXIT FOR
NEXT
END IF
IF endSection > 0 THEN
'add values to the end of the specified section$
IniNewFile$ = LEFT$(IniWholeFile$, endSection - 1)
IniNewFile$ = IniNewFile$ + key$ + "=" + value$ + IniLF$
IF MID$(IniWholeFile$, endSection, LEN(IniLF$)) <> IniLF$ THEN IniNewFile$ = IniNewFile$ + IniLF$
IniNewFile$ = IniNewFile$ + MID$(IniWholeFile$, endSection)
ELSE
'add values to the end of the file
IniNewFile$ = IniWholeFile$
IF RIGHT$(IniNewFile$, LEN(IniLF$)) = IniLF$ THEN
IniNewFile$ = IniNewFile$ + key$ + "=" + value$
ELSE
IniNewFile$ = IniNewFile$ + IniLF$ + key$ + "=" + value$
END IF
END IF
IniCommit
IF IniCODE = 0 THEN IniCODE = 7
EXIT SUB
ELSE
CreateSection:
IniNewFile$ = IniWholeFile$
IF section$ = "[]" THEN GOTO WriteAtTop
IF RIGHT$(IniNewFile$, LEN(IniLF$) * 2) = IniLF$ + IniLF$ THEN
IniNewFile$ = IniNewFile$ + section$ + IniLF$ + key$ + "=" + value$ + IniLF$
ELSEIF RIGHT$(IniNewFile$, LEN(IniLF$)) = IniLF$ THEN
IniNewFile$ = IniNewFile$ + IniLF$ + section$ + IniLF$ + key$ + "=" + value$ + IniLF$
ELSE
IniNewFile$ = IniNewFile$ + IniLF$ + IniLF$ + section$ + IniLF$ + key$ + "=" + value$ + IniLF$
END IF
IniCommit
IF IniCODE = 0 THEN IniCODE = 9 ELSE IniCODE = 16
EXIT SUB
END IF
'if not found, key$=value$ is written to the beginning of the file
WriteAtTop:
IniNewFile$ = key$ + "=" + value$ + IniLF$
IF LEFT$(LTRIM$(IniWholeFile$), 1) = "[" THEN IniNewFile$ = IniNewFile$ + IniLF$
IniNewFile$ = IniNewFile$ + IniWholeFile$
IniCommit
IniCODE = 5
END IF
END SUB
SUB IniSetAddQuotes (state AS _BYTE)
SHARED IniDisableAddQuotes
IF state THEN
IniDisableAddQuotes = 0
ELSE
IniDisableAddQuotes = -1
END IF
END SUB
SUB IniSetForceReload (state AS _BYTE)
SHARED IniForceReload
IF state THEN
IniForceReload = -1
ELSE
IniForceReload = 0
END IF
END SUB
SUB IniSetAllowBasicComments (state AS _BYTE)
SHARED IniAllowBasicComments
IF state THEN
IniAllowBasicComments = -1
ELSE
IniAllowBasicComments = 0
END IF
END SUB
SUB IniSetAutoCommit (state AS _BYTE)
SHARED IniDisableAutoCommit
IF state THEN
IniDisableAutoCommit = 0
ELSE
IniDisableAutoCommit = -1
END IF
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$)
SHARED IniCODE, currentIniFileName$, IniLF$, IniWholeFile$
SHARED currentIniFileLOF AS _UNSIGNED LONG
SHARED IniForceReload
DIM fileNum AS INTEGER
'Error messages are returned with IniCODE
'Error descriptions can be fetched with function IniINFO$
IniCODE = 0
IF file$ <> "" AND currentIniFileName$ <> file$ THEN currentIniFileName$ = ""
IF IniForceReload AND LEN(currentIniFileName$) > 0 THEN
file$ = currentIniFileName$
currentIniFileName$ = ""
END IF
'Passing an empty file$ is allowed if user already
'passed a valid file in this session.
IF currentIniFileName$ = "" THEN
'initialization
IF _FILEEXISTS(file$) THEN
currentIniFileName$ = file$
'Load file into memory
fileNum = FREEFILE
OPEN currentIniFileName$ FOR BINARY AS #fileNum
currentIniFileLOF = LOF(fileNum)
IniWholeFile$ = SPACE$(currentIniFileLOF)
GET #fileNum, 1, IniWholeFile$
CLOSE #fileNum
'Check if this ini file uses CRLF or LF
IF INSTR(IniWholeFile$, CHR$(13)) THEN IniLF$ = CHR$(13) + CHR$(10) ELSE IniLF$ = CHR$(10)
ELSE
IniFileNotFound:
IniCODE = 1
$IF WIN THEN
IniLF$ = CHR$(13) + CHR$(10)
$ELSE
IniLF$ = CHR$(10)
$END IF
EXIT SUB
END IF
ELSEIF NOT _FILEEXISTS(currentIniFileName$) THEN
currentIniFileName$ = ""
GOTO IniFileNotFound
END IF
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