Какая библиотека C имеет функциональные возможности для выполнения рекурсивных глобусов zsh?

Я написал привязку nodejs к glob.h (npm install glob для ее использования).

Мне бы очень хотелось поддерживать причудливый тип lib/**/*.js zsh, но я не могу понять, какая библиотека имеет эту функциональность.

Я точно не хочу пытаться реализовать это самостоятельно, и я не ищу умного решения головоломки программирования. Я просто хочу что-то вроде этого:

#include <fancy_glob.h>
int do_fancy_glob (etc) { ... }

Любые указатели? Я почти уверен, что у Ruby есть привязка к этому, не так ли?


РЕДАКТИРОВАТЬ:

Я провел небольшое исследование и выяснил интересные вещи.

Гвидо Ван Россум (известный по Python) написал реализацию, которая сейчас используется в BSD и некоторых других Unix-системах. Он не включал так называемые «расширенные» шаблоны глобусов (** и т. д.). Когда вы делаете #include <glob.h> в своей программе, скорее всего, это то, что вы получите. man 3 glob описывает его поведение.

Однако Bash, Zsh и Ksh теперь имеют расширенные реализации glob, и все они, насколько я могу судить, написаны с нуля. У NetBSD есть узнаваемый потомок реализации GVR с добавленными расширенными глобусами. Ruby имеет расширенные глобусы, реализованные в dir.c как часть своей стандартной библиотеки (определенно написанной на C, а не на ruby). Perl, похоже, имеет привязки или реализации всех существующих библиотек глобусов, чего, я полагаю, и следовало ожидать.

Из всех, что я нашел, NetBSD кажется наиболее близкой к тому, что я кодировал с типичной нерасширенной libc glob(3), и ее лицензия больше всего подходит для моего проекта.

Другим подходом было бы переписать его с нуля. Я был бы в порядке, но я не могу найти четкую спецификацию или набор тестов. Есть предложения?


РЕДАКТИРОВАТЬ 2: я переписал его на JS. https://github.com/isaacs/node-glob


person isaacs    schedule 13.01.2011    source источник


Ответы (1)


Я почти уверен, что Ruby делает это сам, и, вероятно, это делает код Ruby. Помимо синтаксического анализа строки и обхода файловой системы, для реализации этого не так много препятствий. Я не уверен, но я не думаю, что zsh использует для этого библиотеку, это просто в коде zsh.

person AboutRuby    schedule 13.01.2011
comment
Ruby делает это сам, но он написан на C, а не в коде Ruby. Проверьте dir.c в источнике ruby. - person isaacs; 20.01.2012