gpt4 book ai didi

c - 在字符串中展开 [x-y] 和 {a,b,c} -- 类似于 glob(3) 但没有文件名匹配

转载 作者:行者123 更新时间:2023-11-30 18:14:30 34 4
gpt4 key购买 nike

我正在寻找一个可以执行以下操作的固定 C 例程 glob(3)确实如此,除了没有将结果与文件名进行匹配,例如

input: "x[1-4]y"
output: "x1y", "x2y", "x3y", "x4y"

无论是否存在具有这些名称的文件。 编辑:这不需要立即生成所有列表;事实上,如果它有一个迭代器风格的“现在给我下一个名字”API 会更好,因为列表可能会很大。

显然这不能支持*?,但是没关系;我只需要 [a-z] 符号。支持 {foo,bar,baz} 表示法也很好。

最好的选择是告诉我一个例程的名称,该例程已经存在于每个执行此操作的 C 库中。第二好的方法是指向 BSD 许可的(或更宽松的)代码块的指针。 GPL 代码会很尴尬,但我可以忍受。

最佳答案

cURL (命令行工具,而不是库)包含执行此任务的代码,该代码相对容易提取:

https://github.com/bagder/curl/blob/master/src/tool_urlglob.c
https://github.com/bagder/curl/blob/master/src/tool_urlglob.h

必须对它们进行编辑,以删除对不属于公共(public)库界面一部分的 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 返回的字符串在使用完毕后必须使用 free 进行释放。

关于c - 在字符串中展开 [x-y] 和 {a,b,c} -- 类似于 glob(3) 但没有文件名匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255106/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com