147 lines
4.8 KiB
C
147 lines
4.8 KiB
C
#ifndef SCOPE_H
|
|
#define SCOPE_H
|
|
|
|
/** **********************************************************************
|
|
** Module: Scope \file scope.h
|
|
** Description: This module implements a hierarchical (i.e., scoped)
|
|
** symbol table. The symbol table can store definitions of entities,
|
|
** types, algorithms, and variables, as well as containing a list
|
|
** of subscopes.
|
|
** Constants:
|
|
** SCOPE_NULL - the null scope
|
|
**
|
|
************************************************************************/
|
|
|
|
/*
|
|
* This software was developed by U.S. Government employees as part of
|
|
* their official duties and is not subject to copyright.
|
|
*
|
|
* $Log: scope.h,v $
|
|
* Revision 1.10 1997/01/21 19:17:11 dar
|
|
* made C++ compatible
|
|
*
|
|
* Revision 1.9 1995/04/05 14:58:31 clark
|
|
* CADDETC preval
|
|
*
|
|
* Revision 1.8 1994/05/11 19:51:05 libes
|
|
* numerous fixes
|
|
*
|
|
* Revision 1.7 1993/10/15 18:48:24 libes
|
|
* CADDETC certified
|
|
*
|
|
* Revision 1.6 1993/01/19 22:16:43 libes
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.5 1992/08/18 17:12:41 libes
|
|
* rm'd extraneous error messages
|
|
*
|
|
* Revision 1.4 1992/06/08 18:06:24 libes
|
|
* prettied up interface to print_objects_when_running
|
|
*/
|
|
|
|
/*************/
|
|
/* constants */
|
|
/*************/
|
|
|
|
#define SCOPE_NULL (Scope)0
|
|
|
|
/****************/
|
|
/* modules used */
|
|
/****************/
|
|
|
|
#include <sc_export.h>
|
|
#include "type.h"
|
|
#include "variable.h"
|
|
#include "entity.h"
|
|
#include "express.h"
|
|
#include "alg.h"
|
|
#include "schema.h"
|
|
|
|
/*****************/
|
|
/* packages used */
|
|
/*****************/
|
|
|
|
#include "expbasic.h" /* get basic definitions */
|
|
#include "dict.h"
|
|
#include "symbol.h"
|
|
|
|
/***************************/
|
|
/* hidden type definitions */
|
|
/***************************/
|
|
|
|
/* these allow one to give SCOPEfind hints to its search strategy */
|
|
#define SCOPE_FIND_TYPE OBJ_TYPE_BITS
|
|
#define SCOPE_FIND_ENTITY OBJ_ENTITY_BITS
|
|
#define SCOPE_FIND_FUNCTION OBJ_FUNCTION_BITS
|
|
#define SCOPE_FIND_PROCEDURE OBJ_PROCEDURE_BITS
|
|
#define SCOPE_FIND_VARIABLE OBJ_VARIABLE_BITS
|
|
#define SCOPE_FIND_ANYTHING OBJ_ANYTHING_BITS
|
|
|
|
struct Scope_ {
|
|
Symbol symbol;
|
|
char type; /* see above */
|
|
ClientData clientData; /**< user may use this for any purpose */
|
|
int search_id; /**< key to avoid searching this scope twice */
|
|
Dictionary symbol_table, enum_table;
|
|
struct Scope_ * superscope;
|
|
union {
|
|
struct Procedure_ * proc;
|
|
struct Function_ * func;
|
|
struct Rule_ * rule;
|
|
struct Entity_ * entity;
|
|
struct Schema_ * schema;
|
|
struct Express_ * express;
|
|
struct Increment_ * incr;
|
|
struct TypeHead_ * type;
|
|
/* no, query owns a scope rather than scope owning a query
|
|
* struct Query *query; */
|
|
} u;
|
|
Linked_List where; /**< optional where clause */
|
|
};
|
|
|
|
/******************************/
|
|
/* macro function definitions */
|
|
/******************************/
|
|
|
|
#define SCOPEis(scope) ((scope)->type)
|
|
#define SCOPEis_schema(scope) ((scope)->type == OBJ_SCHEMA)
|
|
|
|
#define SCOPEget_symbol(scope) (&(scope)->symbol)
|
|
#define SCOPEput_name(scope,name) ((scope)->symbol.name = name)
|
|
#define SCOPEget_name(scope) ((scope)->symbol.name)
|
|
#define SCOPEget_resolved(scope) ((scope)->symbol.resolved)
|
|
|
|
#define SCOPEget_clientData(s) ((s)->clientData)
|
|
#define SCOPEput_clientData(s,d) ((s)->clientData = (d))
|
|
|
|
|
|
#define SCOPEdo_types(s,t,de) DICTdo_type_init(s->symbol_table,&de,OBJ_TYPE);{\
|
|
Type t; \
|
|
while (0 != (t = (Type)DICTdo(&de))) {
|
|
#define SCOPEdo_entities(s,t,de) DICTdo_type_init(s->symbol_table,&de,OBJ_ENTITY); { \
|
|
Entity t; \
|
|
while (0 != (t = (Entity)DICTdo(&de))) {
|
|
#define SCOPEdo_functions(s,t,de) DICTdo_type_init(s->symbol_table,&de,OBJ_FUNCTION); { \
|
|
Entity t; \
|
|
while (0 != (t = (Entity)DICTdo(&de))) {
|
|
#define SCOPEdo_rules(s,t,de) DICTdo_type_init(s->symbol_table,&de,OBJ_RULE); { \
|
|
Entity t; \
|
|
while (0 != (t = (Entity)DICTdo(&de))) {
|
|
|
|
#define SCOPEod }}
|
|
|
|
/***********************/
|
|
/* function prototypes */
|
|
/***********************/
|
|
|
|
extern SC_EXPRESS_EXPORT struct Symbol_ * SCOPE_get_symbol PROTO( ( Generic ) );
|
|
extern SC_EXPRESS_EXPORT void SCOPE_get_entities PROTO( ( Scope, Linked_List ) );
|
|
extern SC_EXPRESS_EXPORT Linked_List SCOPEget_entities PROTO( ( Scope ) );
|
|
extern SC_EXPRESS_EXPORT Linked_List SCOPEget_entities_superclass_order PROTO( ( Scope ) );
|
|
extern SC_EXPRESS_EXPORT Generic SCOPEfind PROTO( ( Scope, char *, int ) );
|
|
extern SC_EXPRESS_EXPORT void SCOPE_get_functions PROTO( ( Scope, Linked_List ) );
|
|
extern SC_EXPRESS_EXPORT Linked_List SCOPEget_functions PROTO( ( Scope ) );
|
|
extern SC_EXPRESS_EXPORT void SCOPE_get_rules PROTO( ( Scope, Linked_List ) );
|
|
extern SC_EXPRESS_EXPORT Linked_List SCOPEget_rules PROTO( ( Scope ) );
|
|
|
|
#endif /* SCOPE_H */
|