Annotation of coherent/d/bin/fnkey.c, revision 1.1.1.1

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