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 char copyright[] =
20 "@(#) Copyright (c) 1988 Regents of the University of California.\n\
21  All rights reserved.\n";
22 #endif /* not lint */
23 
24 #ifndef lint
25 static char sccsid[] = "@(#)mkastosc.c	4.1 (Berkeley) 12/04/88";
26 #endif /* not lint */
27 
28 #include <stdio.h>
29 #if	defined(unix)
30 #include <strings.h>
31 #else	/* defined(unix) */
32 #include <string.h>
33 #endif	/* defined(unix) */
34 #include <ctype.h>
35 
36 #include "../general/general.h"
37 #include "../ctlr/function.h"
38 
39 #include "dohits.h"
40 
41 static struct tbl {
42     unsigned char
43 	scancode,
44 	used;
45     char
46 	*shiftstate;
47 } tbl[128];
48 
49 int
50 main(argc, argv)
51 int	argc;
52 char	*argv[];
53 {
54     int scancode;
55     int asciicode;
56     int empty;
57     int i;
58     int c;
59     int found;
60     struct hits *ph;
61     struct Hits *Ph;
62     struct thing *this;
63     struct thing **attable;
64     struct tbl *Pt;
65     static char *shiftof[] =
66 	    { "0", "SHIFT_UPSHIFT", "SHIFT_ALT", "SHIFT_ALT|SHIFT_UPSHIFT" };
67     char *aidfile = 0, *fcnfile = 0;
68 
69     if (argc > 1) {
70 	if (argv[1][0] != '-') {
71 	    aidfile = argv[1];
72 	}
73     }
74     if (argc > 2) {
75 	if (argv[2][0] != '-') {
76 	    fcnfile = argv[2];
77 	}
78     }
79 
80     dohits(aidfile, fcnfile);		/* Set up "Hits" */
81 
82     printf("/*\n");
83     printf(" * Ascii to scancode conversion table.  First\n");
84     printf(" * 128 bytes (0-127) correspond with actual Ascii\n");
85     printf(" * characters; the rest are functions from ctrl/function.h\n");
86     printf(" */\n");
87     /* Build the ascii part of the table. */
88     for (Ph = Hits, scancode = 0; Ph <= Hits+highestof(Hits);
89 							Ph++, scancode++) {
90 	ph = &Ph->hits;
91 	for (i = 0; i < 4; i++) {
92 	    if (ph->hit[i].ctlrfcn == FCN_CHARACTER) {
93 		c = Ph->name[i][0];	/* "name" of this one */
94 		if (tbl[c].used == 0) {
95 		    tbl[c].used = 1;
96 		    tbl[c].shiftstate = shiftof[i];
97 		    tbl[c].scancode = scancode;
98 		}
99 	    }
100 	}
101     }
102     /* Now, output the table */
103     for (Pt = tbl, asciicode = 0; Pt <= tbl+highestof(tbl); Pt++, asciicode++) {
104 	if (Pt->used == 0) {
105 	    if (isprint(asciicode) && (asciicode != ' ')) {
106 		fprintf(stderr, "Unable to produce scancode sequence for");
107 		fprintf(stderr, " ASCII character [%c]!\n", asciicode);
108 	    }
109 	    printf("\t{ 0, 0, undefined, 0 },\t");
110 	} else {
111 	    printf("\t{ 0x%02x, %s, FCN_CHARACTER, 0 },",
112 					Pt->scancode, Pt->shiftstate);
113 	}
114 	printf("\t/* 0x%x", asciicode);
115 	if (isprint(asciicode)) {
116 	    printf(" [%c]", asciicode);
117 	}
118 	printf(" */\n");
119     }
120 
121 
122     for (attable = &table[0]; attable <= &table[highestof(table)]; attable++) {
123 	for (this = *attable; this; this = this->next) {
124 	    Ph = this->hits;
125 	    if (Ph == 0) {
126 		continue;
127 	    }
128 	    for (i = 0; i < 4; i++) {
129 		if ((Ph->name[i] != 0) &&
130 			(Ph->name[i][0] == this->name[0]) &&
131 			(strcmp(Ph->name[i], this->name) == 0)) {
132 		    printf("\t{ 0x%02x, %s, ",
133 				Ph-Hits, shiftof[i]);
134 		    if (memcmp("AID_", this->name, 4) == 0) {	/* AID key */
135 			printf("FCN_AID, ");
136 		    } else {
137 			printf("%s, ", Ph->name[i]);
138 		    }
139 		    if (memcmp("PF", this->name+4, 2) == 0) {
140 			printf("\"PFK%s\" },\n", Ph->name[i]+4+2);
141 		    } else {
142 			printf("\"%s\" },\n", Ph->name[i]+4);
143 		    }
144 		}
145 	    }
146 	}
147     }
148 
149     return 0;
150 }
151