8 #include "asn1_buffer.h"
9 #include "asn1_namespace.h"
11 static void (*_add_standard_namespaces_cb)(asn1_namespace_t *);
14 asn1_namespace_add_standard_namespaces_callback(
15 void (*cb)(asn1_namespace_t *)) {
16 _add_standard_namespaces_cb = cb;
20 asn1_namespace_new() {
21 asn1_namespace_t *ns = calloc(1, sizeof(*ns));
23 if(_add_standard_namespaces_cb) {
24 _add_standard_namespaces_cb(ns);
31 asn1_namespace_free(asn1_namespace_t *ns) {
33 for(size_t i = 0; i < ns->elements_count; i++) {
34 switch(ns->elements[i].selector) {
38 free(ns->elements[i].u.symbol.identifier);
48 asn1_namespace_clone(const asn1_namespace_t *old_ns) {
49 asn1_namespace_t *new_ns = calloc(1, sizeof(*new_ns));
51 for(size_t i = 0; i < old_ns->elements_count; i++) {
52 switch(old_ns->elements[i].selector) {
54 asn1_namespace_add_module(new_ns,
55 old_ns->elements[i].u.space.module,
56 old_ns->elements[i].u.space.stop_search);
59 asn1_namespace_add_symbol(
60 new_ns, old_ns->elements[i].u.symbol.opt_governor,
61 old_ns->elements[i].u.symbol.identifier,
62 old_ns->elements[i].u.symbol.resolution);
71 _add_element(asn1_namespace_t *ns) {
72 size_t idx = ns->elements_count;
74 if(ns->elements_count >= ns->elements_size) {
75 size_t elc = ns->elements_size ? ns->elements_size * 2 : 4;
76 ns->elements = realloc(ns->elements, sizeof(ns->elements[0]) * elc);
77 ns->elements_size = elc;
85 asn1_namespace_add_symbol(asn1_namespace_t *ns,
86 struct asn1p_ref_s *opt_governor,
87 const char *identifier,
88 struct asn1p_expr_s *resolved_argument) {
89 size_t idx = _add_element(ns);
91 ns->elements[idx].selector = NAM_SYMBOL;
92 ns->elements[idx].u.symbol.opt_governor = opt_governor;
93 ns->elements[idx].u.symbol.identifier = strdup(identifier);
94 ns->elements[idx].u.symbol.resolution = resolved_argument;
98 asn1_namespace_new_from_module(struct asn1p_module_s *module, int stop_search) {
99 asn1_namespace_t *ns = asn1_namespace_new();
100 asn1_namespace_add_module(ns, module, stop_search);
105 asn1_namespace_add_module(asn1_namespace_t *ns, struct asn1p_module_s *module,
107 size_t idx = _add_element(ns);
109 ns->elements[idx].selector = NAM_SPACE,
110 ns->elements[idx].u.space.module = module;
111 ns->elements[idx].u.space.stop_search = stop_search;
115 asn1_namespace_string(const asn1_namespace_t *ns) {
122 for(size_t i = 0; i < ns->elements_count; i++) {
123 if(i) abuf_str(&ab, ",");
124 switch(ns->elements[i].selector) {
128 *(const char *const *)ns->elements[i].u.space.module,
129 ns->elements[i].u.space.stop_search ? "!" : "");
132 abuf_printf(&ab, "S:\"%s%s%s\"",
133 ns->elements[i].u.symbol.opt_governor
135 ns->elements[i].u.symbol.opt_governor)
137 ns->elements[i].u.symbol.opt_governor ? ":" : "",
138 ns->elements[i].u.symbol.identifier);
145 return "<no namespace>";