Mercurial > repos > rhope
annotate structs.h @ 75:0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 06 Jul 2010 07:52:59 -0400 |
parents | 94c885692eb5 |
children |
rev | line source |
---|---|
0 | 1 #ifndef _STRUCTS_H_ |
2 #define _STRUCTS_H_ | |
3 | |
4 #ifdef WIN32 | |
5 #include <windows.h> | |
6 #endif | |
7 | |
8 #ifndef BOOL | |
9 #define BOOL short | |
10 #define TRUE 1 | |
11 #define FALSE 0 | |
12 #endif | |
13 | |
14 #ifndef DWORD | |
15 #define DWORD unsigned long | |
16 #endif | |
17 | |
18 #ifndef WINAPI | |
19 #define WINAPI | |
20 #endif | |
21 | |
22 #ifndef LPVOID | |
23 #define LPVOID void * | |
24 #endif | |
25 #ifndef NULL | |
26 #define NULL 0 | |
27 #endif | |
28 | |
29 //#include "interp.h" | |
30 #include "vis_threading.h" | |
31 #include "datum.h" | |
32 #define QUEUE_SIZE 512 | |
33 #include <stdio.h> | |
34 | |
35 #ifdef CPLUSPLUS | |
36 extern "C" { | |
37 #endif | |
38 | |
39 typedef struct | |
40 { | |
41 int type; | |
42 int num_outputs; | |
43 int num_inputs; | |
44 char name[256]; | |
45 int wire_up_lookup; | |
46 int wire_down_lookup; | |
47 void * value_index;//used to associate with a def | |
48 int io_num; | |
49 unsigned short magic_cache_type; | |
50 struct worker_def * magic_cache_implement; | |
51 VIS_CRITICAL_SECTION(lock) | |
52 BOOL null_input; | |
53 } worker; | |
54 | |
55 typedef struct | |
56 { | |
57 int start_worker; | |
58 int end_worker; | |
59 int output_num; | |
60 int input_num; | |
61 } wire; | |
62 | |
63 | |
64 typedef struct | |
65 { | |
66 datum * value; | |
67 VIS_CRITICAL_SECTION(worker_lock) | |
68 int ready_count; | |
69 datum * params[32]; | |
70 } worker_instance_data; | |
71 | |
72 | |
73 typedef struct | |
74 { | |
75 datum * data; | |
76 } wire_instance_data; | |
77 | |
78 /* | |
79 Moved to datum.h for stupid reasons | |
80 typedef struct | |
81 { | |
82 char filename[512]; | |
83 struct worker_def * deflist; | |
84 int num_defs; | |
85 int defs_storage; | |
86 struct company * companylist; | |
87 int num_companies; | |
88 int companies_storage; | |
89 } program; | |
90 | |
91 */ | |
92 | |
93 /*typedef struct worker_def | |
94 { | |
95 worker_impl implement_func; | |
96 char name[256]; | |
97 int num_outputs; | |
98 int num_inputs; | |
99 unsigned short input_types[32]; | |
100 // unsigned short output_types[32]; | |
101 // int parent_out_wires[32]; | |
102 worker * workerlist; | |
103 int num_workers; | |
104 wire * wirelist; | |
105 int num_wires; | |
106 int * workers_to_wires_down; | |
107 int * workers_to_wires_up; | |
108 // struct worker_def * parent; | |
109 // int parent_attached_worker; | |
110 // int parent_attached_workerout; | |
111 // struct worker_def ** children; | |
112 // int num_children; | |
113 BOOL magic; | |
114 program program; | |
115 } worker_def;*/ | |
116 /* | |
117 typedef struct worker_def_file | |
118 { | |
119 worker_impl implement_func; | |
120 char name[256]; | |
121 int num_outputs; | |
122 int num_inputs; | |
123 unsigned short input_types[32]; | |
124 // unsigned short output_types[32]; | |
125 // int parent_out_wires[32]; | |
126 worker * workerlist; | |
127 int num_workers; | |
128 wire * wirelist; | |
129 int num_wires; | |
130 int * workers_to_wires_down; | |
131 int * workers_to_wires_up; | |
132 // struct worker_def * parent; | |
133 // int parent_attached_worker; | |
134 // int parent_attached_workerout; | |
135 // struct worker_def ** children; | |
136 // int num_children; | |
137 BOOL magic; | |
138 } worker_def;*/ | |
139 | |
140 typedef struct | |
141 { | |
142 worker * workerlist; | |
143 int num_workers; | |
144 int worker_storage; | |
145 wire * wirelist; | |
146 int num_wires; | |
147 int wire_storage; | |
148 int * workers_to_wires_down; | |
149 int * workers_to_wires_up; | |
150 VIS_CRITICAL_SECTION(lock) | |
151 BOOL dirty; | |
152 } custom_worker; | |
153 | |
154 #define TRANSACTION_WRITE 0x8000 | |
155 #define TRANSACTION_TYPE_MASK 0xFF | |
156 #define TRANSACTION_RETRY 0 | |
157 #define TRANSACTION_FORCE 1 | |
158 | |
159 typedef struct worker_def | |
160 { | |
161 custom_worker * implement_func; //points to either C function or "custom function struct" | |
162 char * name; | |
163 struct opt_entry * optimized; | |
164 int opt_count; | |
165 int num_stores; | |
166 char ** uses_stores; | |
167 unsigned short num_outputs; | |
168 unsigned short num_inputs; | |
169 unsigned short *input_types; | |
170 unsigned short *output_types; | |
171 unsigned short type; //Magic, Builtin, Custom | |
172 unsigned short transaction_flags; | |
173 #ifdef CPLUSPLUS | |
174 //ugly hack alert! | |
175 program * prog; | |
176 #else | |
177 program * program; | |
178 #endif | |
179 #ifdef USER_PROFILE | |
180 int count; | |
181 LARGE_INTEGER total; | |
182 LARGE_INTEGER worst; | |
183 VIS_CRITICAL_SECTION(lock) | |
184 #endif | |
185 } worker_def; | |
186 | |
187 typedef struct defchunk | |
188 { | |
189 int num_defs; | |
190 int defs_storage; | |
191 struct defchunk * next; | |
192 worker_def deflist[1]; | |
193 } defchunk; | |
194 | |
195 typedef struct | |
196 { | |
197 datum * name; | |
198 datum * data; | |
199 //short inuse; | |
200 } global_store; | |
201 | |
202 typedef struct | |
203 { | |
204 global_store * store; | |
205 datum * begin_data; | |
206 datum * instance_data; | |
207 VIS_CRITICAL_SECTION(lock) | |
208 } global_store_use; | |
209 | |
210 typedef struct | |
211 { | |
212 int num_stores; | |
213 datum * params[32]; | |
214 global_store_use stores[1]; | |
215 } transaction; | |
216 | |
217 typedef struct worker_instance | |
218 { | |
219 worker_def * def; | |
220 worker_instance_data * workerlist; | |
221 datum ** opt_results; | |
222 int num_workers; | |
223 wire_instance_data * wirelist; | |
224 int num_wires; | |
225 void (*callback)(struct worker_instance *, int, struct worker_instance *, void * data); | |
226 void * callback_data; | |
227 struct worker_instance * caller_instance; | |
228 int worker_in_caller; | |
229 int in_queue_count; | |
230 int in_progress_count; | |
231 int child_count; | |
232 transaction * trans; | |
233 #ifdef USER_PROFILE | |
234 LARGE_INTEGER start; | |
235 #endif // USER_PROFILE | |
236 VIS_CRITICAL_SECTION(counter_lock) | |
237 } worker_instance; | |
238 | |
239 typedef void (*instance_callback)(worker_instance *, int, worker_instance *, void * data); | |
240 | |
241 typedef struct | |
242 { | |
243 int worker_num; | |
244 worker_instance * instance; | |
245 } queue_entry; | |
246 | |
247 typedef struct queue_section | |
248 { | |
249 queue_entry entries[QUEUE_SIZE]; | |
250 struct queue_section * last; | |
251 struct queue_section * next; | |
252 } queue_section; | |
253 | |
254 #define ROOM_NO_ACCESS 0 | |
255 #define ROOM_BYTE 1 | |
256 #define ROOM_SHORT 2 | |
257 #define ROOM_LONG 3 | |
258 #define ROOM_SINGLE 4 | |
259 #define ROOM_DOUBLE 5 | |
260 //The param must be set to the max string length for these | |
261 #define ROOM_CSTRING_STRUCT 6 | |
262 #define ROOM_PSTRING_STRUCT 7 | |
263 //Pointer types: For the following it's assumed that it's safe to free the current string | |
264 #define ROOM_CSTRING 8 | |
265 #define ROOM_PSTRING 9 | |
266 //Will copy the contents of a complex value to the destination offset, or the union contents otherwise | |
267 #define ROOM_VIS_OBJECT 10 | |
268 //Pointer to datum | |
269 #define ROOM_VIS_REF 11 | |
270 //Use a worker to set/get the room | |
271 #define ROOM_WORKER 12 | |
272 | |
273 #define PRIVATE_FLAG 0x8000 | |
274 #define ROOM_TYPE_MASK 0xFF | |
275 | |
276 typedef struct | |
277 { | |
278 char * name; | |
279 void * set_func; | |
280 void * get_func; | |
281 int param; | |
282 unsigned short set_func_type; | |
283 unsigned short get_func_type; | |
284 } company_room; | |
285 | |
286 typedef struct company | |
287 { | |
288 char name[256]; | |
289 worker_def ** methodlist; | |
290 int num_methods; | |
291 int method_storage; | |
292 company_room * room_list; | |
293 int num_rooms; | |
294 int room_storage; | |
295 int build_size; | |
296 unsigned short type_id; | |
297 VIS_CRITICAL_SECTION(lock) | |
298 } company; | |
299 | |
300 typedef struct | |
301 { | |
302 int num_entries; | |
303 datum * entries[1]; | |
304 } list_data; | |
305 /* | |
306 typedef struct ternary_node | |
307 { | |
308 struct ternary_node * left; | |
309 struct ternary_node * right; | |
310 struct ternary_node * next; | |
311 datum * payload; | |
312 char letter; | |
313 } ternary_node; | |
314 */ | |
315 | |
316 typedef struct ternary_node | |
317 { | |
318 int left; | |
319 int right; | |
320 int next; | |
321 datum * payload; | |
322 char letter; | |
323 } ternary_node; | |
324 | |
325 typedef struct | |
326 { | |
327 int num_entries; //Number of entries currently in the dict | |
328 int num_nodes; //Number of ternary nodes in the dict | |
329 int node_storage; //Max number of nodes we can store in the dict | |
330 ternary_node nodes[1]; | |
331 } dict_data; | |
332 | |
333 typedef enum {FILE_NOSIZE, FILE_CLOSED, FILE_WRITE, FILE_READ, FILE_CANT_OPEN} file_status; | |
334 typedef struct | |
335 { | |
336 unsigned int size; | |
337 #ifndef SEGA | |
338 FILE * file; | |
339 #endif | |
340 VIS_CRITICAL_SECTION(lock) | |
341 int ref_count; | |
342 file_status status; | |
343 char name[1]; | |
344 } shared_file; | |
345 typedef struct | |
346 { | |
347 unsigned int offset; | |
348 shared_file * shared; | |
349 } file_data; | |
350 | |
351 typedef struct | |
352 { | |
353 datum * title; | |
354 double width; | |
355 double height; | |
356 datum * widget_dict; | |
357 datum * widget_xpos; | |
358 datum * widget_ypos; | |
359 datum * id_list; | |
3
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
360 datum * menu; |
0 | 361 } vis_window; |
362 | |
363 typedef struct | |
364 { | |
365 datum * label; | |
366 datum * value; | |
367 double width; | |
368 double height; | |
369 int flags; | |
370 datum * handler_dict; | |
371 int selected_index; | |
372 } vis_widget; | |
373 | |
374 typedef struct | |
375 { | |
3
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
376 datum * label_list; |
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
377 datum * action_list; |
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
378 } vis_menu; |
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
379 |
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
380 typedef struct |
94c885692eb5
Partial set of fixes and enhancements from Linux box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
381 { |
0 | 382 VIS_CRITICAL_SECTION(lock) |
383 datum ** params; | |
384 BOOL done_flag; | |
385 } def_done; | |
386 | |
387 typedef struct opt_entry | |
388 { | |
389 worker_def * def; | |
390 int original_pos; | |
391 int * input_data; | |
392 int null_inputs; | |
393 int branch1; | |
394 int branch2; | |
395 int * output_refs; | |
396 } opt_entry; | |
397 | |
398 typedef struct | |
399 { | |
400 worker_def * def; | |
401 datum * params[32]; | |
402 } worker_datum; | |
403 #define MIN_STACK_SIZE 512 //minimum stack size in longwords | |
404 typedef struct stack_segment | |
405 { | |
406 int size; | |
407 struct stack_segment *parent; | |
408 struct stack_segment *child; | |
409 unsigned long current_stack;//only used when stack is in the queue | |
410 unsigned int data[MIN_STACK_SIZE]; | |
411 } stack_segment; | |
412 | |
413 #define QUEUE_FUNC 0 | |
414 #define QUEUE_BUILTIN 1 | |
415 #define QUEUE_BLOCK 2 | |
416 #define QUEUE_BLOCK_WAIT 3 | |
417 | |
418 typedef struct | |
419 { | |
420 unsigned long * address; | |
421 void * params; | |
422 stack_segment * stack; | |
423 char type; | |
424 } virt_queue_entry; | |
425 | |
426 typedef struct virt_queue_segment | |
427 { | |
428 struct virt_queue_segment * next; | |
429 struct virt_queue_segment * last; | |
430 virt_queue_entry entries[QUEUE_SIZE]; | |
431 } virt_queue_segment; | |
432 | |
433 typedef int (*worker_impl)(datum **, queue_entry *); | |
434 | |
435 //extern worker_def deflist[100]; | |
436 //extern int num_defs; | |
437 | |
438 //extern datum data[4096]; | |
439 //extern int num_datum; | |
440 | |
441 extern wire wirelist[2048]; | |
442 extern int num_wires; | |
443 | |
444 extern worker workerlist[1024]; | |
445 extern int num_workers; | |
446 | |
447 extern int workers_to_wires_down[2048]; | |
448 extern int workers_to_wires_up[2048]; | |
449 | |
450 #ifdef CPLUSPLUS | |
451 } | |
452 #endif | |
453 | |
454 | |
455 #endif //_STRUCTS_H_ | |
456 | |
457 | |
458 | |
459 | |
460 | |
461 | |
462 | |
463 | |
464 |