/* $Copyright:	$
 * Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989, 1990 
 * Sequent Computer Systems, Inc.   All rights reserved.
 *  
 * This software is furnished under a license and may be used
 * only in accordance with the terms of that license and with the
 * inclusion of the above copyright notice.   This software may not
 * be provided or otherwise made available to, or used by, any
 * other person.  No title to or ownership of the software is
 * hereby transferred.
*/

/*	Copyright (c) 1984 AT&T	*/
/*	  All Rights Reserved  	*/

/*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*/
/*	The copyright notice above does not evidence any   	*/
/*	actual or intended publication of such source code.	*/

#ident	"$Header: gmatch.c 1.3 89/10/23 $@(#)libgen:gmatch.c	1.1"

#include <euc.h>
#include <pcode.h>
#include <stdlib.h>
#include <ctype.h>
#include "_wchar.h"
#define	Popwchar(p, c) \
			n = mbtowc(&cl, p, MULTI_BYTE_MAX); \
			c = cl; \
			if(n <= 0) \
				return 0; \
			p += n;

gmatch(s, p)
register char	*s, *p;
{
	register char *olds;
	register wchar_t scc, c;
	register int n;
	wchar_t cl;

	eucmask = (_pcwchek(_pcwidth())) ? EUCMASK : F_EUCMASK;

	olds = s;
	n = mbtowc(&cl, s, MULTI_BYTE_MAX);
	if(n <= 0) {
		s++;
		scc = n;
	} else {
		scc = cl;
		s += n;
	}
	n = mbtowc(&cl, p, MULTI_BYTE_MAX);
	if(n < 0)
		return(0);
	if(n == 0)
		return(scc == 0);
	p += n;
	c = cl;
	
	switch(c) 
	{
	case '[':
		if(scc <= 0)
			return(0);
	{
			int ok;
			wchar_t lc = 0;
			int notflag = 0;

			ok = 0;
			if (*p == '!')
			{
				notflag = 1;
				p++;
			}
			Popwchar(p, c)
			do
			{
				if (c == '-' && lc && *p!= ']')
				{
					Popwchar(p, c)
					if(c == '\\') {
						Popwchar(p, c)
					}
					if (notflag)
					{
						if(!multibyte || (c & eucmask) == (lc & eucmask) && (c >0377 || !iscntrl(c)) && (lc > 0377 || !iscntrl(lc))) {
							if (scc < lc || scc > c)
								ok++;
							else
								return(0);
						}
					} else {
						if(!multibyte || (c & eucmask) == (lc & eucmask) && (c > 0377 || !iscntrl(c)) && (lc > 0377 || !iscntrl(lc))) 
							if (lc <= scc && scc <= c)
								ok++;
					}
				}
				else if(c == '\\') { /* skip to quoted character */
					Popwchar(p, c)
				}
				lc = c;
				if (notflag)
				{
					if (scc != lc)
						ok++;
					else
						return(0);
				}
				else
				{
					if (scc == lc)
						ok++;
				}
				Popwchar(p, c)
			} while (c != ']');
			return(ok ? gmatch(s,p) : 0);
		}

	case '\\':	
		Popwchar(p, c) /* skip to quoted character and see if it matches */
	default:
		if (c != scc)
			return(0);

	case '?':
		return(scc > 0 ? gmatch(s, p) : 0);

	case '*':
		while (*p == '*')
			p++;

		if (*p == 0)
			return(1);
		s = olds;
		while (*s)
		{
			if (gmatch(s, p))
				return(1);
			n = mbtowc(&cl, s, MULTI_BYTE_MAX);
			if(n < 0)
				/* skip past illegal byte sequence */
				s++;
			else
				s += n;
		}
		return(0);
	}
}
