a71c8c4a27c6d3d0e1fe210f2e91c3e5d4ef55b0
[com/asn1c.git] / libasn1parser / asn1p_oid.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "asn1parser.h"
6
7 asn1p_oid_t *
8 asn1p_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
27 asn1p_oid_t *
28 asn1p_oid_new() {
29         return calloc(1, sizeof(asn1p_oid_t));
30 }
31
32 int
33 asn1p_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
48 void
49 asn1p_oid_free(asn1p_oid_t *oid) {
50         if(oid) {
51                 if(oid->arcs) {
52                         while(oid->arcs_count--) {
53                                 free(oid->arcs[oid->arcs_count].name);
54                         }
55                         free(oid->arcs);
56                 }
57                 free(oid);
58         }
59 }
60
61 asn1p_oid_arc_t *
62 asn1p_oid_arc_new(const char *optName, asn1c_integer_t optNumber /* = -1 */) {
63         asn1p_oid_arc_t *arc;
64
65         arc = calloc(1, sizeof *arc);
66         if(arc) {
67                 if(optName)
68                         arc->name = strdup(optName);
69                 arc->number = optNumber;
70         }
71
72         return arc;
73 }
74
75 void
76 asn1p_oid_arc_free(asn1p_oid_arc_t *arc) {
77         if(arc) {
78                 free(arc->name);
79                 free(arc);
80         }
81 }
82
83 int
84 asn1p_oid_compare(const asn1p_oid_t *a, const asn1p_oid_t *b) {
85         int i;
86
87         for(i = 0; ; i++) {
88                 asn1c_integer_t cmp;
89
90                 if(b->arcs_count > i) {
91                         if(a->arcs_count <= i)
92                                 return -1;
93                 } else if(a->arcs_count > i) {
94                         if(b->arcs_count <= i)
95                                 return 1;
96                 } else if(b->arcs_count <= i && a->arcs_count <= i) {
97                         cmp = b->arcs_count - a->arcs_count;
98                         if(cmp < 0)
99                                 return -1;
100                         else if(cmp > 0)
101                                 return 1;
102                         return 0;
103                 }
104
105                 cmp = b->arcs[i].number - a->arcs[i].number;
106                 if(cmp < 0)
107                         return -1;
108                 else if(cmp > 0)
109                         return 1;
110         }
111
112 }
113
114