X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fodr_seq.c;fp=src%2Fodr_seq.c;h=c642ac14201feee7b602dee3e183b4a54f4d49b4;hb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9;hp=0000000000000000000000000000000000000000;hpb=c71d717ada2a9ef730d527f161eb5ba9aa641a9f;p=yaz-moved-to-github.git diff --git a/src/odr_seq.c b/src/odr_seq.c new file mode 100644 index 0000000..c642ac1 --- /dev/null +++ b/src/odr_seq.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1995-2003, Index Data + * See the file LICENSE for details. + * Sebastian Hammer, Adam Dickmeiss + * + * $Id: odr_seq.c,v 1.1 2003-10-27 12:21:34 adam Exp $ + */ + +#if HAVE_CONFIG_H +#include +#endif + +#include "odr-priv.h" + +int odr_sequence_begin(ODR o, void *p, int size, const char *name) +{ + char **pp = (char**) p; + + if (o->error) + return 0; + if (o->t_class < 0) + { + o->t_class = ODR_UNIVERSAL; + o->t_tag = ODR_SEQUENCE; + } + if (o->direction == ODR_DECODE) + *pp = 0; + if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name)) + { + if (o->direction == ODR_DECODE && size) + *pp = (char *)odr_malloc(o, size); + return 1; + } + else + return 0; +} + +int odr_set_begin(ODR o, void *p, int size, const char *name) +{ + 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, name)) + { + 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_set_end(ODR o) +{ + return odr_constructed_end(o); +} + +static int odr_sequence_more(ODR o) +{ + return odr_constructed_more(o); +} + +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; + + switch (o->direction) + { + case ODR_DECODE: + *num = 0; + *pp = (char **)odr_nullval(); + while (odr_sequence_more(o)) + { + /* outgrown array? */ + if (*num * (int) sizeof(void*) >= size) + { + /* double the buffer size */ + tmp = (char **)odr_malloc(o, sizeof(void*) * + (size += size ? size : 128)); + if (*num) + { + memcpy(tmp, *pp, *num * sizeof(void*)); + /* + * For now, we just throw the old *p away, since we use + * nibble memory anyway (disgusting, isn't it?). + */ + } + *pp = tmp; + } + if (!(*type)(o, (*pp) + *num, 0, 0)) + return 0; + (*num)++; + } + break; + case ODR_ENCODE: case ODR_PRINT: +#ifdef ODR_DEBUG + fprintf(stderr, "[seqof: num=%d]", *num); +#endif + for (i = 0; i < *num; i++) + { +#ifdef ODR_DEBUG + fprintf(stderr, "[seqof: elem #%d]", i); +#endif + if (!(*type)(o, *pp + i, 0, 0)) + return 0; + } + break; + default: + odr_seterror(o, OOTHER, 47); + return 0; + } + return odr_sequence_end(o); +} + +int odr_set_of(ODR o, Odr_fun type, void *p, int *num, const char *name) +{ + if (!odr_set_begin(o, p, 0, name)) { + 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, + const char *name) +{ + if (!odr_sequence_begin(o, p, 0, name)) { + if (o->direction == ODR_DECODE) + *num = 0; + return 0; + } + return odr_sequence_x (o, type, p, num); +} +