Annotation of 43BSDReno/games/ching/phx/ching.phx.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Guy Harris.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted
                      9:  * provided that: (1) source distributions retain this entire copyright
                     10:  * notice and comment, and (2) distributions including binaries display
                     11:  * the following acknowledgement:  ``This product includes software
                     12:  * developed by the University of California, Berkeley and its contributors''
                     13:  * in the documentation or other materials provided with the distribution
                     14:  * and in all advertising materials mentioning features or use of this
                     15:  * software. Neither the name of the University nor the names of its
                     16:  * contributors may be used to endorse or promote products derived
                     17:  * from this software without specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     20:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #ifndef lint
                     24: char copyright[] =
                     25: "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
                     26:  All rights reserved.\n";
                     27: #endif /* not lint */
                     28: 
                     29: #ifndef lint
                     30: static char sccsid[] = "@(#)ching.phx.c        5.3 (Berkeley) 6/1/90";
                     31: #endif /* not lint */
                     32: 
                     33: /*
                     34:  * phx - Print NROFF/TROFF source of change, given the line values.
                     35:  */
                     36: #include <stdio.h>
                     37: #include "ching.h"
                     38: #include "pathnames.h"
                     39: 
                     40: struct {
                     41:        int     lines;          /* encoded value of lines */
                     42:        int     trinum;         /* trigram number */
                     43: } table[] = {
                     44:        { 777, 0 },             /* 1 */
                     45:        { 887, 1 },             /* 4 */
                     46:        { 878, 2 },             /* 6 */
                     47:        { 788, 3 },             /* 7 */
                     48:        { 888, 4 },             /* 8 */
                     49:        { 778, 5 },             /* 5 */
                     50:        { 787, 6 },             /* 3 */
                     51:        { 877, 7 },             /* 2 */
                     52: };
                     53: 
                     54: /*
                     55:  * Gives hexagram number from two component trigrams.
                     56:  */
                     57: int    crosstab[8][8] = {
                     58:        1,  34, 5,  26, 11, 9,  14, 43,
                     59:        25, 51, 3,  27, 24, 42, 21, 17,
                     60:        6,  40, 29, 4,  7,  59, 64, 47,
                     61:        33, 62, 39, 52, 15, 53, 56, 31,
                     62:        12, 16, 8,  23, 2,  20, 35, 45,
                     63:        44, 32, 48, 18, 46, 57, 50, 28,
                     64:        13, 55, 63, 22, 36, 37, 30, 49,
                     65:        10, 54, 60, 41, 19, 61, 38, 58,
                     66: };
                     67: 
                     68: int    trigrams[6];
                     69: int    moving[6];
                     70: 
                     71: FILE   *chingf;                /* stream to read the hexagram file */
                     72: 
                     73: char   *gets();
                     74: 
                     75: main(argc, argv)
                     76: int argc;
                     77: char **argv;
                     78: {
                     79:        register int hexagram;          /* hexagram number */
                     80:        register char *hexptr;          /* pointer to string of lines */
                     81:        char hexstr[6+1];               /* buffer for reading lines in */
                     82:        register int i;
                     83: 
                     84:        if (argc < 2)
                     85:                hexptr = gets(hexstr);
                     86:        else
                     87:                hexptr = argv[1];
                     88:        if (hexptr == (char *)NULL || strlen(hexptr) != 6) {
                     89:                fprintf(stderr, "What kind of a change is THAT?!?\n");
                     90:                exit(1);
                     91:        }
                     92:        for (i = 0; i < 6; i++) {
                     93:                trigrams[i] = hexptr[i] - '0';
                     94:                if (trigrams[i] == 6 || trigrams[i] == 9)
                     95:                        moving[i] = 1;
                     96:                else
                     97:                        moving[i] = 0;
                     98:        }
                     99:        if ((chingf = fopen(_PATH_HEX, "r")) == (FILE *)NULL) {
                    100:                fprintf(stderr, "ching: can't read %s\n", _PATH_HEX);
                    101:                exit(2);
                    102:        }
                    103:        phx(doahex(), 0);
                    104:        if (changes())
                    105:                phx(doahex(), 1);
                    106: }
                    107: 
                    108: /*
                    109:  * Compute the hexagram number, given the trigrams.
                    110:  */
                    111: int
                    112: doahex()
                    113: {
                    114:        int lower, upper;       /* encoded values of lower and upper trigrams */
                    115:        int lnum, unum;         /* indices of upper and lower trigrams */
                    116:        register int i;
                    117: 
                    118:        lower = codem(0);
                    119:        upper = codem(3);
                    120:        for (i = 0; i < 8; i++) {
                    121:                if (table[i].lines == lower)
                    122:                         lnum = table[i].trinum;
                    123:                if (table[i].lines == upper)
                    124:                         unum = table[i].trinum;
                    125:        }
                    126:        return(crosstab[lnum][unum]);
                    127: }
                    128: 
                    129: /*
                    130:  * Encode a trigram as a 3-digit number; the digits, from left to right,
                    131:  * represent the lines.  7 is a solid (yang) line, 8 is a broken (yin) line.
                    132:  */
                    133: codem(a)
                    134: int a;
                    135: {
                    136:        register int code, i;
                    137:        int factor[3];
                    138: 
                    139:        factor[0] = 1;
                    140:        factor[1] = 10;
                    141:        factor[2] = 100;
                    142:        code = 0;
                    143: 
                    144:        for (i = a; i < a + 3; i++) {
                    145:                switch(trigrams[i]) {
                    146: 
                    147:                case YYANG:
                    148:                case OYANG:
                    149:                        code += factor[i%3]*7;
                    150:                        break;
                    151: 
                    152:                case OYIN:
                    153:                case YYIN:
                    154:                        code += factor[i%3]*8;
                    155:                        break;
                    156:                }
                    157:        }
                    158:        return(code);
                    159: }
                    160: 
                    161: /*
                    162:  * Compute the changes based on moving lines; return 1 if any lines moved,
                    163:  * 0 if no lines moved.
                    164:  */
                    165: changes()
                    166: {
                    167:        register int cflag;
                    168:        register int i;
                    169: 
                    170:        cflag = 0;
                    171:        for (i = 0; i < 6; i++) {
                    172:                if (trigrams[i] == OYIN) {
                    173:                        trigrams[i] = YYANG;
                    174:                        cflag++;
                    175:                } else if (trigrams[i] == OYANG) {
                    176:                        trigrams[i] = YYIN;
                    177:                        cflag++;
                    178:                }
                    179:        }
                    180:        return(cflag);
                    181: }
                    182: 
                    183: /*
                    184:  * Print the NROFF/TROFF source of a hexagram, given the hexagram number;
                    185:  * if flag is 0, print the entire source; if flag is 1, ignore the meanings
                    186:  * of the lines.
                    187:  */
                    188: phx(hexagram, flag)
                    189: int hexagram;
                    190: int flag;
                    191: {
                    192:        char textln[128+1];             /* buffer for text line */
                    193:        register char *lp;              /* pointer into buffer */
                    194:        register int thishex;           /* number of hexagram just read */
                    195:        int lineno;                     /* number of line read in */
                    196:        int allmoving;                  /* 1 if all lines are moving */
                    197:        register int i;
                    198: 
                    199:        /*
                    200:         * Search for the hexagram; it begins with a line of the form
                    201:         * .H <hexagram number> <other data>.
                    202:         */
                    203:        rewind(chingf);
                    204:        for (;;) {
                    205:                if (fgets(textln, sizeof(textln), chingf) == (char *)NULL) {
                    206:                        fprintf(stderr, "ching: Hexagram %d missing\n",
                    207:                            hexagram);
                    208:                        exit(3);
                    209:                }
                    210:                lp = &textln[0];
                    211:                if (*lp++ != '.' || *lp++ != 'H')
                    212:                        continue;
                    213:                while (*lp++ == ' ')
                    214:                        ;
                    215:                lp--;
                    216:                thishex = atoi(lp);
                    217:                if (thishex < 1 || thishex > 64)
                    218:                        continue;
                    219:                if (thishex == hexagram)
                    220:                        break;
                    221:        }
                    222: 
                    223:        /*
                    224:         * Print up to the line commentary, which ends with a line of the form
                    225:         * .L <position> <value>
                    226:         */
                    227:        fputs(textln, stdout);
                    228:        for (;;) {
                    229:                if (fgets(textln, sizeof(textln), chingf) == (char *)NULL) {
                    230:                        fprintf(stderr, "ching: Hexagram %d malformed\n",
                    231:                            hexagram);
                    232:                        exit(3);
                    233:                }
                    234:                lp = &textln[0];
                    235:                if (*lp++ == '.') {
                    236:                        if (*lp++ == 'L')
                    237:                                break;
                    238:                }
                    239:                fputs(textln, stdout);
                    240:        }
                    241: 
                    242:        /*
                    243:         * Now print the line commentaries, if this is the first hexagram.
                    244:         */
                    245:        if (flag)
                    246:                return;
                    247: 
                    248:        /*
                    249:         * If a line is moving, print its commentary.
                    250:         * The text of the commentary ends with a line either of the form
                    251:         * .L <position> <value>
                    252:         * or of the form
                    253:         * .LA <value>
                    254:         * or of the form
                    255:         * .H <hexagram number> <other arguments>
                    256:         */
                    257:        allmoving = 1;
                    258:        for (i = 0; i < 6; i++) {
                    259:                while (*lp++ == ' ')
                    260:                        ;
                    261:                lp--;
                    262:                lineno = atoi(lp);
                    263:                if (i + 1 != lineno) {
                    264:                        fprintf(stderr, "ching: Hexagram %d malformed\n",
                    265:                            hexagram);
                    266:                        exit(3);
                    267:                }
                    268:                if (moving[i])
                    269:                        fputs(textln, stdout);
                    270:                else
                    271:                        allmoving = 0;
                    272:                for (;;) {
                    273:                        if (fgets(textln, sizeof(textln), chingf) == (char *)NULL)
                    274:                                break;
                    275:                        lp = &textln[0];
                    276:                        if (*lp++ == '.' && (*lp == 'L' || *lp == 'H')) {
                    277:                                lp++;
                    278:                                break;
                    279:                        }
                    280:                        if (moving[i])
                    281:                                fputs(textln, stdout);
                    282:                }
                    283:        }
                    284: 
                    285:        /*
                    286:         * If all the lines are moving, print the commentary for that; it
                    287:         * ends with a line of the form
                    288:         * .H <hexagram number> <other arguments>
                    289:         */
                    290:        if (*lp == 'A' && allmoving) {
                    291:                fputs(textln, stdout);
                    292:                for (;;) {
                    293:                        if (fgets(textln, sizeof(textln), chingf) == (char *)NULL)
                    294:                                break;
                    295:                        lp = &textln[0];
                    296:                        if (*lp++ == '.' || *lp++ == 'H')
                    297:                                break;
                    298:                        fputs(textln, stdout);
                    299:                }
                    300:        }
                    301: }

unix.superglobalmegacorp.com

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