blob: 80d41e2d5fae92352e704e0789ed853b84bfc759 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#include "asn1parser.h"
6
7asn1p_oid_t *
Lev Walkin6b3ff542006-03-06 14:51:00 +00008asn1p_oid_construct(asn1p_oid_arc_t *arc, int narcs) {
9 asn1p_oid_t *oid;
10
11 if(narcs <= 0)
12 return NULL;
13
14 oid = asn1p_oid_new();
15 if(oid) {
16 for(; narcs--; arc++) {
17 if(asn1p_oid_add_arc(oid, arc)) {
18 asn1p_oid_free(oid);
19 return NULL;
20 }
21 }
22 }
23
24 return oid;
25}
26
27asn1p_oid_t *
Lev Walkinf15320b2004-06-03 03:38:44 +000028asn1p_oid_new() {
29 return calloc(1, sizeof(asn1p_oid_t));
30}
31
32int
33asn1p_oid_add_arc(asn1p_oid_t *oid, asn1p_oid_arc_t *template) {
34 void *p;
35 p = realloc(oid->arcs, (oid->arcs_count + 1) * sizeof(oid->arcs[0]));
36 if(p) {
37 oid->arcs = p;
38 oid->arcs[oid->arcs_count].name
39 = template->name?strdup(template->name):0;
40 oid->arcs[oid->arcs_count].number = template->number;
41 oid->arcs_count++;
42 return 0;
43 } else {
44 return -1;
45 }
46}
47
48void
49asn1p_oid_free(asn1p_oid_t *oid) {
50 if(oid) {
51 if(oid->arcs) {
52 while(oid->arcs_count--) {
Lev Walkinf15320b2004-06-03 03:38:44 +000053 free(oid->arcs[oid->arcs_count].name);
54 }
55 }
56 free(oid);
57 }
58}
59
60asn1p_oid_arc_t *
Lev Walkind21c5052004-09-29 13:18:09 +000061asn1p_oid_arc_new(const char *optName, asn1c_integer_t optNumber /* = -1 */) {
Lev Walkinf15320b2004-06-03 03:38:44 +000062 asn1p_oid_arc_t *arc;
63
64 arc = calloc(1, sizeof *arc);
65 if(arc) {
66 if(optName)
67 arc->name = strdup(optName);
68 arc->number = optNumber;
69 }
70
71 return arc;
72}
73
74void
75asn1p_oid_arc_free(asn1p_oid_arc_t *arc) {
76 if(arc) {
Lev Walkind8b83642016-03-14 02:00:27 -070077 free(arc->name);
Lev Walkinf15320b2004-06-03 03:38:44 +000078 free(arc);
79 }
80}
81
82int
83asn1p_oid_compare(asn1p_oid_t *a, asn1p_oid_t *b) {
84 int i;
85
86 for(i = 0; ; i++) {
Lev Walkind21c5052004-09-29 13:18:09 +000087 asn1c_integer_t cmp;
Lev Walkinf15320b2004-06-03 03:38:44 +000088
89 if(b->arcs_count > i) {
90 if(a->arcs_count <= i)
91 return -1;
92 } else if(a->arcs_count > i) {
93 if(b->arcs_count <= i)
94 return 1;
95 } else if(b->arcs_count <= i && a->arcs_count <= i) {
96 cmp = b->arcs_count - a->arcs_count;
97 if(cmp < 0)
98 return -1;
99 else if(cmp > 0)
100 return 1;
101 return 0;
102 }
103
104 cmp = b->arcs[i].number - a->arcs[i].number;
105 if(cmp < 0)
106 return -1;
107 else if(cmp > 0)
108 return 1;
109 }
110
111}
112
113