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