Lightweight INI style Configuration manager
Supports (currently)
- Reading & processing sections from file.
- Reading parameter/value pairs from an ini file.
- Converting readed values to int/float/string.
- Building linked list from parameters.
- Multiline values are supported.
- Reading comments.
- UNICODE/UTF8 support.
- Escape sequence support.
Automatically switch between UNIX ('\n') and Windows ('\r\n') line endings. MAC ('\r' only) is not supported currently. Comments can be started with ';' or '#' signs. Multiline values are supported if they are surrounded with Double-Quotation-Mark (") signs. Uses Finite State Machine technique for file processing. Sections, Parameter names can be ASCII alphabetical or numerical characters. Values in alone also ASCII, or between Double-Quotation-Marks(") can be any UNICODE/UTF8 characters.
Maximum line length can be 2^(32/2) characters.
Future Plans
- Writing and Rewriting ini files.
- Writing support for comments.
- Modifying one or more values/parameters/sections in ini files.
sample.ini
;Comments are started with '#' or ';'
# This is also a comment
; Inline comments are allowed.
; EMPTY/BLANK lines are not processed!
;Global variables are allowed
;# Parameters without section are global variables.
global1 = 11
global2 = aaa
; The First character of Section name should be alphanumerical, but
;# another caharacters can be Alphanumerical or dot(.)/underscore(_)/hyphen(-)/space(' ')
[Sections.are_ASCII-alnum characters]
;Parameter values in itself:
;# can be ASCII Alphanumerical only, without any SPACE or TAB character.
;Should start with alphanumerical, and from the second character,
;# can contain (with dot(.) or underscore(_) or hyphen(-))
;If you want to use other characters, you should enclose them between two double-quotation-mark(") sign.
parameter = value-in_itself-are-Alnum.ascii
;Parameter names are ASCII alphanumerical only, with additional dot(.) or underscore(_) or hyphen(-) or suare-bracket([/]) characters.
;# Square-brackets([]) are allowed for arrays.
parameter_names.also-ASCII = value
[Section 2]
;For other value characters:
;# The Space, or any other special characters are allowed only between two double-quotation-mark sign.
;Escaped characters, (\n, \t, etc.) or multi-byte characters (é, €, カ, ⠋, ঘঃ, 😍) are allowed here.
parameter2 = "I like \t emojis 😍 but, don't like mosquitoes カ ! :)"
; Even! Multiline Parameters are supported:
parameter3 = "With double quotation mark \
I can write multiline values, but I should \
escapse the trailing newline with '\' sign!"
[E X A M P L E S] ;inline comments are #OK
abcdefgh ;WRONG (eqal sign is needed)
abcdefgh = ;CORRECT
abcdefgh == ;WRONG (one equal sign allowed)
abcdefgh = "==" ;CORRECT
=abcd ;ERROR
= ;xxxx ;also will produce ERROR
param=value ;OK (inline comments are ok)
param = value ;OK (you can use any space between Label, equal, and value
param = value1 value2 #ERROR
param = value1\ value2 #ERROR
paramß = value1_value2 #ERROR (ascii is needed for labels and sections)
[example ;section] ;WRONG
[example \;section] ;WRONG
param = "qwerty \"qwerty\" abcdefh" ;CORRECT (you can use backslash in quoted value)
param = "qwerty\nqwerty" ;CORRECT ('\''n' -> '\n' will be translated to newline (\r, \t, etc also))
param = "qwerty"qwerty ;WRONG (mixing are not allowed)
param = "qwerty" ;OK
param = qwerty ;OK
array[0123] = "asdasd" ;OK
array [1234] = dfgdfg ;WRONG
array[_] = "jkljkl" ;OK
array[abc] = aaaa ;OK
array.abc = aaaa ;OK
array[abc] = "" ;OK
#### qwerty $ۧ qwerty #### ;OK (you can use any character in comments
test = -1.1 #OK
test2 = "-1.1" #OK
test3 = _aaa #WRONG
test4 = aaa_ #OK
test5 = .aaa #WRONG
test6 = aaa. #OK
test6 = aa.a #OK
[server_options] ;OK
server_ = ;xxxx ;OK
server_ = server.example.com ;OK
_server_= server.example.com ;ERROR (labe should start with alpha-numerical character)
ip = 127.0.0.1 ;OK
ip = "127.0.0.1" ;OK
1024 = xxxxx ;OK
1024 = 2048 ;OK (but only syntactically :)
Engine is using a Finite State Machine
(Markdown graph)
(If it does not appear see: engine.html)
graph LR
A[Start] -- \n,\r --> ST[Stop]
A -- comment_sign --> C[Comment]
A -- any_space --> SP[begin_space]
A -- utf8_BOM --> A
A -- square_bracket --> S[section]
A -- alpha_num --> P[label]
A -- other --> E[ERROR]
C -- any_character --> C
C -- \n, \r --> ST
SP -- \n, \r --> ST
SP -- comment_sign --> C
SP -- square_bracket --> S
SP -- alpha_num --> P
SP -- other --> E
S -- square_bracket --> SE[sect_end]
S -- alpha_num --> S
S -- other --> E
SE -- \n, \r --> ST
SE -- any_space --> SE
SE -- comment_sign --> C
SE -- other --> E
P -- equal_sign --> VP[value_pre]
P -- alpha_num --> P
P -- any_space --> P2[label_end]
P -- other --> E
P2 -- equal_sign --> VP
P2 -- any_space --> P2
P2 -- other --> E
VP -- \n, \r --> ST
VP -- comment_sign --> C
VP -- double_quotation_mark --> DQ[quoted_val]
VP -- any_space --> VP
VP -- alpha_num --> VC[value]
VP -- other --> E
VC -- \n, \r --> ST
VC -- comment_sign --> C
VC -- alpha_num --> VC
VC -- any_space --> VV[value_end]
VC -- other --> E
BS -- prev==quoted_val --> DQ
VV -- \n \r --> ST
VV -- comment_sign --> C
VV -- any_space --> VV
VV -- other --> E
DQ -- double_quotation_mark --> VV
DQ -- backslash --> BS
DQ -- \r \n \0 --> E
DQ -- any_other --> DQ
E -- any_other --> ST
ST -- \n \r \0 prev==ERROR --> ST
ST -- other --> E