Annotation of 43BSDReno/games/chess/Xchess/program.c, revision 1.1.1.1

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, &notime)) &&
                    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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.