Files
Digital-Research-Source-Code/ASSEMBLY & COMPILE TOOLS/PLM-2-C 2/plm2c/mem.c
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

197 lines
3.3 KiB
C

#ifdef IBMPC
#include <alloc.h>
#endif
#include "misc.h"
#include "defs.h"
#include "cvt.h"
#include "struct.h"
/*
* Memory allocation and deallocation routines.
*/
/*
* Allocate memory
*/
char *get_mem(size)
unsigned int size;
{
char *malloc_ptr;
void *malloc();
if ((malloc_ptr = (char *)malloc(size)) == NULL) {
parse_error("Out of memory");
exit(1);
}
return malloc_ptr;
}
/*
* Generate a new context.
*/
get_context_ptr(context)
CONTEXT **context;
{
*context = (CONTEXT *) get_mem(sizeof(CONTEXT));
(*context)->decl_head = NULL;
(*context)->next_context = NULL;
}
/*
* Malloc memory for a TOKEN.
*/
get_token_ptr(token)
TOKEN **token;
{
*token = (TOKEN *) get_mem(sizeof(TOKEN));
}
/*
* Malloc memory for a DECL_ID.
*/
get_var_ptr(var)
DECL_ID **var;
{
*var = (DECL_ID *) get_mem(sizeof(DECL_ID));
(*var)->name = NULL;
(*var)->based_name = NULL;
(*var)->next_var = NULL;
(*var)->is_ext_at = FALSE;
}
/*
* Free a linked list of variables.
*/
free_var_list(list_ptr)
DECL_ID *list_ptr;
{
DECL_ID *next_ptr;
while (list_ptr) {
if (list_ptr->name)
free( (char *) list_ptr->name);
if (list_ptr->based_name)
free( (char *) list_ptr->based_name);
next_ptr = list_ptr->next_var;
free((char *) list_ptr);
list_ptr = next_ptr;
}
}
/*
* Malloc space for a DECL_MEMBER structure and return pointer.
*/
get_element_ptr(element)
DECL_MEMBER **element;
{
DECL_MEMBER *el_ptr;
/* Malloc space for element */
el_ptr = (DECL_MEMBER *) get_mem(sizeof(DECL_MEMBER));
/* Init pointers */
el_ptr->name_list = NULL;
el_ptr->literal = NULL;
#ifdef PARSE_LITERALS
el_ptr->literal_token = NULL;
#endif
el_ptr->array_bound = NULL;
el_ptr->type = NULL;
el_ptr->struct_list = NULL;
el_ptr->at_ptr = NULL;
el_ptr->init_ptr = NULL;
el_ptr->next_member = NULL;
el_ptr->attributes = NONE;
el_ptr->initialization = NONE;
*element = el_ptr;
}
/*
* Free a DECL_MEMBER list.
*/
free_decl_list(element)
DECL_MEMBER *element;
{
DECL_MEMBER *el_ptr;
while (element) {
if (element->name_list)
free_var_list(element->name_list);
if (element->literal)
free((char *) element->literal);
if (element->array_bound)
free((char *) element->array_bound);
if (element->type)
free((char *) element->type);
if (element->struct_list)
free_decl_list(element->struct_list);
if (element->at_ptr)
free(element->at_ptr);
el_ptr = element->next_member;
free((char *) element);
element = el_ptr;
}
}
/*
* Malloc space for a procedure parameter
*/
get_param_ptr(param)
PARAM_LIST **param;
{
*param = (PARAM_LIST *) get_mem(sizeof(PARAM_LIST));
(*param)->next_param = NULL;
}
/*
* Free parameter list
*/
free_param_list(param_list)
PARAM_LIST *param_list;
{
PARAM_LIST *param_ptr;
while (param_list) {
param_ptr = param_list->next_param;
free((char *) param_list);
param_list = param_ptr;
}
}
/*
* Malloc space for a DECLARE statement
*/
get_decl_ptr(decl)
DECL **decl;
{
*decl = (DECL *) get_mem(sizeof(DECL));
(*decl)->decl_list = NULL;
(*decl)->next_decl = NULL;
}
/*
* Free DECL list
*/
free_decl(decl_list)
DECL *decl_list;
{
DECL *decl_ptr;
while (decl_list) {
decl_ptr = decl_list->next_decl;
#ifdef FREE_DECL_TOKEN
if (decl_list->decl_token)
free((char *) decl_list->decl_token);
#endif
if (decl_list->decl_list)
free_decl_list(decl_list->decl_list);
free((char *) decl_list);
decl_list = decl_ptr;
}
}