X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fodr_seq.c;h=a500773a3a2189ed909e2496b0de91a6a6370526;hp=7d41c108817404bd1f59b33e33ddd9487ef9b49f;hb=11af92513c72d3eb1e618e658b9418a42f4a630f;hpb=4c176312acdc3444c9afc820f76a393e64668e52 diff --git a/src/odr_seq.c b/src/odr_seq.c index 7d41c10..a500773 100644 --- a/src/odr_seq.c +++ b/src/odr_seq.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. - * - * $Id: odr_seq.c,v 1.3 2005-01-15 19:47:14 adam Exp $ */ /** * \file odr_seq.c @@ -19,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) @@ -42,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) @@ -83,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); } @@ -132,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 + */ +