X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Frecord_conv.c;h=ab5f1732efa5e269178801b919d79dfecdf4d4e4;hp=524171efe91c7cef67cc49af82ab5263e0ca7be8;hb=2979c8fc3b5c53c06facad850dcae09645b43044;hpb=fe507b6b15788a3a8e58063d9dae52532a5229a5 diff --git a/src/record_conv.c b/src/record_conv.c index 524171e..ab5f173 100644 --- a/src/record_conv.c +++ b/src/record_conv.c @@ -2,7 +2,7 @@ * Copyright (C) 2005-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: record_conv.c,v 1.16 2007-05-06 20:12:20 adam Exp $ + * $Id: record_conv.c,v 1.17 2007-12-16 11:08:51 adam Exp $ */ /** * \file record_conv.c @@ -21,6 +21,7 @@ #include #include #include +#include #if YAZ_HAVE_XML2 #include @@ -370,14 +371,56 @@ int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) return 0; } +static int yaz_record_conv_record_rule(yaz_record_conv_t p, + struct yaz_record_conv_rule *r, + const char *input_record_buf, + size_t input_record_len, + WRBUF output_record); + +int yaz_record_conv_opac_record(yaz_record_conv_t p, + Z_OPACRecord *input_record, + WRBUF output_record) +{ + int ret = 0; + struct yaz_record_conv_rule *r = p->rules; + WRBUF res = wrbuf_alloc(); + yaz_marc_t mt = yaz_marc_create(); + + wrbuf_rewind(p->wr_error); + yaz_marc_xml(mt, r->u.marc.output_format); + if (r->u.marc.iconv_t) + yaz_marc_iconv(mt, r->u.marc.iconv_t); + yaz_opac_decode_wrbuf(mt, input_record, res); + if (ret != -1) + { + ret = yaz_record_conv_record_rule(p, + r->next, + wrbuf_buf(res), wrbuf_len(res), + output_record); + } + yaz_marc_destroy(mt); + wrbuf_destroy(res); + return ret; +} + int yaz_record_conv_record(yaz_record_conv_t p, const char *input_record_buf, size_t input_record_len, WRBUF output_record) { + return yaz_record_conv_record_rule(p, p->rules, + input_record_buf, + input_record_len, output_record); +} + +static int yaz_record_conv_record_rule(yaz_record_conv_t p, + struct yaz_record_conv_rule *r, + const char *input_record_buf, + size_t input_record_len, + WRBUF output_record) +{ int ret = 0; WRBUF record = output_record; /* pointer transfer */ - struct yaz_record_conv_rule *r = p->rules; wrbuf_rewind(p->wr_error); wrbuf_write(record, input_record_buf, input_record_len);