/* 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 output_person( FILE *fp, char *name ) { newstr family, given, suffix; char *p = name; newstrs_init( &family, &given, &suffix, NULL ); while ( *p && *p!='|' ) newstr_addchar( &family, *p++ ); while ( *p=='|' && *(p+1)!='|' ) { p++; if ( *p!='|' ) newstr_addchar( &given, *p++ ); while ( *p && *p!='|' ) p++; } if ( *p=='|' && *(p+1)=='|' ) { p += 2; while ( *p && *p!='|' ) newstr_addchar( &suffix, *p++ ); } if ( family.len ) fprintf( fp, "%s", family.data ); if ( suffix.len ) { if ( family.len ) fprintf( fp, " %s", suffix.data ); else fprintf( fp, "%s", suffix.data ); } if ( given.len ) fprintf( fp, ", %s", given.data ); newstrs_free( &family, &given, &suffix, NULL ); }
static void cleanup_wiley_author( fields *endin, int n ) { newstr tmp, tmppart; int i, nauthor = 0; newstrs_init( &tmp, &tmppart, NULL ); newstr_newstrcpy( &tmp, &( endin->data[n] ) ); i = 0; while ( i<tmp.len ) { if ( tmp.data[i]==',' ) { if ( nauthor==0 ) newstr_newstrcpy( &(endin->data[n]), &tmppart ); else fields_add( endin, endin->tag[n].data, tmppart.data, endin->level[n] ); newstr_empty( &tmppart ); nauthor++; while ( i<tmp.len && is_ws( tmp.data[i] ) ) i++; } else { newstr_addchar( &tmppart, tmp.data[i] ); } i++; } newstrs_free( &tmp, &tmppart, NULL ); }
int endin_processf( fields *endin, char *p, char *filename, long nref ) { newstr tag, data; int n; newstrs_init( &tag, &data, NULL ); while ( *p ) { if ( endin_istag( p ) ) { p = process_endline( &tag, &data, p ); /* no empty fields allowed */ if ( data.len ) { fields_add( endin, tag.data, data.data, 0 ); } } else { p = process_endline2( &tag, &data, p ); /* endnote puts %K only on 1st line of keywords */ n = fields_num( endin ); if ( n>0 && data.len ) { if ( !strncmp( endin->tag[n-1].data, "%K", 2 ) ) { fields_add( endin, "%K", data.data, 0 ); } else { newstr_addchar( &(endin->data[n-1]), ' ' ); newstr_strcat( &(endin->data[n-1]), data.data ); } } } newstrs_empty( &tag, &data, NULL ); } newstrs_free( &tag, &data, NULL ); return 1; }
static int risin_processf( fields *risin, char *p, char *filename, long nref, param *pm ) { newstr tag, data; int status, n; newstrs_init( &tag, &data, NULL ); while ( *p ) { if ( risin_istag( p ) ) p = process_line( &tag, &data, p ); /* no anonymous fields allowed */ if ( tag.len ) { status = fields_add( risin, tag.data, data.data, 0 ); if ( status!=FIELDS_OK ) return 0; } else { p = process_line2( &tag, &data, p ); n = fields_num( risin ); if ( data.len && n>0 ) { newstr *od; od = fields_value( risin, n-1, FIELDS_STRP ); newstr_addchar( od, ' ' ); newstr_strcat( od, data.data ); } } newstrs_empty( &tag, &data, NULL ); } newstrs_free( &tag, &data, NULL ); return 1; }
static int wordin_pages( xml *node, fields *info ) { int i, status, ret = BIBL_OK; newstr sp, ep; char *p; newstrs_init( &sp, &ep, NULL ); p = xml_data( node ); while ( *p && *p!='-' ) newstr_addchar( &sp, *p++ ); if ( newstr_memerr( &sp ) ) { ret = BIBL_ERR_MEMERR; goto out; } if ( *p=='-' ) p++; while ( *p ) newstr_addchar( &ep, *p++ ); if ( newstr_memerr( &ep ) ) { ret = BIBL_ERR_MEMERR; goto out; } if ( sp.len ) { status = fields_add( info, "PAGES:START", sp.data, 1 ); if ( status!=FIELDS_OK ) { ret = BIBL_ERR_MEMERR; goto out; } } if ( ep.len ) { if ( sp.len > ep.len ) { for ( i=sp.len-ep.len; i<sp.len; ++i ) sp.data[i] = ep.data[i-sp.len+ep.len]; status = fields_add( info, "PAGES:STOP", sp.data, 1 ); } else status = fields_add( info, "PAGES:STOP", ep.data, 1 ); if ( status!=FIELDS_OK ) { ret = BIBL_ERR_MEMERR; goto out; } } out: newstrs_free( &sp, &ep, NULL ); return ret; }
static void output_name( FILE *outptr, char *p, int level ) { newstr family, part, suffix; int n=0; newstrs_init( &family, &part, &suffix, NULL ); while ( *p && *p!='|' ) newstr_addchar( &family, *p++ ); if ( *p=='|' ) p++; while ( *p ) { while ( *p && *p!='|' ) newstr_addchar( &part, *p++ ); /* truncate periods from "A. B. Jones" names */ if ( part.len ) { if ( part.len==2 && part.data[1]=='.' ) { part.len=1; part.data[1]='\0'; } if ( n==0 ) output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, "type", "personal", NULL ); output_tag( outptr, lvl2indent(incr_level(level,1)), "namePart", part.data, TAG_OPENCLOSE, TAG_NEWLINE, "type", "given", NULL ); n++; } if ( *p=='|' ) { p++; if ( *p=='|' ) { p++; while ( *p && *p!='|' ) newstr_addchar( &suffix, *p++ ); } newstr_empty( &part ); } } if ( family.len ) { if ( n==0 ) output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, "type", "personal", NULL ); output_tag( outptr, lvl2indent(incr_level(level,1)), "namePart", family.data, TAG_OPENCLOSE, TAG_NEWLINE, "type", "family", NULL ); n++; } if ( suffix.len ) { if ( n==0 ) output_tag( outptr, lvl2indent(level), "name", NULL, TAG_OPEN, TAG_NEWLINE, "type", "personal", NULL ); output_tag( outptr, lvl2indent(incr_level(level,1)), "namePart", suffix.data, TAG_OPENCLOSE, TAG_NEWLINE, "type", "suffix", NULL ); } newstrs_free( &part, &family, &suffix, NULL ); }
/* <Pagination> * <MedlinePgn>12111-6</MedlinePgn> * </Pagination> */ static int medin_pagination( xml *node, fields *info ) { int i, fstatus, status; newstr sp, ep; char *p, *pp; if ( xml_tagexact( node, "MedlinePgn" ) && node->value ) { newstrs_init( &sp, &ep, NULL ); p = newstr_cpytodelim( &sp, xml_data( node ), "-", 1 ); if ( newstr_memerr( &sp ) ) return BIBL_ERR_MEMERR; if ( sp.len ) { fstatus = fields_add( info, "PAGESTART", sp.data, 1 ); if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR; } p = newstr_cpytodelim( &ep, p, "", 0 ); if ( newstr_memerr( &ep ) ) return BIBL_ERR_MEMERR; if ( ep.len ) { if ( sp.len > ep.len ) { for ( i=sp.len-ep.len; i<sp.len; ++i ) sp.data[i] = ep.data[i-sp.len+ep.len]; pp = sp.data; } else pp = ep.data; fstatus = fields_add( info, "PAGEEND", pp, 1 ); if ( fstatus!=FIELDS_OK ) return BIBL_ERR_MEMERR; } newstrs_free( &sp, &ep, NULL ); } if ( node->down ) { status = medin_pagination( node->down, info ); if ( status!=BIBL_OK ) return status; } if ( node->next ) { status = medin_pagination( node->next, info ); if ( status!=BIBL_OK ) return status; } return BIBL_OK; }