home *** CD-ROM | disk | FTP | other *** search
- #include "old.h"
-
- stdin()
- {
- int piece1, piece2, side1, side2, rnk1, rnk2, file1, file2;
- int ckf, c, m, *p1, *p2, to, amb, piece;
-
- piece1 = piece2 = side1 = side2 = -1;
- rnk1 = rnk2 = file1 = file2 = -1;
- ckf = 0;
- if(match("o-o-o")||match("ooo")) {
- piece1 = 6;
- file1 = 3;
- side1 = 1;
- file2 = 2;
- side2 = 0;
- goto search;
- }
- if(match("o-o")||match("oo")) {
- piece1 = 6;
- file1 = 3;
- file2 = 1;
- goto search;
- }
- stdpin(&piece1, &side1, &rnk1, &file1);
- c = *sbufp++;
- if(c=='*' || c=='x')
- stdpin(&piece2, &side2, &rnk2, &file2); else
- if(c == '-')
- stdbin(&side2, &rnk2, &file2); else
- sbufp--;
-
- search:
- c = *sbufp++;
- if(c == '+') {
- ckf = 1;
- c = *sbufp++;
- }
- if(c != '\0')
- return(0);
-
- p1 = p2 = lmp;
- mantom? bagen(): wagen();
- m = -1;
- amb = 0;
- while(p1 != lmp) {
- p1++;
- piece = board[*p1>>8];
- mantom? bmove(*p1): wmove(*p1);
- to = amp[-3];
- if(pcomp(piece, amp[-4],
- piece1, side1, rnk1, file1))
- if(pcomp(amp[-2], to,
- piece2, side2, rnk2, file2))
- if(comp(ckf, check())) {
- if(m >= 0) {
- if(!amb) {
- printf("ambiguous\n");
- amb = 1;
- }
- }
- m = *p1;
- }
- p1++;
- mantom? bremove(): wremove();
- }
- lmp = p2;
- if(amb) return(-1);
- return(m);
- }
-
- stdpin(ap, as, ar, af)
- int *ap, *as, *ar, *af;
- {
- int c;
-
- c = *sbufp++;
- if(c == 'q') {
- *as = 0;
- stdpin(ap, as, ar, af);
- return;
- }
- if(c == 'k') {
- *as = 1;
- stdpin(ap, as, ar, af);
- return;
- }
- if(c == 'p') {
- *ap = 1;
- if(*as >= 0)
- *af = 3;
- goto loc;
- }
- if(c == 'n') {
- *ap = 2;
- goto pie;
- }
- if(c == 'b') {
- *ap = 3;
- goto pie;
- }
- if(c == 'r') {
- *ap = 4;
- goto pie;
- }
- sbufp--;
- goto loc;
-
- pie:
- if(*sbufp == 'p') {
- *af = (*ap-1)%3;
- *ap = 1;
- sbufp++;
- }
-
- loc:
- if(*ap<0 && *as>=0) {
- *ap = *as+5;
- *as = -1;
- }
- if(*sbufp == '/') {
- sbufp++;
- stdbin(as, ar, af);
- }
- }
-
- stdbin(as, ar, af)
- int *as, *ar, *af;
- {
- int c;
-
- loop:
- c = *sbufp++;
- if(c == 'q') {
- *as = 0;
- goto kq;
- }
- if(c == 'k') {
- *as = 1;
- kq:
- stdbin(as, ar, af);
- if(*af < 0)
- *af = 3;
- return;
- }
-
- if(c == 'r') {
- *af = 0;
- goto loop;
- }
- if(c == 'n') {
- *af = 1;
- goto loop;
- }
- if(c == 'b') {
- *af = 2;
- goto loop;
- }
- if(c>'0' && c<'9')
- *ar = c-'1'; else
- sbufp--;
- }
-
- pcomp(p, l, pp, sp, rp, fp)
- int p, l, pp, sp, rp, fp;
- {
- int r, f, s;
-
- f = l%8;
- r = l/8;
- if(!mantom)
- r = 7-r;
- if(f > 3) {
- f = 7-f;
- s = 1;
- } else
- s = 0;
-
- if(comp(pp, p))
- if(comp(sp, s))
- if(comp(rp, r))
- if(comp(fp, f))
- return(1);
- return(0);
- }
-
- comp(p, v)
- int p, v;
- {
-
- if(p < 0) return(1);
- return(p == abs(v));
- }
-
- abs(x)
- int x;
- {
-
- if(x < 0)
- return(-x);
- return(x);
- }
-