6485b355cea47e72e9e95addaf004e17650bb65b
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"
15 #include "identifier.h"
16 #include "name_table.h"
17 #include "../classgen/bytecode.h"
20 #include "../util/memory.h"
25 extern FILE* symbols_file
;
28 Creates an empty identifier
31 identifier
*identifier_create()
33 identifier
*new_identifier
;
34 new_identifier
= (identifier
*) mem_alloc(sizeof(identifier
));
36 if (new_identifier
== NULL
)
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
;
59 void identifier_destroy(identifier
*item
)
61 switch (item
->identifier_class
)
65 if (item
->constant_type
->type_class
== string_type
)
66 string_destroy(item
->constant_string_value
);
67 type_destroy(item
->constant_type
);
73 if (item
->variable_type
!= NULL
)
74 type_destroy(item
->variable_type
);
80 type_destroy(item
->defined_type
);
86 type_list_destroy(item
->parameters
);
87 if (item
->variables
!= NULL
)
88 type_list_destroy(item
->variables
);
94 type_destroy(item
->return_type
);
95 type_list_destroy(item
->parameters
);
96 if (item
->variables
!= NULL
)
97 type_list_destroy(item
->variables
);
103 type_destroy(item
->parameter_type
);
109 unit_destroy(item
->unit_block
);
118 Create a copy of a given identifier
120 identifier
*identifier_duplicate(identifier
*item
)
122 identifier
*new_identifier
;
123 new_identifier
= (identifier
*) mem_alloc(sizeof(identifier
));
125 if (new_identifier
== NULL
)
128 new_identifier
->identifier_class
= item
->identifier_class
;
129 new_identifier
->unit_function
= item
->unit_function
;
131 switch(new_identifier
->identifier_class
)
135 new_identifier
->constant_type
= type_duplicate(item
->constant_type
);
136 switch(item
->constant_type
->type_class
)
140 new_identifier
->constant_int_value
= item
->constant_int_value
;
145 new_identifier
->constant_int_value
= item
->constant_int_value
;
150 new_identifier
->constant_string_value
= string_duplicate(item
->constant_string_value
);
155 new_identifier
->constant_int_value
= item
->constant_int_value
;
160 new_identifier
->constant_real_value
= item
->constant_real_value
;
164 case record_store_type
:
182 new_identifier
->variable_type
= type_duplicate(item
->variable_type
);
183 new_identifier
->variable_index
= item
->variable_index
;
189 new_identifier
->defined_type
= type_duplicate(item
->defined_type
);
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
);
202 new_identifier
->container_unit
= NULL
;
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
);
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
;
226 new_identifier
->unit_block
= unit_duplicate(item
->unit_block
);
232 if (item
->container_unit
!= NULL
)
233 new_identifier
->container_unit
= unit_duplicate(item
->container_unit
);
235 new_identifier
->container_unit
= NULL
;
237 if (item
->unit_block
!= NULL
)
238 new_identifier
->unit_block
= unit_duplicate(item
->unit_block
);
240 new_identifier
->unit_block
= NULL
;
242 return new_identifier
;
245 void bsf_write_integer_constant(long int value
, char* name
)
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
)
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
)
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
)
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
)
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
))
303 fwrite(&tag
, 1, 1, symbols_file
);
304 bsf_write_STRING(string_get_cstr(it
->data
));
305 bsf_write_TYPE(var_type
);
310 void bsf_write_type(string
* type_name
, type
* type_type
)
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
)
321 char params_count
= 0;
324 fwrite(&tag
, 1, 1, symbols_file
);
325 bsf_write_STRING(string_get_cstr(name
));
327 params_count
= type_list_length(parameters
);
328 fwrite(¶ms_count
, 1, 1, symbols_file
);
332 while ((it
!= NULL
) && (it
->data
!= NULL
))
334 bsf_write_TYPE(it
->data
);
339 void bsf_write_function(string
* name
, type_list
* parameters
, type
* return_type
)
342 char params_count
= 0;
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(¶ms_count
, 1, 1, symbols_file
);
355 while ((it
!= NULL
) && (it
->data
!= NULL
))
357 bsf_write_TYPE(it
->data
);
362 void bsf_write_STRING(char* value
)
364 char len
= strlen(value
);
366 fwrite(&len
, 1, 1, symbols_file
);
367 fwrite(value
, 1, len
, symbols_file
);
370 string
* bsf_read_STRING(FILE* file
)
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
);
386 void bsf_write_TYPE(type
* type_desc
)
390 fwrite((char *)&type_desc
->type_class
, 1, 1, symbols_file
);
392 fwrite(&(char)type_desc
->type_class
, 1, 1, symbols_file
);
395 if (type_desc
->type_class
== array_type
)
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
);
414 if (type_desc
->type_class
== record_type
)
417 string_list
*name_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
)
442 fwrite((char *)&type_desc
->interval_base_type
, 1, 1, symbols_file
);
444 fwrite(&(char)type_desc
->interval_base_type
, 1, 1, symbols_file
);
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
)
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
)
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
));
476 if (result_type
->type_class
== record_type
)
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();
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
));
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
);