Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 179

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

struct dirent dp;

DIR *dir;

char pattern[100];

/* ...Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ шаблон, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ошибки... */

while ((dp = readdir(dir)) != NULL) {

Β if (fnmatch(pattern, dir->d_name, FNM_PERIOD) == 0)

Β  /* имя Ρ„Π°ΠΉΠ»Π° соотвСтствуСт ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ */

Β else

Β  continue; /* Π½Π΅ соотвСтствуСт */

}

GNU

ls
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚
fnmatch()
для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ своСй ΠΎΠΏΡ†ΠΈΠΈ
--ignore
. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСсколько ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… шаблонов (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ).
ls
сопоставляСт ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° со всСми шаблонами. Она Π΄Π΅Π»Π°Π΅Ρ‚ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
file_interesting()
Π²
ls.с
:

2269 /* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ ноль, Ссли Ρ„Π°ΠΉΠ» Π² 'next' Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пСрСчислСн. */

2270

2271 static int

2272 file_interesting(const struct dirent *next)

2273 {

2274Β  register struct ignore_pattern* ignore;

2275

2276Β  for (ignore = ignore_patterns; ignore; ignore = ignore->next)

2277Β Β  if (fnmatch(ignore->pattern, next->d_name, FNM_PERIOD) == 0)

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 (/* <i>ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ нСзависимо ΠΎΡ‚ ΠΈΡ… ΠΈΠΌΠ΅Π½ΠΈ (-Π°)</i> */

Β OR /* <i>ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ Ρ‚ΠΎΡ‡ΠΊΠ°</i> */

Β OR (/* <i>ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (-А)</i> */

Β  AND /* <i>Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° нСсколько символов</i> */

Β  AND (/* <i>Π²Ρ‚ΠΎΡ€ΠΎΠΉ символ Π½Π΅ Ρ‚ΠΎΡ‡ΠΊΠ°</i> */

Β Β  OR /* <i>Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ символ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ имя</i> */)))

Β return TRUE;

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•.

fnmatch()
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ дорогостоящСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ссли ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π»ΠΎΠΊΠ°Π»ΠΈ с ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов. ΠžΠ±ΡΡƒΠ΄ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ символов Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.4 Β«ΠœΠΎΠΆΠ΅Ρ‚Π΅ произнСсти это для мСня ΠΏΠΎ Π±ΡƒΠΊΠ²Π°ΠΌ?Β»

12.7.2. РаскрытиС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°:

glob()
ΠΈ
globfree()

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

glob()
ΠΈ
globfree()
Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅, Ρ‡Π΅ΠΌ
fnmatch()
:

#include &lt;glob.h&gt; /* 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

Число ΠΏΡƒΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подошли.