henesyinit from p9fce6d0435 years agoHistory
740 lines · 10.0 KB · C
RawDownload
#include	<u.h>#include	<libc.h>#include	"gen.h" static	int	fmtmode;static	int	fmtformat;static	int	fmtchar;		voidchessinit(int chr, int mode, int fmt){ 	fmtmode = mode;	fmtformat = fmt;	if(chr != fmtchar)		fmtinstall(chr, chessfmt);} intchessfmt(void *o, Fconv *fp){	char str1[50], str2[50], *p1, *p2;	Rune r;	int c; 	((fmtformat&1)? dscout: algout)(*(int*)o, str1, fmtmode);	if(fmtformat&2) {		p2 = str2;		for(p1=str1; c=*p1; p1++)		switch(c) {		default:			fprint(2, "dont now %c\n", c);		case '1':		case '2':		case '3':		case '4':		case '5':		case '6':		case '7':		case '8': 		case 'a':		case 'b':		case 'c':		case 'd':		case 'e':		case 'f':		case 'g':		case 'h': 		case 'O':		case '+':		case '-':		case '/':			*p2++ = c;			break;		case 'x':		case ':':			r = L'×';			goto putr;		case 'P':			r = L'♙';			goto putr;		case 'N':			r = L'♘';			goto putr;		case 'B':			r = L'♗';			goto putr;		case 'R':			r = L'♖';			goto putr;		case 'Q':			r = L'♕';			goto putr;		case 'K':			r = L'♔';			goto putr;		putr:			p2 += runetochar(p2, &r);			break;		}		*p2 = 0;		strconv(str2, fp);		return sizeof(int);	}	strconv(str1, fp);	return sizeof(int);} intchessin(char *str){	int m;	short mv[MAXMG]; 	getamv(mv);	m = xalgin(mv, str);	if(m == 0)		m = xdscin(mv, str);	return m;} intxalgin(short *mv, char *str){	int p, t, fx, fy, tx, ty, x, m, i;	Rune c; 	str += chartorune(&c, str);	t = -1;	p = -1; 	if(c == '*' && str[0] == '*' && str[1] == '*' && str[2] == 0)		return TNULL << 12;	for(i=0; c=='o'||c=='O'||c=='0'; i++) {		str += chartorune(&c, str);		while(c == '-')			str += chartorune(&c, str);		if(i > 0) {			p = WKING;			t = TOO;			if(i > 1)				t = TOOO;		}	} 	i = 0;	switch(c) {	case 'P':	case L'♙':		i = 1;		break;	case 'N':	case 'n':	case L'♘':		i = 2;		break;	case 'B':	case 'p':	case L'♗':		i = 3;		break;	case 'R':	case 'r':	case L'♖':		i = 4;		break;	case 'Q':	case 'q':	case L'♕':		i = 5;		break;	case 'K':	case 'k':	case L'♔':		i = 6;		break;	}	if(i != 0) {		str += chartorune(&c, str);		p = i;	} 	fx = -1;	fy = -1; loop:	tx = -1;	ty = -1;	if(c >= 'a' && c <= 'h') {		tx = c-'a';		str += chartorune(&c, str);	}	if(c >= '1' && c <= '8') {		ty = '8'-c;		str += chartorune(&c, str);	}	if(c == ':' || c == L'×')		str += chartorune(&c, str);	if((c >= 'a' && c <= 'h') ||	  (c >= '1' && c <= '8')) {		fx = tx;		fy = ty;		goto loop;	}	if(c == '(' || c == '=')		str += chartorune(&c, str); 	i = 0;	switch(c) {	case 'N':	case 'n':	case L'♘':		i = TNPRO;		break;	case 'B':	case 'p':	case L'♗':		i = TBPRO;		break;	case 'R':	case 'r':	case L'♖':		i = TRPRO;		break;	case 'Q':	case 'q':	case L'♕':		i = TQPRO;		break;	}	if(i != 0) {		str += chartorune(&c, str);		t = i;	} 	if(c == ')')		str += chartorune(&c, str);	while(c == '+')		str += chartorune(&c, str);	if(c != 0)		return 0; 	if(p == -1) {		p = WPAWN;		if(fx >= 0 && fy >= 0)			p = board[fy*8+fx] & 07;	}	c = 0;	for(i=0; m=mv[i]; i++) {		if(p == (board[(m>>6)&077]&7))		if(match(m, p, t, fx, fy, -1, tx, ty)) {			if(moveno & 1) {				bmove(m);				x = wattack(bkpos);				bremove();			} else {				wmove(m);				x = battack(wkpos);				wremove();			}			if(!x)				continue;			if(c)				return 0;	/* ambiguous */			c = m;		}	}	return c;} intxdscin(short *mv, char *str){	int pf, pt, t, fx, fy, tx, ty, x, i, c;	char *s; 	t = -1;	pf = -1;	pt = 0;	fx = fy = -1;	tx = ty = -1; 	str = getpie(&pf, &fx, str);	c = *str++;	if(c == '/') {		str = getpla(&fx, &fy, str);		c = *str++;	}	if(c == 'x' || c == '*') {		str = getpie(&pt, &tx, str);		c = *str++;		if(c == '/') {			str = getpla(&tx, &ty, str);			c = *str++;		}	} else	if(c == '-') {		str = getpla(&tx, &ty, str);		c = *str++;	}	if(c == '(' || c == '=') {		c = *str++;		t = -1;		for(s = "N0n0B1b1R2r2Q3q3"; s[0]; s+=2)			if(c == s[0])				t = TNPRO + s[1]-'0';		if(t < 0)			return 0;		c = *str++;		if(c == ')')			c = *str++;	}	if(c == 'e' || c == 'E')	if(*str == 'p' || *str == 'P') {		str++;		c = *str++;		t = TENPAS;		pt = -1;	}	while(c == '+')		c = *str++;	if(c != 0)		return 0; 	c = 0;	for(i=0; mv[i]; i++) {		if(match(mv[i], pf, t, fx, fy, pt, tx, ty)) {			if(moveno & 1) {				bmove(mv[i]);				x = wattack(bkpos);				bremove();			} else {				wmove(mv[i]);				x = battack(wkpos);				wremove();			}			if(!x)				continue;			if(c) {				return 0;			}			c = mv[i];		}	}	return c;} char*getpie(int *p, int *x, char *str){	char *s;	int kq, rbn, pwn, c; 	kq = 0;	rbn = 0;	pwn = 0;	c = *str++;	for(s = "Q5q5K6k6"; s[0]; s+=2)		if(c == s[0]) {			kq = s[1] - '0';			c = *str++;			break;		}	for(s = "N2n2B3b3R4r4"; s[0]; s+=2)		if(c == s[0]) {			rbn = s[1] - '0';			c = *str++;			break;		}	for(s = "P1p1"; s[0]; s+=2)		if(c == s[0]) {			pwn = s[1] - '0';			str++;			break;		}	str--;	if(pwn) {		*p = pwn;		if(rbn) {			rbn--;			if(rbn == 3)				rbn = 0;			if(kq == 5)				*x = rbn;			else			if(kq == 6)				*x = 7-rbn;			else				*x = 8+rbn;		} else		if(kq)			*x = kq-2;		return str;	}	if(rbn) {		*p = rbn;		if(kq == 5)			*x = 16;		else		if(kq == 6)			*x = 17;		return str;	}	if(kq)		*p = kq;	return str;} char*getpla(int *x, int *y, char *str){	char *s;	int c; 	c = *str++;	for(s = "Q3q3K4k4"; s[0]; s+=2)		if(c == s[0]) {			*x = s[1] - '0';			c = *str++;			break;		}	for(s = "R0r0N1n1B2b2"; s[0]; s+=2)		if(c == s[0]) {			if(*x == 3)				*x = s[1]-'0';			else			if(*x == 4)				*x = 7 - (s[1]-'0');			else				*x = 8 + (s[1]-'0');			c = *str++;			break;		}	if(c >= '1' && c <= '8') {		if(moveno & 1)			*y = c-'1';		else			*y = '8'-c;		return str;	}	str--;	return str;} voidalgout(int m, char *str, int f){	short mv[MAXMG]; 	getamv(mv);	xalgout(mv, m, str, f);} voidxalgout(short *mv, int m, char *str, int f){	int p, c, t, fx, fy, tx, ty, i, j, n; 	t = (m>>12) & 017;	c = 0;	if(t == TENPAS || board[m&077])		c++;	if(t == TOO || t == TOOO) {		*str++ = 'O';		*str++ = '-';		*str++ = 'O';		if(t == TOOO) {			*str++ = '-';			*str++ = 'O';		}		goto chk;	}	p = board[(m>>6) & 077] & 7;	tx = (m>>0) & 7;	ty = (m>>3) & 7;	if(t < TNPRO || t > TQPRO)		t = -1;	for(i=0; i<4; i++) {		if(f)			i = 3;		fx = -1;		if((i & 1) || (c && p == 1))			fx = (m>>6) & 7;		fy = -1;		if((i & 2))			fy = (m>>9) & 7;		n = 0;		for(j=0; mv[j]; j++)			if(match(mv[j], p, t, fx, fy, -1, tx, ty))				n++; 		if(n == 1) {			if(f || (p != WPAWN))				*str++ = "XPNBRQKY"[p];			if(fx >= 0)				*str++ = 'a'+fx;			if(fy >= 0)				*str++ = '8'-fy;			if(c)				*str++ = ':';			*str++ = 'a'+tx;			*str++ = '8'-ty;			goto chk;		}	}	*str++ = '?';	*str++ = '?';	*str++ = '?';	*str++ = '?';	*str = 0;	return; chk:	if(t >= TNPRO && t <= TQPRO)		*str++ = "NBRQ"[t-TNPRO];	move(m);	if(check()) {		*str++ = '+';

Lines 1–500 of 740.