1 /* $NetBSD: putdriver.c,v 1.6 2001/11/13 01:10:52 lukem Exp $ */
2
3 /*
4 * This code is such a kludge that I don't want to put my name on it.
5 * It was a ridiculously fast hack and needs rewriting.
6 * However it does work...
7 */
8
9 /* The original idea was to put all the driver code
10 * in one place so it would be easy to modify
11 * but as hacks got thrown in it got worse and worse...
12 * It's to the point where a user would be better off
13 * writing his own driver and xebec should JUST produce
14 * the tables.
15 */
16
17 #include <sys/cdefs.h>
18 __KERNEL_RCSID(0, "$NetBSD: putdriver.c,v 1.6 2001/11/13 01:10:52 lukem Exp $");
19
20 #include <stdio.h>
21 #include "main.h"
22 #include "debug.h"
23
24 extern char protocol[];
25 char Eventshiftstring[10];
26 static char statename[] = {'_', 's', 't', 'a', 't', 'e', 0 };
27
28 static char *strings[] = {
29
30 #define PART1 { 0,3 }
31
32 "\n#include \"",
33 kerneldirname,
34 protocol,
35 "_states.h\"",
36 (char *)0,
37 (char *)0,
38 (char *)0,
39 (char *)0,
40 (char *)0,
41 (char *)0,
42
43 #define PART12 { 10,12 }
44 "\n\nstatic struct act_ent {\n",
45 "\tint a_newstate;\n\tint a_action;\n",
46 "} statetable[] = { {0,0},\n",
47 (char *)0,
48 (char *)0,
49 (char *)0,
50 (char *)0,
51 (char *)0,
52 (char *)0,
53 (char *)0,
54
55 #define PART2 { 20,20 }
56 "};\n",
57 (char *)0,
58 (char *)0,
59 (char *)0,
60 (char *)0,
61 (char *)0,
62 (char *)0,
63 (char *)0,
64 (char *)0,
65 (char *)0,
66
67 #define PART3 { 30,41 }
68 "\n",
69 protocol,
70 "_driver(p, e)\nregister ",
71 protocol,
72 PCBNAME,
73 " *p;\nregister struct ",
74 protocol,
75 "_event *e;\n",
76 "{\n",
77 "\tregister int index, error=0;\n",
78 "\tstruct act_ent *a;\n",
79 "\tstatic struct act_ent erroraction = {0,-1};\n",
80 (char *)0,
81 (char *)0,
82 (char *)0,
83 (char *)0,
84 (char *)0,
85 (char *)0,
86 (char *)0,
87 (char *)0,
88
89 #define PART4 { 50,54 }
90
91 "\textern int ",
92 protocol,
93 "_debug;\n\textern FILE *",
94 protocol,
95 "_astringfile;\n",
96 (char *)0,
97 (char *)0,
98 (char *)0,
99 (char *)0,
100 (char *)0,
101
102 #define PART6 { 60, 65 }
103 "\n\tindex = inx[1 + e->ev_number][p->",
104 protocol,
105 statename,
106 "];\n\tif(index<0) index=_Xebec_index(e, p);\n",
107 "\tif (index==0) {\n\t\ta = &erroraction;\n",
108 "\t} else\n\t\ta = &statetable[index];\n\n",
109 (char *)0,
110 (char *)0,
111 (char *)0,
112 (char *)0,
113
114 #define PART7 {70, 77 }
115 "\tif(",
116 protocol,
117 "_debug) fprintf(",
118 protocol,
119 "_astringfile, \"%15s <-- %15s [%15s] \\n\\t%s\\n\",\n",
120 "\t\tsstring[a->a_newstate], sstring[p->",
121 protocol,
122 "_state], estring[e->ev_number], astring[a->a_action]);\n\n",
123 (char *)0,
124 (char *)0,
125
126 #define PART8 { 80, 84 }
127 "\tif(a->a_action)\n",
128 "\t\terror = _Xebec_action( a->a_action, e, p );\n",
129 "\tif(error==0)\n\tp->",
130 protocol,
131 "_state = a->a_newstate;\n\treturn error;\n}\n",
132 (char *)0,
133 (char *)0,
134 (char *)0,
135 (char *)0,
136 (char *)0,
137
138 #define PART9 { 90, 99 }
139 "\n_XEBEC_PG int _Xebec_action(a,e,p)\nint a;\nstruct ",
140 protocol,
141 "_event *e;\n",
142 protocol,
143 PCBNAME,
144 " *p;\n{\n",
145 "switch(a) {\n",
146 "case -1: return ",
147 protocol,
148 "_protocol_error(e,p);\n",
149 (char *)0,
150
151 #define PART10 { 101, 105 }
152 "\tif(",
153 protocol,
154 "_debug) fprintf(",
155 protocol,
156 "_astringfile, \"index 0x%5x\\n\", index);\n",
157 (char *)0,
158 (char *)0,
159 (char *)0,
160 (char *)0,
161
162 #define PART5 { 110, 121 }
163 "\n_XEBEC_PG int\n_Xebec_index( e,p )\n",
164 "\tstruct ",
165 protocol,
166 "_event *e;\n\t",
167 protocol,
168 PCBNAME,
169 " *p;\n{\nswitch( (e->ev_number<<",
170 Eventshiftstring,
171 ")+(p->",
172 protocol,
173 statename,
174 ") ) {\n",
175 (char *)0,
176 (char *)0,
177 (char *)0,
178 (char *)0,
179 (char *)0,
180 (char *)0,
181 (char *)0,
182 (char *)0,
183
184 #define PART11 {130, 137 }
185 "\tIFTRACE(D_DRIVER)\n",
186 "\t",
187 protocol,
188 "trace(DRIVERTRACE,",
189 "\t\ta->a_newstate, p->",
190 protocol,
191 "_state, e->ev_number, a->a_action, 0);\n\n",
192 "\tENDTRACE\n",
193 (char *)0,
194 (char *)0,
195
196 #define PART13 {140, 147 }
197 "\tif(",
198 protocol,
199 "_debug) fprintf(",
200 protocol,
201 "_astringfile, \"%15s <-- %15s [%15s] \\n\",\n",
202 "\t\tsstring[a->a_newstate], sstring[p->",
203 protocol,
204 "_state], estring[e->ev_number]);\n\n",
205 (char *)0,
206 (char *)0,
207
208 #define PART14 { 150,150 }
209 "#define _XEBEC_PG static\n",
210
211 #define PART15 { 151,151 }
212 "#define _XEBEC_PG \n",
213
214 };
215
216 static struct { int start; int finish; } parts[] = {
217 { 0,0 },
218 PART1,
219 PART2,
220 PART3,
221 PART4,
222 PART5,
223 PART6,
224 PART7,
225 PART8,
226 PART9,
227 PART10,
228 PART11,
229 PART12,
230 PART13,
231 PART14,
232 PART15,
233 };
234
235 void
236 putdriver(f, x)
237 FILE *f;
238 int x;
239 {
240 register int i;
241
242 for( i = parts[x].start; i<= parts[x].finish; i++)
243 fprintf(f, "%s", strings[i]);
244 IFDEBUG(d)
245 fflush(f);
246 ENDDEBUG
247 }
Cache object: 4a654c15556c670035fddd5ddffc070d
|