static void bibtexin_crossref( bibl *bin, param *p ) { char booktitle[] = "booktitle"; long i, j, ncross; char *nt, *nd, *type; int n, ntype, nl; for ( i=0; i<bin->nrefs; ++i ) { n = fields_find( bin->ref[i], "CROSSREF", -1 ); if ( n==-1 ) continue; ncross = bibtexin_findref( bin, bin->ref[i]->data[n].data ); if ( ncross==-1 ) { bibtexin_nocrossref( bin, i, n, p ); continue; } ntype = fields_find( bin->ref[i], "TYPE", -1 ); type = bin->ref[i]->data[ntype].data; fields_setused( bin->ref[i], n ); /* bin->ref[i]->used[n] = 1; */ for ( j=0; j<bin->ref[ncross]->nfields; ++j ) { nt = bin->ref[ncross]->tag[j].data; if ( !strcasecmp( nt, "TYPE" ) ) continue; if ( !strcasecmp( nt, "REFNUM" ) ) continue; if ( !strcasecmp( nt, "TITLE" ) ) { if ( !strcasecmp( type, "Inproceedings" ) || !strcasecmp( type, "Incollection" ) ) nt = booktitle; } nd = bin->ref[ncross]->data[j].data; nl = bin->ref[ncross]->level[j] + 1; fields_add( bin->ref[i], nt, nd, nl ); } } }
static int bibtexin_crossref( bibl *bin, param *p ) { int i, n, ncross, status = BIBL_OK; fields *bibref, *bibcross; for ( i=0; i<bin->nrefs; ++i ) { bibref = bin->ref[i]; n = fields_find( bibref, "CROSSREF", -1 ); if ( n==-1 ) continue; fields_setused( bibref, n ); ncross = bibtexin_findref( bin, (char*) fields_value( bibref, n, FIELDS_CHRP ) ); if ( ncross==-1 ) { bibtexin_nocrossref( bin, i, n, p ); continue; } bibcross = bin->ref[ncross]; status = bibtexin_crossref_oneref( bibref, bibcross ); if ( status!=BIBL_OK ) goto out; } out: return status; }