static void bibtex_cleandata( newstr *s, fields *info, param *p ) { list tokens; int i; if ( !s->len ) return; list_init( &tokens ); bibtex_split( &tokens, s ); for ( i=0; i<tokens.n; ++i ) { if ( !bibtex_protected( &(tokens.str[i] ) ) ) { bibtex_usestrings( &(tokens.str[i]) ); } else { if (!strncasecmp(tokens.str[i].data,"\\href{", 6)) { bibtex_addtitleurl( info, &(tokens.str[i]) ); } bibtex_cleantoken( &(tokens.str[i]), p ); } } newstr_empty( s ); for ( i=0; i<tokens.n; ++i ) { if ( bibtex_protected( &(tokens.str[i]) ) ) bibtex_removeprotection( &(tokens.str[i])); newstr_strcat( s, tokens.str[i].data ); } list_free( &tokens ); }
static int bibtex_cleandata( newstr *tag, newstr *s, fields *info, param *p ) { int i, status; list tokens; newstr *tok; if ( !s->len ) return BIBL_OK; /* protect url from undergoing any parsing */ if ( is_url_tag( tag ) ) return BIBL_OK; list_init( &tokens ); status = bibtex_split( &tokens, s ); if ( status!=BIBL_OK ) goto out; for ( i=0; i<tokens.n; ++i ) { tok = list_get( &tokens, i ); if ( bibtex_protected( tok ) ) { if (!strncasecmp(tok->data,"\\href{", 6)) { bibtex_addtitleurl( info, tok ); } } if ( p->latexin && !is_name_tag( tag ) && !is_url_tag( tag ) ) bibtex_cleantoken( tok ); } newstr_empty( s ); for ( i=0; i<tokens.n; ++i ) { tok = list_get( &tokens, i ); if ( i>0 ) newstr_addchar( s, ' ' ); newstr_newstrcat( s, tok ); } out: list_free( &tokens ); return status; }
/* * bibtex_names( info, newtag, field, level); * * split names in author list separated by and's (use '|' character) * and add names * * returns BIBL_OK on success, BIBL_ERR_MEMERR on memory error */ static int bibtex_names( fields *info, char *tag, newstr *data, int level, list *asis, list *corps ) { int begin, end, ok, n, etal, i, status, match; list tokens; /* If we match the asis or corps list add and bail. */ status = bibtex_matches_list( info, tag, ":ASIS", data, level, asis, &match ); if ( match==1 || status!=BIBL_OK ) return status; status = bibtex_matches_list( info, tag, ":CORP", data, level, corps, &match ); if ( match==1 || status!=BIBL_OK ) return status; list_init( &tokens ); bibtex_split( &tokens, data ); for ( i=0; i<tokens.n; ++i ) bibtex_cleantoken( list_get( &tokens, i ) ); etal = name_findetal( &tokens ); begin = 0; n = tokens.n - etal; while ( begin < n ) { end = begin + 1; while ( end < n && strcasecmp( list_getc( &tokens, end ), "and" ) ) end++; if ( end - begin == 1 ) { ok = name_addsingleelement( info, tag, list_getc( &tokens, begin ), level, 0 ); if ( !ok ) { status = BIBL_ERR_MEMERR; goto out; } } else { ok = name_addmultielement( info, tag, &tokens, begin, end, level ); if ( !ok ) { status = BIBL_ERR_MEMERR; goto out; } } begin = end + 1; /* Handle repeated 'and' errors: authors="G. F. Author and and B. K. Author" */ while ( begin < n && !strcasecmp( list_getc( &tokens, begin ), "and" ) ) begin++; } if ( etal ) { ok = name_addsingleelement( info, tag, "et al.", level, 0 ); if ( !ok ) status = BIBL_ERR_MEMERR; } out: list_free( &tokens ); 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 ); }