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

155 lines
3.2 KiB
C

#include "misc.h"
#include "defs.h"
#include "cvt.h"
#include "struct.h"
/*
* Pointer to the current context
*/
CONTEXT *context_head;
/*
* Pointer to all popped contexts
*/
CONTEXT *old_context;
/*
* Search DECL_MEMBER list for symbol and if found, return TRUE
* and pointer to DECL_ID for that symbol.
*/
find_member_symbol(symbol, decl_ptr, decl_id)
TOKEN *symbol;
DECL_MEMBER *decl_ptr;
DECL_ID **decl_id;
{
DECL_ID *var_ptr;
for (var_ptr = decl_ptr->name_list; var_ptr;
var_ptr = var_ptr->next_var) {
if (!strcmp(var_ptr->name->token_name, symbol->token_name)) {
*decl_id = var_ptr;
return TRUE;
}
}
*decl_id = NULL;
return FALSE;
}
/*
* Search DECL_MEMBER list for symbol.
* If found, return pointer to DECL_MEMBER containing that symbol
* in decl_found, and return TRUE.
* If not found, return null pointer in decl_found, and return FALSE.
*/
find_list_symbol(symbol, decl_ptr, decl_found, decl_id)
TOKEN *symbol;
DECL_MEMBER *decl_ptr, **decl_found;
DECL_ID **decl_id;
{
for (*decl_found = decl_ptr; *decl_found;
*decl_found = (*decl_found)->next_member) {
if (find_member_symbol(symbol, *decl_found, decl_id))
return TRUE;
}
return FALSE;
}
/*
* Search context for symbol.
* If found, return pointer to DECL_MEMBER containing that symbol
* in decl_found, return DECL_ID for that symbol in decl_id, and
* return TRUE.
* If not found, return null pointers in decl_found and decl_id,
* and return FALSE.
*/
find_symbol(symbol, decl_found, decl_id)
TOKEN *symbol;
DECL_MEMBER **decl_found;
DECL_ID **decl_id;
{
CONTEXT *context_ptr;
for (context_ptr = context_head; context_ptr;
context_ptr = context_ptr->next_context) {
if (find_list_symbol(symbol, context_ptr->decl_head,
decl_found, decl_id))
return TRUE;
}
return FALSE;
}
/*
* Add a declaration to current context
*/
add_to_context(decl)
DECL_MEMBER *decl;
{
DECL_MEMBER *decl_ptr;
/* Find end of declaration list */
for (decl_ptr = decl; decl_ptr->next_member; )
decl_ptr = decl_ptr->next_member;
/* Add current declarations to tail of new list */
decl_ptr->next_member = context_head->decl_head;
context_head->decl_head = decl;
}
/*
* Add a DECL list to context and NULL the list pointer
*/
add_decl_to_context(decl)
DECL *decl;
{
DECL *decl_ptr;
/* Find end of declaration list */
for (decl_ptr = decl; decl_ptr; decl_ptr = decl_ptr->next_decl) {
if (decl_ptr->decl_list)
add_to_context(decl_ptr->decl_list);
decl_ptr->decl_list = NULL;
}
}
/*
* Push a new context of specified type and name
*/
new_context(type, name)
int type;
TOKEN *name;
{
CONTEXT *new_context;
get_context_ptr(&new_context);
new_context->context_type = type;
if (name) {
get_token_ptr(&new_context->context_name);
token_copy(name, new_context->context_name);
} else
new_context->context_name = NULL;
new_context->next_context = context_head;
context_head = new_context;
}
/*
* Pop current context and place on old context
*/
pop_context()
{
CONTEXT *popped_context;
popped_context = context_head;
context_head = popped_context->next_context;
popped_context->next_context = old_context;
old_context = popped_context;
}
/*
* Initializes context pointers
*/
init_context()
{
context_head = NULL;
old_context = NULL;
}