Blame bibutils/endout.c

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