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