|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* bibtexout.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2003-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 "str.h"
|
|
Packit |
89ede9 |
#include "strsearch.h"
|
|
Packit |
89ede9 |
#include "utf8.h"
|
|
Packit |
89ede9 |
#include "xml.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 bibtexout_write( fields *in, FILE *fp, param *p, unsigned long refnum );
|
|
Packit |
89ede9 |
static void bibtexout_writeheader( FILE *outptr, param *p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
bibtexout_initparams( param *p, const char *progname )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
p->writeformat = BIBL_BIBTEXOUT;
|
|
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 = 1;
|
|
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 |
p->headerf = bibtexout_writeheader;
|
|
Packit |
89ede9 |
p->footerf = NULL;
|
|
Packit |
89ede9 |
p->writef = bibtexout_write;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !p->progname && progname )
|
|
Packit |
89ede9 |
p->progname = strdup( progname );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
enum {
|
|
Packit |
89ede9 |
TYPE_UNKNOWN = 0,
|
|
Packit |
89ede9 |
TYPE_ARTICLE,
|
|
Packit |
89ede9 |
TYPE_INBOOK,
|
|
Packit |
89ede9 |
TYPE_INPROCEEDINGS,
|
|
Packit |
89ede9 |
TYPE_PROCEEDINGS,
|
|
Packit |
89ede9 |
TYPE_INCOLLECTION,
|
|
Packit |
89ede9 |
TYPE_COLLECTION,
|
|
Packit |
89ede9 |
TYPE_BOOK,
|
|
Packit |
89ede9 |
TYPE_PHDTHESIS,
|
|
Packit |
89ede9 |
TYPE_MASTERSTHESIS,
|
|
Packit |
89ede9 |
TYPE_DIPLOMATHESIS,
|
|
Packit |
89ede9 |
TYPE_REPORT,
|
|
Packit |
89ede9 |
TYPE_MANUAL,
|
|
Packit |
89ede9 |
TYPE_UNPUBLISHED,
|
|
Packit |
89ede9 |
TYPE_ELECTRONIC,
|
|
Packit |
89ede9 |
TYPE_MISC,
|
|
Packit |
89ede9 |
NUM_TYPES
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
is_genre_element( fields *in, int n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *tag;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
tag = fields_tag( in, n, FIELDS_CHRP );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !strcasecmp( tag, "GENRE:MARC" ) ) return 1;
|
|
Packit |
89ede9 |
if ( !strcasecmp( tag, "GENRE:BIBUTILS" ) ) return 1;
|
|
Packit |
89ede9 |
if ( !strcasecmp( tag, "GENRE:UNKNOWN" ) ) return 1;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
is_issuance_element( fields *in, int n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( !strcasecmp( fields_tag( in, n, FIELDS_CHRP ), "ISSUANCE" ) ) return 1;
|
|
Packit |
89ede9 |
else return 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
bibtexout_type( fields *in, char *filename, int refnum, param *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int type = TYPE_UNKNOWN, i, maxlevel, n, level;
|
|
Packit |
89ede9 |
char *genre;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* determine bibliography type from GENRE */
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( !is_genre_element( in, i ) ) continue;
|
|
Packit |
89ede9 |
genre = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
level = in->level[i];
|
|
Packit |
89ede9 |
if ( !strcasecmp( genre, "periodical" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "academic journal" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "magazine" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "newspaper" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "article" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_ARTICLE;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "instruction" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_MANUAL;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "unpublished" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "manuscript" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_UNPUBLISHED;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "conference publication" ) ) {
|
|
Packit |
89ede9 |
if ( level==0 ) type=TYPE_PROCEEDINGS;
|
|
Packit |
89ede9 |
else type = TYPE_INPROCEEDINGS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "collection" ) ) {
|
|
Packit |
89ede9 |
if ( level==0 ) type=TYPE_COLLECTION;
|
|
Packit |
89ede9 |
else type = TYPE_INCOLLECTION;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "report" ) ||
|
|
Packit |
89ede9 |
!strcasecmp( genre, "technical report" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_REPORT;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "book chapter" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "book" ) ) {
|
|
Packit |
89ede9 |
if ( level==0 ) type = TYPE_BOOK;
|
|
Packit |
89ede9 |
else type = TYPE_INBOOK;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "thesis" ) ) {
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) type=TYPE_PHDTHESIS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "Ph.D. thesis" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_PHDTHESIS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "Licentiate thesis" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_PHDTHESIS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "Masters thesis" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_MASTERSTHESIS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "Diploma thesis" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_DIPLOMATHESIS;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "electronic" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_ELECTRONIC;
|
|
Packit |
89ede9 |
} else if ( !strcasecmp( genre, "miscellaneous" ) ) {
|
|
Packit |
89ede9 |
type = TYPE_MISC;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* check type from ISSUANCE */
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( !is_issuance_element( in, i ) ) continue;
|
|
Packit |
89ede9 |
genre = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( !strcasecmp( genre, "monographic" ) ) {
|
|
Packit |
89ede9 |
if ( level==0 ) type = TYPE_BOOK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* default to TYPE_MISC */
|
|
Packit |
89ede9 |
if ( type==TYPE_UNKNOWN ) {
|
|
Packit |
89ede9 |
maxlevel = fields_maxlevel( in );
|
|
Packit |
89ede9 |
if ( maxlevel > 0 ) type = TYPE_MISC;
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( p->progname ) fprintf( stderr, "%s: ", p->progname );
|
|
Packit |
89ede9 |
fprintf( stderr, "Cannot identify TYPE in reference %d ", 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 @Misc)\n" );
|
|
Packit |
89ede9 |
type = TYPE_MISC;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return type;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
output( FILE *fp, fields *out, int format_opts )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, j, len, nquotes;
|
|
Packit |
89ede9 |
char *tag, *value, ch;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...output type information "@article{" */
|
|
Packit |
89ede9 |
value = ( char * ) fields_value( out, 0, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( !(format_opts & BIBL_FORMAT_BIBOUT_UPPERCASE) ) fprintf( fp, "@%s{", value );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
len = strlen( value );
|
|
Packit |
89ede9 |
fprintf( fp, "@" );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
fprintf( fp, "%c", toupper((unsigned char)value[i]) );
|
|
Packit |
89ede9 |
fprintf( fp, "{" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...output refnum "Smith2001" */
|
|
Packit |
89ede9 |
value = ( char * ) fields_value( out, 1, FIELDS_CHRP );
|
|
Packit |
89ede9 |
fprintf( fp, "%s", value );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...rest of the references */
|
|
Packit |
89ede9 |
for ( j=2; j<out->n; ++j ) {
|
|
Packit |
89ede9 |
nquotes = 0;
|
|
Packit |
89ede9 |
tag = ( char * ) fields_tag( out, j, FIELDS_CHRP );
|
|
Packit |
89ede9 |
value = ( char * ) fields_value( out, j, FIELDS_CHRP );
|
|
Packit |
89ede9 |
fprintf( fp, ",\n" );
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_WHITESPACE ) fprintf( fp, " " );
|
|
Packit |
89ede9 |
if ( !(format_opts & BIBL_FORMAT_BIBOUT_UPPERCASE ) ) fprintf( fp, "%s", tag );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
len = strlen( tag );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
fprintf( fp, "%c", toupper((unsigned char)tag[i]) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_WHITESPACE ) fprintf( fp, " = \t" );
|
|
Packit |
89ede9 |
else fprintf( fp, "=" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_BRACKETS ) fprintf( fp, "{" );
|
|
Packit |
89ede9 |
else fprintf( fp, "\"" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
len = strlen( value );
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
ch = value[i];
|
|
Packit |
89ede9 |
if ( ch!='\"' ) fprintf( fp, "%c", ch );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_BRACKETS || ( i>0 && value[i-1]=='\\' ) )
|
|
Packit |
89ede9 |
fprintf( fp, "\"" );
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( nquotes % 2 == 0 )
|
|
Packit |
89ede9 |
fprintf( fp, "``" );
|
|
Packit |
89ede9 |
else fprintf( fp, "\'\'" );
|
|
Packit |
89ede9 |
nquotes++;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_BRACKETS ) fprintf( fp, "}" );
|
|
Packit |
89ede9 |
else fprintf( fp, "\"" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...finish reference */
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_FINALCOMMA ) fprintf( fp, "," );
|
|
Packit |
89ede9 |
fprintf( fp, "\n}\n\n" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fflush( fp );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_type( int type, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *typenames[ NUM_TYPES ] = {
|
|
Packit |
89ede9 |
[ TYPE_ARTICLE ] = "Article",
|
|
Packit |
89ede9 |
[ TYPE_INBOOK ] = "Inbook",
|
|
Packit |
89ede9 |
[ TYPE_PROCEEDINGS ] = "Proceedings",
|
|
Packit |
89ede9 |
[ TYPE_INPROCEEDINGS ] = "InProceedings",
|
|
Packit |
89ede9 |
[ TYPE_BOOK ] = "Book",
|
|
Packit |
89ede9 |
[ TYPE_PHDTHESIS ] = "PhdThesis",
|
|
Packit |
89ede9 |
[ TYPE_MASTERSTHESIS ] = "MastersThesis",
|
|
Packit |
89ede9 |
[ TYPE_DIPLOMATHESIS ] = "MastersThesis",
|
|
Packit |
89ede9 |
[ TYPE_REPORT ] = "TechReport",
|
|
Packit |
89ede9 |
[ TYPE_MANUAL ] = "Manual",
|
|
Packit |
89ede9 |
[ TYPE_COLLECTION ] = "Collection",
|
|
Packit |
89ede9 |
[ TYPE_INCOLLECTION ] = "InCollection",
|
|
Packit |
89ede9 |
[ TYPE_UNPUBLISHED ] = "Unpublished",
|
|
Packit |
89ede9 |
[ TYPE_ELECTRONIC ] = "Electronic",
|
|
Packit |
89ede9 |
[ TYPE_MISC ] = "Misc",
|
|
Packit |
89ede9 |
};
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
char *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( type < 0 || type >= NUM_TYPES ) type = TYPE_MISC;
|
|
Packit |
89ede9 |
s = typenames[ type ];
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "TYPE", s, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_citekey( fields *in, fields *out, int format_opts, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus;
|
|
Packit |
89ede9 |
str s;
|
|
Packit |
89ede9 |
char *p;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, "REFNUM", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( ( format_opts & BIBL_FORMAT_BIBOUT_DROPKEY ) || n==FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "REFNUM", "", LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
p = fields_value( in, n, FIELDS_CHRP );
|
|
Packit |
89ede9 |
while ( p && *p && *p!='|' ) {
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_STRICTKEY ) {
|
|
Packit |
89ede9 |
if ( isdigit((unsigned char)*p) || (*p>='A' && *p<='Z') ||
|
|
Packit |
89ede9 |
(*p>='a' && *p<='z' ) ) {
|
|
Packit |
89ede9 |
str_addchar( &s, *p );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
if ( *p!=' ' && *p!='\t' ) {
|
|
Packit |
89ede9 |
str_addchar( &s, *p );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
p++;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) { *status = BIBL_ERR_MEMERR; str_free( &s ); return; }
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "REFNUM", str_cstr( &s ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_simple( fields *in, char *intag, char *outtag, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, intag, LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n!=FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, outtag, fields_value( in, n, FIELDS_CHRP ), 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_simpleall( fields *in, char *intag, char *outtag, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( fields_match_tag( in, i, intag ) ) {
|
|
Packit |
89ede9 |
fields_setused( in, i );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, outtag, fields_value( in, i, FIELDS_CHRP ), 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 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_keywords( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str keywords, *word;
|
|
Packit |
89ede9 |
vplist_index i;
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
vplist a;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &keywords );
|
|
Packit |
89ede9 |
vplist_init( &a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_findv_each( in, LEVEL_ANY, FIELDS_STRP, &a, "KEYWORD" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( a.n ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
word = vplist_get( &a, i );
|
|
Packit |
89ede9 |
if ( i>0 ) str_strcatc( &keywords, "; " );
|
|
Packit |
89ede9 |
str_strcat( &keywords, word );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &keywords ) ) { *status = BIBL_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "keywords", str_cstr( &keywords ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &keywords );
|
|
Packit |
89ede9 |
vplist_free( &a );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_fileattach( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *tag, *value;
|
|
Packit |
89ede9 |
int i, fstatus;
|
|
Packit |
89ede9 |
str data;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &data );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
tag = fields_tag( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
if ( strcasecmp( tag, "FILEATTACH" ) ) continue;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
value = fields_value( in, i, FIELDS_CHRP );
|
|
Packit |
89ede9 |
str_strcpyc( &data, ":" );
|
|
Packit |
89ede9 |
str_strcatc( &data, value );
|
|
Packit |
89ede9 |
if ( strsearch( value, ".pdf" ) )
|
|
Packit |
89ede9 |
str_strcatc( &data, ":PDF" );
|
|
Packit |
89ede9 |
else if ( strsearch( value, ".html" ) )
|
|
Packit |
89ede9 |
str_strcatc( &data, ":HTML" );
|
|
Packit |
89ede9 |
else str_strcatc( &data, ":TYPE" );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &data ) ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_setused( in, i );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "file", str_cstr( &data ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_empty( &data );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &data );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_people( fields *in, char *tag, char *ctag, char *atag,
|
|
Packit |
89ede9 |
char *bibtag, int level, fields *out, int format_opts )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str allpeople, oneperson;
|
|
Packit |
89ede9 |
int i, npeople, person, corp, asis;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_init( &allpeople, &oneperson, NULL );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* primary citation authors */
|
|
Packit |
89ede9 |
npeople = 0;
|
|
Packit |
89ede9 |
for ( i=0; i<in->n; ++i ) {
|
|
Packit |
89ede9 |
if ( level!=LEVEL_ANY && in->level[i]!=level ) continue;
|
|
Packit |
89ede9 |
person = ( strcasecmp( in->tag[i].data, tag ) == 0 );
|
|
Packit |
89ede9 |
corp = ( strcasecmp( in->tag[i].data, ctag ) == 0 );
|
|
Packit |
89ede9 |
asis = ( strcasecmp( in->tag[i].data, atag ) == 0 );
|
|
Packit |
89ede9 |
if ( person || corp || asis ) {
|
|
Packit |
89ede9 |
if ( npeople>0 ) {
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_WHITESPACE )
|
|
Packit |
89ede9 |
str_strcatc( &allpeople, "\n\t\tand " );
|
|
Packit |
89ede9 |
else str_strcatc( &allpeople, "\nand " );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( corp ) {
|
|
Packit |
89ede9 |
str_addchar( &allpeople, '{' );
|
|
Packit |
89ede9 |
str_strcat( &allpeople, fields_value( in, i, FIELDS_STRP ) );
|
|
Packit |
89ede9 |
str_addchar( &allpeople, '}' );
|
|
Packit |
89ede9 |
} else if ( asis ) {
|
|
Packit |
89ede9 |
str_addchar( &allpeople, '{' );
|
|
Packit |
89ede9 |
str_strcat( &allpeople, fields_value( in, i, FIELDS_STRP ) );
|
|
Packit |
89ede9 |
str_addchar( &allpeople, '}' );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
name_build_withcomma( &oneperson, fields_value( in, i, FIELDS_CHRP ) );
|
|
Packit |
89ede9 |
str_strcat( &allpeople, &oneperson );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
npeople++;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( npeople ) {
|
|
Packit |
89ede9 |
fields_add( out, bibtag, allpeople.data, LEVEL_MAIN );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
strs_free( &allpeople, &oneperson, NULL );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
append_title_chosen( fields *in, char *bibtag, fields *out, int nmainttl, int nsubttl )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str fulltitle, *mainttl = NULL, *subttl = NULL;
|
|
Packit |
89ede9 |
int status, ret = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &fulltitle );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nmainttl!=-1 ) {
|
|
Packit |
89ede9 |
mainttl = fields_value( in, nmainttl, FIELDS_STRP );
|
|
Packit |
89ede9 |
fields_setused( in, nmainttl );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nsubttl!=-1 ) {
|
|
Packit |
89ede9 |
subttl = fields_value( in, nsubttl, FIELDS_STRP );
|
|
Packit |
89ede9 |
fields_setused( in, nsubttl );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
title_combine( &fulltitle, mainttl, subttl );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( &fulltitle ) ) {
|
|
Packit |
89ede9 |
ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_has_value( &fulltitle ) ) {
|
|
Packit |
89ede9 |
status = fields_add( out, bibtag, str_cstr( &fulltitle ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( status!=FIELDS_OK ) ret = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &fulltitle );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
append_title( fields *in, char *bibtag, int level, fields *out, int format_opts )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int title, short_title, subtitle, short_subtitle, use_title, use_subtitle;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
title = fields_find( in, "TITLE", level );
|
|
Packit |
89ede9 |
short_title = fields_find( in, "SHORTTITLE", level );
|
|
Packit |
89ede9 |
subtitle = fields_find( in, "SUBTITLE", level );
|
|
Packit |
89ede9 |
short_subtitle = fields_find( in, "SHORTSUBTITLE", level );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( title==FIELDS_NOTFOUND || ( ( format_opts & BIBL_FORMAT_BIBOUT_SHORTTITLE ) && level==1 ) ) {
|
|
Packit |
89ede9 |
use_title = short_title;
|
|
Packit |
89ede9 |
use_subtitle = short_subtitle;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
use_title = title;
|
|
Packit |
89ede9 |
use_subtitle = subtitle;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return append_title_chosen( in, bibtag, out, use_title, use_subtitle );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_titles( fields *in, int type, fields *out, int format_opts, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
/* item=main level title */
|
|
Packit |
89ede9 |
*status = append_title( in, "title", 0, out, format_opts );
|
|
Packit |
89ede9 |
if ( *status!=BIBL_OK ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
switch( type ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
case TYPE_ARTICLE:
|
|
Packit |
89ede9 |
*status = append_title( in, "journal", 1, out, format_opts );
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
case TYPE_INBOOK:
|
|
Packit |
89ede9 |
*status = append_title( in, "bookTitle", 1, out, format_opts );
|
|
Packit |
89ede9 |
if ( *status!=BIBL_OK ) return;
|
|
Packit |
89ede9 |
*status = append_title( in, "series", 2, out, format_opts );
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
case TYPE_INCOLLECTION:
|
|
Packit |
89ede9 |
case TYPE_INPROCEEDINGS:
|
|
Packit |
89ede9 |
*status = append_title( in, "booktitle", 1, out, format_opts );
|
|
Packit |
89ede9 |
if ( *status!=BIBL_OK ) return;
|
|
Packit |
89ede9 |
*status = append_title( in, "series", 2, out, format_opts );
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
case TYPE_PHDTHESIS:
|
|
Packit |
89ede9 |
case TYPE_MASTERSTHESIS:
|
|
Packit |
89ede9 |
*status = append_title( in, "series", 1, out, format_opts );
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
case TYPE_BOOK:
|
|
Packit |
89ede9 |
case TYPE_REPORT:
|
|
Packit |
89ede9 |
case TYPE_COLLECTION:
|
|
Packit |
89ede9 |
case TYPE_PROCEEDINGS:
|
|
Packit |
89ede9 |
*status = append_title( in, "series", 1, out, format_opts );
|
|
Packit |
89ede9 |
if ( *status!=BIBL_OK ) return;
|
|
Packit |
89ede9 |
*status = append_title( in, "series", 2, out, format_opts );
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
default:
|
|
Packit |
89ede9 |
/* do nothing */
|
|
Packit |
89ede9 |
break;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
find_date( fields *in, char *date_element )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char date[100], partdate[100];
|
|
Packit |
89ede9 |
int n;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
sprintf( date, "DATE:%s", date_element );
|
|
Packit |
89ede9 |
n = fields_find( in, date, LEVEL_ANY );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( n==FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
sprintf( partdate, "PARTDATE:%s", date_element );
|
|
Packit |
89ede9 |
n = fields_find( in, partdate, LEVEL_ANY );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return n;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_date( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char *months[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
Packit |
89ede9 |
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
|
Packit |
89ede9 |
int n, month, fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = find_date( in, "YEAR" );
|
|
Packit |
89ede9 |
if ( n!=FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "year", in->data[n].data, 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 |
n = find_date( in, "MONTH" );
|
|
Packit |
89ede9 |
if ( n!=-1 ) {
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
month = atoi( in->data[n].data );
|
|
Packit |
89ede9 |
if ( month>0 && month<13 )
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "month", months[month-1], LEVEL_MAIN );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "month", in->data[n].data, 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 |
n = find_date( in, "DAY" );
|
|
Packit |
89ede9 |
if ( n!=-1 ) {
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "day", in->data[n].data, 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 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_arxiv( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus1, fstatus2;
|
|
Packit |
89ede9 |
str url;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, "ARXIV", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n==FIELDS_NOTFOUND ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...write:
|
|
Packit |
89ede9 |
* archivePrefix = "arXiv",
|
|
Packit |
89ede9 |
* eprint = "#####",
|
|
Packit |
89ede9 |
* ...for arXiv references
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
fstatus1 = fields_add( out, "archivePrefix", "arXiv", LEVEL_MAIN );
|
|
Packit |
89ede9 |
fstatus2 = fields_add( out, "eprint", fields_value( in, n, FIELDS_CHRP ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus1!=FIELDS_OK || fstatus2!=FIELDS_OK ) {
|
|
Packit |
89ede9 |
*status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
return;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...also write:
|
|
Packit |
89ede9 |
* url = "http://arxiv.org/abs/####",
|
|
Packit |
89ede9 |
* ...to maximize compatibility
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
str_init( &url );
|
|
Packit |
89ede9 |
arxiv_to_url( in, n, "URL", &url );
|
|
Packit |
89ede9 |
if ( str_has_value( &url ) ) {
|
|
Packit |
89ede9 |
fstatus1 = fields_add( out, "url", str_cstr( &url ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus1!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &url );
|
|
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", "JSTOR", 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, "url", LEVEL_MAIN, &types );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_free( &types );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_isi( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, "ISIREFNUM", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n==FIELDS_NOTFOUND ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "note", fields_value( in, n, FIELDS_CHRP ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_articlenumber( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, "ARTICLENUMBER", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n==FIELDS_NOTFOUND ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_setused( in, n );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "pages", fields_value( in, n, FIELDS_CHRP ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
pages_build_pagestr( str *pages, fields *in, int sn, int en, int format_opts )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
/* ...append if starting page number is defined */
|
|
Packit |
89ede9 |
if ( sn!=-1 ) {
|
|
Packit |
89ede9 |
str_strcat( pages, fields_value( in, sn, FIELDS_STRP ) );
|
|
Packit |
89ede9 |
fields_setused( in, sn );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...append dashes if both starting and ending page numbers are defined */
|
|
Packit |
89ede9 |
if ( sn!=-1 && en!=-1 ) {
|
|
Packit |
89ede9 |
if ( format_opts & BIBL_FORMAT_BIBOUT_SINGLEDASH )
|
|
Packit |
89ede9 |
str_strcatc( pages, "-" );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
str_strcatc( pages, "--" );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* ...append ending page number is defined */
|
|
Packit |
89ede9 |
if ( en!=-1 ) {
|
|
Packit |
89ede9 |
str_strcat( pages, fields_value( in, en, FIELDS_STRP ) );
|
|
Packit |
89ede9 |
fields_setused( in, en );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( pages ) ) return BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
else return BIBL_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
pages_are_defined( fields *in, int *sn, int *en )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
*sn = fields_find( in, "PAGES:START", LEVEL_ANY );
|
|
Packit |
89ede9 |
*en = fields_find( in, "PAGES:STOP", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( *sn==FIELDS_NOTFOUND && *en==FIELDS_NOTFOUND ) return 0;
|
|
Packit |
89ede9 |
else return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_pages( fields *in, fields *out, int format_opts, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int sn, en, fstatus;
|
|
Packit |
89ede9 |
str pages;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !pages_are_defined( in, &sn, &en ) ) {
|
|
Packit |
89ede9 |
append_articlenumber( in, out, status );
|
|
Packit |
89ede9 |
return;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_init( &pages );
|
|
Packit |
89ede9 |
*status = pages_build_pagestr( &pages, in, sn, en, format_opts );
|
|
Packit |
89ede9 |
if ( *status==BIBL_OK ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "pages", str_cstr( &pages ), LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &pages );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* from Tim Hicks:
|
|
Packit |
89ede9 |
* I'm no expert on bibtex, but those who know more than I on our mailing
|
|
Packit |
89ede9 |
* list suggest that 'issue' isn't a recognised key for bibtex and
|
|
Packit |
89ede9 |
* therefore that bibutils should be aliasing IS to number at some point in
|
|
Packit |
89ede9 |
* the conversion.
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Therefore prefer outputting issue/number as number and only keep
|
|
Packit |
89ede9 |
* a distinction if both issue and number are present for a particular
|
|
Packit |
89ede9 |
* reference.
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
append_issue_number( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
char issue[] = "issue", number[] = "number", *use_issue = number;
|
|
Packit |
89ede9 |
int nissue = fields_find( in, "ISSUE", LEVEL_ANY );
|
|
Packit |
89ede9 |
int nnumber = fields_find( in, "NUMBER", LEVEL_ANY );
|
|
Packit |
89ede9 |
int fstatus;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nissue!=FIELDS_NOTFOUND && nnumber!=FIELDS_NOTFOUND ) use_issue = issue;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nissue!=FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
fields_setused( in, nissue );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, use_issue, fields_value( in, nissue, FIELDS_CHRP ), 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 |
if ( nnumber!=FIELDS_NOTFOUND ) {
|
|
Packit |
89ede9 |
fields_setused( in, nnumber );
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "number", fields_value( in, nnumber, FIELDS_CHRP ), 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_howpublished( fields *in, fields *out, int *status )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int n, fstatus;
|
|
Packit |
89ede9 |
char *d;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
n = fields_find( in, "GENRE:BIBUTILS", LEVEL_ANY );
|
|
Packit |
89ede9 |
if ( n==FIELDS_NOTFOUND ) return;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
d = fields_value( in, n, FIELDS_CHRP_NOUSE );
|
|
Packit |
89ede9 |
if ( !strcmp( d, "Habilitation thesis" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "howpublised", d, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( !strcmp( d, "Licentiate thesis" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "howpublised", d, LEVEL_MAIN );
|
|
Packit |
89ede9 |
if ( fstatus!=FIELDS_OK ) *status = BIBL_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( !strcmp( d, "Diploma thesis" ) ) {
|
|
Packit |
89ede9 |
fstatus = fields_add( out, "howpublised", d, 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 type, status = BIBL_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
type = bibtexout_type( in, "", refnum, p );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
append_type ( type, out, &status );
|
|
Packit |
89ede9 |
append_citekey ( in, out, p->format_opts, &status );
|
|
Packit |
89ede9 |
append_people ( in, "AUTHOR", "AUTHOR:CORP", "AUTHOR:ASIS", "author", 0, out, p->format_opts );
|
|
Packit |
89ede9 |
append_people ( in, "EDITOR", "EDITOR:CORP", "EDITOR:ASIS", "editor", -1, out, p->format_opts );
|
|
Packit |
89ede9 |
append_people ( in, "TRANSLATOR", "TRANSLATOR:CORP", "TRANSLATOR:ASIS", "translator", -1, out, p->format_opts );
|
|
Packit |
89ede9 |
append_titles ( in, type, out, p->format_opts, &status );
|
|
Packit |
89ede9 |
append_date ( in, out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "EDITION", "edition", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "PUBLISHER", "publisher", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "ADDRESS", "address", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "VOLUME", "volume", out, &status );
|
|
Packit |
89ede9 |
append_issue_number( in, out, &status );
|
|
Packit |
89ede9 |
append_pages ( in, out, p->format_opts, &status );
|
|
Packit |
89ede9 |
append_keywords ( in, out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "CONTENTS", "contents", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "ABSTRACT", "abstract", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "LOCATION", "location", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "DEGREEGRANTOR", "school", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "DEGREEGRANTOR:ASIS", "school", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "DEGREEGRANTOR:CORP", "school", out, &status );
|
|
Packit |
89ede9 |
append_simpleall ( in, "NOTES", "note", out, &status );
|
|
Packit |
89ede9 |
append_simpleall ( in, "ANNOTE", "annote", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "ISBN", "isbn", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "ISSN", "issn", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "MRNUMBER", "mrnumber", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "CODEN", "coden", out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "DOI", "doi", out, &status );
|
|
Packit |
89ede9 |
append_urls ( in, out, &status );
|
|
Packit |
89ede9 |
append_fileattach ( in, out, &status );
|
|
Packit |
89ede9 |
append_arxiv ( in, out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "EPRINTCLASS", "primaryClass", out, &status );
|
|
Packit |
89ede9 |
append_isi ( in, out, &status );
|
|
Packit |
89ede9 |
append_simple ( in, "LANGUAGE", "language", out, &status );
|
|
Packit |
89ede9 |
append_howpublished( in, out, &status );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
bibtexout_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 |
status = append_data( in, &out, p, refnum );
|
|
Packit |
89ede9 |
if ( status==BIBL_OK ) output( fp, &out, p->format_opts );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fields_free( &out );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static void
|
|
Packit |
89ede9 |
bibtexout_writeheader( FILE *outptr, param *p )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( p->utf8bom ) utf8_writebom( outptr );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|