【发布时间】:2010-10-17 12:49:21
【问题描述】:
我有一个守护进程,它读取配置文件以便知道在哪里写东西。在配置文件中,存在这样一行:
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。健全性检查很容易,我只是花一点时间来获取参数的数量(和顺序)以正确格式化。
提前致谢。另外,如果您有声誉,请随时编辑此标题,正如我所说,我不太确定如何在一行中提出问题。我认为我需要的是parser,但是使用成熟的词法分析器/解析器来处理一个简单的字符串感觉很尴尬。
【问题讨论】:
-
我只是在等待有人在这个网站上发布柠檬派对的链接......你让我暂停...... lmao
-
@ojblass,Lemon 非常适合这种事情,并且不会引入新的构建依赖项.. 除非您在 SCM 中跟踪解析器的输出?
-
不,链接中的柠檬这个名字是我不会点击的。我无法描述原因,但我没有点击带有柠檬这个词的链接。
-
如果你得到这个工作,记得添加对包含类似
../../../etc/passwd的配置文件的保护。 -
@MattMcNabb 是的,当然 - 取决于你如何使用它。请注意,
../config/file.dat有效,../../etcif 在某人的主目录/构建目录中也是如此。我最终做的是检查遍历,并在第 (x) 行需要绝对路径时出错 - 例如/home/jdoe/output' - 在健全性检查中测试读/写访问也很重要。
标签: c string tokenize variadic