blob: 7d1c1a50b54d4aed36438632d3c96f0449ac9278 [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--) {
53 if(oid->arcs[oid->arcs_count].name)
54 free(oid->arcs[oid->arcs_count].name);
55 }
56 }
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) {
78 if(arc->name)
79 free(arc->name);
80 free(arc);
81 }
82}
83
84int
85asn1p_oid_compare(asn1p_oid_t *a, asn1p_oid_t *b) {
86 int i;
87
88 for(i = 0; ; i++) {
Lev Walkind21c5052004-09-29 13:18:09 +000089 asn1c_integer_t cmp;
Lev Walkinf15320b2004-06-03 03:38:44 +000090
91 if(b->arcs_count > i) {
92 if(a->arcs_count <= i)
93 return -1;
94 } else if(a->arcs_count > i) {
95 if(b->arcs_count <= i)
96 return 1;
97 } else if(b->arcs_count <= i && a->arcs_count <= i) {
98 cmp = b->arcs_count - a->arcs_count;
99 if(cmp < 0)
100 return -1;
101 else if(cmp > 0)
102 return 1;
103 return 0;
104 }
105
106 cmp = b->arcs[i].number - a->arcs[i].number;
107 if(cmp < 0)
108 return -1;
109 else if(cmp > 0)
110 return 1;
111 }
112
113}
114
115