blob: 6ab3c4a16136c8d98ac73a9208ea64c9ac7a1054 [file] [log] [blame]
Lev Walkinb46156d2017-09-05 02:53:05 -07001#include "asn1c_internal.h"
2#include "asn1c_naming.h"
3#include "asn1c_misc.h"
4#include "asn1c_misc.h"
5#include <asn1_buffer.h>
6
7static abuf *
8construct_base_name(abuf *buf, arg_t *arg, int compound_names,
9 int avoid_keywords) {
10 const char *id;
11
12 if(!buf) buf = abuf_new();
13
14 if(compound_names && arg->expr->parent_expr) {
15 arg_t tmparg = *arg;
16 tmparg.expr = arg->expr->parent_expr;
17 construct_base_name(buf, &tmparg, compound_names, 0);
18 if(buf->length) {
19 abuf_str(buf, "__"); /* component separator */
20 }
21 }
22
23 id = asn1c_make_identifier(
24 ((avoid_keywords && !buf->length) ? AMI_CHECK_RESERVED : 0), arg->expr,
25 0);
26
27 abuf_str(buf, id);
28
29 return buf;
30}
31
32static struct c_names
33c_name_impl(arg_t *arg, int avoid_keywords) {
34 asn1p_expr_type_e expr_type = arg->expr->expr_type;
35 struct c_names names;
36 int compound_names = 0;
37
38 static abuf b_base_name;
39 static abuf b_short_name;
40 static abuf b_full_name;
41 static abuf b_as_member;
42 static abuf b_presence_enum;
43 static abuf b_presence_name;
44 static abuf b_members_enum;
45 static abuf b_members_name;
46
47 abuf_clear(&b_base_name);
48 abuf_clear(&b_short_name);
49 abuf_clear(&b_full_name);
50 abuf_clear(&b_as_member);
51 abuf_clear(&b_presence_enum);
52 abuf_clear(&b_presence_name);
53 abuf_clear(&b_members_enum);
54 abuf_clear(&b_members_name);
55
56 if((arg->flags & A1C_COMPOUND_NAMES)) {
57 if((expr_type & ASN_CONSTR_MASK)
58 || expr_type == ASN_BASIC_ENUMERATED
59 || ((expr_type == ASN_BASIC_INTEGER
60 || expr_type == ASN_BASIC_BIT_STRING))) {
61 compound_names = 1;
62 }
63 }
64
65 abuf *base_name =
66 construct_base_name(NULL, arg, compound_names, avoid_keywords);
67 abuf *part_name =
68 construct_base_name(NULL, arg, compound_names, 0);
69 abuf *member_name =
70 construct_base_name(NULL, arg, 0, 1);
71
72 abuf_printf(&b_base_name, "%s", base_name->buffer);
73 if(!arg->expr->_anonymous_type) {
74 if(arg->embed) {
75 abuf_printf(&b_short_name, "%s", member_name->buffer);
76 } else {
77 abuf_printf(&b_short_name, "%s_t", member_name->buffer);
78 }
79 }
80 abuf_printf(&b_full_name, "struct %s", base_name->buffer);
81 abuf_printf(&b_as_member, "%s", member_name->buffer);
82 abuf_printf(&b_presence_enum, "enum %s_PR", part_name->buffer);
83 abuf_printf(&b_presence_name, "%s_PR", part_name->buffer);
84 abuf_printf(&b_members_enum, "enum %s", base_name->buffer);
85 abuf_printf(&b_members_name, "e_%s", part_name->buffer);
86
87 names.base_name = b_base_name.buffer;
88 names.short_name = b_short_name.buffer;
89 names.full_name = b_full_name.buffer;
90 names.as_member = b_as_member.buffer;
91 names.presence_enum = b_presence_enum.buffer;
92 names.presence_name = b_presence_name.buffer;
93 names.members_enum = b_members_enum.buffer;
94 names.members_name = b_members_name.buffer;
95
96 abuf_free(base_name);
97 abuf_free(part_name);
98 abuf_free(member_name);
99
100 return names;
101}
102
103struct c_names
104c_name(arg_t *arg) {
105 return c_name_impl(arg, 1);
106}
107
108const char *
109c_member_name(arg_t *arg, asn1p_expr_t *expr) {
110 static abuf ab;
111
112 abuf_clear(&ab);
113
114 abuf_printf(&ab, "%s_%s", c_name_impl(arg, 0).base_name,
115 asn1c_make_identifier(0, expr, 0));
116
117 return ab.buffer;
118}
119
120
121const char *
122c_presence_name(arg_t *arg, asn1p_expr_t *expr) {
123 static abuf ab;
124
125 abuf_clear(&ab);
126
127 if(expr) {
128 abuf_printf(&ab, "%s_PR_%s", c_name_impl(arg, 0).base_name,
129 asn1c_make_identifier(0, expr, 0));
130 } else {
131 abuf_printf(&ab, "%s_PR_NOTHING", c_name_impl(arg, 0).base_name);
132 }
133
134 return ab.buffer;
135}
136
137