1: #include "old.h" 2: 3: stdin() 4: { 5: int piece1, piece2, side1, side2, rnk1, rnk2, file1, file2; 6: int ckf, c, m, *p1, *p2, to, amb, piece; 7: 8: piece1 = piece2 = side1 = side2 = -1; 9: rnk1 = rnk2 = file1 = file2 = -1; 10: ckf = 0; 11: if(match("o-o-o")||match("ooo")) { 12: piece1 = 6; 13: file1 = 3; 14: side1 = 1; 15: file2 = 2; 16: side2 = 0; 17: goto search; 18: } 19: if(match("o-o")||match("oo")) { 20: piece1 = 6; 21: file1 = 3; 22: file2 = 1; 23: goto search; 24: } 25: stdpin(&piece1, &side1, &rnk1, &file1); 26: c = *sbufp++; 27: if(c=='*' || c=='x') 28: stdpin(&piece2, &side2, &rnk2, &file2); else 29: if(c == '-') 30: stdbin(&side2, &rnk2, &file2); else 31: sbufp--; 32: 33: search: 34: c = *sbufp++; 35: if(c == '+') { 36: ckf = 1; 37: c = *sbufp++; 38: } 39: if(c != '\0') 40: return(0); 41: 42: p1 = p2 = lmp; 43: mantom? bagen(): wagen(); 44: m = -1; 45: amb = 0; 46: while(p1 != lmp) { 47: p1++; 48: piece = board[*p1>>8]; 49: mantom? bmove(*p1): wmove(*p1); 50: to = amp[-3]; 51: if(pcomp(piece, amp[-4], 52: piece1, side1, rnk1, file1)) 53: if(pcomp(amp[-2], to, 54: piece2, side2, rnk2, file2)) 55: if(comp(ckf, check())) { 56: if(m >= 0) { 57: if(!amb) { 58: printf("ambiguous\n"); 59: amb = 1; 60: } 61: } 62: m = *p1; 63: } 64: p1++; 65: mantom? bremove(): wremove(); 66: } 67: lmp = p2; 68: if(amb) return(-1); 69: return(m); 70: } 71: 72: stdpin(ap, as, ar, af) 73: int *ap, *as, *ar, *af; 74: { 75: int c; 76: 77: c = *sbufp++; 78: if(c == 'q') { 79: *as = 0; 80: stdpin(ap, as, ar, af); 81: return; 82: } 83: if(c == 'k') { 84: *as = 1; 85: stdpin(ap, as, ar, af); 86: return; 87: } 88: if(c == 'p') { 89: *ap = 1; 90: if(*as >= 0) 91: *af = 3; 92: goto loc; 93: } 94: if(c == 'n') { 95: *ap = 2; 96: goto pie; 97: } 98: if(c == 'b') { 99: *ap = 3; 100: goto pie; 101: } 102: if(c == 'r') { 103: *ap = 4; 104: goto pie; 105: } 106: sbufp--; 107: goto loc; 108: 109: pie: 110: if(*sbufp == 'p') { 111: *af = (*ap-1)%3; 112: *ap = 1; 113: sbufp++; 114: } 115: 116: loc: 117: if(*ap<0 && *as>=0) { 118: *ap = *as+5; 119: *as = -1; 120: } 121: if(*sbufp == '/') { 122: sbufp++; 123: stdbin(as, ar, af); 124: } 125: } 126: 127: stdbin(as, ar, af) 128: int *as, *ar, *af; 129: { 130: int c; 131: 132: loop: 133: c = *sbufp++; 134: if(c == 'q') { 135: *as = 0; 136: goto kq; 137: } 138: if(c == 'k') { 139: *as = 1; 140: kq: 141: stdbin(as, ar, af); 142: if(*af < 0) 143: *af = 3; 144: return; 145: } 146: 147: if(c == 'r') { 148: *af = 0; 149: goto loop; 150: } 151: if(c == 'n') { 152: *af = 1; 153: goto loop; 154: } 155: if(c == 'b') { 156: *af = 2; 157: goto loop; 158: } 159: if(c>'0' && c<'9') 160: *ar = c-'1'; else 161: sbufp--; 162: } 163: 164: pcomp(p, l, pp, sp, rp, fp) 165: int p, l, pp, sp, rp, fp; 166: { 167: int r, f, s; 168: 169: f = l%8; 170: r = l/8; 171: if(!mantom) 172: r = 7-r; 173: if(f > 3) { 174: f = 7-f; 175: s = 1; 176: } else 177: s = 0; 178: 179: if(comp(pp, p)) 180: if(comp(sp, s)) 181: if(comp(rp, r)) 182: if(comp(fp, f)) 183: return(1); 184: return(0); 185: } 186: 187: comp(p, v) 188: int p, v; 189: { 190: 191: if(p < 0) return(1); 192: return(p == abs(v)); 193: } 194: 195: abs(x) 196: int x; 197: { 198: 199: if(x < 0) 200: return(-x); 201: return(x); 202: }