X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frecord_conv.c;h=ab5f1732efa5e269178801b919d79dfecdf4d4e4;hb=2dbe1df5facb92bac31b5da0ca2e2e8ee6f9b358;hp=bf148e973d7b9ac2da29bcb917999d9945325561;hpb=ca44977409b92a8b1c7bfbc913a6422edc41d1d5;p=yaz-moved-to-github.git diff --git a/src/record_conv.c b/src/record_conv.c index bf148e9..ab5f173 100644 --- a/src/record_conv.c +++ b/src/record_conv.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 2005-2006, Index Data ApS + * Copyright (C) 2005-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: record_conv.c,v 1.12 2006-12-12 10:41:38 marc 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 @@ -107,7 +108,7 @@ static void yaz_record_conv_reset(yaz_record_conv_t p) yaz_record_conv_t yaz_record_conv_create() { - yaz_record_conv_t p = xmalloc(sizeof(*p)); + yaz_record_conv_t p = (yaz_record_conv_t) xmalloc(sizeof(*p)); p->nmem = nmem_create(); p->wr_error = wrbuf_alloc(); p->rules = 0; @@ -126,7 +127,7 @@ void yaz_record_conv_destroy(yaz_record_conv_t p) { yaz_record_conv_reset(p); nmem_destroy(p->nmem); - wrbuf_free(p->wr_error, 1); + wrbuf_destroy(p->wr_error); xfree(p->path); xfree(p); } @@ -136,7 +137,8 @@ void yaz_record_conv_destroy(yaz_record_conv_t p) static struct yaz_record_conv_rule *add_rule(yaz_record_conv_t p, enum YAZ_RECORD_CONV_RULE type) { - struct yaz_record_conv_rule *r = nmem_malloc(p->nmem, sizeof(*r)); + struct yaz_record_conv_rule *r = (struct yaz_record_conv_rule *) + nmem_malloc(p->nmem, sizeof(*r)); r->which = type; r->next = 0; *p->rules_p = r; @@ -339,10 +341,8 @@ static int conv_marc(yaz_record_conv_t p, const xmlNode *ptr) return 0; } -int yaz_record_conv_configure(yaz_record_conv_t p, const void *ptr_v) +int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) { - const xmlNode *ptr = ptr_v; - yaz_record_conv_reset(p); /* parsing element children */ @@ -371,14 +371,56 @@ int yaz_record_conv_configure(yaz_record_conv_t p, const void *ptr_v) 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); @@ -486,7 +528,7 @@ int yaz_record_conv_record(yaz_record_conv_t p, const char *yaz_record_conv_get_error(yaz_record_conv_t p) { - return wrbuf_buf(p->wr_error); + return wrbuf_cstr(p->wr_error); } void yaz_record_conv_set_path(yaz_record_conv_t p, const char *path)