From 74582047b4f19d220c6722a85f4651dc742f083f Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 20 Mar 1998 14:45:01 +0000 Subject: [PATCH] Implemented odr_enum and odr_set_of. --- odr/Makefile | 4 ++-- odr/odr_enum.c | 47 ++++++++++++++++++++++++++++++++++++ odr/odr_seq.c | 72 +++++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 odr/odr_enum.c diff --git a/odr/Makefile b/odr/Makefile index 0512fb8..f1a697f 100644 --- a/odr/Makefile +++ b/odr/Makefile @@ -1,7 +1,7 @@ # Copyright (C) 1995-1998, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.27 1998-01-29 13:18:29 adam Exp $ +# $Id: Makefile,v 1.28 1998-03-20 14:45:01 adam Exp $ SHELL=/bin/sh INCLUDE=-I../include -I. @@ -13,7 +13,7 @@ LIBS=-lodr PO = odr_bool.o ber_bool.o ber_len.o ber_tag.o odr_util.o odr_null.o \ ber_null.o odr_int.o ber_int.o odr_tag.o odr_cons.o odr_seq.o\ odr_oct.o ber_oct.o odr_bit.o ber_bit.o odr_oid.o ber_oid.o odr_use.o \ - odr_choice.o odr_any.o ber_any.o odr.o odr_mem.o dumpber.o + odr_choice.o odr_any.o ber_any.o odr.o odr_mem.o dumpber.o odr_enum.o CPP=$(CC) -E RANLIB=ranlib diff --git a/odr/odr_enum.c b/odr/odr_enum.c new file mode 100644 index 0000000..078593d --- /dev/null +++ b/odr/odr_enum.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1995-1998, Index Data + * See the file LICENSE for details. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: odr_enum.c,v $ + * Revision 1.1 1998-03-20 14:45:01 adam + * Implemented odr_enum and odr_set_of. + * + */ + +#include +#include + +/* + * Top level enum en/decoder. + * Returns 1 on success, 0 on error. + */ +int odr_enum(ODR o, int **p, int opt) +{ + int res, cons = 0; + + if (o->error) + return 0; + if (o->t_class < 0) + { + o->t_class = ODR_UNIVERSAL; + o->t_tag = ODR_ENUM; + } + if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0) + return 0; + if (!res) + return opt; + if (o->direction == ODR_PRINT) + { + fprintf(o->print, "%s%d\n", odr_indent(o), **p); + return 1; + } + if (cons) + { + o->error = OPROTO; + return 0; + } + if (o->direction == ODR_DECODE) + *p = (int *)odr_malloc(o, sizeof(int)); + return ber_integer(o, *p); +} diff --git a/odr/odr_seq.c b/odr/odr_seq.c index c03df95..d0f198e 100644 --- a/odr/odr_seq.c +++ b/odr/odr_seq.c @@ -1,10 +1,13 @@ /* - * Copyright (c) 1995-1997, Index Data + * Copyright (c) 1995-1998, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_seq.c,v $ - * Revision 1.22 1998-02-11 11:53:34 adam + * Revision 1.23 1998-03-20 14:45:01 adam + * Implemented odr_enum and odr_set_of. + * + * Revision 1.22 1998/02/11 11:53:34 adam * Changed code so that it compiles as C++. * * Revision 1.21 1997/11/24 11:33:56 adam @@ -32,8 +35,6 @@ * * Revision 1.14 1995/08/15 11:16:39 quinn * Fixed pretty-printers. - * CV:e ---------------------------------------------------------------------- - * CV:e ---------------------------------------------------------------------- * * Revision 1.13 1995/05/22 14:56:57 quinn * Fixed problem in decoding empty sequence. @@ -102,28 +103,50 @@ int odr_sequence_begin(ODR o, void *p, int size) return 0; } +int odr_set_begin(ODR o, void *p, int size) +{ + char **pp = (char**) p; + + if (o->error) + return 0; + if (o->t_class < 0) + { + o->t_class = ODR_UNIVERSAL; + o->t_tag = ODR_SET; + } + if (o->direction == ODR_DECODE) + *pp = 0; + if (odr_constructed_begin(o, p, o->t_class, o->t_tag)) + { + if (o->direction == ODR_DECODE && size) + *pp = (char *)odr_malloc(o, size); + return 1; + } + else + return 0; +} + int odr_sequence_end(ODR o) { return odr_constructed_end(o); } -int odr_sequence_more(ODR o) +int odr_set_end(ODR o) +{ + return odr_constructed_end(o); +} + +static int odr_sequence_more(ODR o) { return odr_constructed_more(o); } -int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) +static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num) { char ***pp = (char***) p; /* for dereferencing */ char **tmp = 0; int size = 0, i; - if (!odr_sequence_begin(o, p, 0)) { - if (o->direction == ODR_DECODE) - *num = 0; - return 0; - } - switch (o->direction) { case ODR_DECODE: @@ -135,8 +158,8 @@ int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) if (*num * (int) sizeof(void*) >= size) { /* double the buffer size */ - tmp = (char **)odr_malloc(o, sizeof(void*) * (size += size ? size : - 128)); + tmp = (char **)odr_malloc(o, sizeof(void*) * + (size += size ? size : 128)); if (*num) { memcpy(tmp, *pp, *num * sizeof(void*)); @@ -171,3 +194,24 @@ int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) } return odr_sequence_end(o); } + +int odr_set_of(ODR o, Odr_fun type, void *p, int *num) +{ + if (!odr_set_begin(o, p, 0)) { + if (o->direction == ODR_DECODE) + *num = 0; + return 0; + } + return odr_sequence_x (o, type, p, num); +} + +int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) +{ + if (!odr_sequence_begin(o, p, 0)) { + if (o->direction == ODR_DECODE) + *num = 0; + return 0; + } + return odr_sequence_x (o, type, p, num); +} + -- 1.7.10.4