Русское сообщество по скриптингу

[INC] UTIL Parser

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[INC] UTIL Parser

Сообщение sa1me » 18 янв 2017, 12:17

Автор: Вы должны зарегистрироваться, чтобы видеть ссылки.
Версия: Stable

Обновления:
    Beta:
  • первый релиз
    Stable:
  • Исправление багов (спасибо пользователю Ronna Riva)
  • Добавлена поддержка файлов без блоков


Описание: Данный заголовочный файл представляет собой функции для упрощения обработки информации из INI файлов.

Доступные функции:
Код: Выделить всё
//инициализация (обработка) файла
//возвращает идентификатор файла
//dir - путь к обрабатываемому файлу
stock UTIL_ParserLoadFile(const dir[]);


//функция возвращает кол-во строк в указанном блоке или в файле, если нет блоков
//handle - идентификатор файла
//section - необходимый блок в файле, указывается в квадратных скобках, к примеру [MAIN]
stock UTIL_ParserGetLines(const handle, const section[] = "default");


//функция получает содержимое указанной строки в блоке/файле
//(нумерация строк в каждом блоке индивидуальна, а не равна общему числу строк во всем файле)
//handle - идентификатор файла
//line - номер строки
//output - массив для записи строки
//размер массива
//section - необходимый блок в файле, пропустить, если в файле нет блоков
stock UTIL_ParserGetContent(const handle, const line, output[], const size, const section[] = "default");


//запускает обработку строк с вызовом в указанную функцию
//handle - идентификатор файла
//function - функция, которая будет получать содержимое строки
//section - необходимый блок в файле, пропустить, если в файле нет блоков
stock UTIL_ParserGetContentOnHandle(const handle, const function[], const section[] = "default"); 

Задача для примера: У нас есть INI файл с блоком [MAPS], который содержит в себе список карт, на которых плагин не функционирует.
Код: Выделить всё
[MAPS]
de_dust
de_dust2
de_dust2_2x2
de_inferno


Реализация 1:
Код: Выделить всё
#include <amxmisc>
#include <util_parser>

#pragma semicolon 1

#define PLUGIN "UTIL Parser: Stub plugin"
#define VERSION "1.0"
#define AUTHOR "sa1me AKA Eriurias"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    new szTempString
[64], szBuffer[32];
    
    get_configsdir
(szTempString, charsmax(szTempString));
    add(szTempString, charsmax(szTempString), "/testconfig.ini");
    
    new iParserHandle 
= UTIL_ParserLoadFile(szTempString);
    
    get_mapname
(szTempString, charsmax(szTempString));
    
    for 
(new i; i < UTIL_ParserGetLines(iParserHandle, "[MAPS]"); i++)
    {
        UTIL_ParserGetContent(iParserHandle, i, szBuffer, charsmax(szBuffer), "[MAPS]");
        
        if 
(equal(szBuffer, szTempString))
        {
            pause("d");
            break;
        }
    }


Реализация 2:
Код: Выделить всё
#include <amxmisc>
#include <util_parser>

#pragma semicolon 1

#define PLUGIN "UTIL Parser: Stub plugin"
#define VERSION "1.0"
#define AUTHOR "sa1me AKA Eriurias"

new g_iParserHandle;
new g_szMapName[32];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    new szConfig
[64];
    get_configsdir(szConfig, charsmax(szConfig));
    add(szConfig, charsmax(szConfig), "/testconfig.ini");
    
    g_iParserHandle 
= UTIL_ParserLoadFile(szConfig);
    
    get_mapname
(g_szMapName, charsmax(g_szMapName));
    
    UTIL_ParserGetContentOnHandle
(g_iParserHandle, "MapsSection", "[MAPS]");
}

public MapsSection(const buffer[])
{
    if (equal(buffer, g_szMapName))
    {
        pause("d");
        return PARSER_BREAK;
    }
    
    return PARSER_CONTINUE
;
}


TODO: Реализовать функции для обработки полученных строк, а также возможность получать строку в обработчик уже по готовым аргументам.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

Re: [INC] UTIL Parser

Сообщение RevCrew » 19 янв 2017, 14:23

sa1me, кто то когда то модуль обещал, или уже не будет?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: [INC] UTIL Parser

Сообщение sa1me » 19 янв 2017, 15:43

RevCrew, давно забросил разработку. Это вполне реализуемо без модуля, как видишь.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

Re: [INC] UTIL Parser

Сообщение Ronna Riva » 20 фев 2017, 07:14

sa1me, почему-то если прочитать файл где есть комментарии, то в логах ошибки связанные с Trie и Array. Думал может я что-то не так делаю, но такое происходит даже если использовать ваш пример :dntknw:
Аватара пользователя
Ronna Riva
 
Сообщения: 34
Зарегистрирован: 13 фев 2017, 11:36
Забанен
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Опыт программирования: Больше трех лет
Языки программирования: Objective-C
C++

Re: [INC] UTIL Parser

Сообщение sa1me » 20 фев 2017, 07:47

Ronna Riva, логи можно увидеть?

Добавлено спустя 1 минуту 46 секунд:
А, все понял. Забыл trimspace заюзать для буффера, перед условием игнора комментариев. Домой приеду, исправлю.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

Re: [INC] UTIL Parser

Сообщение Ronna Riva » 20 фев 2017, 09:48

sa1me, во, теперь все отлично. Спасибо! :thumbs_up
Кстати, было бы здорово иметь возможность работать не только с файлами где есть блоки :-)
Аватара пользователя
Ronna Riva
 
Сообщения: 34
Зарегистрирован: 13 фев 2017, 11:36
Забанен
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Опыт программирования: Больше трех лет
Языки программирования: Objective-C
C++

Re: [INC] UTIL Parser

Сообщение sa1me » 22 фев 2017, 23:16

Обновление до стабильной версии.
    Stable:
  • Исправление багов (спасибо пользователю Ronna Riva)
  • Добавлена поддержка файлов без блоков


P.S.: Порядок аргументов изменился в связи с обновлением, подробнее в первом посте. Для обработки файлов без блоков, следует пропустить последний аргумент section в функциях, то есть не указывая имя блока.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4