aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1parser/asn1p_class.c
diff options
context:
space:
mode:
Diffstat (limited to 'libasn1parser/asn1p_class.c')
-rw-r--r--libasn1parser/asn1p_class.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/libasn1parser/asn1p_class.c b/libasn1parser/asn1p_class.c
new file mode 100644
index 00000000..cd0e385a
--- /dev/null
+++ b/libasn1parser/asn1p_class.c
@@ -0,0 +1,135 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "asn1parser.h"
+
+asn1p_wsyntx_chunk_t *
+asn1p_wsyntx_chunk_new() {
+ asn1p_wsyntx_chunk_t *wc;
+
+ wc = calloc(1, sizeof(*wc));
+
+ return wc;
+}
+
+void
+asn1p_wsyntx_chunk_free(asn1p_wsyntx_chunk_t *wc) {
+ if(wc) {
+ if(wc->ref)
+ asn1p_ref_free(wc->ref);
+ if(wc->buf)
+ free(wc->buf);
+ free(wc);
+ }
+}
+
+asn1p_wsyntx_chunk_t *
+asn1p_wsyntx_chunk_clone(asn1p_wsyntx_chunk_t *wc) {
+ asn1p_wsyntx_chunk_t *nc;
+
+ nc = asn1p_wsyntx_chunk_new();
+ if(nc) {
+ if(wc->buf) {
+ nc->buf = malloc(wc->len + 1);
+ if(nc->buf) {
+ nc->len = wc->len;
+ memcpy(nc->buf, wc->buf, wc->len);
+ nc->buf[nc->len] = '\0';
+ }
+ }
+ if(wc->ref) {
+ nc->ref = asn1p_ref_clone(wc->ref);
+ }
+
+ if(!nc->ref && !nc->buf) {
+ asn1p_wsyntx_chunk_free(nc);
+ return NULL;
+ }
+ }
+
+ return nc;
+}
+
+asn1p_wsyntx_t *
+asn1p_wsyntx_new() {
+ asn1p_wsyntx_t *wx;
+
+ wx = calloc(1, sizeof(*wx));
+ if(wx) {
+ TQ_INIT(&(wx->chunks));
+ }
+
+ return wx;
+}
+
+void
+asn1p_wsyntx_free(asn1p_wsyntx_t *wx) {
+ if(wx) {
+ asn1p_wsyntx_chunk_t *wc;
+ while((wc = TQ_REMOVE(&(wx->chunks), next)))
+ asn1p_wsyntx_chunk_free(wc);
+ free(wx);
+ }
+}
+
+asn1p_wsyntx_t *
+asn1p_wsyntx_clone(asn1p_wsyntx_t *wx) {
+ asn1p_wsyntx_t *nw;
+
+ nw = asn1p_wsyntx_new();
+ if(nw) {
+ asn1p_wsyntx_chunk_t *wc;
+ asn1p_wsyntx_chunk_t *nc;
+ TQ_FOR(wc, &(wx->chunks), next) {
+ nc = asn1p_wsyntx_chunk_clone(wc);
+ if(nc) {
+ TQ_ADD(&(nw->chunks), nc, next);
+ } else {
+ asn1p_wsyntx_free(nw);
+ return NULL;
+ }
+ }
+ }
+
+ return nw;
+}
+
+asn1p_wsyntx_chunk_t *
+asn1p_wsyntx_chunk_fromref(asn1p_ref_t *ref, int do_copy) {
+ asn1p_wsyntx_chunk_t *wc;
+
+ if(do_copy) {
+ static asn1p_wsyntx_chunk_t tmp;
+ tmp.ref = ref;
+ wc = asn1p_wsyntx_chunk_clone(&tmp);
+ } else {
+ wc = asn1p_wsyntx_chunk_new();
+ if(wc) wc->ref = ref;
+ }
+
+ return wc;
+}
+
+asn1p_wsyntx_chunk_t *
+asn1p_wsyntx_chunk_frombuf(char *buf, int len, int do_copy) {
+ asn1p_wsyntx_chunk_t *wc;
+
+ if(do_copy) {
+ static asn1p_wsyntx_chunk_t tmp;
+ tmp.buf = buf;
+ tmp.len = len;
+ wc = asn1p_wsyntx_chunk_clone(&tmp);
+ } else {
+ wc = asn1p_wsyntx_chunk_new();
+ if(wc) {
+ wc->buf = buf;
+ wc->len = len;
+ }
+ }
+
+ return wc;
+}
+