Annotation of coherent/b/etc/Build_401/fnkey.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     fnkey.c
                      3:  *     06/30/92
                      4:  *     Usage:  fnkey [ n [ string ] ]
                      5:  *     Sets/prints IBM AT console function keys.
                      6:  *     Revised for COHERENT 4.0
                      7:  */
                      8: #include <stdio.h>
                      9: #include <sgtty.h>
                     10: #include <ctype.h>
                     11: #include <sys/kb.h>
                     12: #include <errno.h>
                     13: 
                     14: #define        VERSION "4.0"                   /* version number */
                     15: 
                     16: /*
                     17:  * The following constants were hard coded into the original kb.c driver
                     18:  * and have to be duplicated here to support both drivers on demand.
                     19:  */
                     20: #define        NFKEY   20                      /* kb: number of function keys */
                     21: #define        NFCHAR  150                     /* kb: function key storage */
                     22: #define        NFBUF   (2*NFKEY+NFCHAR+1)      /* kb: total buffer size */
                     23: 
                     24: FNKEY  *okeys;                         /* old key bindings */
                     25: FNKEY  *nkeys;                         /* new key bindings */
                     26: int    old;                            /* true: kb driver, false: nkb */
                     27: KBTBL  kbt[MAX_KEYS];                  /* key mapping table for TIOCGETKBT */
                     28: 
                     29: main(argc, argv)
                     30: int argc;
                     31: char **argv;
                     32: {
                     33:        unsigned c;
                     34:        register int i;
                     35:        register unsigned char *cp, *ncp;
                     36:        int n, fd, max_fchar, max_fkeys;
                     37: 
                     38:        fd = open("/dev/tty", 2);
                     39:        if (fd == -1)
                     40:                fatal("cannot open /dev/tty");
                     41:        okeys = (FNKEY *) malloc(sizeof(FNKEY) + MAX_FCHAR);
                     42:        nkeys = (FNKEY *) malloc(sizeof(FNKEY) + MAX_FCHAR);
                     43:        if (okeys == (FNKEY *)0 || nkeys == (FNKEY *)0)
                     44:                fatal("out of memory");
                     45:        cp =  &okeys->k_fnval[0];
                     46:        ncp = &nkeys->k_fnval[0];
                     47: 
                     48:        /* Print version number if -V. */
                     49:        if (*++argv != NULL && strcmp(*argv, "-V") == 0) {
                     50:                --argc;
                     51:                ++argv;
                     52:                fprintf(stderr, "fnkey:  V%s\n", VERSION);
                     53:        }
                     54:        if (argc > 3)
                     55:                usage();
                     56: 
                     57:        ioctl(fd, TIOCGETKBT, kbt);             /* See if nkb driver present */
                     58:        if (errno)
                     59:                ++old;                          /* No, kb assumed */
                     60: 
                     61:        errno = 0;
                     62:        if (old) {                              /* get current key bindings */
                     63:                ioctl(fd, TIOCGETF, okeys->k_fnval);    /* kb */
                     64:                max_fchar = NFBUF;
                     65:                max_fkeys = NFKEY;
                     66:        } else {
                     67:                ioctl(fd, TIOCGETF, okeys);             /* nkb */
                     68:                max_fchar = MAX_FCHAR;
                     69:                max_fkeys = MAX_FKEYS;
                     70:        }
                     71:        if (errno) {
                     72:                /*
                     73:                 * Couldn't read current function key settings
                     74:                 */
                     75:                fatal("not on console");
                     76:        }
                     77:        /* Print current values if no args, then exit */
                     78:        if (*argv == NULL ) {
                     79:                if (old)
                     80:                        kb_print();
                     81:                else
                     82:                        nkb_print();
                     83:                exit(0);
                     84:        }
                     85: 
                     86:        /* First arg must be digit. */
                     87:        if (!isdigit(**argv))
                     88:                usage();
                     89:        n = atoi(*argv++);
                     90:        if ((old && n > NFKEY) || (!old && n >= MAX_FKEYS))
                     91:                usage();
                     92:        if (old)
                     93:                --n;
                     94:        /* Set Fn to given value. */
                     95:        for (i = 0; i < max_fkeys; i++) {
                     96:                if (i == n) {
                     97:                        if (*argv != NULL)
                     98:                                while (c = *(*argv)++)
                     99:                                        if (ncp < &nkeys->k_fnval[max_fchar]-1)
                    100:                                                *ncp++ = c;
                    101:                        while ((c = *cp++)!=DELIM && cp < &okeys->k_fnval[max_fchar])
                    102:                                ;
                    103:                } else {
                    104:                        while ((c = *cp++)!=DELIM && cp < &okeys->k_fnval[max_fchar])
                    105:                                if (ncp < &nkeys->k_fnval[max_fchar]-1)
                    106:                                        *ncp++ = c;
                    107:                }
                    108:                *ncp++ = DELIM;
                    109:                if (ncp >= &nkeys->k_fnval[max_fchar])
                    110:                        break;
                    111:        }
                    112:        if (old) {
                    113:                ioctl(fd, TIOCSETF, nkeys->k_fnval);    /* kb */
                    114:        } else {
                    115:                nkeys->k_nfkeys = i;
                    116:                ioctl(fd, TIOCSETF, nkeys);             /* nkb */
                    117:        }
                    118:        if (errno)
                    119:                fatal("couldn't set function keys or not on console");
                    120: 
                    121:        exit(0);
                    122: }
                    123: 
                    124: printchar(c)
                    125: register unsigned c;
                    126: {
                    127:        if (c == '\\')
                    128:                printf("\\\\");
                    129:        else if ((c >= ' ' && c <= '~') || c >= 0200)
                    130:                putchar(c);
                    131:        else switch (c) {
                    132:        case '\n':      printf("\\n");
                    133:                        break;
                    134:        case '\t':      printf("\\t");
                    135:                        break;
                    136:        case '\b':      printf("\\b");
                    137:                        break;
                    138:        case '\r':      printf("\\r");
                    139:                        break;
                    140:        default:        printf("\\%03o", c);
                    141:                        break;
                    142:        }
                    143: }
                    144: 
                    145: usage()
                    146: {
                    147:        fprintf(stderr, "Usage: fnkey [ n [ string ] ]\n");
                    148:        exit(1);
                    149: }
                    150: 
                    151: fatal(arg)
                    152: char   *arg;
                    153: {
                    154:        fprintf(stderr, "fnkey:\t%r\n", &arg);
                    155:        exit(1);
                    156: }
                    157: 
                    158: /*
                    159:  * Print out current settings of function key bindings.
                    160:  * We do this two ways to support kb and nkb.
                    161:  */
                    162: kb_print()
                    163: {
                    164:        int i;
                    165:        unsigned c;
                    166:        unsigned char *cp;
                    167: 
                    168:        cp = &okeys->k_fnval[0];
                    169:        for (i = 1; i <= NFKEY && cp < &okeys->k_fnval[NFBUF]; i++)  {
                    170:                if ((c = *cp) == DELIM) {
                    171:                        cp++;
                    172:                        continue;
                    173:                }
                    174:                printf ("F%d:  ", i);
                    175:                while ((c = *cp++) != DELIM && cp < &okeys->k_fnval[NFBUF]) 
                    176:                        printchar(c);
                    177:                putchar('\n');
                    178:        }
                    179: }
                    180: 
                    181: nkb_print()
                    182: {
                    183:        int i;
                    184:        unsigned c;
                    185:        unsigned char *cp;
                    186: 
                    187:        cp = &okeys->k_fnval[0];
                    188:        for (i = 0; i<okeys->k_nfkeys && cp<&okeys->k_fnval[MAX_FCHAR]; i++)  {
                    189:                if ((c = *cp) == DELIM) {
                    190:                        cp++;
                    191:                        continue;
                    192:                }
                    193:                printf ("F%d:  ", i);
                    194:                while ((c = *cp++)!=DELIM && cp<&okeys->k_fnval[MAX_FCHAR]) 
                    195:                        printchar(c);
                    196:                putchar('\n');
                    197:        }
                    198: }
                    199: /* end of fnkey.c */

unix.superglobalmegacorp.com

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