|
|
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.