Blame bibutils/nbibout.c

Packit 89ede9
/*
Packit 89ede9
 * nbibout.c
Packit 89ede9
 *
Packit 89ede9
 * Copyright (c) Chris Putnam 2018
Packit 89ede9
 *
Packit 89ede9
 * Source code released under the GPL version 2
Packit 89ede9
 *
Packit 89ede9
 */
Packit 89ede9
#include <stdio.h>
Packit 89ede9
#include <stdlib.h>
Packit 89ede9
#include <string.h>
Packit 89ede9
#include <ctype.h>
Packit 89ede9
#include "utf8.h"
Packit 89ede9
#include "str.h"
Packit 89ede9
#include "is_ws.h"
Packit 89ede9
#include "strsearch.h"
Packit 89ede9
#include "fields.h"
Packit 89ede9
#include "iso639_3.h"
Packit 89ede9
#include "title.h"
Packit 89ede9
#include "bibutils.h"
Packit 89ede9
#include "bibformats.h"
Packit 89ede9
Packit 89ede9
static int  nbibout_write( fields *info, FILE *fp, param *p, unsigned long refnum );
Packit 89ede9
static void nbibout_writeheader( FILE *outptr, param *p );
Packit 89ede9
Packit 89ede9
void
Packit 89ede9
nbibout_initparams( param *p, const char *progname )
Packit 89ede9
{
Packit 89ede9
	p->writeformat      = BIBL_NBIBOUT;
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 = nbibout_writeheader;
Packit 89ede9
	p->footerf = NULL;
Packit 89ede9
	p->writef  = nbibout_write;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
enum {
Packit 89ede9
        TYPE_UNKNOWN = 0,
Packit 89ede9
        TYPE_ARTICLE = 1,
Packit 89ede9
        TYPE_INBOOK  = 2,
Packit 89ede9
        TYPE_BOOK    = 3,
Packit 89ede9
};
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_type( fields *in, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	int fstatus;
Packit 89ede9
	char *s;
Packit 89ede9
        int type = TYPE_UNKNOWN, i, n, level;
Packit 89ede9
	char *tag, *value;
Packit 89ede9
Packit 89ede9
	n = fields_num( in );
Packit 89ede9
        for ( i=0; i
Packit 89ede9
		tag = fields_tag( in, i, FIELDS_CHRP );
Packit 89ede9
                if ( strcasecmp( tag, "GENRE:MARC" ) &&
Packit 89ede9
		     strcasecmp( tag, "GENRE:BIBUTILS" ) &&
Packit 89ede9
		     strcasecmp( tag, "GENRE:UNKNOWN" ) ) continue;
Packit 89ede9
		value = fields_value( in, i, FIELDS_CHRP );
Packit 89ede9
		level = fields_level( in, i );
Packit 89ede9
                if ( !strcasecmp( value, "periodical" ) ||
Packit 89ede9
                     !strcasecmp( value, "academic journal" ) ||
Packit 89ede9
		     !strcasecmp( value, "journal article" ) ) {
Packit 89ede9
                        type = TYPE_ARTICLE;
Packit 89ede9
                } else if ( !strcasecmp( value, "book" ) ) {
Packit 89ede9
                        if ( level==0 ) type=TYPE_BOOK;
Packit 89ede9
                        else type=TYPE_INBOOK;
Packit 89ede9
		} else if ( !strcasecmp( value, "book chapter" ) ) {
Packit 89ede9
			type = TYPE_INBOOK;
Packit 89ede9
                }
Packit 89ede9
        }
Packit 89ede9
Packit 89ede9
	if ( type==TYPE_ARTICLE ) s = "Journal Article";
Packit 89ede9
	else if ( type==TYPE_INBOOK ) s = "Chapter";
Packit 89ede9
	else if ( type==TYPE_BOOK ) s = "Book";
Packit 89ede9
	else s = "Miscellaneous";
Packit 89ede9
Packit 89ede9
	fstatus = fields_add( out, "PT", s, LEVEL_MAIN );
Packit 89ede9
	if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_titlecore( fields *in, char *nbibtag, int level, char *maintag, char *subtag, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	str *mainttl = fields_findv( in, level, FIELDS_STRP, maintag );
Packit 89ede9
	str *subttl  = fields_findv( in, level, FIELDS_STRP, subtag );
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, nbibtag, 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
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_title( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	append_titlecore( in, nbibtag, level, "TITLE", "SUBTITLE", out, status );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_abbrtitle( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	append_titlecore( in, nbibtag, level, "SHORTTITLE", "SHORTSUBTITLE", out, status );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
process_person( str *person, char *name, int full )
Packit 89ede9
{
Packit 89ede9
	str family, given, suffix;
Packit 89ede9
	char *p = name;
Packit 89ede9
Packit 89ede9
	str_empty( person );
Packit 89ede9
Packit 89ede9
	strs_init( &family, &given, &suffix, NULL );
Packit 89ede9
Packit 89ede9
	while ( *p && *p!='|' )
Packit 89ede9
		str_addchar( &family, *p++ );
Packit 89ede9
Packit 89ede9
	if ( full ) {
Packit 89ede9
		while ( *p=='|' && *(p+1)!='|' ) {
Packit 89ede9
			p++;
Packit 89ede9
			if ( *p!='|' && str_has_value( &given ) ) str_addchar( &given, ' ' );
Packit 89ede9
			while ( *p && *p!='|' ) str_addchar( &given, *p++ );
Packit 89ede9
		}
Packit 89ede9
	}
Packit 89ede9
	else {
Packit 89ede9
		while ( *p=='|' && *(p+1)!='|' ) {
Packit 89ede9
			p++;
Packit 89ede9
			if ( *p!='|' ) str_addchar( &given, *p++ );
Packit 89ede9
			while ( *p && *p!='|' ) p++;
Packit 89ede9
		}
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( *p=='|' && *(p+1)=='|' ) {
Packit 89ede9
		p += 2;
Packit 89ede9
		while ( *p && *p!='|' ) str_addchar( &suffix, *p++ );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( str_has_value( &family ) ) str_strcat( person, &family );
Packit 89ede9
	if ( str_has_value( &suffix ) ) {
Packit 89ede9
		if ( str_has_value( &family ) ) str_strcatc( person, " " );
Packit 89ede9
		str_strcat( person, &suffix );
Packit 89ede9
	}
Packit 89ede9
	if ( str_has_value( &given ) ) {
Packit 89ede9
		if ( str_has_value( person ) ) {
Packit 89ede9
			if ( full ) str_strcatc( person, ", " );
Packit 89ede9
			else        str_strcatc( person, " " );
Packit 89ede9
		}
Packit 89ede9
		str_strcat( person, &given );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	strs_free( &family, &given, &suffix, NULL );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_people( fields *f, char *tag, char *nbibtag_full, char *nbibtag_abbr, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	vplist_index i;
Packit 89ede9
	vplist people;
Packit 89ede9
	str person;
Packit 89ede9
	int fstatus;
Packit 89ede9
Packit 89ede9
	str_init( &person );
Packit 89ede9
	vplist_init( &people );
Packit 89ede9
Packit 89ede9
	fields_findv_each( f, level, FIELDS_CHRP, &people, tag );
Packit 89ede9
	for ( i=0; i
Packit 89ede9
Packit 89ede9
		process_person( &person, (char *)vplist_get( &people, i ), 1 );
Packit 89ede9
		if ( str_memerr( &person ) ) { *status = BIBL_ERR_MEMERR; goto out; }
Packit 89ede9
		fstatus = fields_add_can_dup( out, nbibtag_full, str_cstr( &person ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) { *status = BIBL_ERR_MEMERR; goto out; }
Packit 89ede9
Packit 89ede9
		process_person( &person, (char *)vplist_get( &people, i ), 0 );
Packit 89ede9
		if ( str_memerr( &person ) ) { *status = BIBL_ERR_MEMERR; goto out; }
Packit 89ede9
		fstatus = fields_add_can_dup( out, nbibtag_abbr, str_cstr( &person ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) { *status = BIBL_ERR_MEMERR; goto out; }
Packit 89ede9
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
out:
Packit 89ede9
	vplist_free( &people );
Packit 89ede9
	str_free( &person );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_easy( fields *in, char *tag, char *nbibtag, 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, nbibtag, value, 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 *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	vplist_index i;
Packit 89ede9
	int fstatus;
Packit 89ede9
	vplist a;
Packit 89ede9
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, nbibtag, (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_pages( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	str *start, *stop, *articlenumber;
Packit 89ede9
	int fstatus;
Packit 89ede9
	str pages;
Packit 89ede9
	char *p, *q;
Packit 89ede9
Packit 89ede9
	str_init( &pages );
Packit 89ede9
Packit 89ede9
	start = fields_findv_firstof( in, level, FIELDS_STRP, "PAGES:START", NULL );
Packit 89ede9
	if ( start ) {
Packit 89ede9
		str_strcpy( &pages, start );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	stop  = fields_findv_firstof( in, level, FIELDS_STRP, "PAGES:STOP", NULL );
Packit 89ede9
	if ( stop ) {
Packit 89ede9
		/* nbib from pubmed doesn't do "PG - 101-109", but rather "PG - 101-9" */
Packit 89ede9
		if ( start ) {
Packit 89ede9
			p = str_cstr( start );
Packit 89ede9
			q = str_cstr( stop );
Packit 89ede9
			while ( *p && *p == *q ) {
Packit 89ede9
				p++;
Packit 89ede9
				q++;
Packit 89ede9
			}
Packit 89ede9
			if ( *q ) {
Packit 89ede9
				str_addchar( &pages, '-' );
Packit 89ede9
				str_strcatc( &pages, q );
Packit 89ede9
			}
Packit 89ede9
		}
Packit 89ede9
		else {
Packit 89ede9
			str_strcat( &pages, stop );
Packit 89ede9
		}
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	articlenumber  = fields_findv_firstof( in, level, FIELDS_STRP, "ARTICLENUMBER", NULL );
Packit 89ede9
	if ( str_is_empty( &pages ) && articlenumber ) {
Packit 89ede9
		str_strcpy( &pages, articlenumber );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( str_has_value( &pages ) ) {
Packit 89ede9
		fstatus = fields_add( out, nbibtag, str_cstr( &pages ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	str_free( &pages );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
/* location identifier */
Packit 89ede9
static void
Packit 89ede9
append_lid( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	str *doi, *pii, *isi;
Packit 89ede9
	int fstatus;
Packit 89ede9
	str lid;
Packit 89ede9
Packit 89ede9
	str_init( &lid );
Packit 89ede9
Packit 89ede9
	doi = fields_findv( in, level, FIELDS_STRP, "DOI" );
Packit 89ede9
	if ( doi ) {
Packit 89ede9
		str_strcpy( &lid, doi );
Packit 89ede9
		str_strcatc( &lid, " [doi]" );
Packit 89ede9
		fstatus = fields_add( out, nbibtag, str_cstr( &lid ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	pii = fields_findv( in, level, FIELDS_STRP, "PII" );
Packit 89ede9
	if ( pii ) {
Packit 89ede9
		str_strcpy( &lid, pii );
Packit 89ede9
		str_strcatc( &lid, " [pii]" );
Packit 89ede9
		fstatus = fields_add( out, nbibtag, str_cstr( &lid ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	isi = fields_findv( in, level, FIELDS_STRP, "ISIREFNUM" );
Packit 89ede9
	if ( isi ) {
Packit 89ede9
		str_strcpy( &lid, isi );
Packit 89ede9
		str_strcatc( &lid, " [isi]" );
Packit 89ede9
		fstatus = fields_add( out, nbibtag, str_cstr( &lid ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
Packit 89ede9
Packit 89ede9
	str_free( &lid );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_date( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	str *day, *month, *year;
Packit 89ede9
	int fstatus;
Packit 89ede9
	str date;
Packit 89ede9
Packit 89ede9
	str_init( &date );
Packit 89ede9
Packit 89ede9
	year  = fields_findv_firstof( in, level, FIELDS_STRP, "PARTDATE:YEAR",  "DATE:YEAR",  NULL );
Packit 89ede9
	if ( year ) {
Packit 89ede9
		str_strcpy( &date, year );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	month = fields_findv_firstof( in, level, FIELDS_STRP, "PARTDATE:MONTH", "DATE:MONTH", NULL );
Packit 89ede9
	if ( month ) {
Packit 89ede9
		if ( str_has_value( &date ) ) str_addchar( &date, ' ' );
Packit 89ede9
		str_strcat( &date, month );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	day   = fields_findv_firstof( in, level, FIELDS_STRP, "PARTDATE:DAY",   "DATE:DAY",   NULL );
Packit 89ede9
	if ( day ) {
Packit 89ede9
		if ( str_has_value( &date ) ) str_addchar( &date, ' ' );
Packit 89ede9
		str_strcat( &date, day );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( str_has_value( &date ) ) {
Packit 89ede9
		fstatus = fields_add( out, nbibtag, str_cstr( &date ), LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
	
Packit 89ede9
	str_free( &date );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
append_lang( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	int fstatus;
Packit 89ede9
	str *lang;
Packit 89ede9
	char *code;
Packit 89ede9
Packit 89ede9
	lang = fields_findv( in, level, FIELDS_STRP, "LANGUAGE" );
Packit 89ede9
	if ( lang ) {
Packit 89ede9
		code = iso639_3_from_name( str_cstr( lang ) );
Packit 89ede9
		if ( !code ) code = str_cstr( lang );
Packit 89ede9
		fstatus = fields_add( out, nbibtag, code, 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_keywords( fields *in, char *nbibtag, int level, fields *out, int *status )
Packit 89ede9
{
Packit 89ede9
	vplist keywords;
Packit 89ede9
	int fstatus;
Packit 89ede9
	char *kw;
Packit 89ede9
	int i;
Packit 89ede9
Packit 89ede9
	vplist_init( &keywords );
Packit 89ede9
Packit 89ede9
	fields_findv_each( in, level, FIELDS_CHRP, &keywords, "KEYWORD" );
Packit 89ede9
	for ( i=0; i
Packit 89ede9
		kw = vplist_get( &keywords, i );
Packit 89ede9
		fstatus = fields_add( out, nbibtag, kw, LEVEL_MAIN );
Packit 89ede9
		if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
Packit 89ede9
	}
Packit 89ede9
	
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static int
Packit 89ede9
append_data( fields *in, fields *out )
Packit 89ede9
{
Packit 89ede9
	int status = BIBL_OK;
Packit 89ede9
Packit 89ede9
	append_easy ( in, "PMID",   "PMID", LEVEL_ANY,  out, &status );
Packit 89ede9
	append_easyall( in, "ISSN", "IS",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_easy ( in, "VOLUME", "VI",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_easy ( in, "ISSUE",  "IP",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_easy ( in, "NUMBER", "IP",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_date ( in,           "DP",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_title( in,           "TI",   LEVEL_MAIN, out, &status );
Packit 89ede9
	append_pages( in,           "PG",   LEVEL_ANY,  out, &status );
Packit 89ede9
	append_lid  ( in,           "LID",  LEVEL_MAIN, out, &status );
Packit 89ede9
	append_easy ( in, "ABSTRACT", "AB", LEVEL_MAIN, out, &status );
Packit 89ede9
	append_people ( in, "AUTHOR", "FAU",  "AU", LEVEL_MAIN, out, &status );
Packit 89ede9
	append_easyall( in, "AUTHOR:CORP", "FAU", LEVEL_MAIN, out, &status );
Packit 89ede9
	append_easyall( in, "AUTHOR:ASIS", "FAU", LEVEL_MAIN, out, &status );
Packit 89ede9
	append_lang ( in,             "LA", LEVEL_ANY,  out, &status );
Packit 89ede9
	append_type ( in, out, &status );
Packit 89ede9
	append_easy(  in, "ADDRESS", "PL", LEVEL_MAIN, out, &status );
Packit 89ede9
	append_abbrtitle( in, "TA", LEVEL_HOST, out, &status );
Packit 89ede9
	append_title( in, "JT", LEVEL_HOST, out, &status );
Packit 89ede9
	append_easy ( in, "PMC",    "PMC",  LEVEL_ANY,  out, &status );
Packit 89ede9
	append_keywords( in, "OT", LEVEL_ANY, out, &status );
Packit 89ede9
	return status;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
output_verbose( fields *f, const char *type, unsigned long refnum )
Packit 89ede9
{
Packit 89ede9
	char *tag, *value;
Packit 89ede9
	int i, n, level;
Packit 89ede9
Packit 89ede9
	fprintf( stderr, "REF #%lu %s---\n", refnum+1, type );
Packit 89ede9
Packit 89ede9
	n = fields_num( f );
Packit 89ede9
	for ( i=0; i
Packit 89ede9
		tag   = fields_tag( f, i, FIELDS_CHRP_NOUSE );
Packit 89ede9
		value = fields_value( f, i, FIELDS_CHRP_NOUSE );
Packit 89ede9
		level = fields_level( f, i );
Packit 89ede9
		fprintf( stderr, "\t'%s'\t'%s'\t%d\n", tag, value, level );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	fflush( stderr );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
output_tag( FILE *fp, char *p )
Packit 89ede9
{
Packit 89ede9
	int i = 0;
Packit 89ede9
Packit 89ede9
	while ( i < 4 && p && *p ) {
Packit 89ede9
		fprintf( fp, "%c", *p );
Packit 89ede9
		i++;
Packit 89ede9
		p++;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	for ( ; i<4; ++i )
Packit 89ede9
		fprintf( fp, " " );
Packit 89ede9
	fprintf( fp, "- " );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
output_value( FILE *fp, str *value )
Packit 89ede9
{
Packit 89ede9
	char *p, *q, *lastws;
Packit 89ede9
	int n;
Packit 89ede9
Packit 89ede9
	if ( value->len < 82 ) {
Packit 89ede9
		fprintf( fp, "%s", str_cstr( value ) );
Packit 89ede9
		return;
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	p = str_cstr( value );
Packit 89ede9
	while ( p && *p ) {
Packit 89ede9
		n = 0;
Packit 89ede9
		q = p;
Packit 89ede9
		lastws = NULL;
Packit 89ede9
		while ( n < 82 && *q ) {
Packit 89ede9
			if ( is_ws( *q ) ) lastws = q;
Packit 89ede9
			q++;
Packit 89ede9
			n++;
Packit 89ede9
		}
Packit 89ede9
		if ( *q && lastws ) {
Packit 89ede9
			while ( p!=lastws ) {
Packit 89ede9
				fprintf( fp, "%c", *p );
Packit 89ede9
				p++;
Packit 89ede9
			}
Packit 89ede9
			p++; /* skip ws separator */
Packit 89ede9
		}
Packit 89ede9
		else {
Packit 89ede9
			while ( p!=q ) {
Packit 89ede9
				fprintf( fp, "%c", *p );
Packit 89ede9
				p++;
Packit 89ede9
			}
Packit 89ede9
			p = q;
Packit 89ede9
		}
Packit 89ede9
		if ( *p ) {
Packit 89ede9
			fprintf( fp, "\n" );
Packit 89ede9
			fprintf( fp, "      " );
Packit 89ede9
		}
Packit 89ede9
	}
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
output_reference( FILE *fp, fields *out )
Packit 89ede9
{
Packit 89ede9
	int i;
Packit 89ede9
Packit 89ede9
	for ( i=0; i<out->n; ++i ) {
Packit 89ede9
Packit 89ede9
		output_tag( fp, ( char * ) fields_tag( out, i, FIELDS_CHRP ) );
Packit 89ede9
		output_value( fp, ( str * ) fields_value( out, i, FIELDS_STRP ) );
Packit 89ede9
		fprintf( fp, "\n" );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
        fprintf( fp, "\n\n" );
Packit 89ede9
        fflush( fp );
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static int
Packit 89ede9
nbibout_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
Packit 89ede9
	if ( p->format_opts & BIBL_FORMAT_VERBOSE )
Packit 89ede9
		output_verbose( in, "IN", refnum );
Packit 89ede9
Packit 89ede9
	status = append_data( in, &out );
Packit 89ede9
Packit 89ede9
	if ( status==BIBL_OK ) output_reference( fp, &out );
Packit 89ede9
Packit 89ede9
	if ( p->format_opts & BIBL_FORMAT_VERBOSE )
Packit 89ede9
		output_verbose( &out, "OUT", refnum );
Packit 89ede9
Packit 89ede9
	fields_free( &out );
Packit 89ede9
Packit 89ede9
	return status;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
static void
Packit 89ede9
nbibout_writeheader( FILE *outptr, param *p )
Packit 89ede9
{
Packit 89ede9
	if ( p->utf8bom ) utf8_writebom( outptr );
Packit 89ede9
}