Хрестоматия по программированию на Си в Unix




Примеры. Хрестоматия по программированию на Си в Unix


Пример 18

/* _______________________ файл glob.h ___________________________*/ /* ПОДДЕРЖКА СПИСКА ИМЕН ФАЙЛОВ ЗАДАННОГО КАТАЛОГА */ /* ______________________________________________________________ */ #define FILF

#include <sys/types.h>

#include <sys/stat.h>

#include <dirent.h>

# define DIR_SIZE 14 extern char *malloc(unsigned); char *strdup(const char *str); extern char *getenv(); extern char *strchr(char *, char), *strrchr(char *, char); #define ISDIR(mode) ((mode & S_IFMT) == S_IFDIR) #define ISDEV(mode) ((mode & S_IFMT) & (S_IFCHR|S_IFBLK)) #define ISREG(mode) ((mode & S_IFMT) == S_IFREG) #define ISEXE(mode) ((mode & S_IFMT) == S_IFREG && (mode & 0111)) #define isdir(st) ISDIR(st.st_mode) #define isdev(st) ISDEV(st.st_mode) #define isreg(st) ISREG(st.st_mode) #define isexe(st) ISEXE(st.st_mode) #define YES 1 #define NO 0 #define I_DIR 0x01 /* это имя каталога */ #define I_EXE 0x02 /* это выполняемый файл */ #define I_NOSEL 0x04 /* строку нельзя выбрать */ #define I_SYS (I_DIR | I_EXE | I_NOSEL) /* Скопировано из treemk.c * Лучше просто написать #include "glob.h" в файле treemk.c */ #define FAILURE (-1) /* код неудачи */ #define SUCCESS 1 /* код успеха */ #define WARNING 0 /* нефатальная ошибка */

typedef struct _info { /* структура элемента каталога */ char *s; /* имя файла */ short fl; /* флаг */ union _any{ int (*act)(); /* возможно связанное действие */ char *note; /* или комментарий */ unsigned i; /* или еще какой-то параметр */ struct _info *inf; } any; /* вспомогательное поле */ #ifdef FILF /* дополнительные необязательные параметры, получаемые из stat(); */ long size; int uid, gid; unsigned short mode; #endif } Info; typedef union _any Any;

extern Info NullInfo; #define MAX_ARGV 256 /* Максимальное число имен в каталоге */ typedef struct { /* Содержимое каталога name */ time_t lastRead; /* время последнего чтения каталога */ Info *files; /* содержимое каталога */ char *name; /* имя каталога */ ino_t ino; dev_t dev; /* I-узел и устройство */ char valid; /* существует ли этот каталог вообще */ short readErrors; /* != 0, если каталог не читается */ } DirContents; /* Виды сортировки имен в каталоге */ typedef enum { SORT_ASC, SORT_DESC, SORT_SUFX, SORT_NOSORT, SORT_SIZE } Sort; extern Sort sorttype; extern int in_the_root;




Содержание  Назад  Вперед