|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* modsin.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2004-2018
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Source code released under the GPL version 2
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
#include <stdio.h>
|
|
Packit |
89ede9 |
#include <stdlib.h>
|
|
Packit |
89ede9 |
#include <string.h>
|
|
Packit |
89ede9 |
#include <ctype.h>
|
|
Packit |
89ede9 |
#include "is_ws.h"
|
|
Packit |
89ede9 |
#include "str.h"
|
|
Packit |
89ede9 |
#include "str_conv.h"
|
|
Packit |
89ede9 |
#include "xml.h"
|
|
Packit |
89ede9 |
#include "xml_encoding.h"
|
|
Packit |
89ede9 |
#include "fields.h"
|
|
Packit |
89ede9 |
#include "name.h"
|
|
Packit |
89ede9 |
#include "reftypes.h"
|
|
Packit |
89ede9 |
#include "modstypes.h"
|
|
Packit |
89ede9 |
#include "bu_auth.h"
|
|
Packit |
89ede9 |
#include "marc_auth.h"
|
|
Packit |
89ede9 |
#include "url.h"
|
|
Packit |
89ede9 |
#include "iso639_1.h"
|
|
Packit |
89ede9 |
#include "iso639_2.h"
|
|
Packit |
89ede9 |
#include "iso639_3.h"
|
|
Packit |
89ede9 |
#include "bibutils.h"
|
|
Packit |
89ede9 |
#include "bibformats.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int modsin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset );
|
|
Packit |
89ede9 |
static int modsin_processf( fields *medin, char *data, char *filename, long nref, param *p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: void modsin_initparams()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
modsin_initparams( param *p, const char *progname )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p->readformat = BIBL_MODSIN;
|
|
Packit |
89ede9 |
p->format_opts = 0;
|
|
Packit |
89ede9 |
p->charsetin = BIBL_CHARSET_UNICODE;
|
|
Packit |
89ede9 |
p->charsetin_src = BIBL_SRC_DEFAULT;
|
|
Packit |
89ede9 |
p->latexin = 0;
|
|
Packit |
89ede9 |
p->utf8in = 1;
|
|
Packit |
89ede9 |
p->xmlin = 1;
|
|
Packit |
89ede9 |
p->nosplittitle = 0;
|
|
Packit |
89ede9 |
p->verbose = 0;
|
|
Packit |
89ede9 |
p->addcount = 0;
|
|
Packit |
89ede9 |
p->singlerefperfile = 0;
|
|
Packit |
89ede9 |
p->output_raw = BIBL_RAW_WITHMAKEREFID |
|
|
Packit |
89ede9 |
BIBL_RAW_WITHCHARCONVERT;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p->readf = modsin_readf;
|
|
Packit |
89ede9 |
p->processf = modsin_processf;
|
|
Packit |
89ede9 |
p->cleanf = NULL;
|
|
Packit |
89ede9 |
p->typef = NULL;
|
|
Packit |
89ede9 |
p->convertf = NULL;
|
|
Packit |
89ede9 |
p->all = NULL;
|
|
Packit |
89ede9 |
p->nall = 0;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_init( &(p->asis) );
|
|
Packit |
89ede9 |
slist_init( &(p->corps) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !progname ) p->progname = NULL;
|
|
Packit |
89ede9 |
else p->progname = strdup( progname );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: int modsin_processf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static char modsns[]="mods";
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_detailr( xml *node, str *value )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
if ( value->len ) str_addchar( value, ' ' );
|
|
Packit |
89ede9 |
str_strcat( value, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( value ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_detailr( node->down, value );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next )
|
|
Packit |
89ede9 |
status = modsin_detailr( node->next, value );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_detail( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str type, value, *tp;
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
strs_init( &type, &value, NULL );
|
|
Packit |
89ede9 |
tp = xml_attribute( node, "type" );
|
|
Packit |
89ede9 |
if ( tp ) {
|
|
Packit |
89ede9 |
str_strcpy( &type, tp );
|
|
Packit |
89ede9 |
str_toupper( &type );
|
|
Packit |
89ede9 |
if ( str_memerr( &type ) ) goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
status = modsin_detailr( node->down, &value );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
if ( type.data && !strcasecmp( type.data, "PAGE" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PAGES:START", value.data, level );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, type.data, value.data, level );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &type, &value, NULL );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_date( xml *node, fields *info, int level, int part )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
char *tag, *p;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p = xml_value_cstr( node );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( p ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p = str_cpytodelim( &s, skip_ws( p ), "-", 1 );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
tag = ( part ) ? "PARTDATE:YEAR" : "DATE:YEAR";
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p = str_cpytodelim( &s, skip_ws( p ), "-", 1 );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
tag = ( part ) ? "PARTDATE:MONTH" : "DATE:MONTH";
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
(void) str_cpytodelim( &s, skip_ws( p ), "", 0 );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
tag = ( part ) ? "PARTDATE:DAY" : "DATE:DAY";
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_pager( xml *node, str *sp, str *ep, str *tp, str *lp )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "start" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( sp, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( sp ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "end" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( ep, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( ep ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "total" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( tp, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( tp ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "list" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( lp, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( lp ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_pager( node->down, sp, ep, tp, lp );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next )
|
|
Packit |
89ede9 |
status = modsin_pager( node->next, sp, ep, tp, lp );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_page( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str sp, ep, tp, lp;
|
|
Packit |
89ede9 |
xml *dnode = node->down;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !dnode ) return BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_init( &sp, &ep, &tp, &lp, NULL );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = modsin_pager( dnode, &sp, &ep, &tp, &lp );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &sp ) || str_has_value( &ep ) ) {
|
|
Packit |
89ede9 |
if ( str_has_value( &sp ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PAGES:START", str_cstr( &sp ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &ep ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PAGES:STOP", str_cstr( &ep ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else if ( str_has_value( &lp ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PAGES:START", str_cstr( &lp ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &tp ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PAGES:TOTAL", str_cstr( &tp ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &sp, &ep, &tp, &lp, NULL );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_titler( xml *node, str *title, str *subtitle )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "title" ) ) {
|
|
Packit |
89ede9 |
if ( str_has_value( title ) ) str_strcatc( title, " : " );
|
|
Packit |
89ede9 |
str_strcat( title, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( title ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "subTitle" ) ) {
|
|
Packit |
89ede9 |
str_strcat( subtitle, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( subtitle ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_titler( node->down, title, subtitle );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next )
|
|
Packit |
89ede9 |
status = modsin_titler( node->next, title, subtitle );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_title( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *titletag[2][2] = {
|
|
Packit |
89ede9 |
{ "TITLE", "SHORTTITLE" },
|
|
Packit |
89ede9 |
{ "SUBTITLE", "SHORTSUBTITLE" },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str title, subtitle;
|
|
Packit |
89ede9 |
xml *dnode;
|
|
Packit |
89ede9 |
int abbr;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
dnode = node->down;
|
|
Packit |
89ede9 |
if ( !dnode ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_init( &title, &subtitle, NULL );
|
|
Packit |
89ede9 |
abbr = xml_tag_has_attribute( node, "titleInfo", "type", "abbreviated" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = modsin_titler( dnode, &title, &subtitle );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &title ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, titletag[0][abbr], str_cstr( &title ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &subtitle ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, titletag[1][abbr], str_cstr( &subtitle ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &title, &subtitle, NULL );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* modsin_marcrole_convert()
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Map MARC-authority roles for people or organizations associated
|
|
Packit |
89ede9 |
* with a reference to internal roles.
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Take input strings with roles separated by '|' characters, e.g.
|
|
Packit |
89ede9 |
* "author" or "author|creator" or "edt" or "editor|edt".
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_marcrole_convert( str *s, char *suffix, str *out )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, sstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
slist tokens;
|
|
Packit |
89ede9 |
char *p;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_init( &tokens );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...default to author on an empty string */
|
|
Packit |
89ede9 |
if ( str_is_empty( s ) ) {
|
|
Packit |
89ede9 |
str_strcpyc( out, "AUTHOR" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
sstatus = slist_tokenize( &tokens, s, "|", 1 );
|
|
Packit |
89ede9 |
if ( sstatus!=SLIST_OK ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto done;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
/* ...take first match */
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
p = marc_convertrole( slist_cstr( &tokens, i ) );
|
|
Packit |
89ede9 |
if ( p ) {
|
|
Packit |
89ede9 |
str_strcpyc( out, p );
|
|
Packit |
89ede9 |
goto done;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
/* ...otherwise just copy input */
|
|
Packit |
89ede9 |
str_strcpy( out, slist_str( &tokens, 0 ) );
|
|
Packit |
89ede9 |
str_toupper( out );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
done:
|
|
Packit |
89ede9 |
if ( suffix ) str_strcatc( out, suffix );
|
|
Packit |
89ede9 |
slist_free( &tokens );
|
|
Packit |
89ede9 |
if ( str_memerr( out ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_asis_corp_r( xml *node, str *name, str *role )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "namePart" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( name, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( name ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "roleTerm" ) ) {
|
|
Packit |
89ede9 |
if ( role->len ) str_addchar( role, '|' );
|
|
Packit |
89ede9 |
str_strcat( role, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( role ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_asis_corp_r( node->down, name, role );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next )
|
|
Packit |
89ede9 |
status = modsin_asis_corp_r( node->next, name, role );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_asis_corp( xml *node, fields *info, int level, char *suffix )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str name, roles, role_out;
|
|
Packit |
89ede9 |
xml *dnode = node->down;
|
|
Packit |
89ede9 |
if ( dnode ) {
|
|
Packit |
89ede9 |
strs_init( &name, &roles, &role_out, NULL );
|
|
Packit |
89ede9 |
status = modsin_asis_corp_r( dnode, &name, &roles );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
status = modsin_marcrole_convert( &roles, suffix, &role_out );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
fstatus = fields_add( info, str_cstr( &role_out ), str_cstr( &name ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &name, &roles, &role_out, NULL );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_roler( xml *node, str *roles )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
if ( roles->len ) str_addchar( roles, '|' );
|
|
Packit |
89ede9 |
str_strcat( roles, xml_value( node ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_memerr( roles ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
else return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_personr( xml *node, str *familyname, str *givenname, str *suffix )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !xml_has_value( node ) ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, "namePart", "type", "family" ) ) {
|
|
Packit |
89ede9 |
if ( str_has_value( familyname ) ) str_addchar( familyname, ' ' );
|
|
Packit |
89ede9 |
str_strcat( familyname, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( familyname ) ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "namePart", "type", "suffix" ) ||
|
|
Packit |
89ede9 |
xml_tag_has_attribute( node, "namePart", "type", "termsOfAddress" ) ) {
|
|
Packit |
89ede9 |
if ( str_has_value( suffix ) ) str_addchar( suffix, ' ' );
|
|
Packit |
89ede9 |
str_strcat( suffix, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( suffix ) ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "namePart", "type", "date" ) ) {
|
|
Packit |
89ede9 |
/* no nothing */
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( str_has_value( givenname ) ) str_addchar( givenname, '|' );
|
|
Packit |
89ede9 |
str_strcat( givenname, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( givenname ) ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_person( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str familyname, givenname, name, suffix, roles, role_out;
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
xml *dnode, *rnode;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
dnode = node->down;
|
|
Packit |
89ede9 |
if ( !dnode ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_init( &name, &familyname, &givenname, &suffix, &roles, &role_out, NULL );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
while ( dnode ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_matches( dnode, "namePart" ) ) {
|
|
Packit |
89ede9 |
status = modsin_personr( dnode, &familyname, &givenname, &suffix );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( dnode, "role" ) ) {
|
|
Packit |
89ede9 |
rnode = dnode->down;
|
|
Packit |
89ede9 |
while ( rnode ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( rnode, "roleTerm" ) ) {
|
|
Packit |
89ede9 |
status = modsin_roler( rnode, &roles );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
rnode = rnode->next;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
dnode = dnode->next;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* Handle:
|
|
Packit |
89ede9 |
* <namePart type='given'>Noah A.</namePart>
|
|
Packit |
89ede9 |
* <namePart type='family'>Smith</namePart>
|
|
Packit |
89ede9 |
* without mangling the order of "Noah A."
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
if ( str_has_value( &familyname ) ) {
|
|
Packit |
89ede9 |
str_strcpy( &name, &familyname );
|
|
Packit |
89ede9 |
if ( givenname.len ) {
|
|
Packit |
89ede9 |
str_addchar( &name, '|' );
|
|
Packit |
89ede9 |
str_strcat( &name, &givenname );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* Handle:
|
|
Packit |
89ede9 |
* <namePart>Noah A. Smith</namePart>
|
|
Packit |
89ede9 |
* with name order mangling.
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( str_has_value( &givenname ) )
|
|
Packit |
89ede9 |
name_parse( &name, &givenname, NULL, NULL );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &suffix ) ) {
|
|
Packit |
89ede9 |
str_strcatc( &name, "||" );
|
|
Packit |
89ede9 |
str_strcat( &name, &suffix );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &name ) ) {
|
|
Packit |
89ede9 |
status=BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = modsin_marcrole_convert( &roles, NULL, &role_out );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add_can_dup( info, str_cstr( &role_out ), str_cstr( &name ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &name, &familyname, &givenname, &suffix, &roles, &role_out, NULL );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_placeterm_text( xml *node, fields *info, int level, int school )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char address_tag[] = "ADDRESS";
|
|
Packit |
89ede9 |
char school_tag[] = "SCHOOL";
|
|
Packit |
89ede9 |
char *tag;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
tag = ( school ) ? school_tag : address_tag;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_placeterm_code( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str s, *auth;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
auth = xml_attribute( node, "authority" );
|
|
Packit |
89ede9 |
if ( auth && auth->len ) {
|
|
Packit |
89ede9 |
str_strcpy( &s, auth );
|
|
Packit |
89ede9 |
str_addchar( &s, '|' );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_strcat( &s, xml_value( node ) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "CODEDADDRESS", str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_placeterm( xml *node, fields *info, int level, int school )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
str *type;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
type = xml_attribute( node, "type" );
|
|
Packit |
89ede9 |
if ( str_has_value( type ) ) {
|
|
Packit |
89ede9 |
if ( !strcmp( str_cstr( type ), "text" ) )
|
|
Packit |
89ede9 |
status = modsin_placeterm_text( node, info, level, school );
|
|
Packit |
89ede9 |
else if ( !strcmp( str_cstr( type ), "code" ) )
|
|
Packit |
89ede9 |
status = modsin_placeterm_code( node, info, level );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_placer( xml *node, fields *info, int level, int school )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, "place", "type", "school" ) ) {
|
|
Packit |
89ede9 |
school = 1;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "placeTerm" ) ) {
|
|
Packit |
89ede9 |
status = modsin_placeterm( node, info, level, school );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_placer( node->down, info, level, school );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_placer( node->next, info, level, school );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_origininfor( xml *node, fields *info, int level, str *pub, str *add, str *addc, str *ed, str *iss )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "dateIssued" ) ) {
|
|
Packit |
89ede9 |
status = modsin_date( node, info, level, 0 );
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "place" ) ) {
|
|
Packit |
89ede9 |
status = modsin_placer( node, info, level, 0 );
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "publisher" ) ) {
|
|
Packit |
89ede9 |
str_strcat( pub, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( pub ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "edition" ) ) {
|
|
Packit |
89ede9 |
str_strcat( ed, xml_value( node ) );
|
|
Packit |
89ede9 |
if( str_memerr( ed ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches_has_value( node, "issuance" ) ) {
|
|
Packit |
89ede9 |
str_strcat( iss, xml_value( node ) );
|
|
Packit |
89ede9 |
if ( str_memerr( iss ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_origininfor( node->down, info, level, pub, add, addc, ed, iss );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->next )
|
|
Packit |
89ede9 |
status = modsin_origininfor( node->next, info, level, pub, add, addc, ed, iss );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_origininfo( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str publisher, address, addcode, edition, issuance;
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
strs_init( &publisher, &address, &addcode, &edition, &issuance, NULL );
|
|
Packit |
89ede9 |
status = modsin_origininfor( node->down, info, level, &publisher,
|
|
Packit |
89ede9 |
&address, &addcode, &edition, &issuance );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
if ( str_has_value( &publisher ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PUBLISHER", str_cstr( &publisher ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status=BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &address ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "ADDRESS", str_cstr( &address ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status=BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &addcode ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "CODEDADDRESS", str_cstr( &addcode ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status=BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &edition ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "EDITION", str_cstr( &edition ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status=BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &issuance ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "ISSUANCE", str_cstr( &issuance ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status=BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &publisher, &address, &addcode, &edition, &issuance, NULL );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_subjectr( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, "topic", "class", "primary" ) && xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "EPRINTCLASS", xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( xml_tag_matches_has_value( node, "topic" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "KEYWORD", xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( xml_tag_matches_has_value( node, "geographic" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "KEYWORD", xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_subjectr( node->down, info, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_subjectr( node->next, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_subject( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_subjectr( node->down, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_id1( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
str *ns;
|
|
Packit |
89ede9 |
ns = xml_attribute( node, "ID" );
|
|
Packit |
89ede9 |
if ( str_has_value( ns ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "REFNUM", str_cstr( ns ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* modsin_genre()
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* MARC authority terms tagged with "GENRE:MARC"
|
|
Packit |
89ede9 |
* bibutils authority terms tagged with "GENRE:BIBUTILS"
|
|
Packit |
89ede9 |
* unknown terms tagged with "GENRE:UNKNOWN"
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_genre( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
char *d;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !xml_has_value( node ) ) return BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
d = xml_value_cstr( node );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...handle special genres in KTH DivA */
|
|
Packit |
89ede9 |
if ( !strcmp( d, "conferenceProceedings" ) || !strcmp( d, "conferencePaper" ) )
|
|
Packit |
89ede9 |
d = "conference publication";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "artisticOutput" ) || !strcmp( d, "other" ) )
|
|
Packit |
89ede9 |
d = "miscellaneous";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "studentThesis" ) )
|
|
Packit |
89ede9 |
d = "thesis";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "monographDoctoralThesis" ) )
|
|
Packit |
89ede9 |
d = "Ph.D. thesis";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "comprehensiveDoctoralThesis" ) )
|
|
Packit |
89ede9 |
d = "Ph.D. thesis";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "monographLicentiateThesis" ) )
|
|
Packit |
89ede9 |
d = "Licentiate thesis";
|
|
Packit |
89ede9 |
else if ( !strcmp( d, "comprehensiveLicentiateThesis" ) )
|
|
Packit |
89ede9 |
d = "Licentiate thesis";
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( is_marc_genre( d ) )
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "GENRE:MARC", d, level );
|
|
Packit |
89ede9 |
else if ( is_bu_genre( d ) )
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "GENRE:BIBUTILS", d, level );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "GENRE:UNKNOWN", d, level );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
else return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* in MODS version 3.5
|
|
Packit |
89ede9 |
* <languageTerm type="text">....</languageTerm>
|
|
Packit |
89ede9 |
* <languageTerm type="code" authority="xxx">...</languageTerm>
|
|
Packit |
89ede9 |
* xxx = rfc3066
|
|
Packit |
89ede9 |
* xxx = iso639-2b
|
|
Packit |
89ede9 |
* xxx = iso639-3
|
|
Packit |
89ede9 |
* xxx = rfc4646
|
|
Packit |
89ede9 |
* xxx = rfc5646
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_languager( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
char *d = NULL;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "languageTerm" ) ) {
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
if ( xml_has_attribute( node, "type", "code" ) ) {
|
|
Packit |
89ede9 |
if ( xml_has_attribute( node, "authority", "iso639-1" ) )
|
|
Packit |
89ede9 |
d = iso639_1_from_code( xml_value_cstr( node ) );
|
|
Packit |
89ede9 |
else if ( xml_has_attribute( node, "authority", "iso639-2b" ) )
|
|
Packit |
89ede9 |
d = iso639_2_from_code( xml_value_cstr( node ) );
|
|
Packit |
89ede9 |
else if ( xml_has_attribute( node, "authority", "iso639-3" ))
|
|
Packit |
89ede9 |
d = iso639_3_from_code( xml_value_cstr( node ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( !d ) d = xml_value_cstr( node );
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "LANGUAGE", d, level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_languager( node->next, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_language( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
/* Old versions of MODS had <language>English</language> */
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "LANGUAGE", xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* New versions of MODS have <language><languageTerm>English</languageTerm></language> */
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_languager( node->down, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_simple( xml *node, fields *info, char *tag, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_locationr( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
char *url = "URL";
|
|
Packit |
89ede9 |
char *fileattach = "FILEATTACH";
|
|
Packit |
89ede9 |
char *tag=NULL;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "url" ) ) {
|
|
Packit |
89ede9 |
if ( xml_has_attribute( node, "access", "raw object" ) )
|
|
Packit |
89ede9 |
tag = fileattach;
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
tag = url;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "physicalLocation" ) ) {
|
|
Packit |
89ede9 |
if ( xml_has_attribute( node, "type", "school" ) )
|
|
Packit |
89ede9 |
tag = "SCHOOL";
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
tag = "LOCATION";
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( tag == url ) {
|
|
Packit |
89ede9 |
status = urls_split_and_add( xml_value_cstr( node ), info, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( tag ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_locationr( node->down, info, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_locationr( node->next, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_location( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_locationr( node->down, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_descriptionr( xml *node, str *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "extent" ) ||
|
|
Packit |
89ede9 |
xml_tag_matches( node, "note" ) ) {
|
|
Packit |
89ede9 |
str_strcpy( s, &(node->value) );
|
|
Packit |
89ede9 |
if ( str_memerr( s ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_descriptionr( node->down, s );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_descriptionr( node->next, s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_description( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_descriptionr( node->down, &s );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
if ( node->value.len > 0 )
|
|
Packit |
89ede9 |
str_strcpy( &s, &(node->value) );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "DESCRIPTION", str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_partr( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "detail" ) )
|
|
Packit |
89ede9 |
status = modsin_detail( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "extent", "unit", "page" ) )
|
|
Packit |
89ede9 |
status = modsin_page( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "extent", "unit", "pages" ) )
|
|
Packit |
89ede9 |
status = modsin_page( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "date" ) )
|
|
Packit |
89ede9 |
status = modsin_date( node, info, level, 1 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_partr( node->next, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_part( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( node->down ) return modsin_partr( node->down, info, level );
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <classification authority="lcc">Q3 .A65</classification> */
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_classification( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
char *tag;
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, "classification", "authority", "lcc" ) )
|
|
Packit |
89ede9 |
tag = "LCC";
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
tag = "CLASSIFICATION";
|
|
Packit |
89ede9 |
fstatus = fields_add( info, tag, xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_classification( node->down, info, level );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_recordinfo( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
xml *curr;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* extract recordIdentifier */
|
|
Packit |
89ede9 |
curr = node;
|
|
Packit |
89ede9 |
while ( curr ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( curr, "recordIdentifier" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "REFNUM", xml_value_cstr( curr ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
curr = curr->next;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_identifier( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
convert ids[] = {
|
|
Packit |
89ede9 |
{ "citekey", "REFNUM", 0, 0 },
|
|
Packit |
89ede9 |
{ "issn", "ISSN", 0, 0 },
|
|
Packit |
89ede9 |
{ "coden", "CODEN", 0, 0 },
|
|
Packit |
89ede9 |
{ "isbn", "ISBN", 0, 0 },
|
|
Packit |
89ede9 |
{ "doi", "DOI", 0, 0 },
|
|
Packit |
89ede9 |
{ "url", "URL", 0, 0 },
|
|
Packit |
89ede9 |
{ "uri", "URL", 0, 0 },
|
|
Packit |
89ede9 |
{ "pmid", "PMID", 0, 0 },
|
|
Packit |
89ede9 |
{ "pubmed", "PMID", 0, 0 },
|
|
Packit |
89ede9 |
{ "medline", "MEDLINE", 0, 0 },
|
|
Packit |
89ede9 |
{ "pmc", "PMC", 0, 0 },
|
|
Packit |
89ede9 |
{ "arXiv", "ARXIV", 0, 0 },
|
|
Packit |
89ede9 |
{ "MRnumber", "MRNUMBER", 0, 0 },
|
|
Packit |
89ede9 |
{ "pii", "PII", 0, 0 },
|
|
Packit |
89ede9 |
{ "isi", "ISIREFNUM", 0, 0 },
|
|
Packit |
89ede9 |
{ "serial number", "SERIALNUMBER",0, 0 },
|
|
Packit |
89ede9 |
{ "accessnum", "ACCESSNUM", 0, 0 },
|
|
Packit |
89ede9 |
{ "jstor", "JSTOR", 0, 0 },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int i, fstatus, n = sizeof( ids ) / sizeof( ids[0] );
|
|
Packit |
89ede9 |
if ( node->value.len==0 ) return BIBL_OK;
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, "identifier", "type", ids[i].mods ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, ids[i].internal, xml_value_cstr( node ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_mods( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
convert simple[] = {
|
|
Packit |
89ede9 |
{ "note", "NOTES", 0, 0 },
|
|
Packit |
89ede9 |
{ "abstract", "ABSTRACT", 0, 0 },
|
|
Packit |
89ede9 |
{ "bibtex-annote", "ANNOTE", 0, 0 },
|
|
Packit |
89ede9 |
{ "typeOfResource", "RESOURCE", 0, 0 },
|
|
Packit |
89ede9 |
{ "tableOfContents", "CONTENTS", 0, 0 },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int nsimple = sizeof( simple ) / sizeof( simple[0] );
|
|
Packit |
89ede9 |
int i, found = 0, status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, simple[i].mods ) ) {
|
|
Packit |
89ede9 |
status = modsin_simple( node, info, simple[i].internal, level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
found = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !found ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "titleInfo" ) )
|
|
Packit |
89ede9 |
modsin_title( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "name", "type", "personal" ) )
|
|
Packit |
89ede9 |
status = modsin_person( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "name", "type", "corporate" ) )
|
|
Packit |
89ede9 |
status = modsin_asis_corp( node, info, level, ":CORP" );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "name" ) )
|
|
Packit |
89ede9 |
status = modsin_asis_corp( node, info, level, ":ASIS" );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "recordInfo" ) && node->down )
|
|
Packit |
89ede9 |
status = modsin_recordinfo( node->down, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "part" ) )
|
|
Packit |
89ede9 |
modsin_part( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "identifier" ) )
|
|
Packit |
89ede9 |
status = modsin_identifier( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "originInfo" ) )
|
|
Packit |
89ede9 |
status = modsin_origininfo( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "language" ) )
|
|
Packit |
89ede9 |
status = modsin_language( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "genre" ) )
|
|
Packit |
89ede9 |
status = modsin_genre( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "date" ) )
|
|
Packit |
89ede9 |
status = modsin_date( node, info, level, 0 );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "subject" ) )
|
|
Packit |
89ede9 |
status = modsin_subject( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "classification" ) )
|
|
Packit |
89ede9 |
status = modsin_classification( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "location" ) )
|
|
Packit |
89ede9 |
status = modsin_location( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "physicalDescription" ) )
|
|
Packit |
89ede9 |
status = modsin_description( node, info, level );
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "relatedItem", "type", "host" ) ||
|
|
Packit |
89ede9 |
xml_tag_has_attribute( node, "relatedItem", "type", "series" ) ) {
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_mods( node->down, info, level+1 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( xml_tag_has_attribute( node, "relatedItem", "type", "original" ) ) {
|
|
Packit |
89ede9 |
if ( node->down ) status = modsin_mods( node->down, info, LEVEL_ORIG );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_mods( node->next, info, level );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_assembleref( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "mods" ) ) {
|
|
Packit |
89ede9 |
status = modsin_id1( node, info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_mods( node->down, info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else if ( node->down ) {
|
|
Packit |
89ede9 |
status = modsin_assembleref( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) status = modsin_assembleref( node->next, info );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_processf( fields *modsin, char *data, char *filename, long nref, param *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
xml top;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
xml_init( &top );
|
|
Packit |
89ede9 |
xml_parse( data, &top );
|
|
Packit |
89ede9 |
status = modsin_assembleref( &top, modsin );
|
|
Packit |
89ede9 |
xml_free( &top );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status==BIBL_OK ) return 1;
|
|
Packit |
89ede9 |
else return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: int modsin_readf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static char *
|
|
Packit |
89ede9 |
modsin_startptr( char *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *startptr;
|
|
Packit |
89ede9 |
startptr = xml_find_start( p, "mods:mods" );
|
|
Packit |
89ede9 |
if ( startptr ) {
|
|
Packit |
89ede9 |
/* set namespace if found */
|
|
Packit |
89ede9 |
xml_pns = modsns;
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
startptr = xml_find_start( p, "mods" );
|
|
Packit |
89ede9 |
if ( startptr ) xml_pns = NULL;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return startptr;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static char *
|
|
Packit |
89ede9 |
modsin_endptr( char *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return xml_find_end( p, "mods" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
modsin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str tmp;
|
|
Packit |
89ede9 |
int m, file_charset = CHARSET_UNKNOWN;
|
|
Packit |
89ede9 |
char *startptr = NULL, *endptr = NULL;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &tmp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
if ( line->data ) str_strcat( &tmp, line );
|
|
Packit |
89ede9 |
if ( str_has_value( &tmp ) ) {
|
|
Packit |
89ede9 |
m = xml_getencoding( &tmp );
|
|
Packit |
89ede9 |
if ( m!=CHARSET_UNKNOWN ) file_charset = m;
|
|
Packit |
89ede9 |
startptr = modsin_startptr( tmp.data );
|
|
Packit |
89ede9 |
endptr = modsin_endptr( tmp.data );
|
|
Packit |
89ede9 |
} else startptr = endptr = NULL;
|
|
Packit |
89ede9 |
str_empty( line );
|
|
Packit |
89ede9 |
if ( startptr && endptr ) {
|
|
Packit |
89ede9 |
str_segcpy( reference, startptr, endptr );
|
|
Packit |
89ede9 |
str_strcpyc( line, endptr );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} while ( !endptr && str_fget( fp, buf, bufsize, bufpos, line ) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_free( &tmp );
|
|
Packit |
89ede9 |
*fcharset = file_charset;
|
|
Packit |
89ede9 |
return ( reference->len > 0 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|