|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* endout.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 <string.h>
|
|
Packit |
89ede9 |
#include <ctype.h>
|
|
Packit |
89ede9 |
#include "utf8.h"
|
|
Packit |
89ede9 |
#include "str.h"
|
|
Packit |
89ede9 |
#include "strsearch.h"
|
|
Packit |
89ede9 |
#include "fields.h"
|
|
Packit |
89ede9 |
#include "name.h"
|
|
Packit |
89ede9 |
#include "title.h"
|
|
Packit |
89ede9 |
#include "url.h"
|
|
Packit |
89ede9 |
#include "bibformats.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int endout_write( fields *in, FILE *fp, param *p, unsigned long refnum );
|
|
Packit |
89ede9 |
static void endout_writeheader( FILE *outptr, param *p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
endout_initparams( param *p, const char *progname )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
p->writeformat = BIBL_ENDNOTEOUT;
|
|
Packit |
89ede9 |
p->format_opts = 0;
|
|
Packit |
89ede9 |
p->charsetout = BIBL_CHARSET_DEFAULT;
|
|
Packit |
89ede9 |
p->charsetout_src = BIBL_SRC_DEFAULT;
|
|
Packit |
89ede9 |
p->latexout = 0;
|
|
Packit |
89ede9 |
p->utf8out = BIBL_CHARSET_UTF8_DEFAULT;
|
|
Packit |
89ede9 |
p->utf8bom = BIBL_CHARSET_BOM_DEFAULT;
|
|
Packit |
89ede9 |
p->xmlout = BIBL_XMLOUT_FALSE;
|
|
Packit |
89ede9 |
p->nosplittitle = 0;
|
|
Packit |
89ede9 |
p->verbose = 0;
|
|
Packit |
89ede9 |
p->addcount = 0;
|
|
Packit |
89ede9 |
p->singlerefperfile = 0;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( p->charsetout == BIBL_CHARSET_UNICODE ) {
|
|
Packit |
89ede9 |
p->utf8out = p->utf8bom = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
p->headerf = endout_writeheader;
|
|
Packit |
89ede9 |
p->footerf = NULL;
|
|
Packit |
89ede9 |
p->writef = endout_write;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
enum {
|
|
Packit |
89ede9 |
TYPE_UNKNOWN = 0,
|
|
Packit |
89ede9 |
TYPE_GENERIC, /* Generic */
|
|
Packit |
89ede9 |
TYPE_ARTWORK, /* Artwork */
|
|
Packit |
89ede9 |
TYPE_AUDIOVISUAL, /* Audiovisual Material */
|
|
Packit |
89ede9 |
TYPE_BILL, /* Bill */
|
|
Packit |
89ede9 |
TYPE_BOOK, /* Book */
|
|
Packit |
89ede9 |
TYPE_INBOOK, /* Book Section */
|
|
Packit |
89ede9 |
TYPE_CASE, /* Case */
|
|
Packit |
89ede9 |
TYPE_CHARTTABLE, /* Chart or Table */
|
|
Packit |
89ede9 |
TYPE_CLASSICALWORK, /* Classical Work */
|
|
Packit |
89ede9 |
TYPE_PROGRAM, /* Computer Program */
|
|
Packit |
89ede9 |
TYPE_INPROCEEDINGS, /* Conference Paper */
|
|
Packit |
89ede9 |
TYPE_PROCEEDINGS, /* Conference Proceedings */
|
|
Packit |
89ede9 |
TYPE_EDITEDBOOK, /* Edited Book */
|
|
Packit |
89ede9 |
TYPE_EQUATION, /* Equation */
|
|
Packit |
89ede9 |
TYPE_ELECTRONICARTICLE, /* Electronic Article */
|
|
Packit |
89ede9 |
TYPE_ELECTRONICBOOK, /* Electronic Book */
|
|
Packit |
89ede9 |
TYPE_ELECTRONIC, /* Electronic Source */
|
|
Packit |
89ede9 |
TYPE_FIGURE, /* Figure */
|
|
Packit |
89ede9 |
TYPE_FILMBROADCAST, /* Film or Broadcast */
|
|
Packit |
89ede9 |
TYPE_GOVERNMENT, /* Government Document */
|
|
Packit |
89ede9 |
TYPE_HEARING, /* Hearing */
|
|
Packit |
89ede9 |
TYPE_ARTICLE, /* Journal Article */
|
|
Packit |
89ede9 |
TYPE_LEGALRULE, /* Legal Rule/Regulation */
|
|
Packit |
89ede9 |
TYPE_MAGARTICLE, /* Magazine Article */
|
|
Packit |
89ede9 |
TYPE_MANUSCRIPT, /* Manuscript */
|
|
Packit |
89ede9 |
TYPE_MAP, /* Map */
|
|
Packit |
89ede9 |
TYPE_NEWSARTICLE, /* Newspaper Article */
|
|
Packit |
89ede9 |
TYPE_ONLINEDATABASE, /* Online Database */
|
|
Packit |
89ede9 |
TYPE_ONLINEMULTIMEDIA, /* Online Multimedia */
|
|
Packit |
89ede9 |
TYPE_PATENT, /* Patent */
|
|
Packit |
89ede9 |
TYPE_COMMUNICATION, /* Personal Communication */
|
|
Packit |
89ede9 |
TYPE_REPORT, /* Report */
|
|
Packit |
89ede9 |
TYPE_STATUTE, /* Statute */
|
|
Packit |
89ede9 |
TYPE_THESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_MASTERSTHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_PHDTHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_DIPLOMATHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_DOCTORALTHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_HABILITATIONTHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_LICENTIATETHESIS, /* Thesis */
|
|
Packit |
89ede9 |
TYPE_UNPUBLISHED, /* Unpublished Work */
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
write_type( FILE *fp, int type )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
switch( type ) {
|
|
Packit |
89ede9 |
case TYPE_UNKNOWN: fprintf( fp, "TYPE_UNKNOWN" ); break;
|
|
Packit |
89ede9 |
case TYPE_GENERIC: fprintf( fp, "TYPE_GENERIC" ); break;
|
|
Packit |
89ede9 |
case TYPE_ARTWORK: fprintf( fp, "TYPE_ARTWORK" ); break;
|
|
Packit |
89ede9 |
case TYPE_AUDIOVISUAL: fprintf( fp, "TYPE_AUDIOVISUAL" ); break;
|
|
Packit |
89ede9 |
case TYPE_BILL: fprintf( fp, "TYPE_BILL" ); break;
|
|
Packit |
89ede9 |
case TYPE_BOOK: fprintf( fp, "TYPE_BOOK" ); break;
|
|
Packit |
89ede9 |
case TYPE_INBOOK: fprintf( fp, "TYPE_INBOOK" ); break;
|
|
Packit |
89ede9 |
case TYPE_CASE: fprintf( fp, "TYPE_CASE" ); break;
|
|
Packit |
89ede9 |
case TYPE_CHARTTABLE: fprintf( fp, "TYPE_CHARITABLE" ); break;
|
|
Packit |
89ede9 |
case TYPE_CLASSICALWORK: fprintf( fp, "TYPE_CLASSICALWORK" ); break;
|
|
Packit |
89ede9 |
case TYPE_PROGRAM: fprintf( fp, "TYPE_PROGRAM" ); break;
|
|
Packit |
89ede9 |
case TYPE_INPROCEEDINGS: fprintf( fp, "TYPE_INPROCEEDINGS" ); break;
|
|
Packit |
89ede9 |
case TYPE_PROCEEDINGS: fprintf( fp, "TYPE_PROCEEDINGS" ); break;
|
|
Packit |
89ede9 |
case TYPE_EDITEDBOOK: fprintf( fp, "TYPE_EDITEDBOOK" ); break;
|
|
Packit |
89ede9 |
case TYPE_EQUATION: fprintf( fp, "TYPE_EQUATION" ); break;
|
|
Packit |
89ede9 |
case TYPE_ELECTRONICARTICLE: fprintf( fp, "TYPE_ELECTRONICARTICLE" ); break;
|
|
Packit |
89ede9 |
case TYPE_ELECTRONICBOOK: fprintf( fp, "TYPE_ELECTRONICBOOK" ); break;
|
|
Packit |
89ede9 |
case TYPE_ELECTRONIC: fprintf( fp, "TYPE_ELECTRONIC" ); break;
|
|
Packit |
89ede9 |
case TYPE_FIGURE: fprintf( fp, "TYPE_FIGURE" ); break;
|
|
Packit |
89ede9 |
case TYPE_FILMBROADCAST: fprintf( fp, "TYPE_FILMBROADCAST" ); break;
|
|
Packit |
89ede9 |
case TYPE_GOVERNMENT: fprintf( fp, "TYPE_GOVERNMENT" ); break;
|
|
Packit |
89ede9 |
case TYPE_HEARING: fprintf( fp, "TYPE_HEARING" ); break;
|
|
Packit |
89ede9 |
case TYPE_ARTICLE: fprintf( fp, "TYPE_ARTICLE" ); break;
|
|
Packit |
89ede9 |
case TYPE_LEGALRULE: fprintf( fp, "TYPE_LEGALRULE" ); break;
|
|
Packit |
89ede9 |
case TYPE_MAGARTICLE: fprintf( fp, "TYPE_MAGARTICLE" ); break;
|
|
Packit |
89ede9 |
case TYPE_MANUSCRIPT: fprintf( fp, "TYPE_MANUSCRIPT" ); break;
|
|
Packit |
89ede9 |
case TYPE_MAP: fprintf( fp, "TYPE_MAP" ); break;
|
|
Packit |
89ede9 |
case TYPE_NEWSARTICLE: fprintf( fp, "TYPE_NEWSARTICLE" ); break;
|
|
Packit |
89ede9 |
case TYPE_ONLINEDATABASE: fprintf( fp, "TYPE_ONLINEDATABASE" ); break;
|
|
Packit |
89ede9 |
case TYPE_ONLINEMULTIMEDIA: fprintf( fp, "TYPE_ONLINEMULTIMEDIA" ); break;
|
|
Packit |
89ede9 |
case TYPE_PATENT: fprintf( fp, "TYPE_PATENT" ); break;
|
|
Packit |
89ede9 |
case TYPE_COMMUNICATION: fprintf( fp, "TYPE_COMMUNICATION" ); break;
|
|
Packit |
89ede9 |
case TYPE_REPORT: fprintf( fp, "TYPE_REPORT" ); break;
|
|
Packit |
89ede9 |
case TYPE_STATUTE: fprintf( fp, "TYPE_STATUTE" ); break;
|
|
Packit |
89ede9 |
case TYPE_THESIS: fprintf( fp, "TYPE_THESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_MASTERSTHESIS: fprintf( fp, "TYPE_MASTERSTHESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_PHDTHESIS: fprintf( fp, "TYPE_PHDTHESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_DIPLOMATHESIS: fprintf( fp, "TYPE_DIPLOMATHESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_DOCTORALTHESIS: fprintf( fp, "TYPE_DOCTORALTHESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_HABILITATIONTHESIS:fprintf( fp, "TYPE_HABILITATIONTHESIS" ); break;
|
|
Packit |
89ede9 |
case TYPE_UNPUBLISHED: fprintf( fp, "TYPE_UNPUBLISHED" ); break;
|
|
Packit |
89ede9 |
default: fprintf( fp, "Error - type not in enum" );break;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
typedef struct match_type {
|
|
Packit |
89ede9 |
char *name;
|
|
Packit |
89ede9 |
int type;
|
|
Packit |
89ede9 |
} match_type;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
get_type( fields *in, param *p, unsigned long refnum )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
/* Comment out TYPE_GENERIC entries as that is default, but
|
|
Packit |
89ede9 |
* keep in source as record of mapping decision. */
|
|
Packit |
89ede9 |
match_type match_genres[] = {
|
|
Packit |
89ede9 |
/* MARC Authority elements */
|
|
Packit |
89ede9 |
{ "art original", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
{ "art reproduction", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
{ "article", TYPE_ARTICLE },
|
|
Packit |
89ede9 |
{ "atlas", TYPE_MAP },
|
|
Packit |
89ede9 |
{ "autobiography", TYPE_BOOK },
|
|
Packit |
89ede9 |
/* { "bibliography", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "biography", TYPE_BOOK },
|
|
Packit |
89ede9 |
{ "book", TYPE_BOOK },
|
|
Packit |
89ede9 |
/* { "calendar", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "catalog", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "chart", TYPE_CHARTTABLE },
|
|
Packit |
89ede9 |
/* { "comic or graphic novel", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "comic strip", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "conference publication", TYPE_PROCEEDINGS },
|
|
Packit |
89ede9 |
{ "database", TYPE_ONLINEDATABASE },
|
|
Packit |
89ede9 |
/* { "dictionary", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "diorama", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
/* { "directory", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "discography", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
/* { "drama", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "encyclopedia", TYPE_BOOK },
|
|
Packit |
89ede9 |
/* { "essay", TYPE_GENERIC }, */
|
|
Packit |
89ede9 |
/* { "festschrift", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "fiction", TYPE_BOOK },
|
|
Packit |
89ede9 |
{ "filmography", TYPE_FILMBROADCAST },
|
|
Packit |
89ede9 |
{ "filmstrip", TYPE_FILMBROADCAST },
|
|
Packit |
89ede9 |
/* { "finding aid", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "flash card", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "folktale", TYPE_CLASSICALWORK },
|
|
Packit |
89ede9 |
{ "font", TYPE_ELECTRONIC },
|
|
Packit |
89ede9 |
/* { "game", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "government publication", TYPE_GOVERNMENT },
|
|
Packit |
89ede9 |
{ "graphic", TYPE_FIGURE },
|
|
Packit |
89ede9 |
{ "globe", TYPE_MAP },
|
|
Packit |
89ede9 |
/* { "handbook", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "history", TYPE_BOOK },
|
|
Packit |
89ede9 |
{ "hymnal", TYPE_BOOK },
|
|
Packit |
89ede9 |
/* { "humor, satire", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "index", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "instruction", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "interview", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "issue", TYPE_ARTICLE },
|
|
Packit |
89ede9 |
{ "journal", TYPE_ARTICLE },
|
|
Packit |
89ede9 |
/* { "kit", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "language instruction", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "law report or digest", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "legal article", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "legal case and case notes", TYPE_CASE },
|
|
Packit |
89ede9 |
{ "legislation", TYPE_BILL },
|
|
Packit |
89ede9 |
{ "letter", TYPE_COMMUNICATION },
|
|
Packit |
89ede9 |
{ "loose-leaf", TYPE_GENERIC },
|
|
Packit |
89ede9 |
{ "map", TYPE_MAP },
|
|
Packit |
89ede9 |
/* { "memoir", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "microscope slide", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "model", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "motion picture", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
{ "multivolume monograph", TYPE_BOOK },
|
|
Packit |
89ede9 |
{ "newspaper", TYPE_NEWSARTICLE },
|
|
Packit |
89ede9 |
{ "novel", TYPE_BOOK },
|
|
Packit |
89ede9 |
/* { "numeric data", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "offprint", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "online system or service", TYPE_ELECTRONIC },
|
|
Packit |
89ede9 |
{ "patent", TYPE_PATENT },
|
|
Packit |
89ede9 |
{ "periodical", TYPE_MAGARTICLE },
|
|
Packit |
89ede9 |
{ "picture", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
/* { "poetry", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "programmed text", TYPE_PROGRAM },
|
|
Packit |
89ede9 |
/* { "realia", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "rehearsal", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
/* { "remote sensing image", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "reporting", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "report", TYPE_REPORT },
|
|
Packit |
89ede9 |
/* { "review", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "script", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "series", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "short story", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "slide", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "sound", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
/* { "speech", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "standard or specification", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "statistics", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "survey of literature", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "technical drawing", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
{ "technical report", TYPE_REPORT },
|
|
Packit |
89ede9 |
{ "thesis", TYPE_THESIS },
|
|
Packit |
89ede9 |
/* { "toy", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "transparency", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
/* { "treaty", TYPE_GENERIC },*/
|
|
Packit |
89ede9 |
{ "videorecording", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
{ "web site", TYPE_ELECTRONIC },
|
|
Packit |
89ede9 |
/* Non-MARC Authority elements */
|
|
Packit |
89ede9 |
{ "academic journal", TYPE_ARTICLE },
|
|
Packit |
89ede9 |
{ "magazine", TYPE_MAGARTICLE },
|
|
Packit |
89ede9 |
{ "hearing", TYPE_HEARING },
|
|
Packit |
89ede9 |
{ "Ph.D. thesis", TYPE_PHDTHESIS },
|
|
Packit |
89ede9 |
{ "Masters thesis", TYPE_MASTERSTHESIS },
|
|
Packit |
89ede9 |
{ "Diploma thesis", TYPE_DIPLOMATHESIS },
|
|
Packit |
89ede9 |
{ "Doctoral thesis", TYPE_DOCTORALTHESIS },
|
|
Packit |
89ede9 |
{ "Habilitation thesis", TYPE_HABILITATIONTHESIS },
|
|
Packit |
89ede9 |
{ "Licentiate thesis", TYPE_LICENTIATETHESIS },
|
|
Packit |
89ede9 |
{ "communication", TYPE_COMMUNICATION },
|
|
Packit |
89ede9 |
{ "manuscript", TYPE_MANUSCRIPT },
|
|
Packit |
89ede9 |
{ "unpublished", TYPE_UNPUBLISHED },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int nmatch_genres = sizeof( match_genres ) / sizeof( match_genres[0] );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int i, j, n, maxlevel, type = TYPE_UNKNOWN;
|
|
Packit |
89ede9 |
char *tag, *data;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* Determine type from genre information */
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
tag = fields_tag( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( strcasecmp( tag, "GENRE:MARC" )!=0 &&
|
|
Packit |
89ede9 |
strcasecmp( tag, "GENRE:BIBUTILS" )!=0 &&
|
|
Packit |
89ede9 |
strcasecmp( tag, "GENRE:UNKNOWN" )!=0 ) continue;
|
|
Packit |
89ede9 |
data = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
for ( j=0; j
|
|
Packit |
89ede9 |
if ( !strcasecmp( data, match_genres[j].name ) ) {
|
|
Packit |
89ede9 |
type = match_genres[j].type;
|
|
Packit |
89ede9 |
fields_setused( in, i );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( p->verbose ) {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Type from tag '%s' data '%s': ", tag, data );
|
|
Packit |
89ede9 |
write_type( stderr, type );
|
|
Packit |
89ede9 |
fprintf( stderr, "\n" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
if ( !strcasecmp( data, "periodical" ) )
|
|
Packit |
89ede9 |
type = TYPE_ARTICLE;
|
|
Packit |
89ede9 |
else if ( !strcasecmp( data, "thesis" ) )
|
|
Packit |
89ede9 |
type = TYPE_THESIS;
|
|
Packit |
89ede9 |
else if ( !strcasecmp( data, "book" ) ) {
|
|
Packit |
89ede9 |
if ( in->level[i]==0 ) type = TYPE_BOOK;
|
|
Packit |
89ede9 |
else type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( !strcasecmp( data, "collection" ) ) {
|
|
Packit |
89ede9 |
if ( in->level[i]==0 ) type = TYPE_BOOK;
|
|
Packit |
89ede9 |
else type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( type!=TYPE_UNKNOWN ) fields_setused( in, i );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
/* the inbook type should be defined if 'book' in host */
|
|
Packit |
89ede9 |
if ( type==TYPE_BOOK && in->level[i]>0 ) type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( p->verbose ) {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Type from genre element: " );
|
|
Packit |
89ede9 |
write_type( stderr, type );
|
|
Packit |
89ede9 |
fprintf( stderr, "\n" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* Determine from resource information */
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( strcasecmp( fields_tag( in, i, FIELDS_CHRP ), "RESOURCE" ) )
|
|
Packit |
89ede9 |
continue;
|
|
Packit |
89ede9 |
data = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( !strcasecmp( data, "moving image" ) )
|
|
Packit |
89ede9 |
type = TYPE_FILMBROADCAST;
|
|
Packit |
89ede9 |
else if ( !strcasecmp( data, "software, multimedia" ) )
|
|
Packit |
89ede9 |
type = TYPE_PROGRAM;
|
|
Packit |
89ede9 |
if ( type!=TYPE_UNKNOWN ) fields_setused( in, i );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( p->verbose ) {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Type from resource element: " );
|
|
Packit |
89ede9 |
write_type( stderr, type );
|
|
Packit |
89ede9 |
fprintf( stderr, "\n" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* Determine from issuance information */
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( strcasecmp( fields_tag( in, i, FIELDS_CHRP ), "ISSUANCE" ) )
|
|
Packit |
89ede9 |
continue;
|
|
Packit |
89ede9 |
data = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( !strcasecmp( data, "monographic" ) ) {
|
|
Packit |
89ede9 |
if ( in->level[i]==0 ) type = TYPE_BOOK;
|
|
Packit |
89ede9 |
else type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( p->verbose ) {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Type from issuance element: " );
|
|
Packit |
89ede9 |
write_type( stderr, type );
|
|
Packit |
89ede9 |
fprintf( stderr, "\n" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* default to generic or book chapter, depending on maxlevel */
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
maxlevel = fields_maxlevel( in );
|
|
Packit |
89ede9 |
if ( maxlevel > 0 ) type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Cannot identify TYPE in reference %lu ", refnum+1 );
|
|
Packit |
89ede9 |
n = fields_find( in, "REFNUM", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n!=FIELDS_NOTFOUND )
|
|
Packit |
89ede9 |
fprintf( stderr, " %s", (char *) fields_value( in, n, FIELDS_CHRP ) );
|
|
Packit |
89ede9 |
fprintf( stderr, " (defaulting to generic)\n" );
|
|
Packit |
89ede9 |
type = TYPE_GENERIC;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( p->verbose ) {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Final type: " );
|
|
Packit |
89ede9 |
write_type( stderr, type );
|
|
Packit |
89ede9 |
fprintf( stderr, "\n" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return type;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_type( int type, fields *out, param *p, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
/* These are restricted to Endnote-defined types */
|
|
Packit |
89ede9 |
match_type genrenames[] = {
|
|
Packit |
89ede9 |
{ "Generic", TYPE_GENERIC },
|
|
Packit |
89ede9 |
{ "Artwork", TYPE_ARTWORK },
|
|
Packit |
89ede9 |
{ "Audiovisual Material", TYPE_AUDIOVISUAL },
|
|
Packit |
89ede9 |
{ "Bill", TYPE_BILL },
|
|
Packit |
89ede9 |
{ "Book", TYPE_BOOK },
|
|
Packit |
89ede9 |
{ "Book Section", TYPE_INBOOK },
|
|
Packit |
89ede9 |
{ "Case", TYPE_CASE },
|
|
Packit |
89ede9 |
{ "Chart or Table", TYPE_CHARTTABLE },
|
|
Packit |
89ede9 |
{ "Classical Work", TYPE_CLASSICALWORK },
|
|
Packit |
89ede9 |
{ "Computer Program", TYPE_PROGRAM },
|
|
Packit |
89ede9 |
{ "Conference Paper", TYPE_INPROCEEDINGS },
|
|
Packit |
89ede9 |
{ "Conference Proceedings", TYPE_PROCEEDINGS },
|
|
Packit |
89ede9 |
{ "Edited Book", TYPE_EDITEDBOOK },
|
|
Packit |
89ede9 |
{ "Equation", TYPE_EQUATION },
|
|
Packit |
89ede9 |
{ "Electronic Article", TYPE_ELECTRONICARTICLE },
|
|
Packit |
89ede9 |
{ "Electronic Book", TYPE_ELECTRONICBOOK },
|
|
Packit |
89ede9 |
{ "Electronic Source", TYPE_ELECTRONIC },
|
|
Packit |
89ede9 |
{ "Figure", TYPE_FIGURE },
|
|
Packit |
89ede9 |
{ "Film or Broadcast", TYPE_FILMBROADCAST },
|
|
Packit |
89ede9 |
{ "Government Document", TYPE_GOVERNMENT },
|
|
Packit |
89ede9 |
{ "Hearing", TYPE_HEARING },
|
|
Packit |
89ede9 |
{ "Journal Article", TYPE_ARTICLE },
|
|
Packit |
89ede9 |
{ "Legal Rule/Regulation", TYPE_LEGALRULE },
|
|
Packit |
89ede9 |
{ "Magazine Article", TYPE_MAGARTICLE },
|
|
Packit |
89ede9 |
{ "Manuscript", TYPE_MANUSCRIPT },
|
|
Packit |
89ede9 |
{ "Map", TYPE_MAP },
|
|
Packit |
89ede9 |
{ "Newspaper Article", TYPE_NEWSARTICLE },
|
|
Packit |
89ede9 |
{ "Online Database", TYPE_ONLINEDATABASE },
|
|
Packit |
89ede9 |
{ "Online Multimedia", TYPE_ONLINEMULTIMEDIA },
|
|
Packit |
89ede9 |
{ "Patent", TYPE_PATENT },
|
|
Packit |
89ede9 |
{ "Personal Communication", TYPE_COMMUNICATION },
|
|
Packit |
89ede9 |
{ "Report", TYPE_REPORT },
|
|
Packit |
89ede9 |
{ "Statute", TYPE_STATUTE },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_THESIS },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_PHDTHESIS },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_MASTERSTHESIS },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_DIPLOMATHESIS },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_DOCTORALTHESIS },
|
|
Packit |
89ede9 |
{ "Thesis", TYPE_HABILITATIONTHESIS },
|
|
Packit |
89ede9 |
{ "Unpublished Work", TYPE_UNPUBLISHED },
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int ngenrenames = sizeof( genrenames ) / sizeof( genrenames[0] );
|
|
Packit |
89ede9 |
int i, fstatus, found = 0;
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
if ( genrenames[i].type == type ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%0", genrenames[i].name, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
found = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( !found ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%0", "Generic", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Cannot identify type %d\n", type );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
append_title( fields *in, char *full, char *sub, char *endtag,
|
|
Packit |
89ede9 |
int level, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *mainttl = fields_findv( in, level, FIELDS_STRP, full );
|
|
Packit |
89ede9 |
str *subttl = fields_findv( in, level, FIELDS_STRP, sub );
|
|
Packit |
89ede9 |
str fullttl;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &fullttl );
|
|
Packit |
89ede9 |
title_combine( &fullttl, mainttl, subttl );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &fullttl ) ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &fullttl ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, endtag, str_cstr( &fullttl ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &fullttl );
|
|
Packit |
89ede9 |
return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_people( fields *in, char *tag, char *entag, int level, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, n, flvl, fstatus;
|
|
Packit |
89ede9 |
str oneperson;
|
|
Packit |
89ede9 |
char *ftag;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &oneperson );
|
|
Packit |
89ede9 |
n = fields_num( in );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
flvl = fields_level( in, i );
|
|
Packit |
89ede9 |
if ( level!=LEVEL_ANY && flvl!=level ) continue;
|
|
Packit |
89ede9 |
ftag = fields_tag( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( !strcasecmp( ftag, tag ) ) {
|
|
Packit |
89ede9 |
name_build_withcomma( &oneperson, fields_value( in, i, FIELDS_CHRP ) );
|
|
Packit |
89ede9 |
fstatus = fields_add_can_dup( out, entag, str_cstr( &oneperson ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &oneperson );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_pages( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *sn, *en;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
str pages;
|
|
Packit |
89ede9 |
char *ar;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
sn = fields_findv( in, LEVEL_ANY, FIELDS_STRP, "PAGES:START" );
|
|
Packit |
89ede9 |
en = fields_findv( in, LEVEL_ANY, FIELDS_STRP, "PAGES:STOP" );
|
|
Packit |
89ede9 |
if ( sn || en ) {
|
|
Packit |
89ede9 |
str_init( &pages );
|
|
Packit |
89ede9 |
if ( sn ) str_strcpy( &pages, sn );
|
|
Packit |
89ede9 |
if ( sn && en ) str_strcatc( &pages, "-" );
|
|
Packit |
89ede9 |
if ( en ) str_strcat( &pages, en );
|
|
Packit |
89ede9 |
if ( str_memerr( &pages ) ) { *status = BIBL_ERR_MEMERR; str_free( &pages ); return; }
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%P", str_cstr( &pages ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
str_free( &pages );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
ar = fields_findv( in, LEVEL_ANY, FIELDS_CHRP, "ARTICLENUMBER" );
|
|
Packit |
89ede9 |
if ( ar ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%P", ar, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_urls( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int lstatus;
|
|
Packit |
89ede9 |
slist types;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
lstatus = slist_init_valuesc( &types, "URL", "DOI", "PMID", "PMC", "ARXIV", "JSTOR", "MRNUMBER", NULL );
|
|
Packit |
89ede9 |
if ( lstatus!=SLIST_OK ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
return;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
*status = urls_merge_and_add( in, LEVEL_ANY, out, "%U", LEVEL_MAIN, &types );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_free( &types );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_year( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
char *year;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
year = fields_findv_firstof( in, LEVEL_ANY, FIELDS_CHRP, "DATE:YEAR", "PARTDATE:YEAR", NULL );
|
|
Packit |
89ede9 |
if ( year ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%D", year, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_monthday( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *months[12] = { "January", "February", "March", "April",
|
|
Packit |
89ede9 |
"May", "June", "July", "August", "September", "October",
|
|
Packit |
89ede9 |
"November", "December" };
|
|
Packit |
89ede9 |
char *month, *day;
|
|
Packit |
89ede9 |
int m, fstatus;
|
|
Packit |
89ede9 |
str monday;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &monday );
|
|
Packit |
89ede9 |
month = fields_findv_firstof( in, LEVEL_ANY, FIELDS_CHRP, "DATE:MONTH", "PARTDATE:MONTH", NULL );
|
|
Packit |
89ede9 |
day = fields_findv_firstof( in, LEVEL_ANY, FIELDS_CHRP, "DATE:DAY", "PARTDATE:DAY", NULL );
|
|
Packit |
89ede9 |
if ( month || day ) {
|
|
Packit |
89ede9 |
if ( month ) {
|
|
Packit |
89ede9 |
m = atoi( month );
|
|
Packit |
89ede9 |
if ( m>0 && m<13 ) str_strcpyc( &monday, months[m-1] );
|
|
Packit |
89ede9 |
else str_strcpyc( &monday, month );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( month && day ) str_strcatc( &monday, " " );
|
|
Packit |
89ede9 |
if ( day ) str_strcatc( &monday, day );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%8", str_cstr( &monday ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &monday );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_genrehint( int type, fields *out, vplist *a, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
vplist_index i;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
char *g;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i ) {
|
|
Packit |
89ede9 |
g = ( char * ) vplist_get( a, i );
|
|
Packit |
89ede9 |
if ( !strcmp( g, "journal article" ) && type==TYPE_ARTICLE ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "academic journal" ) && type==TYPE_ARTICLE ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "collection" ) && type==TYPE_INBOOK ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "television broadcast" ) && type==TYPE_FILMBROADCAST ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "electronic" ) && type==TYPE_PROGRAM ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "magazine" ) && type==TYPE_MAGARTICLE ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "miscellaneous" ) && type==TYPE_GENERIC ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "hearing" ) && type==TYPE_HEARING ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "communication" ) && type==TYPE_COMMUNICATION ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "report" ) && type==TYPE_REPORT ) continue;
|
|
Packit |
89ede9 |
if ( !strcmp( g, "book chapter" ) && type==TYPE_INBOOK ) continue;
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", g, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
return;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_all_genrehint( int type, fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
vplist a;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
vplist_init( &a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_findv_each( in, LEVEL_ANY, FIELDS_CHRP, &a, "GENRE:BIBUTILS" );
|
|
Packit |
89ede9 |
append_genrehint( type, out, &a, status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
vplist_empty( &a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_findv_each( in, LEVEL_ANY, FIELDS_CHRP, &a, "GENRE:UNKNOWN" );
|
|
Packit |
89ede9 |
append_genrehint( type, out, &a, status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
vplist_free( &a );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_thesishint( int type, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( type==TYPE_MASTERSTHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Masters thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_PHDTHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Ph.D. thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_DIPLOMATHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Diploma thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_DOCTORALTHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Doctoral thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_HABILITATIONTHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Habilitation thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_LICENTIATETHESIS ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "%9", "Licentiate thesis", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_easyall( fields *in, char *tag, char *entag, int level, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
vplist_index i;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
vplist a;
|
|
Packit |
89ede9 |
vplist_init( &a );
|
|
Packit |
89ede9 |
fields_findv_each( in, level, FIELDS_CHRP, &a, tag );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
fstatus = fields_add( out, entag, (char *) vplist_get( &a, i ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
vplist_free( &a );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_easy( fields *in, char *tag, char *entag, int level, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *value;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
value = fields_findv( in, level, FIELDS_CHRP, tag );
|
|
Packit |
89ede9 |
if ( value ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, entag, value, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
append_data( fields *in, fields *out, param *p, unsigned long refnum )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int added, type, status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_clearused( in );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
type = get_type( in, p, refnum );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_type( type, out, p, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
added = append_title( in, "TITLE", "SUBTITLE", "%T", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
if ( added==0 ) append_title( in, "SHORTTITLE", "SHORTSUBTITLE", "%T", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
else append_title( in, "SHORTTITLE", "SHORTSUBTITLE", "%!", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_people( in, "AUTHOR", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "EDITOR", "%E", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
if ( type==TYPE_ARTICLE || type==TYPE_MAGARTICLE || type==TYPE_ELECTRONICARTICLE || type==TYPE_NEWSARTICLE )
|
|
Packit |
89ede9 |
append_people( in, "EDITOR", "%E", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
else if ( type==TYPE_INBOOK || type==TYPE_INPROCEEDINGS ) {
|
|
Packit |
89ede9 |
append_people( in, "EDITOR", "%E", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
append_people( in, "EDITOR", "%Y", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
append_people( in, "TRANSLATOR", "%H", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_people( in, "AUTHOR", "%Y", LEVEL_SERIES, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "EDITOR", "%Y", LEVEL_SERIES, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( type==TYPE_CASE ) {
|
|
Packit |
89ede9 |
append_easy( in, "AUTHOR:CORP", "%I", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_easy( in, "AUTHOR:ASIS", "%I", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_HEARING ) {
|
|
Packit |
89ede9 |
append_easyall( in, "AUTHOR:CORP", "%S", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "AUTHOR:ASIS", "%S", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_NEWSARTICLE ) {
|
|
Packit |
89ede9 |
append_people( in, "REPORTER", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "REPORTER:CORP", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "REPORTER:ASIS", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( type==TYPE_COMMUNICATION ) {
|
|
Packit |
89ede9 |
append_people( in, "ADDRESSEE", "%E", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "ADDRESSEE:CORP", "%E", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_people( in, "ADDRESSEE:ASIS", "%E", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
append_easyall( in, "AUTHOR:CORP", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "AUTHOR:ASIS", "%A", LEVEL_MAIN, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "EDITOR:CORP", "%E", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "EDITOR:ASIS", "%E", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "TRANSLATOR:CORP", "%H", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall( in, "TRANSLATOR:ASIS", "%H", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( type==TYPE_ARTICLE || type==TYPE_MAGARTICLE || type==TYPE_ELECTRONICARTICLE || type==TYPE_NEWSARTICLE ) {
|
|
Packit |
89ede9 |
added = append_title( in, "TITLE", "SUBTITLE", "%J", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
if ( added==0 ) append_title( in, "SHORTTITLE", "SHORTSUBTITLE", "%J", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else if ( type==TYPE_INBOOK || type==TYPE_INPROCEEDINGS ) {
|
|
Packit |
89ede9 |
added = append_title( in, "TITLE", "SUBTITLE", "%B", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
if ( added==0 ) append_title( in, "SHORTTITLE", "SHORTSUBTITLE", "%B", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
added = append_title( in, "TITLE", "SUBTITLE", "%S", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
if ( added==0 ) append_title( in, "SHORTTITLE", "SHORTSUBTITLE", "%S", LEVEL_HOST, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( type!=TYPE_CASE && type!=TYPE_HEARING ) {
|
|
Packit |
89ede9 |
append_title( in, "TITLE", "SUBTITLE", "%S", LEVEL_SERIES, out, &status );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_year ( in, out, &status );
|
|
Packit |
89ede9 |
append_monthday( in, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_easy ( in, "VOLUME", "%V", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "ISSUE", "%N", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "NUMBER", "%N", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "EDITION", "%7", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "PUBLISHER", "%I", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "ADDRESS", "%C", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "DEGREEGRANTOR", "%C", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "DEGREEGRANTOR:CORP", "%C", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "DEGREEGRANTOR:ASIS", "%C", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "SERIALNUMBER", "%@", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "ISSN", "%@", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "ISBN", "%@", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "LANGUAGE", "%G", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "REFNUM", "%F", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall ( in, "NOTES", "%O", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "ABSTRACT", "%X", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easy ( in, "CLASSIFICATION" , "%L", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall ( in, "KEYWORD", "%K", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_all_genrehint( type, in, out, &status );
|
|
Packit |
89ede9 |
append_thesishint( type, out, &status );
|
|
Packit |
89ede9 |
append_easyall ( in, "DOI", "%R", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall ( in, "URL", "%U", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_easyall ( in, "FILEATTACH", "%U", LEVEL_ANY, out, &status );
|
|
Packit |
89ede9 |
append_urls ( in, out, &status );
|
|
Packit |
89ede9 |
append_pages ( in, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
output( FILE *fp, fields *out )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<out->n; ++i ) {
|
|
Packit |
89ede9 |
fprintf( fp, "%s %s\n",
|
|
Packit |
89ede9 |
(char*) fields_tag( out, i, FIELDS_CHRP ),
|
|
Packit |
89ede9 |
(char*) fields_value( out, i, FIELDS_CHRP )
|
|
Packit |
89ede9 |
);
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fprintf( fp, "\n" );
|
|
Packit |
89ede9 |
fflush( fp );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
endout_write( fields *in, FILE *fp, param *p, unsigned long refnum )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
fields out;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_init( &out );
|
|
Packit |
89ede9 |
status = append_data( in, &out, p, refnum );
|
|
Packit |
89ede9 |
if ( status==BIBL_OK ) output( fp, &out );
|
|
Packit |
89ede9 |
fields_free( &out );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
endout_writeheader( FILE *outptr, param *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( p->utf8bom ) utf8_writebom( outptr );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|