#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. Load more
#include <u.h> #include <libc.h> #include "gen.h" static int fmtmode; static int fmtformat; static int fmtchar; void chessinit(int chr, int mode, int fmt) { fmtmode = mode; fmtformat = fmt; if(chr != fmtchar) fmtinstall(chr, chessfmt); } int chessfmt(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); } int chessin(char *str) { int m; short mv[MAXMG]; getamv(mv); m = xalgin(mv, str); if(m == 0) m = xdscin(mv, str); return m; } int xalgin(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; } int xdscin(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; } void algout(int m, char *str, int f) { short mv[MAXMG]; getamv(mv); xalgout(mv, m, str, f); } void xalgout(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++ = '+';