mirror of https://gerrit.osmocom.org/asn1c
81 lines
2.6 KiB
C
81 lines
2.6 KiB
C
/*
|
|
* 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 */
|