Linux программирование в примерах
Шрифт:
2278 return 0;
2279
2280 if (really_all_files
2281 || next->d_name[0] !=
2282 || (all_files
2283 && next->d_name[1] != '\0 '
2284 && (next->d_name[1] || next->d_name[2] != '\0')))
2285 return 1;
2286
2287 return 0;
2288 }
Цикл в строках 2276–2278 сопоставляет имя файла со списком шаблонов для игнорируемых файлов. Если один из шаблонов подходит, файл не интересен и
file_interesting
возвращает false (то есть 0). Переменная
all_files
соответствует опции – А
, которая показывает файлы, имена которых начинаются с точки, но не являются '.
' и '..
'. Переменная really_all_files
соответствует опции – а
, которая предполагает – А
, а также показывает '.
' и '..
'. При наличии таких сведений, условие в строках 228–2284 может быть представлено следующим псевдокодом: if (/* показать все файлы независимо от их имени (-а) */
OR /* первый символ имени не точка */
OR (/* показать файлы с точкой (-А) */
AND /* в имени файла несколько символов */
AND (/* второй символ не точка */
OR /* третий символ не завершает имя */)))
return TRUE;
ЗАМЕЧАНИЕ.
fnmatch
может оказаться дорогостоящей функцией, если она используется в локали с многобайтным набором символов. Обсудим многобайтные наборы символов в разделе 13.4 «Можете произнести это для меня по буквам?» 12.7.2. Раскрытие имени файла:
glob
и globfree
Функции
glob
и globfree
более разработанные, чем fnmatch
: #include <glob.h> /* POSIX */
int glob(const char *pattern, int flags,
int (*errfunc)(const char *epath, int eerrno), glob_t *pglob);
void globfree(glob_t *pglob);
Функция
glob
осуществляет просмотр каталога и сопоставление с шаблонами, возвращая список всех путей, соответствующих pattern
. Символы подстановки могут быть включены в нескольких местах пути, а не только в качестве последнего компонента (например, '/usr/*/*.so
'). Аргументы следующие: const char *pattern
Шаблон для раскрывания.
int flags
Флаги, управляющие поведением
glob
, вскоре будут описаны. int (*errfunc)(const char *epath, int eerrno)
Указатель на функцию для использования при сообщениях об ошибках. Это значение может равняться
NULL
. Если нет и если (*errfunc)
возвращает ненулевое значение или в flags
установлен GLOB_ERR
, glob
прекращает обработку. Аргументами (*errfunc)
являются путь, вызвавший проблему, и значение errno, установленное функциями opendir
, readdir
или stat
. glob_t *pglob
Указатель на структуру
glob_t
, использующуюся для хранения результатов. Структура glob_t
содержит список путей, которые выдает glob
: typedef struct { /* POSIX */
size_t gl_pathc; /* Число найденных подходящих путей */
char **gl_pathv; /* Список подходящих путей */
size_t gl_offs; /* Слоты для резервирования в gl_pathv */
} glob_t;
size_t gl_pathc
Число путей, которые подошли.
char **gl_pathv
Массив подходящих путей.
gl_pathv[gl_pathc]
всегда равен NULL
. size_t gl_offs
«Зарезервированные слоты» в
gl_pathv
. Идея заключается в резервировании слотов спереди от gl_pathv
для заполнения их приложением впоследствии, как в случае с именем команды и опциями. Список затем может быть передан непосредственно execv
или execvp
(см. раздел 9.1.4 «Запуск новой программы: семейство exec
»). Зарезервированные слоты устанавливаются в NULL
. Чтобы все это работало, в flags
должен быть установлен GLOB_DOOFFS
. В табл. 12.2 перечислены стандартные флаги для
glob
. Таблица 12.2. Флаги для
glob
| Флаг | Значение |
|---|---|
GLOB_APPEND | Добавить результаты текущего вызова к предыдущим |
GLOB_DOOFFS | Зарезервировать места gl_offs спереди в gl_pathv |
GLOB_MARK | Добавлять символ / в конец каждого имени, которое обозначает каталог |
GLOB_NOCHECK | Если шаблон не соответствует имени какого-нибудь файла, вернуть его без изменений |
GLOB_NOESCAPE | Рассматривать обратный слеш как обычный символ. Это делает невозможным обозначать метасимволы подстановок |
GLOB_NOSORT | Не сортировать результаты, по умолчанию они сортируются |
GLIBC версия структуры
glob_t
содержит дополнительные члены: typedef struct { /* GLIBC */
/* Компоненты POSIX: */
size_t gl_pathc; /* Число подходящих путей */
char **gl_pathv; /* Список подходящих путей */
size_t gl_offs; /* Резервируемые в gl_pathv слоты */
/* Компоненты GLIBC: */
int gl_flags; /* Копия флагов, дополнительные флаги GLIBC */
void (*gl_closedir)(DIR *); /* Частная версия closedir */
struct dirent *(*gl_readdir)(DIR *); /* Частная версия readdir)) */
DIR *(*gl_opendir)(const char *); /* Частная версия opendir)) */
int (*gl_lstat)(const char *, struct stat *);
/* Частная версия lstat */
int (*gl_stat)(const char *, struct stat *); /* Частная версия stat */
} glob_t;
Члены структуры следующие:
Поделиться:
Популярные книги
Лекарь Империи 6
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 12
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Вечная Война. Книга II
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Страж Кодекса. Книга VI
6. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неучтенный элемент. Том 8
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Лев Толстой
363. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
S-T-I-K-S. Пройти через туман
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
Моров. Том 4
3. Моров
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Я еще не князь. Книга XIV
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Граф Книга третья
10. Ученик
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Князь Андер Арес 3
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00