File: glob.c

package info (click to toggle)
resmgr 1.0-2sarge2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 308 kB
  • ctags: 313
  • sloc: ansic: 3,165; sh: 556; makefile: 109
file content (69 lines) | stat: -rw-r--r-- 1,049 bytes parent folder | download
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
/*
 * Simplified glob matching - supports * ? and []
 *
 * Copyright (C) 2002, Olaf Kirch <okir@lst.de>
 */

#include <string.h>
#include "resmgr.h"

int
rsm_glob(const char *pattern, const char *name, const char *end)
{
	if (pattern == NULL)
		return 1;

	if (name == NULL)
		return 0;

	if (end == NULL)
		end = name + strlen(name);

	while (*pattern) {
		unsigned char	pc = *pattern++, nc;
		int		match = 0;

		if (pc == '*') {
			if (*pattern == '\0')
				return 1;
			while (name < end) {
				if (rsm_glob(pattern, name, end))
					return 1;
				name++;
			}
			return 0;
		}

		if (name >= end)
			return 0;
		nc = *name++;

		if (pc == '[') {
			unsigned char	lo, hi;

			while (1) {
				if (!(lo = *pattern++))
					return 0;
				if (lo == ']')
					break;

				if (*pattern == '-') {
					pattern++;
					if (!(hi = *pattern++))
						return 0;
				} else {
					hi = lo;
				}

				while (lo <= hi)
					match |= (nc == lo++);
			}
		} else {
			match = (pc == '?' || pc == nc);
		}
		if (!match)
			return 0;
	}

	return (name == end);
}