LINUX.ORG.RU

Длина строк при чтении конфига


0

0

По шагам моей предыдущей темы про парсер конфига. Меня заинтересовал следующий факт:
как (точнее куда ;)) все-таки ПРАВИЛЬНО читать keyword и его value: в строки с фиксированным размером буфера (keyword_t, value_t), или все-таки выделять для них память с помощью malloc(). Второй способ мне кажется несколько грамоздким, ибо нужно сначала определить длины этих строк, и только потом выделять для них память.
Хотелось бы узнать мнение более компетентных в этом вопросе людей. Спасибо.

anonymous

Или использовать безопасные функции чтения (где указывается размер буфера), или выделять. А еще лучше - не страдать фигней и писать на плюсах или еще на чем, где оно само это за тебя сделает =)

int19h ★★★★
()

Выделять, расмотрим типичны пример:

IT'S_KEYWORD "IT'S VALUE"

с чего начинаем парсинг? Правильно с отделения кейворда от его значения,
а имеено определяем границ - где что начинается и где что заканчивается, и только после этого сохраняем данные. А имя границы легко получить
длины строк: keyword_pos1 - keyword_pos0 == keyword_length

aton
()
Ответ на: комментарий от Flogger_d

Не лучшее решение, вернее не рационально, т.к. обычно конфиг файл это набор пар: keyword <-> value

aton
()

	Привет всем.

	Да, проще было бы наложить ограничение на длину параметра и его значения
и запхать это все в массив, но гораздо интереснее все таки повозиться с памятью 
:-).

lego_12239
()

	Привет всем.

	Да, проще было бы наложить ограничение на длину параметра и его значения
и запхать это все в массив, но гораздо интереснее все таки повозиться с памятью 
:-).

lego_12239
()
Ответ на: комментарий от lego_12239

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

больше ничего копировать не надо, находим границы и структуры keyword_t, value_t есть ни что иное как (если на С)
typedef struct {
 char *begin; // указатель на начало блока
 char *end; // указатель на один элемент за конец блока
} char_range_t;

typedef char_range_t keyword_t;
typedef char_range_t value_t;

вот и вся любовь.

AnToXa
()
Ответ на: комментарий от AnToXa

не катит, т.к. в конфигах еше и коммены бывают и занимаю большую часть
от всех данных, а их скипать надо, иначе не эффективно получится

aton
()
Ответ на: комментарий от aton

> не катит, т.к. в конфигах еше и коммены бывают и занимаю большую часть от всех данных, а их скипать надо, иначе не эффективно получится

> aton (*) (05.10.2005 11:09:45)

Тогда в чем проблема?

char **keyword; char **value;

Читать из цфг и срать в память. Очень просто и доступно.

Lego_12239

anonymous
()
Ответ на: комментарий от aton

на самом деле, как ты понимаешь, главная мысль была не в том, чтобы прочитать все в память, а в том, чтобы прочитать один раз _все_что_нужно_ и потом распарсить без копирований.

да и в задаче не было ничего про комментарии, просто набор пар <keyword> <value>, а остальное - твои измышления :)

AnToXa
()
Ответ на: комментарий от AnToXa

идея то понятна, но к конфигам не приминима, т.к.

- Возможно комменты все таки поддерживаются :)

- Не факт что value есть строка, может быть
так же цифровое значение, с которым удобней
работать все же как с цифрой, а не гонять туда сюда,
из одного типа в другой + даже если value строка иногда
бывает что в ней может содержать environment variables,
которые надо раскрывать при зачитывании, например

TEMPORARY_PATH "$TMP/$USER/work"

и это далеко не все...




aton
()
Ответ на: комментарий от aton

Подводя итоги :-).

Автору нужно разобраться будут у него камменты или нет, хочет ли он гемморой с переводом типов или нет и исходя из этого уже выбрать менее геморойный для НЕГО путь. В конце концов можно забабахать cfg на xml :-). Вот те сразу куча готовых функций... Халява :-)

Lego_12239

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.