#include #include #include #include #include #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; }