aboutsummaryrefslogtreecommitdiffstats
path: root/epan/asn1.c
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2007-08-29 11:44:49 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2007-08-29 11:44:49 +0000
commitc927edea31b292ac9e99df451b21764f1bf89be6 (patch)
tree657e28bb501fde42aa550230f09d2832bbfb4fde /epan/asn1.c
parentf832aaf3b6ab681d15feee18c9c79d0fe52690a8 (diff)
ASN.1 parameterization handling (1st raw implementation)
it is not supported in asn2wrs now, code has to be written manually svn path=/trunk/; revision=22724
Diffstat (limited to 'epan/asn1.c')
-rw-r--r--epan/asn1.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/epan/asn1.c b/epan/asn1.c
index a7cf9ae10b..19038ae7e8 100644
--- a/epan/asn1.c
+++ b/epan/asn1.c
@@ -61,6 +61,89 @@ void asn1_ctx_clean_epdv(asn1_ctx_t *actx) {
actx->embedded_pdv.identification = -1;
}
+
+/*--- stack/parameters ---*/
+
+void asn1_stack_frame_push(asn1_ctx_t *actx, const gchar *name) {
+ asn1_stack_frame_t *frame;
+
+ frame = ep_alloc0(sizeof(asn1_stack_frame_t));
+ frame->name = name;
+ frame->next = actx->stack;
+ actx->stack = frame;
+}
+
+void asn1_stack_frame_pop(asn1_ctx_t *actx, const gchar *name) {
+ DISSECTOR_ASSERT(actx->stack);
+ DISSECTOR_ASSERT(!strcmp(actx->stack->name, name));
+ actx->stack = actx->stack->next;
+}
+
+void asn1_stack_frame_check(asn1_ctx_t *actx, const gchar *name, const asn1_par_def_t *par_def) {
+ const asn1_par_def_t *pd = par_def;
+ asn1_par_t *par;
+
+ DISSECTOR_ASSERT(actx->stack);
+ DISSECTOR_ASSERT(!strcmp(actx->stack->name, name));
+
+ par = actx->stack->par;
+ while (pd->name) {
+ DISSECTOR_ASSERT(par);
+ DISSECTOR_ASSERT((pd->ptype == ASN1_PAR_IRR) || (par->ptype == pd->ptype));
+ par->name = pd->name;
+ pd++;
+ par = par->next;
+ }
+ DISSECTOR_ASSERT(!par);
+}
+
+static asn1_par_t *get_par_by_name(asn1_ctx_t *actx, const gchar *name) {
+ asn1_par_t *par = NULL;
+
+ DISSECTOR_ASSERT(actx->stack);
+ par = actx->stack->par;
+ while (par) {
+ if (!strcmp(par->name, name))
+ return par;
+ par = par->next;
+ }
+ return par;
+}
+
+static asn1_par_t *push_new_par(asn1_ctx_t *actx) {
+ asn1_par_t *par, **pp;
+
+ DISSECTOR_ASSERT(actx->stack);
+
+ par = ep_alloc0(sizeof(asn1_par_t));
+
+ pp = &(actx->stack->par);
+ while (*pp)
+ pp = &((*pp)->next);
+ *pp = par;
+
+ return par;
+}
+
+void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value) {
+ asn1_par_t *par;
+
+ par = push_new_par(actx);
+ par->ptype = ASN1_PAR_INTEGER;
+ par->value.v_integer = value;
+}
+
+gint32 asn1_param_get_integer(asn1_ctx_t *actx, const gchar *name) {
+ asn1_par_t *par = NULL;
+
+ par = get_par_by_name(actx, name);
+ DISSECTOR_ASSERT(par);
+ return par->value.v_integer;
+}
+
+
+/*--- ROSE ---*/
+
void rose_ctx_init(rose_ctx_t *rctx) {
memset(rctx, '\0', sizeof(*rctx));
rctx->signature = ROSE_CTX_SIGNATURE;