flat_reference.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:21k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_reference.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:43:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_reference.cpp,v 1000.2 2004/06/01 19:43:28 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Aaron Ucko, NCBI
  35. *
  36. * File Description:
  37. *   new (early 2003) flat-file generator -- bibliographic references
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objtools/flat/flat_formatter.hpp>
  43. #include <serial/iterator.hpp>
  44. #include <objects/biblio/biblio__.hpp>
  45. #include <objects/general/Name_std.hpp>
  46. #include <objects/general/Person_id.hpp>
  47. #include <objects/medline/Medline_entry.hpp>
  48. #include <objects/pub/pub__.hpp>
  49. #include <objects/seq/Bioseq.hpp>
  50. #include <objects/seqloc/Patent_seq_id.hpp>
  51. #include <objmgr/impl/annot_object.hpp>
  52. #include <objmgr/util/sequence.hpp>
  53. #include <algorithm>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. static void s_FormatAffil(const CAffil& affil, string& result)
  57. {
  58.     if (affil.IsStr()) {
  59.         result = affil.GetStr();
  60.     } else {
  61.         result.erase();
  62.         const CAffil::C_Std& std = affil.GetStd();
  63.         if (std.IsSetDiv()) {
  64.             result = std.GetDiv();
  65.         }
  66.         if (std.IsSetAffil()) {
  67.             if (!result.empty()) {
  68.                 result += ", ";
  69.             }
  70.             result += std.GetAffil();
  71.         }
  72.         if (std.IsSetStreet()) {
  73.             if (!result.empty()) {
  74.                 result += ", ";
  75.             }
  76.             result += std.GetStreet();
  77.         }
  78.         if (std.IsSetCity()) {
  79.             if (!result.empty()) {
  80.                 result += ", ";
  81.             }
  82.             result += std.GetCity();
  83.         }
  84.         if (std.IsSetSub()) {
  85.             if (!result.empty()) {
  86.                 result += ", ";
  87.             }
  88.             result += std.GetSub();
  89.         }
  90.         if (std.IsSetPostal_code()) {
  91.             if (!result.empty()) {
  92.                 result += " ";
  93.             }
  94.             result += std.GetPostal_code();
  95.         }
  96.         if (std.IsSetCountry()) {
  97.             if (!result.empty()) {
  98.                 result += ", ";
  99.             }
  100.             result += std.GetCountry();
  101.         }
  102. #if 0 // not in C version...
  103.         if (std.IsSetFax()) {
  104.             if (!result.empty()) {
  105.                 result += "; ";
  106.             }
  107.             result += "Fax: " + std.GetFax();
  108.         }
  109.         if (std.IsSetPhone()) {
  110.             if (!result.empty()) {
  111.                 result += "; ";
  112.             }
  113.             result += "Phone: " + std.GetPhone();
  114.         }
  115.         if (std.IsSetEmail()) {
  116.             if (!result.empty()) {
  117.                 result += "; ";
  118.             }
  119.             result += "E-mail: " + std.GetEmail();
  120.         }
  121. #endif
  122.     }
  123. }
  124. CFlatReference::CFlatReference(const CPubdesc& pub, const CSeq_loc* loc,
  125.                                const CFlatContext& ctx)
  126.     : m_Pubdesc(&pub), m_Loc(loc), m_Category(eUnknown), m_Serial(0)
  127. {
  128.     ITERATE (CPub_equiv::Tdata, it, pub.GetPub().Get()) {
  129.         x_Init(**it, ctx);
  130.     }
  131.     if (m_Date.NotEmpty()  &&  m_Date->IsStd()) {
  132.         m_StdDate = &m_Date->GetStd();
  133.     } else {
  134.         // complain?
  135.         m_StdDate = new CDate_std(CTime::eEmpty);
  136.     }
  137. }
  138. void CFlatReference::Sort(vector<CRef<CFlatReference> >& v, CFlatContext& ctx)
  139. {
  140.     // XXX -- implement!
  141.     // assign final serial numbers
  142.     for (unsigned int i = 0;  i < v.size();  ++i) {
  143.         v[i]->m_Serial = i + 1;
  144.     }
  145. }
  146. string CFlatReference::GetRange(const CFlatContext& ctx) const
  147. {
  148.     bool is_embl = ctx.GetFormatter().GetDatabase() == IFlatFormatter::eDB_EMBL;
  149.     if (is_embl  &&  m_Loc.Empty()) {
  150.         return kEmptyStr;
  151.     }
  152.     CNcbiOstrstream oss;
  153.     if ( !is_embl ) {
  154.         oss << "  (" << ctx.GetUnits(false) << ' ';
  155.     }
  156.     string delim;
  157.     const char* to = is_embl ? "-" : " to ";
  158.     for (CSeq_loc_CI it(m_Loc ? *m_Loc : ctx.GetLocation());  it;  ++it) {
  159.         CSeq_loc_CI::TRange range = it.GetRange();
  160.         if (it.IsWhole()) {
  161.             range.SetTo(sequence::GetLength(it.GetSeq_id(),
  162.                                             &ctx.GetHandle().GetScope())
  163.                         - 1);
  164.         }
  165.         if (it.IsPoint()) {
  166.             oss << range.GetFrom() + 1;
  167.         } else {
  168.             oss << delim << range.GetFrom() + 1 << to << range.GetTo() + 1;
  169.         }
  170.         delim = ", ";
  171.     }
  172.     if ( !is_embl ) {
  173.         oss << ')';
  174.     }
  175.     return CNcbiOstrstreamToString(oss);
  176. }
  177. void CFlatReference::GetTitles(string& title, string& journal,
  178.                                const CFlatContext& ctx) const
  179. {
  180.     // XXX - kludged for now (should move more logic from x_Init to here)
  181.     title = m_Title;
  182.     if (m_Journal.empty()) {
  183.         // complain?
  184.         return;
  185.     }
  186.     if (ctx.GetFormatter().GetDatabase() == IFlatFormatter::eDB_EMBL) {
  187.         if (m_Category == CFlatReference::eSubmission) {
  188.             journal = "Submitted ";
  189.             if (m_Date) {
  190.                 journal += '(';
  191.                 ctx.GetFormatter().FormatDate(*m_Date, journal);
  192.                 journal += ") ";
  193.             }
  194.             journal += "to the EMBL/GenBank/DDBJ databases.n" + m_Journal;
  195.         } else {
  196.             journal = m_Journal;
  197.             if ( !m_Volume.empty() ) {
  198.                 journal += " " + m_Volume;
  199.             }
  200.             if ( !m_Pages.empty()) {
  201.                 journal += ":" + m_Pages;
  202.             }
  203.             if (m_Date) {
  204.                 journal += '(';
  205.                 m_Date->GetDate(&journal, "%Y");
  206.                 journal += ").";
  207.             }
  208.         }
  209.     } else { // NCBI or DDBJ
  210.         if (m_Category == CFlatReference::eSubmission) {
  211.             journal = "Submitted ";
  212.             if (m_Date) {
  213.                 journal += '(';
  214.                 ctx.GetFormatter().FormatDate(*m_Date, journal);
  215.                 journal += ") ";
  216.             }
  217.             journal += m_Journal;
  218.         } else {
  219.             journal = m_Journal;
  220.             if ( !m_Volume.empty() ) {
  221.                 journal += " " + m_Volume;
  222.             }
  223.             if ( !m_Issue.empty() ) {
  224.                 journal += " (" + m_Issue + ')';
  225.             }
  226.             if ( !m_Pages.empty()) {
  227.                 journal += ", " + m_Pages;
  228.             }
  229.             if (m_Date) {
  230.                 journal += " (";
  231.                 m_Date->GetDate(&journal, "%Y");
  232.                 journal += ')';
  233.             }
  234.         }
  235.     }
  236. }
  237. // can't go in the header, as IFlatFormatter isn't yet known
  238. void CFlatReference::Format(IFlatFormatter& f) const
  239. {
  240.     f.FormatReference(*this);
  241. }
  242. bool CFlatReference::Matches(const CPub_set& ps) const
  243. {
  244.     // compare IDs
  245.     CTypesConstIterator it;
  246.     CType<CCit_gen>::AddTo(it);
  247.     CType<CMedlineUID>::AddTo(it);
  248.     CType<CMedline_entry>::AddTo(it);
  249.     CType<CPub>::AddTo(it);
  250.     CType<CPubMedId>::AddTo(it);
  251.     for (it = ps;  it;  ++it) {
  252.         if (CType<CCit_gen>::Match(it)) {
  253.             const CCit_gen& gen = *CType<CCit_gen>::Get(it);
  254.             if ((gen.IsSetMuid()  &&  HasMUID(gen.GetMuid()))
  255.                 /* ||  gen.GetSerial_number() == m_Serial */) {
  256.                 return true;
  257.             }
  258.         } else if (CType<CMedlineUID>::Match(it)) {
  259.             if (HasMUID(CType<CMedlineUID>::Get(it)->Get())) {
  260.                 return true;
  261.             }
  262.         } else if (CType<CMedline_entry>::Match(it)) {
  263.             if (HasMUID(CType<CMedline_entry>::Get(it)->GetUid())) {
  264.                 return true;
  265.             }
  266.         } else if (CType<CPub>::Match(it)) {
  267.             const CPub& pub = *CType<CPub>::Get(it);
  268.             if (pub.IsMuid()  &&  HasMUID(pub.GetMuid())) {
  269.                 return true;
  270.             }
  271.         } else if (CType<CPubMedId>::Match(it)) {
  272.             if (HasPMID(CType<CPubMedId>::Get(it)->Get())) {
  273.                 return true;
  274.             }
  275.         }
  276.     }
  277.     return false;
  278. }
  279. void CFlatReference::x_Init(const CPub& pub, const CFlatContext& ctx)
  280. {
  281.     switch (pub.Which()) {
  282.     case CPub::e_Gen:      x_Init(pub.GetGen(), ctx);             break;
  283.     case CPub::e_Sub:      x_Init(pub.GetSub(), ctx);             break;
  284.     case CPub::e_Medline:  x_Init(pub.GetMedline(), ctx);         break;
  285.     case CPub::e_Muid:     m_MUIDs.insert(pub.GetMuid());         break;
  286.     case CPub::e_Article:  x_Init(pub.GetArticle(), ctx);         break;
  287.     case CPub::e_Journal:  x_Init(pub.GetJournal(), ctx);         break;
  288.     case CPub::e_Book:     x_Init(pub.GetBook(), ctx);            break;
  289.     case CPub::e_Proc:     x_Init(pub.GetProc().GetBook(), ctx);  break;
  290.     case CPub::e_Patent:   x_Init(pub.GetPatent(), ctx);          break;
  291.     case CPub::e_Man:      x_Init(pub.GetMan(), ctx);             break;
  292.     case CPub::e_Equiv:
  293.         ITERATE (CPub_equiv::Tdata, it, pub.GetEquiv().Get()) {
  294.             x_Init(**it, ctx);
  295.         }
  296.         break;
  297.     case CPub::e_Pmid:     m_PMIDs.insert(pub.GetPmid());    break;
  298.     default:               break;
  299.     }
  300. }
  301. void CFlatReference::x_Init(const CCit_gen& gen, const CFlatContext& ctx)
  302. {
  303.     if (gen.IsSetCit()
  304.         &&  !NStr::CompareNocase(gen.GetCit(), "unpublished") ) {
  305.         m_Category = eUnpublished;
  306.         m_Journal  = "Unpublished";
  307.     }
  308.     if (gen.IsSetAuthors()) {
  309.         x_AddAuthors(gen.GetAuthors());
  310.     }
  311.     if (gen.IsSetMuid()) {
  312.         m_MUIDs.insert(gen.GetMuid());
  313.     }
  314.     if (gen.IsSetJournal()) {
  315.         x_SetJournal(gen.GetJournal(), ctx);
  316.     }
  317.     if (gen.IsSetVolume()  &&  m_Volume.empty()) {
  318.         m_Volume = gen.GetVolume();
  319.     }
  320.     if (gen.IsSetIssue()  &&  m_Issue.empty()) {
  321.         m_Issue = gen.GetIssue();
  322.     }
  323.     if (gen.IsSetPages()  &&  m_Pages.empty()) {
  324.         m_Pages = gen.GetPages();
  325.     }
  326.     if (gen.IsSetDate()  &&  !m_Date) {
  327.         m_Date = &gen.GetDate();
  328.     }
  329.     if (gen.IsSetSerial_number()  &&  !m_Serial) {
  330.         m_Serial = gen.GetSerial_number();
  331.     }
  332.     if (gen.IsSetTitle()  &&  m_Title.empty()) {
  333.         m_Title = gen.GetTitle();
  334.     }
  335.     if (gen.IsSetPmid()) {
  336.         m_PMIDs.insert(gen.GetPmid());
  337.     }
  338. }
  339. void CFlatReference::x_Init(const CCit_sub& sub, const CFlatContext& /* ctx */)
  340. {
  341.     m_Category = eSubmission;
  342.     x_AddAuthors(sub.GetAuthors());
  343.     if (sub.GetAuthors().IsSetAffil()) {
  344.         s_FormatAffil(sub.GetAuthors().GetAffil(), m_Journal);
  345.     }
  346.     if (sub.IsSetDate()) {
  347.         m_Date = &sub.GetDate();
  348.     } else {
  349.         // complain?
  350.         if (sub.IsSetImp()) {
  351.             m_Date = &sub.GetImp().GetDate();
  352.         }
  353.     }
  354. }
  355. void CFlatReference::x_Init(const CMedline_entry& mle, const CFlatContext& ctx)
  356. {
  357.     m_Category = ePublished;
  358.     if (mle.IsSetUid()) {
  359.         m_MUIDs.insert(mle.GetUid());
  360.     }
  361.     m_Date = &mle.GetEm();
  362.     if (mle.IsSetPmid()) {
  363.         m_PMIDs.insert(mle.GetPmid());
  364.     }
  365.     x_Init(mle.GetCit(), ctx);
  366. }
  367. void CFlatReference::x_Init(const CCit_art& art, const CFlatContext& ctx)
  368. {
  369.     if (art.IsSetTitle()  &&  !art.GetTitle().Get().empty() ) {
  370.         m_Title = art.GetTitle().GetTitle();
  371.     }
  372.     if (art.IsSetAuthors()) {
  373.         x_AddAuthors(art.GetAuthors());
  374.     }
  375.     switch (art.GetFrom().Which()) {
  376.     case CCit_art::C_From::e_Journal:
  377.         x_Init(art.GetFrom().GetJournal(), ctx);
  378.         break;
  379.     case CCit_art::C_From::e_Book:
  380.         x_Init(art.GetFrom().GetBook(), ctx);
  381.         break;
  382.     case CCit_art::C_From::e_Proc:
  383.         x_Init(art.GetFrom().GetProc().GetBook(), ctx);
  384.         break;
  385.     default:
  386.         break;
  387.     }
  388.     if (art.IsSetIds()) {
  389.         ITERATE (CArticleIdSet::Tdata, it, art.GetIds().Get()) {
  390.             switch ((*it)->Which()) {
  391.             case CArticleId::e_Pubmed:
  392.                 m_PMIDs.insert((*it)->GetPubmed());
  393.                 break;
  394.             case CArticleId::e_Medline:
  395.                 m_MUIDs.insert((*it)->GetMedline());
  396.                 break;
  397.             default:
  398.                 break;
  399.             }
  400.         }
  401.     }
  402. }
  403. void CFlatReference::x_Init(const CCit_jour& jour, const CFlatContext& ctx)
  404. {
  405.     x_SetJournal(jour.GetTitle(), ctx);
  406.     x_AddImprint(jour.GetImp(), ctx);
  407. }
  408. void CFlatReference::x_Init(const CCit_book& book, const CFlatContext& ctx)
  409. {
  410.     // XXX -- should add more stuff to m_Journal (exactly what depends on
  411.     // the format and whether this is for an article)
  412.     if ( !book.GetTitle().Get().empty() ) {
  413.         m_Journal = book.GetTitle().GetTitle();
  414.     }
  415.     if (m_Authors.empty()) {
  416.         x_AddAuthors(book.GetAuthors());
  417.     }
  418.     x_AddImprint(book.GetImp(), ctx);
  419. }
  420. void CFlatReference::x_Init(const CCit_pat& pat, const CFlatContext& ctx)
  421. {
  422.     m_Title = pat.GetTitle();
  423.     x_AddAuthors(pat.GetAuthors());
  424.     int seqid = 0;
  425.     ITERATE (CBioseq::TId, it, ctx.GetHandle().GetBioseqCore()->GetId()) {
  426.         if ((*it)->IsPatent()) {
  427.             seqid = (*it)->GetPatent().GetSeqid();
  428.         }
  429.     }
  430.     // XXX - same for EMBL?
  431.     if (pat.IsSetNumber()) {
  432.         m_Category = ePublished;
  433.         m_Journal = "Patent: " + pat.GetCountry() + ' ' + pat.GetNumber()
  434.             + '-' + pat.GetDoc_type() + ' ' + NStr::IntToString(seqid);
  435.         if (pat.IsSetDate_issue()) {
  436.             ctx.GetFormatter().FormatDate(pat.GetDate_issue(), m_Journal);
  437.         }
  438.         m_Journal += ';';
  439.     } else {
  440.         // ...
  441.     }
  442. }
  443. void CFlatReference::x_Init(const CCit_let& man, const CFlatContext& ctx)
  444. {
  445.     x_Init(man.GetCit(), ctx);
  446.     if (man.IsSetType()  &&  man.GetType() == CCit_let::eType_thesis) {
  447.         const CImprint& imp = man.GetCit().GetImp();
  448.         m_Journal = "Thesis (";
  449.         imp.GetDate().GetDate(&m_Journal, "%Y");
  450.         m_Journal += ')';
  451.         if (imp.IsSetPrepub()
  452.             &&  imp.GetPrepub() == CImprint::ePrepub_in_press) {
  453.             m_Journal += ", In press";
  454.         }
  455.         if (imp.IsSetPub()) {
  456.             string affil;
  457.             s_FormatAffil(imp.GetPub(), affil);
  458.             replace(affil.begin(), affil.end(), '"', ''');
  459.             m_Journal += ' ' + affil;
  460.         }
  461.     }
  462. }
  463. static string& s_FixMedlineName(string& s)
  464. {
  465.     SIZE_TYPE space = s.find(' ');
  466.     if (space) {
  467.         s[space] = ',';
  468.         for (SIZE_TYPE i = space + 1;  i < s.size();  ++i) {
  469.             if (s[i] == ' ') {
  470.                 break;
  471.             } else if (isupper(s[i])) {
  472.                 s.insert(++i, 1, ',');
  473.             }
  474.         }
  475.     }
  476.     return s;
  477. }
  478. void CFlatReference::x_AddAuthors(const CAuth_list& auth)
  479. {
  480.     typedef CAuth_list::C_Names TNames;
  481.     const TNames& names = auth.GetNames();
  482.     switch (names.Which()) {
  483.     case TNames::e_Std:
  484.         ITERATE (TNames::TStd, it, names.GetStd()) {
  485.             const CPerson_id& name = (*it)->GetName();
  486.             switch (name.Which()) {
  487.             case CPerson_id::e_Name:
  488.             {
  489.                 const CName_std& ns = name.GetName();
  490.                 string           s  = ns.GetLast();
  491.                 if (ns.IsSetInitials()) {
  492.                     s += ',' + ns.GetInitials();
  493.                 } else if (ns.IsSetFirst()) {
  494.                     s += ',' + ns.GetFirst()[0] + '.';
  495.                     if (ns.IsSetMiddle()) {
  496.                         s += ns.GetMiddle()[0] + '.';
  497.                     }
  498.                 }
  499.                 // suffix?
  500.                 m_Authors.push_back(s);
  501.                 break;
  502.             }
  503.             case CPerson_id::e_Ml:
  504.             {
  505.                 string s = name.GetMl();
  506.                 m_Authors.push_back(s_FixMedlineName(s));
  507.                 break;
  508.             }
  509.             case CPerson_id::e_Str:
  510.                 m_Authors.push_back(name.GetStr());
  511.                 break;
  512.             case CPerson_id::e_Consortium:
  513.                 m_Consortium = name.GetConsortium();
  514.                 break;
  515.             default:
  516.                 // complain?
  517.                 break;
  518.             }
  519.         }
  520.         break;
  521.     case TNames::e_Ml:
  522.         ITERATE (TNames::TMl, it, names.GetMl()) {
  523.             string s = *it;
  524.             m_Authors.push_back(s_FixMedlineName(s));
  525.         }
  526.         break;
  527.     case TNames::e_Str:
  528.         m_Authors.insert(m_Authors.end(),
  529.                          names.GetStr().begin(), names.GetStr().end());
  530.         break;
  531.     default:
  532.         break;
  533.     }
  534. }
  535. void CFlatReference::x_SetJournal(const CTitle& title, const CFlatContext& ctx)
  536. {
  537.     ITERATE (CTitle::Tdata, it, title.Get()) {
  538.         if ((*it)->IsIso_jta()) {
  539.             m_Journal = (*it)->GetIso_jta();
  540.             return;
  541.         }
  542.     }
  543.     if (ctx.GetFormatter().GetMode() == IFlatFormatter::eMode_Release) {
  544.         // complain
  545.     } else if ( !title.Get().empty() ) {
  546.         m_Journal = title.GetTitle();
  547.     }
  548. }
  549. void CFlatReference::x_AddImprint(const CImprint& imp, const CFlatContext& ctx)
  550. {
  551.     if ( !m_Date ) {
  552.         m_Date.Reset(&imp.GetDate());
  553.     }
  554.     if (imp.IsSetVolume()) {
  555.         // add part-sup?
  556.         m_Volume = imp.GetVolume();
  557.     }
  558.     if (imp.IsSetIssue()) {
  559.         // add part-supi?
  560.         m_Issue = imp.GetIssue();
  561.     }
  562.     if (imp.IsSetPages()) {
  563.         m_Pages = imp.GetPages();
  564.         // Restore redundant leading digits of the second number if needed
  565.         SIZE_TYPE digits1 = m_Pages.find_first_not_of("0123456789");
  566.         if (digits1 != 0) {
  567.             SIZE_TYPE hyphen = m_Pages.find('-', digits1);
  568.             if (hyphen != NPOS) {
  569.                 SIZE_TYPE digits2 = m_Pages.find_first_not_of("0123456789",
  570.                                                               hyphen + 1);
  571.                 digits2 -= hyphen + 1;
  572.                 if (digits2 < digits1) {
  573.                     // lengths of the tail portions
  574.                     SIZE_TYPE len1 = hyphen + digits2 - digits1;
  575.                     SIZE_TYPE len2 = m_Pages.size() - hyphen - 1;
  576.                     int x = NStr::strncasecmp(&m_Pages[digits1 - digits2],
  577.                                               &m_Pages[hyphen + 1],
  578.                                               min(len1, len2));
  579.                     if (x > 0  ||  (x == 0  &&  len1 >= len2)) {
  580.                         // complain?
  581.                     } else {
  582.                         m_Pages.insert(hyphen + 1, m_Pages, 0,
  583.                                        digits1 - digits2);
  584.                     }
  585.                 }
  586.             }
  587.         }
  588.     }
  589.     if (imp.IsSetPrepub()  &&  imp.GetPrepub() != CImprint::ePrepub_in_press) {
  590.         m_Category = eUnpublished;
  591.     } else {
  592.         m_Category = ePublished;
  593.     }
  594. }
  595. END_SCOPE(objects)
  596. END_NCBI_SCOPE
  597. /*
  598. * ===========================================================================
  599. *
  600. * $Log: flat_reference.cpp,v $
  601. * Revision 1000.2  2004/06/01 19:43:28  gouriano
  602. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  603. *
  604. * Revision 1.11  2004/05/21 21:42:53  gorelenk
  605. * Added PCH ncbi_pch.hpp
  606. *
  607. * Revision 1.10  2003/12/02 19:22:17  ucko
  608. * Properly detect unpublished references, and give them a pseudo-journal
  609. * of Unpublished.
  610. *
  611. * Revision 1.9  2003/06/02 16:06:42  dicuccio
  612. * Rearranged src/objects/ subtree.  This includes the following shifts:
  613. *     - src/objects/asn2asn --> arc/app/asn2asn
  614. *     - src/objects/testmedline --> src/objects/ncbimime/test
  615. *     - src/objects/objmgr --> src/objmgr
  616. *     - src/objects/util --> src/objmgr/util
  617. *     - src/objects/alnmgr --> src/objtools/alnmgr
  618. *     - src/objects/flat --> src/objtools/flat
  619. *     - src/objects/validator --> src/objtools/validator
  620. *     - src/objects/cddalignview --> src/objtools/cddalignview
  621. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  622. * replaces the three libmmdb? libs.
  623. *
  624. * Revision 1.8  2003/04/24 16:15:58  vasilche
  625. * Added missing includes and forward class declarations.
  626. *
  627. * Revision 1.7  2003/04/09 20:03:11  ucko
  628. * Fix unsafe assumptions in CFlatReference::Matches.
  629. *
  630. * Revision 1.6  2003/03/28 17:46:21  dicuccio
  631. * Added missing include for CAnnotObject_Info because MSVC gets confused
  632. * otherwise....
  633. *
  634. * Revision 1.5  2003/03/21 18:49:17  ucko
  635. * Turn most structs into (accessor-requiring) classes; replace some
  636. * formerly copied fields with pointers to the original data.
  637. *
  638. * Revision 1.4  2003/03/11 15:37:51  kuznets
  639. * iterate -> ITERATE
  640. *
  641. * Revision 1.3  2003/03/10 22:06:04  ucko
  642. * Explicitly call NotEmpty to avoid a bogus MSVC error.
  643. * Fix a typo that interpreted some MUIDs as PMIDs.
  644. *
  645. * Revision 1.2  2003/03/10 20:18:16  ucko
  646. * Fix broken call to string::insert (caught by Compaq's compiler).
  647. *
  648. * Revision 1.1  2003/03/10 16:39:09  ucko
  649. * Initial check-in of new flat-file generator
  650. *
  651. *
  652. * ===========================================================================
  653. */