我有一个读取配置文件的守护程序,以便知道在哪里写东西。在配置文件中,存在这样的一行:
output = /tmp/foo/%d/%s/output
或者,它可能看起来像这样:
output = /tmp/foo/%s/output/%d
...或者只是这样:
output = /tmp/foo/%s/output
...或者最后:
output = /tmp/output
我在我的程序中将该行作为 cfg->pathfmt 。我现在要做的是想出一些巧妙的使用方法。
再解释一下,路径最多可以包含两个要格式化的组件。%d 将扩展为作业 ID (int),%s 将扩展为作业名称(字符串)。用户可能希望在配置文件中使用一个、两个或一个都不使用。在我最终将其传递给 snprintf() 之前,我需要知道他们想要什么以及按什么顺序。我可以缩小范围,但我一直想与 strtok() 交谈,这看起来很难看。
我想给用户这种灵活性,但是我迷失了寻找一种明智的、可移植的方式来实现它。我也完全不知道如何开始搜索这个。
如果出现以下情况,我会非常高兴:
- 有人可以帮我缩小搜索词组的范围以找到好的例子
- 有人可以发布一个链接到一些实现这个的 OSS 项目
- 有人可以发布一些伪代码
我不想要为我编写的代码,我只是真的坚持(我认为)应该是非常简单的东西,并且需要一些帮助才能吃第一口。我真的觉得我想多了,忽略了显而易见的事情。
最终结果应该是这样的布尔函数:
bool output_sugar(const char *fmt, int jobid, const char *jobname, struct job *j);
然后它将在 j->outpath 上调用 snprintf()(明智地),如果某种垃圾(即 % 后跟不是 s、d 或 % 的东西)在配置行中(或其 null),则返回 false。健全性检查很容易,我只是花一点时间来获取参数的数量(和顺序)以正确格式化。
提前致谢。另外,如果您有声誉,请随时编辑此标题,正如我所说,我不太确定如何在一行中提出问题。我认为我需要的是一个解析器,但是使用成熟的词法分析器/解析器来处理一个简单的字符串感觉很尴尬。