File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / lib / patmatch.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (7 years, 4 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

/*
 *	BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*')
 *
 *	(c) 1998--2000 Martin Mares <mj@ucw.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(const byte *p, const 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;
}

#if 0
/**
 * patmatch - match shell-like patterns
 * @p: pattern
 * @s: string
 *
 * patmatch() returns whether given string @s matches the given shell-like
 * pattern @p. The patterns consist of characters (which are matched literally),
 * question marks which match any single character, asterisks which match any
 * (possibly empty) string of characters and backslashes which are used to
 * escape any special characters and force them to be treated literally.
 *
 * The matching process is not optimized with respect to time, so please
 * avoid using this function for complex patterns.
 */
int
patmatch(byte *p, byte *s)
{ DUMMY; }
#endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>