|
|
1.1 root 1:
2: /* This file contains code for X-CHESS.
3: Copyright (C) 1986 Free Software Foundation, Inc.
4:
5: This file is part of X-CHESS.
6:
7: X-CHESS is distributed in the hope that it will be useful,
8: but WITHOUT ANY WARRANTY. No author or distributor
9: accepts responsibility to anyone for the consequences of using it
10: or for whether it serves any particular purpose or works at all,
11: unless he says so in writing. Refer to the X-CHESS General Public
12: License for full details.
13:
14: Everyone is granted permission to copy, modify and redistribute
15: X-CHESS, but only under the conditions described in the
16: X-CHESS General Public License. A copy of this license is
17: supposed to have been given to you along with X-CHESS so you
18: can know your rights and responsibilities. It should be in a
19: file named COPYING. Among other things, the copyright notice
20: and this notice must be preserved on all copies. */
21:
22:
23: /* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:18:10 $
24: * $Source: /users/faustus/xchess/RCS/program.c,v $
25: * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
26: * Permission is granted to do anything with this code except sell it
27: * or remove this message.
28: *
29: * The interface to whichever chess playing program we are using...
30: */
31:
32: #include "xchess.h"
33: #include <signal.h>
34: #include <sys/time.h>
35:
36: static int pid;
37: static FILE *from;
38: static FILE *to;
39: static bool easy = 1;
40:
41: bool
42: program_init(name)
43: char *name;
44: {
45: int toprog[2], fromprog[2];
46: char buf[BSIZE];
47: char time[10];
48: char moves[10];
49:
50: pipe(toprog);
51: pipe(fromprog);
52:
53: if (!(pid = fork())) {
54: /* Start up the program. */
55: dup2(toprog[0], 0);
56: dup2(fromprog[1], 1);
57: close(toprog[0]);
58: close(toprog[1]);
59: close(fromprog[0]);
60: close(fromprog[1]);
61: sprintf (time, "%d", timeunit/60);
62: sprintf (moves, "%d", movesperunit);
63: if (proghost)
64: execl("/usr/ucb/rsh", "rsh", proghost, name,
65: moves, time,
66: (char *) NULL);
67: else
68: execl(name, name, moves, time, (char *) NULL);
69: perror(name);
70: exit(1);
71: }
72:
73: close(toprog[0]);
74: close(fromprog[1]);
75:
76: from = fdopen(fromprog[0], "r");
77: setbuf(from, NULL);
78: to = fdopen(toprog[1], "w");
79: setbuf(to, NULL);
80:
81: /* Get the first line... */
82: fgets(buf, BSIZE, from);
83: if (debug)
84: fprintf(stderr, "program says %s", buf);
85: if (blackflag) {
86: fputs("switch\n", to);
87: fflush(to);
88: fgets(buf, BSIZE, from);
89: if (debug)
90: fprintf(stderr, "program says %s", buf);
91: message_add(win1, "GNU Chess playing white\n", false);
92: } else
93: message_add(win1, "GNU Chess playing black\n", false);
94:
95: return (true);
96: }
97:
98: void
99: program_end()
100: {
101: fclose(from);
102: fclose(to);
103: kill(pid, SIGTERM);
104: return;
105: }
106:
107: void
108: program_send(m)
109: move *m;
110: {
111: char buf[BSIZE];
112:
113: if ((m->type == MOVE) || (m->type == CAPTURE))
114: sprintf(buf, "%c%d%c%d\n", 'a' + m->fromx, SIZE - m->fromy,
115: 'a' + m->tox, SIZE - m->toy);
116: else if (m->type == KCASTLE)
117: strcpy(buf, (m->piece.color == WHITE) ? "e1g1\n" : "e8g8\n");
118: else if (m->type == QCASTLE)
119: strcpy(buf, (m->piece.color == WHITE) ? "e1c1\n" : "e8c8\n");
120:
121: if (debug)
122: fprintf(stderr, "sending program %s", buf);
123: if (!easy)
124: kill (pid, SIGINT);
125:
126: fputs(buf, to);
127: fflush(to);
128:
129: /* One junk line... */
130: fgets(buf, BSIZE, from);
131: if (debug)
132: fprintf(stderr, "program says %s", buf);
133: return;
134: }
135:
136: move *
137: program_get()
138: {
139: int rfd = (1 << fileno(from)), wfd = 0, xfd = 0;
140: static struct timeval notime = { 0, 0 };
141: char buf[BSIZE], *s;
142: move *m;
143: int i;
144:
145: /* Do a poll... */
146:
147: if (!(i = select(32, &rfd, &wfd, &xfd, ¬ime)) &&
148: !from->_cnt) { /* Bad stuff... */
149: if (debug)
150: fprintf(stderr, "poll: nothing\n");
151: return (NULL);
152: }
153: if (i == -1) {
154: perror("select");
155: return (NULL);
156: }
157:
158: fgets(buf, BSIZE, from);
159: if (*buf == '\n' || *buf == '\0') {
160: message_add(win1, "program died", false);
161: return (NULL);
162: }
163:
164: if (debug)
165: fprintf(stderr, "got from program %s", buf);
166:
167: for (s = buf; !isalpha(*s); s++)
168: ;
169: m = parse_imove(chessboard, s, nexttomove);
170: if (m == NULL)
171: return (NULL);
172:
173: if (!valid_move(m, chessboard)) {
174: fprintf(stderr, "Error: move %s is invalid!!\n", buf);
175: return (NULL);
176: }
177:
178: /*
179: fgets(buf, BSIZE, from);
180: if (debug)
181: fprintf(stderr, "program says %s", buf);
182: */
183: message_add(win1, buf, false);
184: return (m);
185: }
186:
187: void
188: program_undo()
189: {
190: fputs("undo\n", to);
191: return;
192: }
193: void
194: program_easy (mode)
195: bool mode;
196:
197: {
198: fputs("easy\n", to);
199: easy = mode;
200: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.