DEADSOFTWARE

6485b355cea47e72e9e95addaf004e17650bb65b
[mp3cc.git] / mpc / structures / identifier.c
1 /********************************************************************
3 identifier.c - handling identifier descriptions
5 Niksa Orlic, 2004-04-28
7 ********************************************************************/
9 #include "../util/strings.h"
10 #include "../util/error.h"
11 //#include "../util/message.h"
12 #include "type_list.h"
13 #include "string_list.h"
14 #include "type.h"
15 #include "identifier.h"
16 #include "name_table.h"
17 #include "../classgen/bytecode.h"
18 #include "block.h"
19 #include "unit.h"
20 #include "../util/memory.h"
22 #include <string.h>
23 #include <stdlib.h>
25 extern FILE* symbols_file;
27 /*
28 Creates an empty identifier
29 */
31 identifier *identifier_create()
32 {
33 identifier *new_identifier;
34 new_identifier = (identifier*) mem_alloc(sizeof(identifier));
36 if (new_identifier == NULL)
37 die(1);
39 new_identifier->identifier_class = none;
41 new_identifier->standard_function = 0;
43 new_identifier->variables = NULL;
45 new_identifier->forward_declaration = 0;
47 new_identifier->unit_block = NULL;
49 new_identifier->unit_function = 0;
50 new_identifier->container_unit = NULL;
52 return new_identifier;
53 }
56 /*
57 Deletes an identifier
58 */
59 void identifier_destroy(identifier *item)
60 {
61 switch (item->identifier_class)
62 {
63 case constant_name:
64 {
65 if (item->constant_type->type_class == string_type)
66 string_destroy(item->constant_string_value);
67 type_destroy(item->constant_type);
68 break;
69 }
71 case variable_name:
72 {
73 if (item->variable_type != NULL)
74 type_destroy(item->variable_type);
75 break;
76 }
78 case type_name:
79 {
80 type_destroy(item->defined_type);
81 break;
82 }
84 case procedure_name:
85 {
86 type_list_destroy(item->parameters);
87 if (item->variables != NULL)
88 type_list_destroy(item->variables);
89 break;
90 }
92 case function_name:
93 {
94 type_destroy(item->return_type);
95 type_list_destroy(item->parameters);
96 if (item->variables != NULL)
97 type_list_destroy(item->variables);
98 break;
99 }
101 case parameter_name:
103 type_destroy(item->parameter_type);
104 break;
107 case unit_name:
109 unit_destroy(item->unit_block);
110 break;
114 mem_free(item);
117 /*
118 Create a copy of a given identifier
119 */
120 identifier *identifier_duplicate(identifier *item)
122 identifier *new_identifier;
123 new_identifier = (identifier*) mem_alloc(sizeof(identifier));
125 if (new_identifier == NULL)
126 die(1);
128 new_identifier->identifier_class = item->identifier_class;
129 new_identifier->unit_function = item->unit_function;
131 switch(new_identifier->identifier_class)
133 case constant_name:
135 new_identifier->constant_type = type_duplicate(item->constant_type);
136 switch(item->constant_type->type_class)
138 case integer_type:
140 new_identifier->constant_int_value = item->constant_int_value;
141 break;
143 case char_type:
145 new_identifier->constant_int_value = item->constant_int_value;
146 break;
148 case string_type:
150 new_identifier->constant_string_value = string_duplicate(item->constant_string_value);
151 break;
153 case boolean_type:
155 new_identifier->constant_int_value = item->constant_int_value;
156 break;
158 case real_type:
160 new_identifier->constant_real_value = item->constant_real_value;
161 break;
163 case command_type:
164 case record_store_type:
165 case http_type:
166 case image_type:
167 case stream_type:
168 case alert_type:
170 break;
172 default:
174 die(11);
177 break;
180 case variable_name:
182 new_identifier->variable_type = type_duplicate(item->variable_type);
183 new_identifier->variable_index = item->variable_index;
184 break;
187 case type_name:
189 new_identifier->defined_type = type_duplicate(item->defined_type);
190 break;
193 case procedure_name:
195 new_identifier->parameters = type_list_duplicate(item->parameters);
196 new_identifier->forward_declaration = item->forward_declaration;
197 new_identifier->standard_function = item->standard_function;
198 new_identifier->variables = type_list_duplicate(item->variables);
199 if (item->container_unit != NULL)
200 new_identifier->container_unit = unit_duplicate(item->container_unit);
201 else
202 new_identifier->container_unit = NULL;
203 break;
206 case function_name:
208 new_identifier->parameters = type_list_duplicate(item->parameters);
209 new_identifier->return_type = type_duplicate(item->return_type);
210 new_identifier->forward_declaration = item->forward_declaration;
211 new_identifier->standard_function = item->standard_function;
212 new_identifier->variables = type_list_duplicate(item->variables);
213 break;
216 case parameter_name:
218 new_identifier->parameter_type = type_duplicate(item->parameter_type);
219 new_identifier->is_parameter_variable = item->is_parameter_variable;
220 new_identifier->parameter_index = item->parameter_index;
221 break;
224 case unit_name:
226 new_identifier->unit_block = unit_duplicate(item->unit_block);
227 break;
232 if (item->container_unit != NULL)
233 new_identifier->container_unit = unit_duplicate(item->container_unit);
234 else
235 new_identifier->container_unit = NULL;
237 if (item->unit_block != NULL)
238 new_identifier->unit_block = unit_duplicate(item->unit_block);
239 else
240 new_identifier->unit_block = NULL;
242 return new_identifier;
245 void bsf_write_integer_constant(long int value, char* name)
247 char tag = 1;
248 char type = 1;
249 fwrite(&tag, 1, 1, symbols_file);
250 bsf_write_STRING(name);
251 fwrite(&type, 1, 1, symbols_file);
252 fwrite(&value, sizeof(long int), 1, symbols_file);
255 void bsf_write_real_constant(float value, char* name)
257 char tag = 1;
258 char type = 2;
259 fwrite(&tag, 1, 1, symbols_file);
260 bsf_write_STRING(name);
261 fwrite(&type, 1, 1, symbols_file);
262 fwrite(&value, sizeof(float), 1, symbols_file);
265 void bsf_write_boolean_constant(char value, char* name)
267 char tag = 1;
268 char type = 3;
269 fwrite(&tag, 1, 1, symbols_file);
270 bsf_write_STRING(name);
271 fwrite(&type, 1, 1, symbols_file);
272 fwrite(&value, sizeof(char), 1, symbols_file);
275 void bsf_write_char_constant(char value, char* name)
277 char tag = 1;
278 char type = 4;
279 fwrite(&tag, 1, 1, symbols_file);
280 bsf_write_STRING(name);
281 fwrite(&type, 1, 1, symbols_file);
282 fwrite(&value, sizeof(char), 1, symbols_file);
285 void bsf_write_string_constant(string* value, char* name)
287 char tag = 1;
288 char type = 5;
289 fwrite(&tag, 1, 1, symbols_file);
290 bsf_write_STRING(name);
291 fwrite(&type, 1, 1, symbols_file);
293 bsf_write_STRING(string_get_cstr(value));
296 void bsf_write_variables(string_list* names, type* var_type)
298 string_list *it = names;
300 while ((it != NULL) && (it->data != NULL))
302 char tag = 2;
303 fwrite(&tag, 1, 1, symbols_file);
304 bsf_write_STRING(string_get_cstr(it->data));
305 bsf_write_TYPE(var_type);
306 it = it->next;
310 void bsf_write_type(string* type_name, type* type_type)
312 char tag = 3;
313 fwrite(&tag, 1, 1, symbols_file);
314 bsf_write_STRING(string_get_cstr(type_name));
315 bsf_write_TYPE(type_type);
318 void bsf_write_procedure(string* name, type_list* parameters)
320 type_list *it;
321 char params_count = 0;
323 char tag = 4;
324 fwrite(&tag, 1, 1, symbols_file);
325 bsf_write_STRING(string_get_cstr(name));
327 params_count = type_list_length(parameters);
328 fwrite(&params_count, 1, 1, symbols_file);
330 it = parameters;
332 while ((it != NULL) && (it->data != NULL))
334 bsf_write_TYPE(it->data);
335 it = it->next;
339 void bsf_write_function(string* name, type_list* parameters, type* return_type)
341 type_list *it;
342 char params_count = 0;
344 char tag = 5;
345 fwrite(&tag, 1, 1, symbols_file);
346 bsf_write_STRING(string_get_cstr(name));
348 bsf_write_TYPE(return_type);
350 params_count = type_list_length(parameters);
351 fwrite(&params_count, 1, 1, symbols_file);
353 it = parameters;
355 while ((it != NULL) && (it->data != NULL))
357 bsf_write_TYPE(it->data);
358 it = it->next;
362 void bsf_write_STRING(char* value)
364 char len = strlen(value);
365 lowercase(value);
366 fwrite(&len, 1, 1, symbols_file);
367 fwrite(value, 1, len, symbols_file);
370 string* bsf_read_STRING(FILE* file)
372 char length;
373 char *buffer;
374 string* string_value;
376 fread(&length, 1, 1, file);
377 buffer = (char*) malloc(length + 5);
378 fread(buffer, 1, length, file);
379 buffer[length] = '\0';
380 string_value = string_from_cstr(buffer);
381 free(buffer);
383 return string_value;
386 void bsf_write_TYPE(type* type_desc)
388 // j-a-s-d
389 #ifdef __GNUC__
390 fwrite((char *)&type_desc->type_class, 1, 1, symbols_file);
391 #else
392 fwrite(&(char)type_desc->type_class, 1, 1, symbols_file);
393 #endif
395 if (type_desc->type_class == array_type)
397 char dimensions;
398 type_list *it;
400 bsf_write_TYPE(type_desc->element_type);
402 dimensions = type_list_length(type_desc->dimensions_list);
403 fwrite(&dimensions, 1, 1, symbols_file);
405 it = type_desc->dimensions_list;
407 while ((it != NULL) && (it->data != NULL))
409 bsf_write_TYPE(it->data);
410 it = it->next;
414 if (type_desc->type_class == record_type)
416 char elements;
417 string_list *name_it;
418 type_list *type_it;
420 elements = string_list_length(type_desc->elements_name_list);
421 fwrite(&elements, 1, 1, symbols_file);
423 name_it = type_desc->elements_name_list;
424 type_it = type_desc->elements_type_list;
426 while ((name_it != NULL) && (name_it->data != NULL))
428 bsf_write_STRING(string_get_cstr(name_it->data));
429 bsf_write_TYPE(type_it->data);
431 name_it = name_it->next;
432 type_it = type_it->next;
435 fwrite(&type_desc->unique_record_ID, 4, 1, symbols_file);
438 if (type_desc->type_class == interval_type)
440 // j-a-s-d
441 #ifdef __GNUC__
442 fwrite((char *)&type_desc->interval_base_type, 1, 1, symbols_file);
443 #else
444 fwrite(&(char)type_desc->interval_base_type, 1, 1, symbols_file);
445 #endif
446 fwrite(&type_desc->first_element, 4, 1, symbols_file);
447 fwrite(&type_desc->last_element, 4, 1, symbols_file);
451 type* bsf_read_TYPE(FILE* symbol_file)
453 char type_class;
455 type* result_type = type_create();
457 fread(&type_class, 1, 1, symbol_file);
458 result_type->type_class = (enum en_type_class)type_class;
460 if (result_type->type_class == array_type)
462 char dimensions;
464 result_type->element_type = bsf_read_TYPE(symbol_file);
465 fread(&dimensions, 1, 1, symbol_file);
467 result_type->dimensions_list = type_list_create();
469 while (dimensions > 0)
471 type_list_append(result_type->dimensions_list, bsf_read_TYPE(symbol_file));
472 dimensions --;
476 if (result_type->type_class == record_type)
478 char elements;
479 fread(&elements, 1, 1, symbol_file);
481 result_type->elements_name_list = string_list_create();
482 result_type->elements_type_list = type_list_create();
484 while (elements > 0)
486 string_list_append(result_type->elements_name_list, bsf_read_STRING(symbol_file));
487 type_list_append(result_type->elements_type_list, bsf_read_TYPE(symbol_file));
488 elements --;
491 fread(&result_type->unique_record_ID, sizeof(int), 1, symbol_file);
494 if (result_type->type_class == interval_type)
496 char base_type_class;
497 fread(&base_type_class, 1, 1, symbol_file);
499 result_type->interval_base_type = (enum en_type_class)base_type_class;
501 fread(&result_type->first_element, sizeof(long int), 1, symbol_file);
502 fread(&result_type->last_element, sizeof(long int), 1, symbol_file);
505 return result_type;