/*      BBS/DOS 汎用版 LOG-Cutter      by Gori
                 usage : logc bbs logfile
判定部分
*/
#include	<jctype.h>
#include	"logc.h"

void buftoset(char *p,int buf)
{
	char bb[80],a,b;
	char *ps;
	int i;

	ps=p;
	while (1){
		if (ldtocr(bb,80)==-1) help(221);
		a=bb[0]; b=bb[1];
		if (isupper(a)) a-='A'-'a';
		switch (a){
			case ';':	
			case '#':	
			case '/':	
			case 0x00:	
			case '\n':	continue;
			case 'z':	
			case 'b':	*p=0x00; return;
		}
		i=1;
		while (bb[i]!='\t') i++;
		while (bb[i]=='\t') i++;
		*p=0x00;
		if (a=='s') *p=START;
		if (a=='e') *p=END;
		if (a=='+'){
			if (b=='+') *p=PPLUS;
			else *p=PLUS;
		}
		if (a=='-'){
			if (b=='-') *p=MMINUS;
			else *p=MINUS;
		}
		if (!*p) help(222);
		p++;
		for (;*p=bb[i];p++,i++);
		p++;
		if (p>ps+buf) help (101);
	}
}

int chusyu(const char *def_t,const char *log_t)
{
	int i;
	long int j;

	while (*def_t){
		if (*def_t!='\\'){
			if (*def_t==*log_t) goto cont;
			return (1);
		}
		def_t++; switch(*def_t){
			case '\\':	if (*log_t=='\\') goto cont;
						return(1);
			case '0':	if (isdigit(*log_t)) goto cont;
						return (1);
			case '1':	if (isdigit(*log_t) || *log_t==' ') goto cont;
						return (1);
			case 'a':	if (islower(*log_t)) goto cont;
						return (1);
			case 'A':	if (isupper(*log_t)) goto cont;
						return (1);
			case '$':	if (!*log_t) return (0);
						return (1);
			case 's':	j=(int)*log_t*0x100+(int)*(log_t+1);
						if (j!=0x2020 && j!=0x8140) return (1);
						log_t++; goto cont;
			case 0x82:	def_t++; i=*log_t*0x100; log_t++; i+=*log_t;
						switch(*def_t){
					case 0x4f:	if (jisdigit(i)) goto cont;
								return (1);
					case 0x50:	if (jisdigit(i) || i==0x8140) goto cont;
								return (1);
					case 0x81:	if (jislower(i)) goto cont;
								return (1);
					case 0x60:	if (jisupper(i)) goto cont;
								return (1);
					default:	help(201);
						}
			case 'S':	def_t++; if (*def_t!='[') return(-1);
						def_t++; if (*def_t==0x00) return(-1);
						for (i=0;*def_t!=']';def_t++){
							if (*def_t==0x00) help(202);
							i*=10; i+=((int)*def_t-0x30);
						}
						for (;i>0;i--){
							j=(int)*log_t*0x100+(int)*(log_t+1);
							if (j!=0x2020 && j!=0x8140 &&
								j!=0x2081 && j!=0x4020) return(1);
							log_t+=2;
						}
						log_t--;
						goto cont;
			case '[':	def_t++; if (*def_t==0x00) return(-1);
						for (i=0;*def_t!=']';def_t++){
							if (*def_t==0x00) help(202);
							i*=10; i+=((int)*def_t-0x30);
						}
						for (i--;i>0;i--){
							log_t++;
							if (!*log_t) return(1);
						}
						goto cont;
			default:	help(201);
		}
cont:
	log_t++; def_t++;
	}
	return (0);
}

