/*
 * |-----------------------------------------------------------|
 * | Copyright (c) 1991, 1990 MIPS Computer Systems, Inc.      |
 * | All Rights Reserved                                       |
 * |-----------------------------------------------------------|
 * |          Restricted Rights Legend                         |
 * | Use, duplication, or disclosure by the Government is      |
 * | subject to restrictions as set forth in                   |
 * | subparagraph (c)(1)(ii) of the Rights in Technical        |
 * | Data and Computer Software Clause of DFARS 252.227-7013.  |
 * |         MIPS Computer Systems, Inc.                       |
 * |         950 DeGuigne Avenue                               |
 * |         Sunnyvale, California 94088-3650, USA             |
 * |-----------------------------------------------------------|
 */
#ident	"$Header: gmatch.c,v 1.5.2.1 92/06/24 14:08:35 marker Exp $"

/*	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.	*/

/* INTERNATIONAL */
#include <euc.h>
#include <pcode.h>
#include <limits.h>
#include <stdlib.h>
#include <ctype.h>
#include "_wchar.h"
#define Popwchar(p, c) \
n = mbtowc(&cl, p, MB_LEN_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, MB_LEN_MAX);
        if(n <= 0) {
                s++;
                scc = n;
        } else {
                scc = cl;
                s += n;
        }
        n = mbtowc(&cl, p, MB_LEN_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;
			int lc = -1;
			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 ? 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, MB_LEN_MAX);
                        if(n < 0)
                                /* skip past illegal byte sequence */
                                s++;
                        else
                                s += n;
                }
		return(0);

	}
}
