static void modsout_report_unused_tags( fields *f, param *p, unsigned long numrefs ) { int i, n, nwritten, nunused = 0, level; char *tag, *value; n = fields_num( f ); for ( i=0; i<n; ++i ) { if ( fields_used( f, i ) ) continue; nunused++; } if ( nunused ) { if ( p->progname ) fprintf( stderr, "%s: ", p->progname ); fprintf( stderr, "Reference %lu has unused tags.\n", numrefs+1 ); /* Find author from level 0 */ nwritten = 0; for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != 0 ) continue; tag = fields_tag( f, i, FIELDS_CHRP_NOUSE ); if ( strncasecmp( tag, "AUTHOR", 6 ) ) continue; value = fields_value( f, i, FIELDS_CHRP_NOUSE ); if ( nwritten==0 ) fprintf( stderr, "\tAuthor(s) (level=0):\n" ); fprintf( stderr, "\t\t'%s'\n", value ); nwritten++; } nwritten = 0; for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != 0 ) continue; tag = fields_tag( f, i, FIELDS_CHRP_NOUSE ); if ( strcasecmp( tag, "YEAR" ) && strcasecmp( tag, "PARTYEAR" ) ) continue; value = fields_value( f, i, FIELDS_CHRP_NOUSE ); if ( nwritten==0 ) fprintf( stderr, "\tYear(s) (level=0):\n" ); fprintf( stderr, "\t\t'%s'\n", value ); nwritten++; } nwritten = 0; for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != 0 ) continue; tag = fields_tag( f, i, FIELDS_CHRP_NOUSE ); if ( strncasecmp( tag, "TITLE", 5 ) ) continue; value = fields_value( f, i, FIELDS_CHRP_NOUSE ); if ( nwritten==0 ) fprintf( stderr, "\tTitle(s) (level=0):\n" ); fprintf( stderr, "\t\t'%s'\n", value ); nwritten++; } fprintf( stderr, "\tUnused tags:\n" ); for ( i=0; i<n; ++i ) { if ( fields_used( f, i ) ) continue; tag = fields_tag( f, i, FIELDS_CHRP_NOUSE ); value = fields_value( f, i, FIELDS_CHRP_NOUSE ); level = fields_level( f, i ); fprintf( stderr, "\t\ttag: '%s' value: '%s' level: %d\n", tag, value, level ); } } }
static void output_notes( fields *f, FILE *outptr, int level ) { int i, n; char *t; n = fields_num( f ); for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != level ) continue; t = fields_tag( f, i, FIELDS_CHRP_NOUSE ); if ( !strcasecmp( t, "NOTES" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); else if ( !strcasecmp( t, "PUBSTATE" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, "type", "publication status", NULL ); else if ( !strcasecmp( t, "ANNOTE" ) ) output_fil( outptr, lvl2indent(level), "bibtex-annote", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); else if ( !strcasecmp( t, "TIMESCITED" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, "type", "times cited", NULL ); else if ( !strcasecmp( t, "ANNOTATION" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, "type", "annotation", NULL ); else if ( !strcasecmp( t, "ADDENDUM" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, "type", "addendum", NULL ); else if ( !strcasecmp( t, "BIBKEY" ) ) output_fil( outptr, lvl2indent(level), "note", f, i, TAG_OPENCLOSE, TAG_NEWLINE, "type", "bibliography key", NULL ); } }
/* bibl_copy() * * returns 1 on success, 0 on failure (memory error) */ int bibl_copy( bibl *bout, bibl *bin ) { fields *refin, *refout; int i, j, n, status, ok, level; char *tag, *value; for ( i=0; i<bin->nrefs; ++i ) { refin = bin->ref[i]; refout = fields_new(); if ( !refout ) return 0; n = fields_num( refin ); for ( j=0; j<n; ++j ) { tag = fields_tag( refin, j, FIELDS_CHRP ); value = fields_value( refin, j, FIELDS_CHRP ); level = fields_level( refin, j ); if ( tag && value ) { status = fields_add( refout, tag, value, level ); if ( status!=FIELDS_OK ) return 0; } } ok = bibl_addref( bout, refout ); if ( !ok ) return 0; } return 1; }
static int bibtexin_crossref_oneref( fields *bibref, fields *bibcross ) { int j, n, nl, ntype, fstatus, status = BIBL_OK; char *type, *nt, *nv; ntype = fields_find( bibref, "INTERNAL_TYPE", -1 ); type = ( char * ) fields_value( bibref, ntype, FIELDS_CHRP_NOUSE ); n = fields_num( bibcross ); for ( j=0; j<n; ++j ) { nt = ( char * ) fields_tag( bibcross, j, FIELDS_CHRP_NOUSE ); if ( !strcasecmp( nt, "INTERNAL_TYPE" ) ) continue; if ( !strcasecmp( nt, "REFNUM" ) ) continue; if ( !strcasecmp( nt, "TITLE" ) ) { if ( !strcasecmp( type, "Inproceedings" ) || !strcasecmp( type, "Incollection" ) ) nt = "booktitle"; } nv = ( char * ) fields_value( bibcross, j, FIELDS_CHRP_NOUSE ); nl = fields_level( bibcross, j ) + 1; fstatus = fields_add( bibref, nt, nv, nl ); if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; } } out: return status; }
static int get_type( fields *f ) { int type = TYPE_UNKNOWN, i, n, level; char *tag, *value; n = fields_num( f ); for ( i=0; i<n; ++i ) { tag = fields_tag( f, i, FIELDS_CHRP ); if ( strcasecmp( tag, "GENRE" ) && strcasecmp( tag, "NGENRE") ) continue; value = fields_value( f, i, FIELDS_CHRP ); level = fields_level( f, i ); if ( !strcasecmp( value, "periodical" ) || !strcasecmp( value, "academic journal" ) || !strcasecmp( value, "journal article" ) ) { type = TYPE_ARTICLE; } else if ( !strcasecmp( value, "book" ) ) { if ( level==0 ) type=TYPE_BOOK; else type=TYPE_INBOOK; } else if ( !strcasecmp( value, "book chapter" ) ) { type = TYPE_INBOOK; } } return type; }
static int original_items( fields *f, int level ) { int i, targetlevel, n; if ( level < 0 ) return 0; targetlevel = -( level + 2 ); n = fields_num( f ); for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) == targetlevel ) return targetlevel; } return 0; }
/* output_key() * * <subject> * <topic>xxxx</topic> * </subject> */ static void output_key( fields *f, FILE *outptr, int level ) { int i, n; n = fields_num( f ); for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != level ) continue; if ( !strcasecmp( f->tag[i].data, "KEYWORD" ) ) { output_tag( outptr, lvl2indent(level), "subject", NULL, TAG_OPEN, TAG_NEWLINE, NULL ); output_fil( outptr, lvl2indent(incr_level(level,1)), "topic", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); output_tag( outptr, lvl2indent(level), "subject", NULL, TAG_CLOSE, TAG_NEWLINE, NULL ); } } }
/* output_genre() * * <genre authority="marcgt">thesis</genre> * <genre>Diploma thesis</genre> */ static void output_genre( fields *f, FILE *outptr, int level ) { char *value, *attr, *attrvalue="marcgt"; int i, n; n = fields_num( f ); for ( i=0; i<n; ++i ) { if ( fields_level( f, i ) != level ) continue; if ( !fields_match_tag( f, i, "GENRE" ) && !fields_match_tag( f, i, "NGENRE" ) ) continue; value = fields_value( f, i, FIELDS_CHRP ); attr = ( marc_findgenre( value ) == -1 ) ? NULL : "authority"; output_tag( outptr, lvl2indent(level), "genre", value, TAG_OPENCLOSE, TAG_NEWLINE, attr, attrvalue, NULL ); } }
static void output_verbose( fields *f, unsigned long refnum ) { char *tag, *value; int i, n, level; fprintf( stderr, "REF #%lu----\n", refnum+1 ); n = fields_num( f ); for ( i=0; i<n; ++i ) { tag = fields_tag( f, i, FIELDS_CHRP_NOUSE ); value = fields_value( f, i, FIELDS_CHRP_NOUSE ); level = fields_level( f, i ); fprintf( stderr, "\t'%s'\t'%s'\t%d\n", tag, value, level ); } }
static void output_people( FILE *fp, fields *info, char *tag, char *entag, int level ) { newstr oneperson; int i, n, flvl; char *ftag; newstr_init( &oneperson ); n = fields_num( info ); for ( i=0; i<n; ++i ) { flvl = fields_level( info, i ); if ( level!=LEVEL_ANY && flvl!=level ) continue; ftag = fields_tag( info, i, FIELDS_CHRP ); if ( !strcasecmp( ftag, tag ) ) { name_build_withcomma( &oneperson, fields_value( info, i, FIELDS_CHRP ) ); fprintf( fp, "%s %s\n", entag, oneperson.data ); } } newstr_free( &oneperson ); }
static void output_names( fields *f, FILE *outptr, int level ) { convert names[] = { { "author", "AUTHOR", 0, MARC_AUTHORITY }, { "editor", "EDITOR", 0, MARC_AUTHORITY }, { "annotator", "ANNOTATOR", 0, MARC_AUTHORITY }, { "artist", "ARTIST", 0, MARC_AUTHORITY }, { "author", "2ND_AUTHOR", 0, MARC_AUTHORITY }, { "author", "3RD_AUTHOR", 0, MARC_AUTHORITY }, { "author", "SUB_AUTHOR", 0, MARC_AUTHORITY }, { "author", "COMMITTEE", 0, MARC_AUTHORITY }, { "author", "COURT", 0, MARC_AUTHORITY }, { "author", "LEGISLATIVEBODY", 0, MARC_AUTHORITY }, { "author of afterword, colophon, etc.", "AFTERAUTHOR", 0, MARC_AUTHORITY }, { "author of introduction, etc.", "INTROAUTHOR", 0, MARC_AUTHORITY }, { "cartographer", "CARTOGRAPHER", 0, MARC_AUTHORITY }, { "collaborator", "COLLABORATOR", 0, MARC_AUTHORITY }, { "commentator", "COMMENTATOR", 0, MARC_AUTHORITY }, { "compiler", "COMPILER", 0, MARC_AUTHORITY }, { "degree grantor", "DEGREEGRANTOR", 0, MARC_AUTHORITY }, { "director", "DIRECTOR", 0, MARC_AUTHORITY }, { "event", "EVENT", 0, NO_AUTHORITY }, { "inventor", "INVENTOR", 0, MARC_AUTHORITY }, { "organizer of meeting", "ORGANIZER", 0, MARC_AUTHORITY }, { "patent holder", "ASSIGNEE", 0, MARC_AUTHORITY }, { "performer", "PERFORMER", 0, MARC_AUTHORITY }, { "producer", "PRODUCER", 0, MARC_AUTHORITY }, { "recipient", "RECIPIENT", 0, MARC_AUTHORITY }, { "redactor", "REDACTOR", 0, MARC_AUTHORITY }, { "reporter", "REPORTER", 0, MARC_AUTHORITY }, { "sponsor", "SPONSOR", 0, MARC_AUTHORITY }, { "translator", "TRANSLATOR", 0, MARC_AUTHORITY }, { "writer", "WRITER", 0, MARC_AUTHORITY }, }; int i, n, nfields, ntypes = sizeof( names ) / sizeof( convert ); int f_asis, f_corp, f_conf; newstr role; newstr_init( &role ); nfields = fields_num( f ); for ( n=0; n<ntypes; ++n ) { for ( i=0; i<nfields; ++i ) { if ( fields_level( f, i )!=level ) continue; if ( f->data[i].len==0 ) continue; f_asis = f_corp = f_conf = 0; newstr_strcpy( &role, f->tag[i].data ); if ( newstr_findreplace( &role, ":ASIS", "" )) f_asis=1; if ( newstr_findreplace( &role, ":CORP", "" )) f_corp=1; if ( newstr_findreplace( &role, ":CONF", "" )) f_conf=1; if ( strcasecmp( role.data, names[n].internal ) ) continue; if ( f_asis ) { output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, NULL ); output_fil( outptr, lvl2indent(incr_level(level,1)), "namePart", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); } else if ( f_corp ) { output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, "type", "corporate", NULL ); output_fil( outptr, lvl2indent(incr_level(level,1)), "namePart", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); } else if ( f_conf ) { output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, "type", "conference", NULL ); output_fil( outptr, lvl2indent(incr_level(level,1)), "namePart", f, i, TAG_OPENCLOSE, TAG_NEWLINE, NULL ); } else { output_name(outptr, f->data[i].data, level); } output_tag( outptr, lvl2indent(incr_level(level,1)), "role", NULL, TAG_OPEN, TAG_NEWLINE, NULL ); if ( names[n].code & MARC_AUTHORITY ) output_tag( outptr, lvl2indent(incr_level(level,2)), "roleTerm", names[n].mods, TAG_OPENCLOSE, TAG_NEWLINE, "authority", "marcrelator", "type", "text", NULL ); else output_tag( outptr, lvl2indent(incr_level(level,2)), "roleTerm", names[n].mods, TAG_OPENCLOSE, TAG_NEWLINE, "type", "text", NULL ); output_tag( outptr, lvl2indent(incr_level(level,1)), "role", NULL, TAG_CLOSE, TAG_NEWLINE, NULL ); output_tag( outptr, lvl2indent(level), "name", NULL, TAG_CLOSE, TAG_NEWLINE, NULL ); fields_setused( f, i ); } } newstr_free( &role ); }
/* Try to determine type of reference from * <genre></genre> */ static int get_type_genre( fields *f, param *p ) { match_type match_genres[] = { { "academic journal", TYPE_ARTICLE }, { "article", TYPE_ARTICLE }, { "journal article", TYPE_ARTICLE }, { "magazine", TYPE_MAGARTICLE }, { "conference publication", TYPE_CONF }, { "newspaper", TYPE_NEWS }, { "legislation", TYPE_STATUTE }, { "communication", TYPE_PCOMM }, { "hearing", TYPE_HEAR }, { "electronic", TYPE_ELEC }, { "legal case and case notes", TYPE_CASE }, { "book chapter", TYPE_INBOOK }, { "Ph.D. thesis", TYPE_PHDTHESIS }, { "Masters thesis", TYPE_MASTERSTHESIS }, { "Diploma thesis", TYPE_DIPLOMATHESIS }, { "Doctoral thesis", TYPE_DOCTORALTHESIS }, { "Habilitation thesis", TYPE_HABILITATIONTHESIS }, { "report", TYPE_REPORT }, { "abstract or summary", TYPE_ABSTRACT }, { "patent", TYPE_PATENT }, { "unpublished", TYPE_UNPUBLISHED }, { "map", TYPE_MAP }, }; int nmatch_genres = sizeof( match_genres ) / sizeof( match_genres[0] ); int type, i, j; char *tag, *value; type = TYPE_UNKNOWN; for ( i=0; i<fields_num( f ); ++i ) { if ( !fields_match_tag( f, i, "GENRE" ) && !fields_match_tag( f, i, "NGENRE" ) ) continue; value = ( char * ) fields_value( f, i, FIELDS_CHRP ); for ( j=0; j<nmatch_genres; ++j ) if ( !strcasecmp( match_genres[j].name, value ) ) type = match_genres[j].type; if ( p->verbose ) { tag = ( char * ) fields_tag( f, i, FIELDS_CHRP ); if ( p->progname ) fprintf( stderr, "%s: ", p->progname ); fprintf( stderr, "Type from tag '%s' data '%s': ", tag, value ); write_type( stderr, type ); fprintf( stderr, "\n" ); } if ( type==TYPE_UNKNOWN ) { if ( !strcasecmp( value, "periodical" ) ) type = TYPE_ARTICLE; else if ( !strcasecmp( value, "thesis" ) ) type = TYPE_THESIS; else if ( !strcasecmp( value, "book" ) ) { if ( fields_level( f, i )==0 ) type=TYPE_BOOK; else type=TYPE_INBOOK; } else if ( !strcasecmp( value, "collection" ) ) { if ( fields_level( f, i )==0 ) type=TYPE_BOOK; else type=TYPE_INBOOK; } } } if ( p->verbose ) { if ( p->progname ) fprintf( stderr, "%s: ", p->progname ); fprintf( stderr, "Type from genre element: " ); write_type( stderr, type ); fprintf( stderr, "\n" ); } return type; }