X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fodr_seq.c;h=137fe343451c5614bffea7c13c2bfd2de678464e;hp=c642ac14201feee7b602dee3e183b4a54f4d49b4;hb=5c1eb188e9cf6f0dd2e435a1f81938f258515edb;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/odr_seq.c b/src/odr_seq.c index c642ac1..137fe34 100644 --- a/src/odr_seq.c +++ b/src/odr_seq.c @@ -1,11 +1,11 @@ -/* - * Copyright (c) 1995-2003, Index Data +/* This file is part of the YAZ toolkit. + * Copyright (C) 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 $ */ - +/** + * \file odr_seq.c + * \brief Implements ODR SEQUENCE codec + */ #if HAVE_CONFIG_H #include #endif @@ -17,22 +17,22 @@ 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) + return 0; + if (o->op->t_class < 0) { - o->t_class = ODR_UNIVERSAL; - o->t_tag = ODR_SEQUENCE; + o->op->t_class = ODR_UNIVERSAL; + o->op->t_tag = ODR_SEQUENCE; } if (o->direction == ODR_DECODE) - *pp = 0; - if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name)) + *pp = 0; + if (odr_constructed_begin(o, p, o->op->t_class, o->op->t_tag, name)) { - if (o->direction == ODR_DECODE && size) - *pp = (char *)odr_malloc(o, size); - return 1; + if (o->direction == ODR_DECODE && size) + *pp = (char *)odr_malloc(o, size); + return 1; } else - return 0; + return 0; } int odr_set_begin(ODR o, void *p, int size, const char *name) @@ -40,32 +40,32 @@ 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) + return 0; + if (o->op->t_class < 0) { - o->t_class = ODR_UNIVERSAL; - o->t_tag = ODR_SET; + o->op->t_class = ODR_UNIVERSAL; + o->op->t_tag = ODR_SET; } if (o->direction == ODR_DECODE) - *pp = 0; - if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name)) + *pp = 0; + if (odr_constructed_begin(o, p, o->op->t_class, o->op->t_tag, name)) { - if (o->direction == ODR_DECODE && size) - *pp = (char *)odr_malloc(o, size); - return 1; + if (o->direction == ODR_DECODE && size) + *pp = (char *)odr_malloc(o, size); + return 1; } else - return 0; + return 0; } int odr_sequence_end(ODR o) { - return odr_constructed_end(o); + return odr_constructed_end(o); } int odr_set_end(ODR o) { - return odr_constructed_end(o); + return odr_constructed_end(o); } static int odr_sequence_more(ODR o) @@ -81,48 +81,42 @@ static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num) 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: + 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: + for (i = 0; i < *num; i++) + { + if (!(*type)(o, *pp + i, 0, 0)) + return 0; + } + break; + default: odr_seterror(o, OOTHER, 47); - return 0; + return 0; } return odr_sequence_end(o); } @@ -130,21 +124,30 @@ static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num) 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; + 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) + const char *name) { if (!odr_sequence_begin(o, p, 0, name)) { - if (o->direction == ODR_DECODE) - *num = 0; - return 0; + if (o->direction == ODR_DECODE) + *num = 0; + return 0; } return odr_sequence_x (o, type, p, num); } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +