X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=data1%2Fd1_marc.c;h=05fbb765bee10e038cef845f2f7257052ff64bc9;hb=1b8e1d7dfece31918056f76819c18675ed6e781e;hp=c6ea5305990d4036034d671f473866c1ea352b75;hpb=6c9fcd3b5d3108702fa1ffc92dab4ab6060f9a19;p=idzebra-moved-to-github.git diff --git a/data1/d1_marc.c b/data1/d1_marc.c index c6ea530..05fbb76 100644 --- a/data1/d1_marc.c +++ b/data1/d1_marc.c @@ -1,5 +1,5 @@ -/* $Id: d1_marc.c,v 1.10 2005-01-15 19:38:18 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: d1_marc.c,v 1.18 2007-04-16 08:44:31 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ /* converts data1 tree to ISO2709/MARC record */ @@ -27,7 +27,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include #include #include #include @@ -44,13 +44,10 @@ data1_marctab *data1_read_marctab (data1_handle dh, const char *file) int argc; if (!(f = data1_path_fopen(dh, file, "r"))) - { - yaz_log(YLOG_WARN|YLOG_ERRNO, "%s", file); return 0; - } res->name = 0; - res->reference = VAL_NONE; + res->oid = 0; res->next = 0; res->length_data_entry = 4; res->length_starting = 5; @@ -84,7 +81,10 @@ data1_marctab *data1_read_marctab (data1_handle dh, const char *file) *argv); continue; } - if ((res->reference = oid_getvalbyname(argv[1])) == VAL_NONE) + res->oid = yaz_string_to_oid_nmem(yaz_oid_std(), + CLASS_TAGSET, argv[1], + mem); + if (!res->oid) { yaz_log(YLOG_WARN, "%s:%d: Unknown tagset reference '%s'", file, lineno, argv[1]); @@ -164,7 +164,7 @@ data1_marctab *data1_read_marctab (data1_handle dh, const char *file) * Locate some data under this node. This routine should handle variants * prettily. */ -static char *get_data(data1_node *n, int *len) +static char *get_data(data1_node *n, int *len, int chop) { char *r; @@ -174,15 +174,21 @@ static char *get_data(data1_node *n, int *len) { int i; *len = n->u.data.len; - - for (i = 0; i<*len; i++) - if (!d1_isspace(n->u.data.data[i])) - break; - while (*len && d1_isspace(n->u.data.data[*len - 1])) - (*len)--; - *len = *len - i; - if (*len > 0) - return n->u.data.data + i; + + if (chop) + { + for (i = 0; i<*len; i++) + if (!d1_isspace(n->u.data.data[i])) + break; + while (*len && d1_isspace(n->u.data.data[*len - 1])) + (*len)--; + *len = *len - i; + if (*len > 0) + return n->u.data.data + i; + } + else + if (*len > 0) + return n->u.data.data; } if (n->which == DATA1N_tag) n = n->child; @@ -265,7 +271,7 @@ static int nodetomarc(data1_handle dh, else if (!strcmp(field->u.tag.tag, "leader")) { int dlen = 0; - char *dbuf = get_data(subf, &dlen); + char *dbuf = get_data(subf, &dlen, 0); if (dlen > 24) dlen = 24; if (dbuf && dlen > 0) @@ -309,8 +315,12 @@ static int nodetomarc(data1_handle dh, for (; subf; subf = subf->next) { if (!control_field) + { + if (marc_xml && subf->which != DATA1N_tag) + continue; /* we skip comments, cdata .. */ len += p->identifier_length; - get_data(subf, &dlen); + } + get_data(subf, &dlen, control_field ? 0 : 1); len += dlen; } } @@ -391,9 +401,9 @@ static int nodetomarc(data1_handle dh, if (!strcmp(xa->name, "ind1")) indicator_data[0] = xa->value[0]; if (!strcmp(xa->name, "ind2")) - indicator_data[1] = xa->value[1]; + indicator_data[1] = xa->value[0]; if (!strcmp(xa->name, "ind3")) - indicator_data[2] = xa->value[2]; + indicator_data[2] = xa->value[0]; } } if (!control_field) @@ -410,14 +420,16 @@ static int nodetomarc(data1_handle dh, const char *identifier = "a"; if (marc_xml) { - if (subf->which == DATA1N_tag && - !strcmp(subf->u.tag.tag, "subfield")) - { - data1_xattr *xa; - for (xa = subf->u.tag.attributes; xa; xa = xa->next) - if (!strcmp(xa->name, "code")) - identifier = xa->value; - } + data1_xattr *xa; + if (subf->which != DATA1N_tag) + continue; + if (strcmp(subf->u.tag.tag, "subfield")) + yaz_log(YLOG_WARN, "Unhandled tag %s", + subf->u.tag.tag); + + for (xa = subf->u.tag.attributes; xa; xa = xa->next) + if (!strcmp(xa->name, "code")) + identifier = xa->value; } else if (subf->which != DATA1N_tag) yaz_log(YLOG_WARN, "Malformed fields for marc output."); @@ -427,7 +439,7 @@ static int nodetomarc(data1_handle dh, memcpy (op + data_p+1, identifier, p->identifier_length-1); data_p += p->identifier_length; } - data = get_data(subf, &dlen); + data = get_data(subf, &dlen, control_field ? 0 : 1); memcpy (op + data_p, data, dlen); data_p += dlen; } @@ -473,3 +485,11 @@ char *data1_nodetomarc(data1_handle dh, data1_marctab *p, data1_node *n, *len = nodetomarc(dh, p, n, selected, buf, size); return *buf; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +