|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)dohits.c 4.1 (Berkeley) 12/4/88";
20: #endif /* not lint */
21:
22: /*
23: * This program scans a file which describes a keyboard. The output
24: * of the program is a series of 'C' declarations which describe a
25: * mapping between (scancode, shiftstate, altstate) and 3270 functions,
26: * characters, and AIDs.
27: *
28: * The format of the input file is as follows:
29: *
30: * keynumber [ scancode [ unshifted [ shifted [ alted [ shiftalted ] ] ] ] ]
31: *
32: * keynumber is in decimal, and starts in column 1.
33: * scancode is hexadecimal.
34: * unshifted, etc. - these are either a single ascii character,
35: * or the name of a function or an AID-generating key.
36: *
37: * all fields are separated by a single space.
38: */
39:
40: #include <stdio.h>
41: #if defined(unix)
42: #include <strings.h>
43: #else /* defined(unix) */
44: #include <string.h>
45: #endif /* defined(unix) */
46: #include <ctype.h>
47: #include "../general/general.h"
48: #include "../api/asc_ebc.h"
49: #include "../api/ebc_disp.h"
50: #include "../ctlr/function.h"
51:
52: #include "dohits.h"
53:
54: struct Hits Hits[256]; /* one for each of 0x00-0xff */
55:
56: struct thing *table[100];
57:
58: extern char *malloc();
59:
60: unsigned int
61: dohash(seed, string)
62: unsigned int seed;
63: char *string;
64: {
65: register unsigned int i = seed;
66: register unsigned char c;
67:
68: while (c = *string++) {
69: if (c >= 0x60) {
70: c -= (0x60+0x20);
71: } else {
72: c -= 0x20;
73: }
74: i = (i>>26) + (i<<6) + (c&0x3f);
75: }
76: return i;
77: }
78:
79: void
80: add(first, second, value)
81: char *first, *second;
82: int value;
83: {
84: struct thing **item, *this;
85:
86: item = &firstentry(second);
87: this = (struct thing *) malloc(sizeof *this);
88: this->next = *item;
89: *item = this;
90: this->value = value;
91: strcpy(this->name, first);
92: strcpy(this->name+strlen(this->name), second);
93: }
94:
95: void
96: scanwhite(file, prefix)
97: char *file, /* Name of file to scan for whitespace prefix */
98: *prefix; /* prefix of what should be picked up */
99: {
100: FILE *ourfile;
101: char compare[100];
102: char what[100], value[100];
103: char line[200];
104:
105: sprintf(compare, " %s%%[^,\t \n]", prefix);
106: if ((ourfile = fopen(file, "r")) == NULL) {
107: perror("fopen");
108: exit(1);
109: }
110: while (!feof(ourfile)) {
111: if (fscanf(ourfile, compare, what) == 1) {
112: add(prefix, what, 0);
113: }
114: do {
115: if (fgets(line, sizeof line, ourfile) == NULL) {
116: if (!feof(ourfile)) {
117: perror("fgets");
118: }
119: break;
120: }
121: } while (line[strlen(line)-1] != '\n');
122: }
123: }
124:
125: void
126: scandefine(file, prefix)
127: char *file, /* Name of file to scan for #define prefix */
128: *prefix; /* prefix of what should be picked up */
129: {
130: FILE *ourfile;
131: char compare[100];
132: char what[100], value[100];
133: char line[200];
134: int whatitis;
135:
136: sprintf(compare, "#define %s%%s %%s", prefix);
137: if ((ourfile = fopen(file, "r")) == NULL) {
138: perror("fopen");
139: exit(1);
140: }
141: while (!feof(ourfile)) {
142: if (fscanf(ourfile, compare, what, value) == 2) {
143: if (value[0] == '0') {
144: if ((value[1] == 'x') || (value[1] == 'X')) {
145: sscanf(value, "0x%x", &whatitis);
146: } else {
147: sscanf(value, "0%o", &whatitis);
148: }
149: } else {
150: sscanf(value, "%d", &whatitis);
151: }
152: add(prefix, what, whatitis);
153: }
154: do {
155: if (fgets(line, sizeof line, ourfile) == NULL) {
156: if (!feof(ourfile)) {
157: perror("fgets");
158: }
159: break;
160: }
161: } while (line[strlen(line)-1] != '\n');
162: }
163: }
164:
165: char *savechr(c)
166: unsigned char c;
167: {
168: char *foo;
169:
170: foo = malloc(sizeof c);
171: if (foo == 0) {
172: fprintf(stderr, "No room for ascii characters!\n");
173: exit(1);
174: }
175: *foo = c;
176: return foo;
177: }
178:
179: char *
180: doit(hit, type, hits)
181: struct hit *hit;
182: unsigned char *type;
183: struct Hits *hits;
184: {
185: struct thing *this;
186:
187: hit->ctlrfcn = FCN_NULL;
188: if (type[0] == 0) {
189: return 0;
190: }
191: if (type[1] == 0) { /* character */
192: hit->ctlrfcn = FCN_CHARACTER;
193: hit->code = ebc_disp[asc_ebc[type[0]]];
194: return savechr(*type); /* The character is the name */
195: } else {
196: for (this = firstentry(type); this; this = this->next) {
197: if ((type[0] == this->name[4])
198: && (strcmp(type, this->name+4) == 0)) {
199: this->hits = hits;
200: if (this->name[0] == 'F') {
201: hit->ctlrfcn = FCN_NULL; /* XXX */
202: } else {
203: hit->ctlrfcn = FCN_AID;
204: }
205: return this->name;
206: }
207: }
208: fprintf(stderr, "Error: Unknown type %s.\n", type);
209: return 0;
210: }
211: }
212:
213:
214: void
215: dohits(aidfile, fcnfile)
216: char *aidfile, *fcnfile;
217: {
218: unsigned char plain[100], shifted[100], alted[100], shiftalted[100];
219: unsigned char line[200];
220: int keynumber, scancode;
221: int empty;
222: int i;
223: struct hit *hit;
224: struct hits *ph;
225: struct Hits *Ph;
226:
227: memset((char *)Hits, 0, sizeof Hits);
228:
229: /*
230: * First, we read "host3270.h" to find the names/values of
231: * various AID; then we read kbd3270.h to find the names/values
232: * of various FCNs.
233: */
234:
235: if (aidfile == 0) {
236: aidfile = "../ctlr/hostctlr.h";
237: }
238: scandefine(aidfile, "AID_");
239: if (fcnfile == 0) {
240: fcnfile = "../ctlr/function.h";
241: }
242: scanwhite(fcnfile, "FCN_");
243:
244: while (gets(line) != NULL) {
245: if (!isdigit(line[0])) {
246: continue;
247: }
248: plain[0] = shifted[0] = alted[0] = shiftalted[0] = 0;
249: keynumber = -1;
250: scancode = -1;
251: (void) sscanf(line, "%d %x %s %s %s %s", &keynumber,
252: &scancode, plain, shifted, alted, shiftalted);
253: if ((keynumber == -1) || (scancode == -1)
254: || ((plain[0] == 0)
255: && (shifted[0] == 0)
256: && (alted[0] == 0)
257: && (shiftalted[0] == 0))) {
258: continue;
259: }
260: if (scancode >= 256) {
261: fprintf(stderr,
262: "Error: scancode 0x%02x for keynumber %d\n", scancode,
263: keynumber);
264: break;
265: }
266: if (Hits[scancode].hits.hit[0].ctlrfcn != undefined) {
267: fprintf(stderr,
268: "Error: duplicate scancode 0x%02x for keynumber %d\n",
269: scancode, keynumber);
270: break;
271: }
272: hit = Hits[scancode].hits.hit;
273: Hits[scancode].hits.keynumber = keynumber;
274: Hits[scancode].name[0] = doit(hit, plain, &Hits[scancode]);
275: Hits[scancode].name[1] = doit(hit+1, shifted, &Hits[scancode]);
276: Hits[scancode].name[2] = doit(hit+2, alted, &Hits[scancode]);
277: Hits[scancode].name[3] = doit(hit+3, shiftalted, &Hits[scancode]);
278: }
279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.