| /* |
| * Structures and prototypes related to parameterization |
| */ |
| #ifndef ASN1_NAMESPACE_H |
| #define ASN1_NAMESPACE_H |
| |
| struct asn1p_ref_s; /* Forward declaration */ |
| struct asn1p_expr_s; /* Forward declaration */ |
| struct asn1p_module_s; /* Forward declaration */ |
| |
| typedef struct asn1_namespace_s { |
| struct asn1_namespace_element_s { |
| enum { |
| NAM_SPACE, /* The whole search space (e.g. Module) */ |
| NAM_SYMBOL, /* A particular symbol */ |
| } selector; |
| union { |
| struct { |
| struct asn1p_module_s *module; |
| int stop_search; /* This module MUST contain the symbol */ |
| } space; |
| struct { |
| struct asn1p_ref_s *opt_governor; /* optional */ |
| char *identifier; |
| struct asn1p_expr_s *resolution; |
| } symbol; |
| } u; |
| } *elements; |
| size_t elements_count; |
| size_t elements_size; |
| } asn1_namespace_t; |
| |
| /* |
| * Set callback used to initialize standard namespaces. |
| */ |
| void asn1_namespace_add_standard_namespaces_callback( |
| void (*)(asn1_namespace_t *)); |
| |
| asn1_namespace_t *asn1_namespace_new(void); |
| void asn1_namespace_free(asn1_namespace_t *); |
| |
| asn1_namespace_t *asn1_namespace_clone(const asn1_namespace_t *); |
| |
| asn1_namespace_t *asn1_namespace_new_from_module(struct asn1p_module_s *mod, int stop_search); |
| |
| void asn1_namespace_add_module(asn1_namespace_t *, |
| struct asn1p_module_s *module, int stop_search); |
| |
| void asn1_namespace_add_symbol(asn1_namespace_t *, |
| struct asn1p_ref_s *opt_governor, |
| const char *identifier, |
| struct asn1p_expr_s *resolved_argument); |
| |
| /* |
| * Human-readable namespace layout. |
| * Returns a reference to a statically allocated string. |
| */ |
| const char *asn1_namespace_string(const asn1_namespace_t *); |
| |
| /* |
| * Create a new namespace by cloning (ns1) and adding (ns2) on top. |
| * Destroys (ns2). |
| */ |
| asn1_namespace_t *asn1_namespace_new_ND(const asn1_namespace_t *ns1, |
| asn1_namespace_t *ns2); |
| |
| /* |
| * Introduce and destroy namespace around the given code. |
| * This aids memory management around dynamic namespaces. |
| */ |
| #define WITH_MODULE_NAMESPACE(mod, ns_var, code) \ |
| ({ \ |
| struct asn1_namespace_s *ns_var = \ |
| asn1_namespace_new_from_module(mod, 1); \ |
| typeof(code) ret = code; \ |
| asn1_namespace_free(ns_var); \ |
| ret; \ |
| }) |
| |
| #endif /* ASN1_NAMESPACE_H */ |