在字符串中展开[x-y]和{a,b,c}——类似于glob(3),但不匹配文件名
我正在寻找一个能做什么的C例程,除了不匹配文件名的结果,例如在字符串中展开[x-y]和{a,b,c}——类似于glob(3),但不匹配文件名,c,C,我正在寻找一个能做什么的C例程,除了不匹配文件名的结果,例如 input: "x[1-4]y" output: "x1y", "x2y", "x3y", "x4y" 无论是否存在具有这些名称的文件。编辑:不需要一次生成所有列表;事实上,如果它有一个迭代器样式,那就更好了,现在就给我下一个名字API,因为列表可能会很大 显然,这不能支持*和?,但这很好;我只需要[a-z]符号。支持{foo,bar,baz}符号也很好 最好的选择是告诉我一个例程的名称,这个例程已经存在于每个人的C库中。第二个最好
input: "x[1-4]y"
output: "x1y", "x2y", "x3y", "x4y"
无论是否存在具有这些名称的文件。编辑:不需要一次生成所有列表;事实上,如果它有一个迭代器样式,那就更好了,现在就给我下一个名字API,因为列表可能会很大
显然,这不能支持*和?,但这很好;我只需要[a-z]符号。支持{foo,bar,baz}符号也很好
最好的选择是告诉我一个例程的名称,这个例程已经存在于每个人的C库中。第二个最好的方法是指向BSD许可的或更许可的代码块的指针。GPL代码会很尴尬,但我可以接受它。下面是我如何编写迭代器的草图: 计算字符串中[的实例数。这将是您迭代的维度数。 对于每个标注,根据括号表达式中的字符数建立一个值范围。 只需在这些范围内迭代整数的n元组,并将结果值用作括号表达式的索引,以基于值展开字符串。 命令行工具(而非库)包含执行此任务的代码,相对容易提取: 必须对它们进行编辑,以消除对不属于公共库接口一部分的cURL内部的某些依赖关系。API有点混乱,因此下面是我编写的一些包装器代码:
#include "tool_urlglob.h"
struct url_iter
{
char **upats;
URLGlob *uglob;
int nglob;
};
static inline struct url_iter
url_prep(char **upats)
{
struct url_iter it;
it.upats = upats;
it.uglob = NULL;
it.nglob = -1;
return it;
}
static char *
url_next(struct url_iter *it)
{
char *url;
if (!it->uglob) {
for (;;) {
if (!*it->upats)
return 0;
if (!glob_url(&it->uglob, *it->upats, &it->nglob, stderr))
break;
it->upats++;
}
}
if (glob_next_url(&url, it->uglob))
abort();
if (--it->nglob == 0) {
glob_cleanup(it->uglob);
it->uglob = 0;
it->upats++;
}
return url;
}
将字符串数组传递给url_prep,在结果上调用url_next,直到返回NULL。从url_next返回的字符串在处理完后必须免费处理。非常类似于什么?@sleeplessnerd我需要C.@aselr wordexp与glob一样,只会生成与通配符字符串匹配的文件名列表。事实上,它是我的理解是,它在内部使用glob。谷歌帮了我一个忙:你不明白我在寻找一个固定程序的哪一部分吗?我知道自己该怎么写这该死的东西,如果我有时间的话!我想你可以用比写问题和否决我的答案所花费的时间更短的时间来写它。你知道吗,我会把它当作一个例子如果你以后不再回答或评论我的问题,我会帮你的。