summaryrefslogtreecommitdiffstats
path: root/lib/patmatch.c
blob: 15d5007afd232631e987f28a72fdef4146506064 (plain)
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
/*
 *	BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*')
 *
 *	(c) 1998 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
 */

#include "nest/bird.h"
#include "lib/string.h"

#ifndef MATCH_FUNC_NAME
#define MATCH_FUNC_NAME patmatch
#endif

#ifndef Convert
#define Convert(x) x
#endif

int
MATCH_FUNC_NAME(byte *p, byte *s)
{
  while (*p)
    {
      if (*p == '?' && *s)
	p++, s++;
      else if (*p == '*')
	{
	  int z = p[1];

	  if (!z)
	    return 1;
	  if (z == '\\' && p[2])
	    z = p[2];
	  z = Convert(z);
	  for(;;)
	    {
	      while (*s && Convert(*s) != z)
		s++;
	      if (!*s)
		return 0;
	      if (MATCH_FUNC_NAME(p+1, s))
		return 1;
	      s++;
	    }
	}
      else
	{
	  if (*p == '\\' && p[1])
	    p++;
	  if (Convert(*p++) != Convert(*s++))
	    return 0;
	}
    }
  return !*s;
}