blob: a71c8c4a27c6d3d0e1fe210f2e91c3e5d4ef55b0 [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 }
Bi-Ruei, Chiu0bfcefc2016-11-08 22:37:39 +080055 free(oid->arcs);
Lev Walkinf15320b2004-06-03 03:38:44 +000056 }
57 free(oid);
58 }
59}
60
61asn1p_oid_arc_t *
Lev Walkind21c5052004-09-29 13:18:09 +000062asn1p_oid_arc_new(const char *optName, asn1c_integer_t optNumber /* = -1 */) {
Lev Walkinf15320b2004-06-03 03:38:44 +000063 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
75void
76asn1p_oid_arc_free(asn1p_oid_arc_t *arc) {
77 if(arc) {
Lev Walkind8b83642016-03-14 02:00:27 -070078 free(arc->name);
Lev Walkinf15320b2004-06-03 03:38:44 +000079 free(arc);
80 }
81}
82
83int
Lev Walkinea6635b2017-08-06 23:23:04 -070084asn1p_oid_compare(const asn1p_oid_t *a, const asn1p_oid_t *b) {
Lev Walkinf15320b2004-06-03 03:38:44 +000085 int i;
86
87 for(i = 0; ; i++) {
Lev Walkind21c5052004-09-29 13:18:09 +000088 asn1c_integer_t cmp;
Lev Walkinf15320b2004-06-03 03:38:44 +000089
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