|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.