aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1parser/asn1p_param.c
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-06-03 03:38:44 +0000
committerLev Walkin <vlm@lionet.info>2004-06-03 03:38:44 +0000
commitf15320bf6b50a0c02636405561ac8323ae901abd (patch)
tree33461d45122896c6dde35f82f5c7d19b62004a6b /libasn1parser/asn1p_param.c
parent746cb60bbccf47019563665f4aec4b6c462c4163 (diff)
Initial revision
Diffstat (limited to 'libasn1parser/asn1p_param.c')
-rw-r--r--libasn1parser/asn1p_param.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/libasn1parser/asn1p_param.c b/libasn1parser/asn1p_param.c
new file mode 100644
index 00000000..f7082241
--- /dev/null
+++ b/libasn1parser/asn1p_param.c
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "asn1parser.h"
+
+/*
+ * Construct a new empty parameters list.
+ */
+asn1p_paramlist_t *
+asn1p_paramlist_new(int _lineno) {
+ asn1p_paramlist_t *pl;
+
+ pl = calloc(1, sizeof *pl);
+ if(pl) {
+ pl->_lineno = _lineno;
+ }
+
+ return pl;
+}
+
+void
+asn1p_paramlist_free(asn1p_paramlist_t *pl) {
+ if(pl) {
+ if(pl->params) {
+ int i = pl->params_count;
+ while(i--) {
+ if(pl->params[i].governor)
+ asn1p_ref_free(pl->params[i].governor);
+ if(pl->params[i].argument)
+ free(pl->params[i].argument);
+ pl->params[i].governor = 0;
+ pl->params[i].argument = 0;
+ }
+ free(pl->params);
+ pl->params = 0;
+ }
+
+ free(pl);
+ }
+}
+
+int
+asn1p_paramlist_add_param(asn1p_paramlist_t *pl, asn1p_ref_t *gov, char *arg) {
+
+ if(!pl || !arg) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /*
+ * Make sure there's enough space to insert a new element.
+ */
+ if(pl->params_count == pl->params_size) {
+ int newsize = pl->params_size?pl->params_size<<2:4;
+ void *p;
+ p = realloc(pl->params,
+ newsize * sizeof(pl->params[0]));
+ if(p) {
+ pl->params = p;
+ pl->params_size = newsize;
+ } else {
+ return -1;
+ }
+
+ }
+
+ if(gov) {
+ pl->params[pl->params_count].governor = asn1p_ref_clone(gov);
+ if(pl->params[pl->params_count].governor == NULL) {
+ return -1;
+ }
+ } else {
+ pl->params[pl->params_count].governor = 0;
+ }
+
+ pl->params[pl->params_count].argument = strdup(arg);
+ if(pl->params[pl->params_count].argument) {
+ pl->params_count++;
+ return 0;
+ } else {
+ if(pl->params[pl->params_count].governor)
+ asn1p_ref_free(pl->params[pl->params_count].governor);
+ return -1;
+ }
+}
+
+asn1p_paramlist_t *
+asn1p_paramlist_clone(asn1p_paramlist_t *pl) {
+ asn1p_paramlist_t *newpl;
+
+ newpl = asn1p_paramlist_new(pl->_lineno);
+ if(newpl) {
+ int i;
+ for(i = 0; i < pl->params_count; i++) {
+ if(asn1p_paramlist_add_param(newpl,
+ pl->params[i].governor,
+ pl->params[i].argument
+ )) {
+ asn1p_paramlist_free(newpl);
+ newpl = NULL;
+ break;
+ }
+ }
+ }
+
+ return newpl;
+}
+