X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fodr-priv.h;h=06d6102781c33b13608b4360b7c642061198b7b4;hp=6aef58b8f61aba837cba3495feeb8e5cdf765234;hb=f1173ed21af445eeecf2acf2df3cbef7dfd61cf0;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/odr-priv.h b/src/odr-priv.h index 6aef58b..06d6102 100644 --- a/src/odr-priv.h +++ b/src/odr-priv.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995-2003, Index Data. + * Copyright (C) 1995-2005, Index Data ApS * * Permission to use, copy, modify, distribute, and sell this software and * its documentation, in whole or in part, for any purpose, is hereby granted, @@ -23,7 +23,12 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * - * $Id: odr-priv.h,v 1.1 2003-10-27 12:21:33 adam Exp $ + * $Id: odr-priv.h,v 1.8 2005-09-09 10:30:35 adam Exp $ + */ + +/** + * \file odr-priv.h + * \brief Internal ODR definitions */ #ifndef ODR_PRIV_H @@ -33,7 +38,8 @@ #include #include -struct Odr_ber_tag { /* used to be statics in ber_tag... */ +/** \brief Utility structure used by ber_tag */ +struct Odr_ber_tag { int lclass; int ltag; int br; @@ -43,18 +49,63 @@ struct Odr_ber_tag { /* used to be statics in ber_tag... */ #define odr_max(o) ((o)->size - ((o)->bp - (o)->buf)) #define odr_offset(o) ((o)->bp - (o)->buf) +/** + * \brief stack for BER constructed items + * + * data structure for con stack.. a little peculiar. Since we can't + * deallocate memory we reuse stack items (popped items gets reused) + * + *\verbatim + * +---+ +---+ +---+ +---+ + * NULL -|p n|-----|p n|-----|p n|-----|p n|-- NULL + * +---+ +---+ +---+ +---+ + * | | + * stack_first stack_top reused item + *\endverbatim + */ +struct odr_constack +{ + const unsigned char *base; /** starting point of data */ + int base_offset; + int len; /** length of data, if known, else -1 + (decoding only) */ + const unsigned char *lenb; /** where to encode length */ + int len_offset; + int lenlen; /** length of length-field */ + const char *name; /** name of stack entry */ + + struct odr_constack *prev; /** pointer back in stack */ + struct odr_constack *next; /** pointer forward */ +}; + +#define ODR_MAX_STACK 2000 + +/** + * \brief ODR private data + */ struct Odr_private { - /* stack for constructed types */ -#define ODR_MAX_STACK 50 - int stackp; /* top of stack (-1 == initial state) */ - odr_constack stack[ODR_MAX_STACK]; + /* stack for constructed types (we above) */ + struct odr_constack *stack_first; /** first member of allocated stack */ + struct odr_constack *stack_top; /** top of stack */ + + + const char **tmp_names_buf; /** array returned by odr_get_element_path */ + int tmp_names_sz; /** size of tmp_names_buf */ + + struct Odr_ber_tag odr_ber_tag; /** used by ber_tag */ - struct Odr_ber_tag odr_ber_tag; yaz_iconv_t iconv_handle; int error_id; char element[80]; + void (*stream_write)(ODR o, void *handle, int type, + const char *buf, int len); + void (*stream_close)(void *handle); }; +#define ODR_STACK_POP(x) (x)->op->stack_top = (x)->op->stack_top->prev +#define ODR_STACK_EMPTY(x) (!(x)->op->stack_top) +#define ODR_STACK_NOT_EMPTY(x) ((x)->op->stack_top) + /* Private macro. * write a single character at the current position - grow buffer if * necessary. @@ -93,3 +144,11 @@ struct Odr_private { ) #endif +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +