X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcopy_types.c;h=9062d866b7bc11e872c61414905627c2a34a1c1c;hp=1f561e6caa0d02c43f610901b6831e1399ba3984;hb=935b1ba0c2c3dc480b0afcb3673abe2ef2dd893f;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7 diff --git a/src/copy_types.c b/src/copy_types.c index 1f561e6..9062d86 100644 --- a/src/copy_types.c +++ b/src/copy_types.c @@ -1,64 +1,81 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ - /** \file copy_types.c \brief Copies various Z39.50 types */ +#if HAVE_CONFIG_H +#include +#endif +#include #include +/** macro clone_z_type copies a given ASN.1 type */ +#define clone_z_type(x) \ +Z_##x *yaz_clone_z_##x(Z_##x *q, NMEM nmem_out) \ +{ \ + Z_##x *q1 = 0; \ + ODR enc = odr_createmem(ODR_ENCODE); \ + ODR dec = odr_createmem(ODR_DECODE); \ + if (z_##x(enc, &q, 0, 0)) \ + { \ + int len; \ + char *buf = odr_getbuf(enc, &len, 0); \ + if (buf) \ + { \ + odr_setbuf(dec, buf, len, 0); \ + z_##x(dec, &q1, 0, 0); \ + nmem_transfer(nmem_out, dec->mem); \ + } \ + } \ + odr_destroy(enc); \ + odr_destroy(dec); \ + return q1; \ +} \ +int yaz_compare_z_##x(Z_##x *a, Z_##x *b) \ +{ \ + int ret = 0; \ + ODR o_a = odr_createmem(ODR_ENCODE); \ + ODR o_b = odr_createmem(ODR_ENCODE); \ + int r_a = z_##x(o_a, &a, 1, 0); \ + int r_b = z_##x(o_b, &b, 1, 0); \ + if (r_a && r_b) \ + { \ + int len_a, len_b; \ + char *buf_a = odr_getbuf(o_a, &len_a, 0); \ + char *buf_b = odr_getbuf(o_b, &len_b, 0); \ + if (buf_a && buf_b && len_a == len_b && !memcmp(buf_a, buf_b, len_a)) \ + ret = 1; \ + else if (!buf_a && !buf_b) \ + ret = 1; \ + } \ + odr_destroy(o_a); \ + odr_destroy(o_b); \ + return ret; \ +} + +clone_z_type(NamePlusRecord) +clone_z_type(RPNQuery) +clone_z_type(Query) +clone_z_type(RecordComposition) +clone_z_type(OtherInformation) + Z_RPNQuery *yaz_copy_z_RPNQuery(Z_RPNQuery *q, ODR out) { - Z_RPNQuery *q1 = 0; - ODR enc = odr_createmem(ODR_ENCODE); - ODR dec = odr_createmem(ODR_DECODE); - if (!z_RPNQuery(enc, &q, 0, 0)) - return 0; - else - { - int len; - char *buf = odr_getbuf(enc, &len, 0); - if (buf) - { - odr_setbuf(dec, buf, len, 0); - z_RPNQuery(dec, &q1, 0, 0); - nmem_transfer(out->mem, dec->mem); - } - } - odr_destroy(enc); - odr_destroy(dec); - return q1; + return yaz_clone_z_RPNQuery(q, out->mem); } Z_Query *yaz_copy_Z_Query(Z_Query *q, ODR out) { - Z_Query *q1 = 0; - ODR enc = odr_createmem(ODR_ENCODE); - ODR dec = odr_createmem(ODR_DECODE); - if (!z_Query(enc, &q, 0, 0)) - return 0; - else - { - int len; - char *buf = odr_getbuf(enc, &len, 0); - if (buf) - { - odr_setbuf(dec, buf, len, 0); - z_Query(dec, &q1, 0, 0); - nmem_transfer(out->mem, dec->mem); - } - } - odr_destroy(enc); - odr_destroy(dec); - return q1; + return yaz_clone_z_Query(q, out->mem); } - /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab