Lev Walkin | b46156d | 2017-09-05 02:53:05 -0700 | [diff] [blame] | 1 | #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 | |
| 7 | static abuf * |
| 8 | construct_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 | |
| 32 | static struct c_names |
| 33 | c_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 | |
| 103 | struct c_names |
| 104 | c_name(arg_t *arg) { |
| 105 | return c_name_impl(arg, 1); |
| 106 | } |
| 107 | |
| 108 | const char * |
| 109 | c_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 | |
| 121 | const char * |
| 122 | c_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 | |