|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* ebiin.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2004-2018
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Program and 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 "is_ws.h"
|
|
Packit |
89ede9 |
#include "str.h"
|
|
Packit |
89ede9 |
#include "str_conv.h"
|
|
Packit |
89ede9 |
#include "fields.h"
|
|
Packit |
89ede9 |
#include "bu_auth.h"
|
|
Packit |
89ede9 |
#include "marc_auth.h"
|
|
Packit |
89ede9 |
#include "xml.h"
|
|
Packit |
89ede9 |
#include "xml_encoding.h"
|
|
Packit |
89ede9 |
#include "bibformats.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int ebiin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset );
|
|
Packit |
89ede9 |
static int ebiin_processf( fields *ebiin, char *data, char *filename, long nref, param *p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: void ebiin_initparams()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
ebiin_initparams( param *p, const char *progname )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
p->readformat = BIBL_EBIIN;
|
|
Packit |
89ede9 |
p->charsetin = BIBL_CHARSET_UNICODE;
|
|
Packit |
89ede9 |
p->charsetin_src = BIBL_SRC_DEFAULT;
|
|
Packit |
89ede9 |
p->latexin = 0;
|
|
Packit |
89ede9 |
p->xmlin = 1;
|
|
Packit |
89ede9 |
p->utf8in = 1;
|
|
Packit |
89ede9 |
p->nosplittitle = 0;
|
|
Packit |
89ede9 |
p->verbose = 0;
|
|
Packit |
89ede9 |
p->addcount = 0;
|
|
Packit |
89ede9 |
p->output_raw = BIBL_RAW_WITHMAKEREFID |
|
|
Packit |
89ede9 |
BIBL_RAW_WITHCHARCONVERT;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p->readf = ebiin_readf;
|
|
Packit |
89ede9 |
p->processf = ebiin_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 ebiin_readf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, str *line, str *reference, int *fcharset )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int haveref = 0, inref = 0, file_charset = CHARSET_UNKNOWN, m;
|
|
Packit |
89ede9 |
char *startptr = NULL, *endptr;
|
|
Packit |
89ede9 |
str tmp;
|
|
Packit |
89ede9 |
str_init( &tmp );
|
|
Packit |
89ede9 |
while ( !haveref && str_fget( fp, buf, bufsize, bufpos, line ) ) {
|
|
Packit |
89ede9 |
if ( line->data ) {
|
|
Packit |
89ede9 |
m = xml_getencoding( line );
|
|
Packit |
89ede9 |
if ( m!=CHARSET_UNKNOWN ) file_charset = m;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( line->data )
|
|
Packit |
89ede9 |
startptr = xml_find_start( line->data, "Publication" );
|
|
Packit |
89ede9 |
if ( startptr || inref ) {
|
|
Packit |
89ede9 |
if ( inref ) str_strcat( &tmp, line );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
str_strcatc( &tmp, startptr );
|
|
Packit |
89ede9 |
inref = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
endptr = xml_find_end( str_cstr( &tmp ), "Publication" );
|
|
Packit |
89ede9 |
if ( endptr ) {
|
|
Packit |
89ede9 |
str_segcpy( reference, str_cstr( &tmp ), endptr );
|
|
Packit |
89ede9 |
haveref = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &tmp );
|
|
Packit |
89ede9 |
*fcharset = file_charset;
|
|
Packit |
89ede9 |
return haveref;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*****************************************************
|
|
Packit |
89ede9 |
PUBLIC: int ebiin_processf()
|
|
Packit |
89ede9 |
*****************************************************/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
typedef struct xml_convert {
|
|
Packit |
89ede9 |
char *in; /* The input tag */
|
|
Packit |
89ede9 |
char *a, *aval; /* The attribute="attribute_value" pair, if nec. */
|
|
Packit |
89ede9 |
char *out; /* The output tag */
|
|
Packit |
89ede9 |
int level;
|
|
Packit |
89ede9 |
} xml_convert;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_doconvert( xml *node, fields *info, xml_convert *c, int nc, int *found )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, status;
|
|
Packit |
89ede9 |
char *d;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !xml_has_value( node ) ) goto out;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
d = xml_value_cstr( node );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( c[i].a==NULL ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, c[i].in ) ) {
|
|
Packit |
89ede9 |
*found = 1;
|
|
Packit |
89ede9 |
status = fields_add( info, c[i].out, d, c[i].level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
else return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
if ( xml_tag_has_attribute( node, c[i].in, c[i].a, c[i].aval ) ){
|
|
Packit |
89ede9 |
*found = 1;
|
|
Packit |
89ede9 |
status = fields_add( info, c[i].out, d, c[i].level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
else return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
*found = 0;
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <ArticleTitle>Mechanism and.....</ArticleTitle>
|
|
Packit |
89ede9 |
* and
|
|
Packit |
89ede9 |
* <Title>Mechanism and....</Title>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_title( xml *node, fields *info, int title_level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "TITLE", xml_value_cstr( node ), title_level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ebiin_medlinedate()
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* - extract medline information from entries like:
|
|
Packit |
89ede9 |
* <MedlineDate>2003 Jan-Feb</MedlineDate>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_medlinedate_year( fields *info, char *p, int level, char **end )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
*end = str_cpytodelim( &s, p, " \t\n\r", 0 );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PARTDATE:YEAR", str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_medlinedate_month( fields *info, char *p, int level, char **end )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
*end = str_cpytodelim( &s, p, " \t\n\r", 0 );
|
|
Packit |
89ede9 |
str_findreplace( &s, "-", "/" );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PARTDATE:MONTH", str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_medlinedate_day( fields *info, char *p, int level, char **end )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
*end = str_cpytodelim( &s, p, " \t\n\r", 0 );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) {
|
|
Packit |
89ede9 |
status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_has_value( &s ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( info, "PARTDATE:DAY", str_cstr( &s ), level );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_medlinedate( fields *info, xml *node, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
char *p;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !xml_has_value( node ) ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p = xml_value_cstr( node );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( *p )
|
|
Packit |
89ede9 |
status = ebiin_medlinedate_year( info, skip_ws( p ), level, &p );
|
|
Packit |
89ede9 |
if ( *p && status==BIBL_OK )
|
|
Packit |
89ede9 |
status = ebiin_medlinedate_month( info, skip_ws( p ), level, &p );
|
|
Packit |
89ede9 |
if ( *p && status==BIBL_OK )
|
|
Packit |
89ede9 |
status = ebiin_medlinedate_day( info, skip_ws( p ), level, &p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <Journal>
|
|
Packit |
89ede9 |
* <ISSN>0027-8424</ISSN>
|
|
Packit |
89ede9 |
* <JournalIssue PrintYN="Y">
|
|
Packit |
89ede9 |
* <Volume>100</Volume>
|
|
Packit |
89ede9 |
* <Issue>21</Issue>
|
|
Packit |
89ede9 |
* <PubDate>
|
|
Packit |
89ede9 |
* <Year>2003</Year>
|
|
Packit |
89ede9 |
* <Month>Oct</Month>
|
|
Packit |
89ede9 |
* <Day>14</Day>
|
|
Packit |
89ede9 |
* </PubDate>
|
|
Packit |
89ede9 |
* </Journal Issue>
|
|
Packit |
89ede9 |
* </Journal>
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* or....
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* <Journal>
|
|
Packit |
89ede9 |
* <ISSN IssnType="Print">0735-0414</ISSN>
|
|
Packit |
89ede9 |
* <JournalIssue CitedMedium="Print">
|
|
Packit |
89ede9 |
* <Volume>38</Volume>
|
|
Packit |
89ede9 |
* <Issue>1</Issue>
|
|
Packit |
89ede9 |
* <PubDate>
|
|
Packit |
89ede9 |
* <MedlineDate>2003 Jan-Feb</MedlineDate>
|
|
Packit |
89ede9 |
* </PubDate>
|
|
Packit |
89ede9 |
* </JournalIssue>
|
|
Packit |
89ede9 |
* <Title>Alcohol and alcoholism (Oxford, Oxfordshire) </Title>
|
|
Packit |
89ede9 |
* <ISOAbbreviation>Alcohol Alcohol.</ISOAbbreviation>
|
|
Packit |
89ede9 |
* </Journal>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_journal1( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
xml_convert c[] = {
|
|
Packit |
89ede9 |
{ "ISSN", NULL, NULL, "ISSN", 1 },
|
|
Packit |
89ede9 |
{ "Volume", NULL, NULL, "VOLUME", 1 },
|
|
Packit |
89ede9 |
{ "Issue", NULL, NULL, "ISSUE", 1 },
|
|
Packit |
89ede9 |
{ "Year", NULL, NULL, "PARTDATE:YEAR", 1 },
|
|
Packit |
89ede9 |
{ "Month", NULL, NULL, "PARTDATE:MONTH", 1 },
|
|
Packit |
89ede9 |
{ "Day", NULL, NULL, "PARTDATE:DAY", 1 },
|
|
Packit |
89ede9 |
{ "Language", NULL, NULL, "LANGUAGE", 1 },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int nc = sizeof( c ) / sizeof( c[0] ), status, found;
|
|
Packit |
89ede9 |
if ( xml_has_value( node ) ) {
|
|
Packit |
89ede9 |
status = ebiin_doconvert( node, info, c, nc, &found );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
if ( !found ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "MedlineDate" ) ) {
|
|
Packit |
89ede9 |
status = ebiin_medlinedate( info, node, LEVEL_HOST );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_journal1( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_journal1( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <Pagination>
|
|
Packit |
89ede9 |
* <MedlinePgn>12111-6</MedlinePgn>
|
|
Packit |
89ede9 |
* </Pagination>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_pages( fields *info, char *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, status, ret = BIBL_OK;
|
|
Packit |
89ede9 |
const int level = 1;
|
|
Packit |
89ede9 |
str sp, ep, *up;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_init( &sp, &ep, NULL );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...start page */
|
|
Packit |
89ede9 |
p = str_cpytodelim( &sp, skip_ws( p ), "-", 1 );
|
|
Packit |
89ede9 |
if ( str_memerr( &sp ) ) {
|
|
Packit |
89ede9 |
ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...end page */
|
|
Packit |
89ede9 |
(void) str_cpytodelim( &ep, skip_ws( p ), " \t\n\r", 0 );
|
|
Packit |
89ede9 |
if ( str_memerr( &ep ) ) {
|
|
Packit |
89ede9 |
ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( sp.len ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "PAGES:START", sp.data, level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( ep.len ) {
|
|
Packit |
89ede9 |
if ( sp.len > ep.len ) {
|
|
Packit |
89ede9 |
for ( i=sp.len-ep.len; i
|
|
Packit |
89ede9 |
sp.data[i] = ep.data[i-sp.len+ep.len];
|
|
Packit |
89ede9 |
up = &(sp);
|
|
Packit |
89ede9 |
} else up = &(ep);
|
|
Packit |
89ede9 |
status = fields_add( info, "PAGES:STOP", up->data, level );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
strs_free( &sp, &ep, NULL );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_pagination( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "Pages" ) ) {
|
|
Packit |
89ede9 |
status = ebiin_pages( info, xml_value_cstr( node ) );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_pagination( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_pagination( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <Abstract>
|
|
Packit |
89ede9 |
* <AbstractText>ljwejrelr</AbstractText>
|
|
Packit |
89ede9 |
* </Abstract>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_abstract( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "AbstractText" ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "ABSTRACT", xml_value_cstr( node ), 0 );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_abstract( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <AuthorList CompleteYN="Y">
|
|
Packit |
89ede9 |
* <Author>
|
|
Packit |
89ede9 |
* <LastName>Barondeau</LastName>
|
|
Packit |
89ede9 |
* <ForeName>David P</ForeName>
|
|
Packit |
89ede9 |
* ( or <FirstName>David P</FirstName> )
|
|
Packit |
89ede9 |
* <Initials>DP</Initials>
|
|
Packit |
89ede9 |
* </Author>
|
|
Packit |
89ede9 |
* </AuthorList>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_author( xml *node, str *name )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
char *p;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "LastName" ) ) {
|
|
Packit |
89ede9 |
if ( name->len ) {
|
|
Packit |
89ede9 |
str_prepend( name, "|" );
|
|
Packit |
89ede9 |
str_prepend( name, xml_value_cstr( node ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else str_strcat( name, xml_value( node ) );
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "ForeName" ) ||
|
|
Packit |
89ede9 |
xml_tag_matches( node, "FirstName" ) ) {
|
|
Packit |
89ede9 |
p = xml_value_cstr( node );
|
|
Packit |
89ede9 |
while ( p && *p ) {
|
|
Packit |
89ede9 |
if ( name->len ) str_addchar( name, '|' );
|
|
Packit |
89ede9 |
while ( *p==' ' ) p++;
|
|
Packit |
89ede9 |
while ( *p && *p!=' ' ) str_addchar( name, *p++ );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} else if ( xml_tag_matches( node, "Initials" ) && !strchr( name->data, '|' ) ) {
|
|
Packit |
89ede9 |
p = xml_value_cstr( node );
|
|
Packit |
89ede9 |
while ( p && *p ) {
|
|
Packit |
89ede9 |
if ( name->len ) str_addchar( name, '|' );
|
|
Packit |
89ede9 |
if ( !is_ws(*p ) ) str_addchar( name, *p++ );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_memerr( name ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_author( node->down, name );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_author( node->next, name );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_authorlist( xml *node, fields *info, int level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus, status = BIBL_OK;
|
|
Packit |
89ede9 |
str name;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &name );
|
|
Packit |
89ede9 |
node = node->down;
|
|
Packit |
89ede9 |
while ( node ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "Author" ) && node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_author( node->down, &name );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) goto out;
|
|
Packit |
89ede9 |
if ( name.len ) {
|
|
Packit |
89ede9 |
fstatus = fields_add(info,"AUTHOR",name.data,level);
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
str_empty( &name );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
node = node->next;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &name );
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <PublicationTypeList>
|
|
Packit |
89ede9 |
* <PublicationType>Journal Article</PublicationType>
|
|
Packit |
89ede9 |
* </PublicationTypeList>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* <MedlineJournalInfo>
|
|
Packit |
89ede9 |
* <Country>United States</Country>
|
|
Packit |
89ede9 |
* <MedlineTA>Proc Natl Acad Sci U S A</MedlineTA>
|
|
Packit |
89ede9 |
* <NlmUniqueID>7507876</NlmUniqueID>
|
|
Packit |
89ede9 |
* </MedlineJournalInfo>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_journal2( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "TitleAbbreviation" ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "TITLE", xml_value_cstr( node ), 1 );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_journal2( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_journal2( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* <MeshHeadingList>
|
|
Packit |
89ede9 |
* <MeshHeading>
|
|
Packit |
89ede9 |
* <DescriptorName MajorTopicYN="N">Biophysics</DescriptorName>
|
|
Packit |
89ede9 |
* </MeshHeading>
|
|
Packit |
89ede9 |
* <MeshHeading>
|
|
Packit |
89ede9 |
* <DescriptorName MajorTopicYN="N">Crystallography, X-Ray</DescriptorName>
|
|
Packit |
89ede9 |
* </MeshHeading>
|
|
Packit |
89ede9 |
* </MeshHeadingList>
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_meshheading( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches_has_value( node, "DescriptorName" ) ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "KEYWORD", xml_value_cstr( node ), 0 );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_meshheading( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_meshheadinglist( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "MeshHeading" ) && node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_meshheading( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_meshheadinglist( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_book( xml *node, fields *info, int book_level )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
xml_convert book[] = {
|
|
Packit |
89ede9 |
{ "Publisher", NULL, NULL, "PUBLISHER", 0 },
|
|
Packit |
89ede9 |
{ "Language", NULL, NULL, "LANGUAGE", 0 },
|
|
Packit |
89ede9 |
{ "ISBN10", NULL, NULL, "ISBN", 0 },
|
|
Packit |
89ede9 |
{ "ISBN13", NULL, NULL, "ISBN13", 0 },
|
|
Packit |
89ede9 |
{ "Year", NULL, NULL, "DATE:YEAR", 0 },
|
|
Packit |
89ede9 |
{ "Month", NULL, NULL, "DATE:MONTH", 0 },
|
|
Packit |
89ede9 |
{ "Day", NULL, NULL, "DATE:DAY", 0 },
|
|
Packit |
89ede9 |
{ "PageTotal", NULL, NULL, "PAGES:TOTAL", 0 },
|
|
Packit |
89ede9 |
{ "SeriesName", NULL, NULL, "TITLE", 1 },
|
|
Packit |
89ede9 |
{ "SeriesISSN", NULL, NULL, "ISSN", 0 },
|
|
Packit |
89ede9 |
{ "OtherReportInformation", NULL, NULL, "NOTES", 0 },
|
|
Packit |
89ede9 |
{ "Edition", NULL, NULL, "EDITION", 0 },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int nbook = sizeof( book ) / sizeof( book[0] );
|
|
Packit |
89ede9 |
xml_convert inbook[] = {
|
|
Packit |
89ede9 |
{ "Publisher", NULL, NULL, "PUBLISHER", 1 },
|
|
Packit |
89ede9 |
{ "Language", NULL, NULL, "LANGUAGE", 0 },
|
|
Packit |
89ede9 |
{ "ISBN10", NULL, NULL, "ISBN", 1 },
|
|
Packit |
89ede9 |
{ "ISBN13", NULL, NULL, "ISBN13", 1 },
|
|
Packit |
89ede9 |
{ "Year", NULL, NULL, "PARTDATE:YEAR", 1 },
|
|
Packit |
89ede9 |
{ "Month", NULL, NULL, "PARTDATE:MONTH", 1 },
|
|
Packit |
89ede9 |
{ "Day", NULL, NULL, "PARTDATE:DAY", 1 },
|
|
Packit |
89ede9 |
{ "PageTotal", NULL, NULL, "PAGES:TOTAL", 1 },
|
|
Packit |
89ede9 |
{ "SeriesName", NULL, NULL, "TITLE", 2 },
|
|
Packit |
89ede9 |
{ "SeriesISSN", NULL, NULL, "ISSN", 1 },
|
|
Packit |
89ede9 |
{ "OtherReportInformation", NULL, NULL, "NOTES", 1 },
|
|
Packit |
89ede9 |
{ "Edition", NULL, NULL, "EDITION", 1 },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int ninbook = sizeof( inbook ) / sizeof( inbook[0] );
|
|
Packit |
89ede9 |
int nc, status, found;
|
|
Packit |
89ede9 |
xml_convert *c;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( book_level==0 ) {
|
|
Packit |
89ede9 |
c = book;
|
|
Packit |
89ede9 |
nc = nbook;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
c = inbook;
|
|
Packit |
89ede9 |
nc = ninbook;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = ebiin_doconvert( node, info, c, nc, &found );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !found ) {
|
|
Packit |
89ede9 |
status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "MedlineDate" ) )
|
|
Packit |
89ede9 |
status = ebiin_medlinedate( info, node, book_level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Title" ) )
|
|
Packit |
89ede9 |
status = ebiin_title( node, info, book_level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Pagination" ) && node->down )
|
|
Packit |
89ede9 |
status = ebiin_pagination( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Abstract" ) && node->down )
|
|
Packit |
89ede9 |
status = ebiin_abstract( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "AuthorList" ) )
|
|
Packit |
89ede9 |
status = ebiin_authorlist( node, info, book_level );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "PubDate" ) && node->down )
|
|
Packit |
89ede9 |
status = ebiin_book( node->down, info, book_level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_book( node->next, info, book_level );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_article( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "Journal" ) )
|
|
Packit |
89ede9 |
status = ebiin_journal1( node, info );
|
|
Packit |
89ede9 |
else if ( node->down && ( xml_tag_matches( node, "Book" ) ||
|
|
Packit |
89ede9 |
xml_tag_matches(node, "Report") ))
|
|
Packit |
89ede9 |
status = ebiin_book( node->down, info, 1 );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "ArticleTitle" ) )
|
|
Packit |
89ede9 |
status = ebiin_title( node, info, 0 );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Pagination" ) && node->down )
|
|
Packit |
89ede9 |
status = ebiin_pagination( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Abstract" ) && node->down )
|
|
Packit |
89ede9 |
status = ebiin_abstract( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "AuthorList" ) )
|
|
Packit |
89ede9 |
status = ebiin_authorlist( node, info, 0 );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_article( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_publication( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = BIBL_OK;
|
|
Packit |
89ede9 |
if ( node->down ) {
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "Article" ) )
|
|
Packit |
89ede9 |
status = ebiin_article( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Book" ) )
|
|
Packit |
89ede9 |
status = ebiin_book( node->down, info, 0 );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "Report" ) )
|
|
Packit |
89ede9 |
status = ebiin_book( node->down, info, 0 );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "JournalInfo" ) )
|
|
Packit |
89ede9 |
status = ebiin_journal2( node->down, info );
|
|
Packit |
89ede9 |
else if ( xml_tag_matches( node, "MeshHeadingList" ) )
|
|
Packit |
89ede9 |
status = ebiin_meshheadinglist( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_publication( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* Call with the "Publication" node */
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_fixtype( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *resource = NULL, *issuance = NULL, *genre1 = NULL, *genre2 = NULL;
|
|
Packit |
89ede9 |
str *type;
|
|
Packit |
89ede9 |
int reslvl, isslvl, gen1lvl, gen2lvl;
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
type = xml_attribute( node, "Type" );
|
|
Packit |
89ede9 |
if ( !type || type->len==0 ) return BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !strcmp( type->data, "JournalArticle" ) ) {
|
|
Packit |
89ede9 |
resource = "text";
|
|
Packit |
89ede9 |
issuance = "continuing";
|
|
Packit |
89ede9 |
genre1 = "periodical";
|
|
Packit |
89ede9 |
genre2 = "academic journal";
|
|
Packit |
89ede9 |
reslvl = 0;
|
|
Packit |
89ede9 |
isslvl = 1;
|
|
Packit |
89ede9 |
gen1lvl = 1;
|
|
Packit |
89ede9 |
gen2lvl = 1;
|
|
Packit |
89ede9 |
} else if ( !strcmp( type->data, "Book" ) ) {
|
|
Packit |
89ede9 |
resource = "text";
|
|
Packit |
89ede9 |
issuance = "monographic";
|
|
Packit |
89ede9 |
genre1 = "book";
|
|
Packit |
89ede9 |
reslvl = 0;
|
|
Packit |
89ede9 |
isslvl = 0;
|
|
Packit |
89ede9 |
gen1lvl = 0;
|
|
Packit |
89ede9 |
} else if ( !strcmp( type->data, "BookArticle" ) ) {
|
|
Packit |
89ede9 |
resource = "text";
|
|
Packit |
89ede9 |
issuance = "monographic";
|
|
Packit |
89ede9 |
genre1 = "book";
|
|
Packit |
89ede9 |
reslvl = 0;
|
|
Packit |
89ede9 |
isslvl = 1;
|
|
Packit |
89ede9 |
gen1lvl = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( resource ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "RESOURCE", resource, reslvl );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( issuance ) {
|
|
Packit |
89ede9 |
status = fields_add( info, "ISSUANCE", issuance, isslvl );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( genre1 ) {
|
|
Packit |
89ede9 |
if ( is_marc_genre( genre1 ) )
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:MARC", genre1, gen1lvl );
|
|
Packit |
89ede9 |
else if ( is_bu_genre( genre1 ) )
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:BIBUTILS", genre1, gen1lvl );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:UNKNOWN", genre1, gen1lvl );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( genre2 ) {
|
|
Packit |
89ede9 |
if ( is_marc_genre( genre2 ) )
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:MARC", genre2, gen2lvl );
|
|
Packit |
89ede9 |
else if ( is_bu_genre( genre2 ) )
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:BIBUTILS", genre2, gen2lvl );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
status = fields_add( info, "GENRE:UNKNOWN", genre2, gen2lvl );
|
|
Packit |
89ede9 |
if ( status!=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 |
ebiin_assembleref( xml *node, fields *info )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
if ( xml_tag_matches( node, "Publication" ) && node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_fixtype( node, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
status = ebiin_publication( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
} else if ( node->down ) {
|
|
Packit |
89ede9 |
status = ebiin_assembleref( node->down, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( node->next ) {
|
|
Packit |
89ede9 |
status = ebiin_assembleref( node->next, info );
|
|
Packit |
89ede9 |
if ( status!=BIBL_OK ) return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
ebiin_processf( fields *ebiin, 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 = ebiin_assembleref( &top, ebiin );
|
|
Packit |
89ede9 |
xml_free( &top );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return ( status==BIBL_OK ) ? 1 : 0;
|
|
Packit |
89ede9 |
}
|