У меня есть демон, который читает файл конфигурации, чтобы знать, где что-то написать. В файле конфигурации есть такая строка:
output = /tmp/foo/%d/%s/output
Или это может выглядеть так:
output = /tmp/foo/%s/output/%d
... или просто так:
output = /tmp/foo/%s/output
... или, наконец:
output = /tmp/output
У меня есть эта строка как cfg-> pathfmt в моей программе. То, что я пытаюсь сделать сейчас, - это придумать какой-нибудь умный способ его использования.
Немного больше объяснений, путь может содержать до двух компонентов, которые будут отформатированы. % d будет расширен как идентификатор задания (int),% s как имя задания (строка). Пользователь может захотеть использовать один, оба или ни одного в файле конфигурации. Мне нужно знать, что они хотят и в каком порядке, прежде чем я наконец передам это snprintf (). Я могу отчасти сузить это, но я все еще хочу поговорить со strtok (), и это кажется уродливым.
Я хочу предоставить пользователям такую гибкость, однако я теряюсь в поисках разумного, портативного способа его реализации. Я также в полной и полной потере, как начать поиск этого.
Я был бы очень рад, если бы:
- Кто-то может помочь мне сузить поисковую фразу, чтобы найти хорошие примеры
- Кто-то может опубликовать ссылку на какой-либо проект OSS, реализующий этот
- Кто-то может опубликовать код псевдо
Мне не нужен код, написанный для меня, я просто застрял на том, что (я думаю) должно быть чем-то очень простым и нуждается в некоторой помощи, чтобы сделать первый укус. Я действительно чувствую, что я слишком много думаю и упускаю из виду очевидное.
Конечным результатом должна быть логическая функция, подобная этой:
bool output_sugar(const char *fmt, int jobid, const char *jobname, struct job *j);
Затем он будет вызывать snprintf () (разумно) для j-> outpath, возвращая false, если какой-то мусор (т.е.%, за которым следует что-то не s, d или%) находится в строке конфигурации (или его ноль). Проверка работоспособности проста, у меня просто немного времени на получение числа (и порядка) аргументов для правильного форматирования.
Спасибо заранее. Кроме того, не стесняйтесь редактировать этот заголовок, если у вас есть для этого репутация, как я уже сказал, я не совсем уверен, как задать вопрос в одной строке. Я думаю, что мне нужен парсер , но он чувствует себя неловко, используя полноценный лексер / парсер для обработки одной простой строки.