Libs-dev/libini/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

INI файлы — структурированные текстовые файлы, легко воспринимаемые человеком. Каждый файл состоит из нескольких секций, в каждой из которых находится несколько ключей со значениями. Вот пример такого файла:

[цвета фруктов]
банан = жёлтый
апельсин = оранжевый
клубника = красный

[цвета овощей]
огурец = зелёный

Имена секций заключены в квадратные скобки, пишутся в одну строку и могут состоять из любых символов. Секции разделяют файл на части, в которых находятся ключи и соответствующие им значения. В начале файла (перед первой секцией) также могут находится ключи и значения, не принадлежащие ни одной из секций. Ключи и значения также пишутся в одну строку и разделяются друг от друга символом равенства "=". Имя ключа, конечно же, не может содержать символ "=". Значение ключа — строка от первого найденного символа "=" до конца строки.

Имена секций, имена и значения ключей обрезаются, то есть пробельные символы удаляются из начала и конца строк перед их сравнением.

Если каждая секция определяет набор ключей, то каждый ключ, в свою очередь, определяет одно значение. Имена секций и ключей не обязаны быть уникальными, однако если найдётся два ключа (в пределах одной секции) с одинаковым именем, значения будут читаться и записываться в тот из них, что находится ближе к началу файла.

Для всех файловых операций, libini использует libio.

Функции (перебор сущностей)

ini_enum_sections

Перебрать секции, вызывая пользовательскую функцию для каждого из них.

Прототип:

proc ini.enum_sections _f_name, _callback

Аргументы:

_f_name → asciiz
путь к INI файлу
_callback
адрес пользовательской функции: func(f_name, sec_name), где
f_name → asciiz
путь к INI файлу (совпадает с переданным в функцию)
sec_name → asciiz
имя найденной секции

Результат:

eax → dword
-1 (ошибка) / 0

ini_enum_keys

Перебоать ключи в секции, вызывая пользовательскую функцию для каждого из них.

Прототип:

proc ini.enum_keys _f_name, _sec_name, _callback

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_callback
адрес пользовательской функции: func(f_name, sec_name, key_name, key_value), где
f_name → asciiz
путь к INI файлу (совпадает с переданным в функцию)
sec_name → asciiz
имя секции (совпадает с переданным в функцию)
key_name → asciiz
имя найденного ключа
key_value → asciiz
значение найденного ключа

Результат:

eax → dword
-1 (ошибка) / 0

Функции (получение и установка значений)

Все функции получения значений безопасны, возвращая переданное значение по умолчанию при любой ошибке.

ini_get_str

Прочитать строку.

Прототип:

proc ini.get_str _f_name, _sec_name, _key_name, _buffer, _buf_len, _def_val

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_buffer → byte*
буфер для записи полученного значения
_buf_len → dword
размер буфера (максимальное количество байт для чтения)
_def_val → asciiz
возвращаемое значение по умолчанию, если ключ, секция или файл не будут найдены

Результат:

eax → dword
-1 (ошибка) / 0
[_buffer] → asciiz
[_def_val] (ошибка) / найденное значение ключа

ini_set_str

Записать строку.

Прототип:

proc ini.set_str _f_name, _sec_name, _key_name, _buffer, _buf_len

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_buffer → byte*
буфер, содержащий записываемое значение
_buf_len → dword
размер буфера (количество байт для записи)

Результат:

eax → dword
-1 (ошибка) / 0

ini_get_int

Прочитать целое число.

Прототип:

proc ini.get_int _f_name, _sec_name, _key_name, _def_val

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_def_val → dword
возвращаемое значение по умолчанию, если ключ, секция или файл не будут найдены

Результат:

eax → dword
[_def_val] (ошибка) / найденное значение ключа

ini_set_int

Записать целое число.

Прототип:

proc ini.set_int _f_name, _sec_name, _key_name, _val

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_val → dword
значение

Результат:

eax → dword
-1 (ошибка) / 0

ini_get_color

Прочитать цвет.

Прототип:

proc ini.get_color _f_name, _sec_name, _key_name, _def_val

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_def_val → dword
возвращаемое значение по умолчанию, если ключ, секция или файл не будут найдены

Результат:

eax → dword
[_def_val] (ошибка) / найденное значение ключа

ini_set_color

Записать цвет.

Прототип:

proc ini.set_color _f_name, _sec_name, _key_name, _val

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_val → dword
значение

Результат:

eax → dword
-1 (ошибка) / 0

ini_get_shortcut

Прочитать клавишу быстрого доступа.

Строка для ini_get_shortcut - произвольное количество модификаторов Ctrl/Alt/Shift/LCtrl/LAlt/LShift/RCtrl/RAlt/RShift, после которых следует латинская буква/цифра/имя клавиши (имена собственные имеют Home, End, PgUp, PgDn, Ins=Insert, Del=Delete, Tab, Plus, Esc, Enter, Backspace, Space, Left, Right, Up, Down). Строку можно писать с любым регистром символов. Части пишутся либо слитно, либо разделяются плюсом. Например: Ctrl+Alt+Backspace, RCtrl+RShift, ShiftA, f10, shiftalt5

Прототип:

proc ini.get_shortcut _f_name, _sec_name, _key_name, _def_val, _modifiers

Аргументы:

_f_name → asciiz
путь к INI файлу
_sec_name → asciiz
имя секции
_key_name → asciiz
имя ключа
_def_val → dword
возвращаемое значение по умолчанию, если ключ, секция или файл не будут найдены
_modifiers → dword*
адрес переменной типа dword, получающей значение модификаторов для передачи функции 66.4

Результат:

eax → dword
[_def_val] (ошибка) / скан-код клавиши быстрого доступа
[[_modifiers]] → dword
неизменно (ошибка) / состояние модификаторов клавиши быстрого доступа

Примеры использования

Этот пример перебирает секции, а потом в пользовательской функции перебирает ключи каждой найденной секции. Заметьте, что мы используем "invoke", так как вызов функции — косвенный.

; ...

        invoke  ini_enum_sections, filename, ini_section_callback

; ...

proc ini_section_callback _filename, _section_name
        ; эта функция вызывается библиотекой для каждой найденной в файле секции

        invoke  ini_enum_keys, [_filename], [_section_name], ini_key_callback

        ; ...

        ret
endp 

proc ini_key_callback _filename, _section_name, _key_name, _key_value
        ; эта функция вызывается библиотекой для каждого найденного в файле ключа каждой секции

        ; ...

        ret
endp

; ...

filename db '/hd0/1/a.ini', 0