Move routine for recursive marking of reachability to object module.
[ilari-esolangs.git] / class.c
blob7905b4051a370d9c0cd290c2bd8f00b741b9a7a3
1 #include <stdio.h>
2 #include "class.h"
4 /*****************************************************************************/
5 struct class
7 /* Class number. */
8 size_t c_class_number;
9 /* Number of fields. */
10 size_t c_fields;
11 /* Number of locals. */
12 size_t c_locals;
13 /* Body text. */
14 unsigned char* c_body;
15 /* Body text length. */
16 size_t c_body_length;
17 /* Next entry. */
18 struct class* c_next;
21 /*****************************************************************************/
22 static struct class* c_list_head = NULL;
23 static struct class* c_list_tail = NULL;
24 static size_t c_first_unalloc = 0;
26 /*****************************************************************************/
27 struct class* class_search(size_t number)
29 struct class* cur = c_list_head;
31 while(cur) {
32 if(number == cur->c_class_number)
33 return cur;
34 cur = cur->c_next;
36 /* No match. */
37 return NULL;
40 /*****************************************************************************/
41 void class_register(struct class* class)
43 struct class* nxt = class->c_next;
45 class->c_next = NULL;
46 class->c_class_number = c_first_unalloc++;
47 if(c_list_head)
48 c_list_tail = c_list_tail->c_next = class;
49 else
50 c_list_tail = c_list_head = class;
52 if(nxt)
53 class_register(nxt);
56 /*****************************************************************************/
57 void class_unregister_all()
59 struct class* class;
60 while(c_list_head) {
61 class = c_list_head;
62 c_list_head = c_list_head->c_next;
63 free(class->c_body);
64 free(class);
68 /*****************************************************************************/
69 struct class* class_make(size_t fields, size_t locals,
70 unsigned char* instructions, size_t ins_len)
72 struct class* class;
73 class = malloc(sizeof(struct class));
74 if(!class) {
75 fprintf(stderr, "Out of memory!\n");
76 exit(1);
79 class->c_fields = fields;
80 class->c_locals = locals;
81 class->c_body = instructions;
82 class->c_body_length = ins_len;
83 class->c_next = NULL;
84 return class;
88 /*****************************************************************************/
89 size_t class_field_count(struct class* class)
91 return class->c_fields;
94 /*****************************************************************************/
95 size_t class_local_count(struct class* class)
97 return class->c_locals;
100 /*****************************************************************************/
101 size_t class_ins_count(struct class* class)
103 return class->c_body_length;
106 /*****************************************************************************/
107 unsigned char class_get_ins(struct class* class, size_t position)
109 if(position >= class->c_body_length)
110 return 0;
111 return class->c_body[position];