Sync usage with man page.
[netbsd-mini2440.git] / sys / netiso / xebec / putdriver.c
blobcfb2d97186f51bd579e1db0b61fa9030817f1f2f
1 /* $NetBSD: putdriver.c,v 1.8 2005/12/11 12:25:16 christos Exp $ */
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 */
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.
17 #include <sys/cdefs.h>
18 __KERNEL_RCSID(0, "$NetBSD: putdriver.c,v 1.8 2005/12/11 12:25:16 christos Exp $");
20 #include <stdio.h>
21 #include "main.h"
22 #include "debug.h"
24 extern char protocol[];
25 char Eventshiftstring[10];
26 static char statename[] = {'_', 's', 't', 'a', 't', 'e', 0 };
28 static char *strings[] = {
30 #define PART1 { 0,3 }
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,
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,
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,
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,
89 #define PART4 { 50,54 }
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,
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,
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,
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,
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,
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,
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,
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,
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,
208 #define PART14 { 150,150 }
209 "#define _XEBEC_PG static\n",
211 #define PART15 { 151,151 }
212 "#define _XEBEC_PG \n",
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,
235 void
236 putdriver(FILE *f, int x)
238 register int i;
240 for( i = parts[x].start; i<= parts[x].finish; i++)
241 fprintf(f, "%s", strings[i]);
242 IFDEBUG(d)
243 fflush(f);
244 ENDDEBUG