diff options
author | Aaron M. Ucko <ucko@debian.org> | 2009-07-27 02:35:37 +0000 |
---|---|---|
committer | Aaron M. Ucko <ucko@debian.org> | 2009-07-27 02:35:37 +0000 |
commit | cb2452a815dd397299bc41d4ca4339883a4cf19e (patch) | |
tree | 913c0be09727fb828caf8e574469c56dc6ffb262 /network/medarch | |
parent | e8f3513c621e07a1d0890d3dab064a122ef9533e (diff) |
[svn-upgrade] Integrating new upstream version, ncbi-tools6 (6.1.20090719)
Diffstat (limited to 'network/medarch')
-rw-r--r-- | network/medarch/client/medutil.c | 163 |
1 files changed, 144 insertions, 19 deletions
diff --git a/network/medarch/client/medutil.c b/network/medarch/client/medutil.c index ff59c9fd..0421f034 100644 --- a/network/medarch/client/medutil.c +++ b/network/medarch/client/medutil.c @@ -28,7 +28,7 @@ * * Version Creation Date: 8/31/93 * -* $Revision: 6.23 $ +* $Revision: 6.24 $ * * File Description: Medline Utilities for MedArch * Assumes user calls MedArchInit and Fini @@ -44,6 +44,9 @@ * * RCS Modification History: * $Log: medutil.c,v $ +* Revision 6.24 2009/06/19 19:27:29 bazhin +* Added support for multiple consortium names. +* * Revision 6.23 2007/12/04 23:29:22 bazhin * MergePubIds() renamed to MergeNonPubmedPubIds(). Merging is * limited to types DOI and OTHER only. @@ -396,11 +399,18 @@ static Boolean ten_authors_compare(CitArtPtr capold, CitArtPtr capnew) Boolean ten_authors(CitArtPtr art, CitArtPtr art_tmp) { NameStdPtr namestd; + ValNodePtr oldcon; + ValNodePtr newcon; + ValNodePtr tvnp; + ValNodePtr vnp; ValNodePtr v; AuthorPtr aup; + CharPtr oldbuf; + CharPtr newbuf; CharPtr mu[10]; - CharPtr oldcon; - CharPtr newcon; + CharPtr p; + Int4 oldlen; + Int4 newlen; Int2 num; Int2 numnew; Int2 numtmp; @@ -427,24 +437,124 @@ Boolean ten_authors(CitArtPtr art, CitArtPtr art_tmp) if(art->authors->choice != 1) return(ten_authors_compare(art, art_tmp)); + oldbuf = NULL; oldcon = NULL; + oldlen = 1; for(num = 0, v = art->authors->names; v != NULL; v = v->next) { aup = v->data.ptrvalue; if(aup->name->choice == 2) num++; else if(aup->name->choice == 5) - oldcon = aup->name->data; + { + p = aup->name->data; + oldlen += (StringLen(p) + 2); + if(oldcon == NULL) + { + oldcon = ValNodeNew(NULL); + oldcon->data.ptrvalue = p; + continue; + } + + for(vnp = oldcon; vnp != NULL; vnp = vnp->next) + { + if(StringICmp(p, vnp->data.ptrvalue) <= 0) + { + if(vnp == oldcon) + { + oldcon = ValNodeNew(NULL); + oldcon->data.ptrvalue = p; + oldcon->next = vnp; + } + else + { + tvnp = ValNodeNew(NULL); + tvnp->data.ptrvalue = vnp->data.ptrvalue; + vnp->data.ptrvalue = p; + tvnp->next = vnp->next; + vnp->next = tvnp; + } + break; + } + if(vnp->next == NULL) + { + vnp->next = ValNodeNew(NULL); + vnp->next->data.ptrvalue = p; + break; + } + } + } + } + if(oldcon != NULL) + { + oldbuf = MemNew(oldlen); + oldbuf[0] = '\0'; + for(vnp = oldcon; vnp != NULL; vnp = vnp->next) + { + if(oldbuf[0] != '\0') + StringCat(oldbuf, "; "); + StringCat(oldbuf, vnp->data.ptrvalue); + } } + newbuf = NULL; newcon = NULL; + newlen = 1; for(numtmp = 0, v = art_tmp->authors->names; v != NULL; v = v->next) { aup = v->data.ptrvalue; if(aup->name->choice == 2) numtmp++; else if(aup->name->choice == 5) - newcon = aup->name->data; + { + p = aup->name->data; + newlen += (StringLen(p) + 2); + if(newcon == NULL) + { + newcon = ValNodeNew(NULL); + newcon->data.ptrvalue = p; + continue; + } + + for(vnp = newcon; vnp != NULL; vnp = vnp->next) + { + if(StringICmp(p, vnp->data.ptrvalue) <= 0) + { + if(vnp == newcon) + { + newcon = ValNodeNew(NULL); + newcon->data.ptrvalue = p; + newcon->next = vnp; + } + else + { + tvnp = ValNodeNew(NULL); + tvnp->data.ptrvalue = vnp->data.ptrvalue; + vnp->data.ptrvalue = p; + tvnp->next = vnp->next; + vnp->next = tvnp; + } + break; + } + if(vnp->next == NULL) + { + vnp->next = ValNodeNew(NULL); + vnp->next->data.ptrvalue = p; + break; + } + } + } + } + if(newcon != NULL) + { + newbuf = MemNew(newlen); + newbuf[0] = '\0'; + for(vnp = newcon; vnp != NULL; vnp = vnp->next) + { + if(newbuf[0] != '\0') + StringCat(newbuf, "; "); + StringCat(newbuf, vnp->data.ptrvalue); + } } if(oldcon != NULL) @@ -453,27 +563,42 @@ Boolean ten_authors(CitArtPtr art, CitArtPtr art_tmp) { ErrPostEx(SEV_WARNING, ERR_REFERENCE_NoConsortAuthors, "Publication as returned by MedArch lacks consortium authors of the original publication: \"%s\".", - oldcon); - aup = AuthorNew(); - aup->name = PersonIdNew(); - aup->name->choice = 5; - aup->name->data = StringSave(oldcon); - v = ValNodeNew(NULL); - v->data.ptrvalue = aup; - v->next = art_tmp->authors->names; - art_tmp->authors->names = v; - newcon = oldcon; + oldbuf); + for(vnp = oldcon;; vnp = vnp->next) + { + aup = AuthorNew(); + aup->name = PersonIdNew(); + aup->name->choice = 5; + aup->name->data = StringSave(vnp->data.ptrvalue); + vnp->data.ptrvalue = aup; + if(vnp->next == NULL) + break; + } + vnp->next = art_tmp->authors->names; + art_tmp->authors->names = oldcon; } - else if(StringICmp(oldcon, newcon) != 0) + else { - ErrPostEx(SEV_WARNING, ERR_REFERENCE_DiffConsortAuthors, - "Consortium author names differ. Original is \"%s\". MedArch's is \"%s\".", - oldcon, newcon); + if(StringICmp(oldbuf, newbuf) != 0) + ErrPostEx(SEV_WARNING, ERR_REFERENCE_DiffConsortAuthors, + "Consortium author names differ. Original is \"%s\". MedArch's is \"%s\".", + oldbuf, newbuf); + MemFree(newbuf); + newbuf = NULL; + ValNodeFree(oldcon); + ValNodeFree(newcon); + newcon = NULL; } + MemFree(oldbuf); if(num == 0) return(TRUE); } + if(newcon != NULL) + ValNodeFree(newcon); + if(newbuf != NULL) + MemFree(newbuf); + numnew = 0; for(v = art_tmp->authors->names; v != NULL && numnew < 10; v = v->next) { |