7
#include "asn1parser.h"
10
* Construct a new empty reference.
13
asn1p_ref_new(int _lineno) {
16
ref = calloc(1, sizeof *ref);
18
ref->_lineno = _lineno;
25
asn1p_ref_free(asn1p_ref_t *ref) {
28
int i = ref->comp_count;
30
if(ref->components[i].name)
31
free(ref->components[i].name);
32
ref->components[i].name = 0;
34
free(ref->components);
42
static enum asn1p_ref_lex_type_e
43
asn1p_ref_name2lextype(char *name) {
44
enum asn1p_ref_lex_type_e lex_type;
45
int has_lowercase = 0;
48
if(name[1] >= 'A' && name[1] <= 'Z') {
49
lex_type = RLT_AmpUppercase;
51
lex_type = RLT_Amplowercase;
53
} else if(*name >= 'A' && *name <= 'Z') {
56
for(p = name; *p; p++) {
57
if(*p >= 'a' && *p <= 'z') {
64
lex_type = RLT_Uppercase;
66
lex_type = RLT_CAPITALS;
68
} else if(*name == '@') {
70
lex_type = RLT_AtDotlowercase;
72
lex_type = RLT_Atlowercase;
74
lex_type = RLT_lowercase;
81
asn1p_ref_add_component(asn1p_ref_t *ref, char *name, enum asn1p_ref_lex_type_e lex_type) {
84
|| (int)lex_type < RLT_UNKNOWN || lex_type >= RLT_MAX) {
89
if(ref->comp_count == ref->comp_size) {
90
int newsize = ref->comp_size?(ref->comp_size<<2):4;
91
void *p = realloc(ref->components,
92
newsize * sizeof(ref->components[0]));
95
ref->comp_size = newsize;
102
if(lex_type == RLT_UNKNOWN) {
103
lex_type = asn1p_ref_name2lextype(name);
105
assert(lex_type == asn1p_ref_name2lextype(name));
108
ref->components[ref->comp_count].name = strdup(name);
109
ref->components[ref->comp_count].lex_type = lex_type;
110
if(ref->components[ref->comp_count].name) {
119
asn1p_ref_clone(asn1p_ref_t *ref) {
122
newref = asn1p_ref_new(ref->_lineno);
125
for(i = 0; i < ref->comp_count; i++) {
126
if(asn1p_ref_add_component(newref,
127
ref->components[i].name,
128
ref->components[i].lex_type
130
asn1p_ref_free(newref);