Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

int (*gl_lstat)(const char *, struct stat*)

Указатель на альтернативную версию

lstat
.

int (*gl_stat)(const char*, struct stat*)

Указатель на альтернативную версию

stat
.

Указатели на альтернативные версии стандартных функций предназначены главным образом для использования в реализации GLIBC; крайне маловероятно, что вы когда-нибудь их используете. Поскольку GLIBC предусматривает поле

gl_flags
и дополнительные значения флагов, справочная страница и руководство Info документируют оставшуюся часть структуры GLIBC
glob_t
. В табл. 12.3 перечислены дополнительные флаги.

Таблица 12.3.

Дополнительные флаги GLIBC для
glob

Флаг Значение
GLOB_ALTDIRFUNC
Использовать для доступа к каталогам альтернативные функции (см. текст)
GLOB_BRACE
Выполнить раскрытие фигурных скобок в стиле
csh
и Bash.
GLOB_MAGCHAR
Вставить
gl_flags
, если были найдены метасимволы.
GLOB_NOMAGIC
Вернуть шаблон, если он не содержит метасимволов
GLOB_ONLYDIR
По возможности сопоставлять лишь каталоги. См. текст.
GLOB_PERIOD
Разрешить соответствие метасимволов наподобие
*
и
?
начальной точке
GLOB_TILDE
Выполнить раскрывание тильды в стиле оболочки.
GLOB_TILDE_CHECK
Подобно
GLOB_TILDE
, но если есть проблемы с указанным домашним каталогом, вернуть
GLOB_NOMATCH
вместо помещения
pattern
в список.

Флаг

GLOB_ONLYDIR
действует в качестве подсказки реализации, потому что вызывающий интересуется лишь каталогами. Главным его предназначением является использование другими функциями в GLIBC, а вызывающий по-прежнему должен быть готов обрабатывать файлы, не являющиеся каталогами. Вам не следует использовать этот флаг в своих программах.

glob
может быть вызвана более одного раза: при первом вызове флаг
GLOB_APPEND
не должен быть указан, при всех последующих вызовах он должен быть указан. Вы не можете между вызовами изменять
gl_offs
, а если вы изменили какие-нибудь значения в
gl_pathv
или
gl_pathc
, нужно их восстановить перед последующим вызовом
glob
.

Возможность многократного вызова

glob
позволяет накапливать результаты в одном списке. Это довольно практично, приближается к мощным возможностям раскрывания групповых символов оболочки, но на уровне языка программирования С.

glob
возвращает 0, если не было проблем, или одно из значений из табл. 12.4, если были.

Таблица 12.4. Возвращаемые

glob
значения

Флаг Значение
GLOB_ABORTED
Просмотр остановлен раньше времени, поскольку был установлен
GLOB_ERR
или функция
(*errfunc)
возвратила ненулевой результат
GLOB_NOMATCH
Ни одно имя файла не соответствовало
pattern
,
а флаг
GLOB_NOCHECK
не был установлен
GLOB_NOSPACE
Была проблема с выделением динамической памяти

globfree
освобождает всю память, которую динамически выделила
glob
Следующая программа,
ch12-glob.с
, демонстрирует
glob
:

1 /* ch12-glob.c --- демонстрирует glob. */

2

3 #include <stdio.h>

4 #include <errno.h>

5 #include <glob.h>

6

7 char *myname;

8

9 /* globerr --- выводит сообщение об ошибке для glob */

10

11 int globerr(const char *path, int eerrno)

12 {

13 fprintf(stderr, "%s: %s: %s\n", myname, path, strerror(eerrno));

14 return 0; /* let glob keep going */

15 }

16

17 /* main --- раскрывает символы подстановки в командной строке и выводит результаты */

18

19 int main(int argc, char **argv)

20 {

21 int i;

22 int flags = 0;

23 glob_t results;

24 int ret;

25

26 if (argc == 1) {

27 fprintf(stderr, "usage: %s wildcard ...\n", argv[0]);

28 exit(1);

29 }

30

31 myname = argv[0]; /* для globerr */

32

33 for (i = 1; i < argc; i++) {

34 flags |= (i > 1 ? GLOB_APPEND : 0);

35 ret = glob(argv[i], flags, globerr, &results);

36 if (ret != 0) {

37 fprintf(stderr, "%s: problem with %s (%s),

38 stopping early\n", myname, argv[i],

39 /* опасно: */ (ret == GLOB_ABORTED ? "filesystem problem" :

40 ret == GLOB_NOMATCH ? "no match of pattern" :

41 ret == GLOB_NOSPACE ? "no dynamic memory" :

42 "unknown problem"));

43 break;

44 }

45 }

46

47 for (i = 0; i < results.gl_pathc; i++)

48 printf("%s\n", results.gl_pathv[i]);

49

50 globfree(&results);

51 return 0;

52 }

Строка 7 определяет

myname
, которая указывает на имя программы; эта переменная для сообщений об ошибках от
globerr
, определенной в строках 11–15.

Строки 33–45 являются основой программы. Они перебирают в цикле шаблоны, приведенные в командной строке, вызывая для каждого

glob
для добавления к списку результатов. Большую часть цикла составляет обработка ошибок (строки 36–44). Строки 47–48 выводят результирующий список, а строки 50–51 проводят завершающую очистку и возвращаются.

Поделиться:
Популярные книги

Воплощение Похоти 2

Некрасов Игорь
2. Воплощение Похоти
Фантастика:
попаданцы
рпг
аниме
хентай
фэнтези
5.00
рейтинг книги
Воплощение Похоти 2

Законы Рода. Том 7

Андрей Мельник
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Гимн Непокорности

Злобин Михаил
2. Хроники геноцида
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Гимн Непокорности

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Седьмой Рубеж VI

Бор Жорж
6. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж VI

Тринадцатый XII

NikL
12. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
7.00
рейтинг книги
Тринадцатый XII

Чужак из ниоткуда 2

Евтушенко Алексей Анатольевич
2. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 2

Изгой Проклятого Клана. Том 5

Пламенев Владимир
5. Изгой
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 5

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Неудержимый. Книга III

Боярский Андрей
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I