/* process_string() * * Handle lines like: * * '@STRING{TL = {Tetrahedron Lett.}}' * * p should point to just after '@STRING' * * In BibTeX, if a string is defined several times, the last one is kept. * */ static int process_string( char *p ) { int n, status = BIBL_OK; newstr s1, s2, *t; newstrs_init( &s1, &s2, NULL ); while ( *p && *p!='{' && *p!='(' ) p++; if ( *p=='{' || *p=='(' ) p++; p = process_bibtexline( skip_ws( p ), &s1, &s2, 0, NULL ); if ( p==NULL ) { status = BIBL_ERR_MEMERR; goto out; } if ( s2.data ) { newstr_findreplace( &s2, "\\ ", " " ); } if ( s1.data ) { n = list_find( &find, s1.data ); if ( n==-1 ) { t = list_add( &find, &s1 ); if ( t==NULL ) { status = BIBL_ERR_MEMERR; goto out; } if ( s2.data ) t = list_add( &replace, &s2 ); else t = list_addc( &replace, "" ); if ( t==NULL ) { status = BIBL_ERR_MEMERR; goto out; } } else { if ( s2.data ) t = list_set( &replace, n, &s2 ); else t = list_setc( &replace, n, "" ); if ( t==NULL ) { status = BIBL_ERR_MEMERR; goto out; } } } out: newstrs_free( &s1, &s2, NULL ); return status; }
/* process_cite() * */ static int process_cite( fields *bibin, char *p, char *filename, long nref ) { int fstatus, status = BIBL_OK; newstr tag, data; newstrs_init( &tag, &data, NULL ); p = process_bibtextype( p, &data ); if ( data.len ) { fstatus = fields_add( bibin, "INTERNAL_TYPE", data.data, 0 ); if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; } } p = process_bibtexid( p, &data ); if ( data.len ) { fstatus = fields_add( bibin, "REFNUM", data.data, 0 ); if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; } } while ( *p ) { p = process_bibtexline( p, &tag, &data, 1, bibin ); if ( p==NULL ) { status = BIBL_ERR_MEMERR; goto out; } /* no anonymous or empty fields allowed */ if ( tag.len && data.len ) { fstatus = fields_add( bibin, tag.data, data.data, 0 ); if ( fstatus!=FIELDS_OK ) { status = BIBL_ERR_MEMERR; goto out; } } newstrs_empty( &tag, &data, NULL ); } out: newstrs_free( &tag, &data, NULL ); return status; }
static void bibtex_addstring( char *p ) { newstr s1, s2; newstr_init( &s1 ); newstr_init( &s2 ); p = skip_ws( p ); if ( *p=='(' || *p=='{' ) p++; p = process_bibtexline( p, &s1, &s2 ); newstr_findreplace( &s2, "\\ ", " " ); bibtex_cleantoken( &s2, NULL ); if ( s1.data ) { list_add( &find, s1.data ); if ( s2.data ) list_add( &replace, s2.data ); else list_add( &replace, "" ); } newstr_free( &s1 ); newstr_free( &s2 ); }
static void process_cite( fields *bibin, char *p, char *filename, long nref ) { newstr tag, data; newstr_init( &tag ); newstr_init( &data ); p = process_bibtextype( p, &data ); if ( data.len ) fields_add( bibin, "TYPE", data.data, 0 ); if ( *p ) p = process_bibtexid ( p, &data ); if ( data.len ) fields_add( bibin, "REFNUM", data.data, 0 ); newstr_empty( &data ); while ( *p ) { p = process_bibtexline( p, &tag, &data ); /* no anonymous or empty fields allowed */ if ( tag.len && data.len ) fields_add( bibin, tag.data, data.data, 0 ); newstr_empty( &tag ); newstr_empty( &data ); } newstr_free( &tag ); newstr_free( &data ); }