1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
/*
** DIRMASK.C - Complex pattern matching
**
** Original Copyright 1988-1991 by Bob Stout as part of
** the MicroFirm Function Library (MFL)
**
** This subset version is functionally identical to the
** version originally published by the author in Tech Specialist
** magazine and is hereby donated to the public domain.
*/
#include <stdio.h>
#include <string.h>
#include "dirent.h"
int patmat(const char *, const char *);
typedef enum {ERROR = -1, FALSE, TRUE} LOGICAL;
#define SUCCESS 0
/****************************************************************/
/* */
/* dirmask() */
/* */
/* Tests a directory entry for matching patterns. Tests both */
/* file name and attributes. Tests for both inclusion specs */
/* and exclusion specs. */
/* */
/* Parameters: 1 - Pointer to the directory entry's FIND */
/* structure */
/* 2 - Filename for inclusion matching, i.e. if */
/* this spec matches the filename, we matched. */
/* Use NULL to match anything. */
/* 3 - Filename for exclusion matching, i.e. if */
/* this spec matches the filename, we failed. */
/* Use NULL to exclude nothing. */
/* 4 - Attribute for inclusion mask. Use FA_ANY */
/* to match anything). */
/* 5 - Attribute for exclusion mask. Use zero to */
/* exclude nothing). */
/* */
/* Returns: SUCCESS if name and attribute matched, else ERROR. */
/* */
/* Side effects: Converts patterns to upper case */
/* */
/****************************************************************/
int dirmask(struct DSTRUCT *dstruct,
char *fname_inc,
char *fname_exc,
unsigned attr_inc,
unsigned attr_exc)
{
if (!dstruct)
return ERROR;
strupr(fname_inc);
strupr(fname_exc);
if (fname_inc)
{
if (TRUE != patmat(dstruct->NAME, fname_inc))
return ERROR;
}
if (fname_exc)
{
if (TRUE == patmat(dstruct->NAME, fname_exc))
return ERROR;
}
if (!((dstruct->ATTRIBUTE | 0x80) & attr_inc))
return ERROR;
if (dstruct->ATTRIBUTE & attr_exc)
return ERROR;
return SUCCESS;
}
|