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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: feat_config_list.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:43:13  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: feat_config_list.cpp,v 1000.1 2004/06/01 20:43:13 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.  * Authors:  Robert Smith
  35.  *
  36.  */
  37. /// @file feat_config_list.cpp
  38. /// 
  39. /// List of feature types to configure preferences for viewing SeqFeats.
  40. #include <ncbi_pch.hpp>
  41. #include <gui/config/feat_config_list.hpp>
  42. BEGIN_NCBI_SCOPE
  43. const CFeatConfigList* GetFeatConfigList()
  44. {
  45.     static CFeatConfigList* theFeatConfigList = 0;
  46.     
  47.     if (theFeatConfigList == 0) {
  48.         theFeatConfigList = new CFeatConfigList();
  49.         
  50.     }
  51.     return theFeatConfigList;
  52. }
  53. #define kMasterDescString "All"
  54. static string   s_MasterDesc(kMasterDescString);
  55. string  ChangeMasterFeatDescription(const string& oldDesc, const string& newMasterDesc)
  56. {
  57.     string newDesc = oldDesc;
  58.     SIZE_TYPE mast_pos = newDesc.find(s_MasterDesc);
  59.     while (mast_pos != NPOS) {
  60.         newDesc.replace(mast_pos, s_MasterDesc.size(), newMasterDesc);
  61.         mast_pos = newDesc.find(s_MasterDesc, mast_pos + newMasterDesc.size());
  62.     }
  63.     return newDesc;
  64. }
  65. USING_SCOPE(objects);
  66. namespace {
  67. CFeatConfigItem config_item_init[] = {
  68.     CFeatConfigItem( CSeqFeatData::e_not_set,   CSeqFeatData::eSubtype_any,   kMasterDescString,  "Master" ),
  69.     CFeatConfigItem( CSeqFeatData::e_Gene,      CSeqFeatData::eSubtype_gene,  "Gene", "Gene" ),
  70.     CFeatConfigItem( CSeqFeatData::e_Org,      CSeqFeatData::eSubtype_org,   "Org",  "Org" ),
  71.     CFeatConfigItem( CSeqFeatData::e_Cdregion, CSeqFeatData::eSubtype_cdregion,  "CDS",  "CDS" ),
  72.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_any,   "Protein, " kMasterDescString,  "Prot Master" ),
  73.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_prot,  "Protein", "Prot" ),
  74.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_preprotein,    "PreProtein", "PreProtein" ),
  75.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_mat_peptide_aa,    "Mature Peptide AA", "Mat-Peptide AA" ),
  76.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_sig_peptide_aa,    "Signal Peptide AA", "Sig-Peptide AA" ), 
  77.     CFeatConfigItem( CSeqFeatData::e_Prot,     CSeqFeatData::eSubtype_transit_peptide_aa,    "Transit Peptide AA", "Transit-Peptide AA" ), 
  78.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_any,   "RNA, " kMasterDescString, "RNA Master" ),
  79.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_preRNA,  "precursor_RNA",   "precursor_RNA" ),   
  80.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_mRNA,  "mRNA", "mRNA" ), 
  81.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_tRNA,  "tRNA", "tRNA" ), 
  82.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_rRNA,  "rRNA", "rRNA" ), 
  83.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_snRNA,  "snRNA", "snRNA" ), 
  84.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_scRNA,  "scRNA", "scRNA" ), 
  85.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_snoRNA,  "sno_RNA", "sno_RNA" ), 
  86.     CFeatConfigItem( CSeqFeatData::e_Rna,     CSeqFeatData::eSubtype_otherRNA,  "misc_RNA",  "misc_RNA" ),
  87.     CFeatConfigItem( CSeqFeatData::e_Pub,     CSeqFeatData::eSubtype_pub,   "Pub", "Pub" ),
  88.     CFeatConfigItem( CSeqFeatData::e_Seq,     CSeqFeatData::eSubtype_seq,   "Seq", "Seq" ),
  89.     CFeatConfigItem( CSeqFeatData::e_Imp,      CSeqFeatData::eSubtype_any,       "Import, " kMasterDescString,  "Import Master" ),
  90.     CFeatConfigItem( CSeqFeatData::e_Imp,      CSeqFeatData::eSubtype_imp,       "import",       "import" ),
  91.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_allele,     "allele",       "allele" ),
  92.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_attenuator, "attenuator",   "attenuator"),
  93.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_C_region,   "C_region",     "C_region" ),
  94.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_CAAT_signal,"CAAT_signal",  "CAAT_signal" ),
  95.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_Imp_CDS,    "Imp_CDS",      "Imp_CDS"), 
  96.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_conflict,   "conflict",     "conflict"), 
  97.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_D_loop,     "D_loop",       "D_loop"),  
  98.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_D_segment,  "D_segment",    "D_segment"), 
  99.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_enhancer,   "enhancer",     "enhancer" ),
  100.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_exon,       "exon",         "exon" ),
  101.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_GC_signal,  "GC_signal",    "GC_signal" ),
  102.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_iDNA,       "iDNA",         "iDNA" ),
  103.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_intron,     "intron",       "intron" ),
  104.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_J_segment,  "J_segment",    "J_segment" ),
  105.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_LTR,        "LTR",          "LTR" ),
  106.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_mat_peptide,"mat_peptide",  "mat_peptide" ),
  107.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_binding,       "misc_binding",     "misc_binding" ),
  108.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_difference,    "misc_difference",  "misc_difference" ),
  109.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_feature,       "misc_feature",     "misc_feature" ),
  110.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_recomb,        "misc_recomb",      "misc_recomb" ),
  111.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_RNA,           "misc_RNA",         "misc_RNA" ),
  112.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_signal,        "misc_signal",      "misc_signal" ),
  113.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_misc_structure,     "misc_structure",   "misc_structure" ),
  114.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_modified_base,  "modified_base",    "modified_base" ),
  115.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_mutation,       "mutation",     "mutation" ),
  116.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_N_region,       "N_region",     "N_region" ),
  117.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_old_sequence,   "old_sequence", "old_sequence" ),
  118.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_polyA_signal,   "polyA_signal", "polyA_signal" ),
  119.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_polyA_site,     "polyA_site",   "polyA_site" ),
  120.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_precursor_RNA,  "precursor_RNA",    "precursor_RNA" ),
  121.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_prim_transcript,"prim_transcript",     "prim_transcript" ),
  122.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_primer_bind,    "primer_bind",     "primer_bind" ),
  123.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_promoter,    "promoter",     "promoter" ),
  124.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_protein_bind,    "protein_bind",     "protein_bind" ),
  125.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_RBS,    "RBS",     "RBS" ),
  126.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_repeat_region,    "repeat_region",     "repeat_region" ),
  127.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_repeat_unit,    "repeat_unit",     "repeat_unit" ),
  128.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_rep_origin,    "rep_origin",     "rep_origin" ),
  129.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_S_region,    "S_region",     "S_region" ),
  130.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_satellite,    "satellite",     "satellite" ),
  131.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_sig_peptide,    "sig_peptide",     "sig_peptide" ),
  132.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_source,    "source",     "source" ),
  133.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_stem_loop,    "stem_loop",     "stem_loop" ),
  134.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_STS,    "STS",     "STS" ),
  135.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_TATA_signal,    "TATA_signal",     "TATA_signal" ),
  136.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_terminator,    "terminator",     "terminator" ),
  137.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_transit_peptide,    "transit_peptide",     "transit_peptide" ),
  138.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_unsure,    "unsure",     "unsure" ),
  139.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_V_region,    "V_region",     "V_region" ),
  140.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_V_segment,    "V_segment",     "V_segment" ),
  141.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_variation,    "variation",     "variation" ),
  142.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_virion,    "virion",     "virion" ),
  143.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_3clip,    "3'clip",     "3'clip" ),
  144.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_3UTR,    "3'UTR",     "3'UTR" ),
  145.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_5clip,    "5'clip",     "5'clip" ),
  146.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_5UTR,    "5'UTR",     "5'UTR" ),
  147.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_10_signal,    "-10_signal",     "-10_signal" ),
  148.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_35_signal,    "-35_signal",     "-35_signal" ),
  149.     CFeatConfigItem( CSeqFeatData::e_Imp,     CSeqFeatData::eSubtype_site_ref,    "site_ref",     "site_ref" ),
  150.     CFeatConfigItem( CSeqFeatData::e_Region,   CSeqFeatData::eSubtype_region,    "region",     "region" ),
  151.     CFeatConfigItem( CSeqFeatData::e_Comment,  CSeqFeatData::eSubtype_comment,    "comment",     "comment" ),
  152.     CFeatConfigItem( CSeqFeatData::e_Bond,     CSeqFeatData::eSubtype_bond,    "bond",     "bond" ),
  153.     CFeatConfigItem( CSeqFeatData::e_Site,     CSeqFeatData::eSubtype_site,    "site",     "site" ),
  154.     CFeatConfigItem( CSeqFeatData::e_Rsite,    CSeqFeatData::eSubtype_rsite,    "rsite",     "rsite" ),
  155.     CFeatConfigItem( CSeqFeatData::e_User,     CSeqFeatData::eSubtype_user,    "user",     "user" ),
  156.     CFeatConfigItem( CSeqFeatData::e_Txinit,   CSeqFeatData::eSubtype_txinit,    "txinit",     "txinit" ),
  157.     CFeatConfigItem( CSeqFeatData::e_Num,      CSeqFeatData::eSubtype_num,    "num",     "num" ),
  158.     CFeatConfigItem( CSeqFeatData::e_Psec_str, CSeqFeatData::eSubtype_psec_str,    "psec_str",     "psec_str" ),
  159.     CFeatConfigItem( CSeqFeatData::e_Non_std_residue,     CSeqFeatData::eSubtype_non_std_residue,    "non_std_residue",     "non_std_residue" ),
  160.     CFeatConfigItem( CSeqFeatData::e_Het,      CSeqFeatData::eSubtype_het,    "het",     "het" ),
  161.     CFeatConfigItem( CSeqFeatData::e_Biosrc,   CSeqFeatData::eSubtype_biosrc,    "biosrc",     "biosrc" ),
  162. };
  163. } // unnamed namespace
  164. /**
  165.     CFeatConfigItem comparator 
  166.     to sort the set properly.
  167. */
  168. bool CFeatConfigItem::operator<(const CFeatConfigItem& rhs) const {
  169.     if (m_Type == rhs.m_Type) {
  170.         // the 'Any' subtype should sort lower than anything else in that type.
  171.         if (m_Subtype == CSeqFeatData::eSubtype_any) {
  172.             return rhs.m_Subtype != CSeqFeatData::eSubtype_any;
  173.         }
  174.         if ( rhs.m_Subtype == CSeqFeatData::eSubtype_any) {
  175.             return false;
  176.         }
  177.         return m_Subtype < rhs.m_Subtype;
  178.     } 
  179.     return m_Type < rhs.m_Type;
  180. }
  181. /*****
  182.     CFeatConfigList definitions.
  183. *****/
  184. CFeatConfigList::CFeatConfigList()
  185. {
  186.     x_Init();
  187. }
  188. bool CFeatConfigList::TypeValid(int type, int subtype) const
  189. {
  190.     const_iterator ci_it = m_FeatTypes.find(CFeatConfigItem(type, subtype, "", ""));
  191.     if (ci_it == m_FeatTypes.end()) {
  192.         return false;
  193.     }
  194.     return true;
  195. }
  196. bool CFeatConfigList::GetItem(int type, int subtype, CFeatConfigItem& config_item) const
  197. {
  198.     const_iterator ci_it = m_FeatTypes.find(CFeatConfigItem(type, subtype, "", ""));
  199.     if (ci_it == m_FeatTypes.end()) {
  200.         return false;
  201.     }
  202.     config_item = *ci_it;
  203.     return true;
  204. }
  205. bool CFeatConfigList::GetItemByDescription(const string& desc, CFeatConfigItem& config_item) const
  206. {
  207.     const_iterator ci_it = begin();
  208.     for (; ci_it != end(); ++ci_it) {
  209.         if (ci_it->GetDescription() == desc) {
  210.             config_item = *ci_it;
  211.             return true;
  212.         }
  213.     }
  214.     return false;
  215. }
  216. bool CFeatConfigList::GetTypeSubType(const string& desc, int& type, int& subtype) const
  217. {
  218.     CFeatConfigItem config_item;
  219.     if ( GetItemByDescription(desc, config_item) ) {
  220.         type = config_item.GetType();
  221.         subtype = config_item.GetSubtype();
  222.         return true;
  223.     }
  224.     return false;
  225. }
  226. bool CFeatConfigList::GetItemByKey(const string& key, CFeatConfigItem& config_item) const
  227. {
  228.     const_iterator ci_it = begin();
  229.     for (; ci_it != end(); ++ci_it) {
  230.         if (ci_it->GetStoragekey() == key) {
  231.             config_item = *ci_it;
  232.             return true;
  233.         }
  234.     }
  235.     return false;
  236. }
  237. string CFeatConfigList::GetDescription(int type, int subtype) const
  238. {
  239.     CFeatConfigItem config_item;
  240.     if (!GetItem(type, subtype, config_item)) {
  241.         return kEmptyStr;
  242.     }
  243.     return config_item.GetDescription();
  244. }
  245. string CFeatConfigList::GetStoragekey(int type, int subtype) const
  246. {
  247.     CFeatConfigItem config_item;
  248.     if (!GetItem(type, subtype, config_item)) {
  249.         return kEmptyStr;
  250.     }
  251.     return config_item.GetStoragekey();
  252. }
  253. size_t CFeatConfigList::size() const
  254. {
  255.     return m_FeatTypes.size();
  256. }
  257. CFeatConfigList::const_iterator CFeatConfigList::begin() const
  258. {
  259.     return m_FeatTypes.begin();
  260. }
  261. CFeatConfigList::const_iterator CFeatConfigList::end() const
  262. {
  263.     return m_FeatTypes.end();
  264. }
  265. void CFeatConfigList::x_Init()
  266. {
  267.     size_t  config_item_size = sizeof(config_item_init)/sizeof(CFeatConfigItem);
  268.     for (size_t i = 0; i < config_item_size; ++i ) {
  269.         bool config_items_init_no_dups = 
  270.            m_FeatTypes.insert(config_item_init[i]).second;
  271.         _ASSERT(config_items_init_no_dups);
  272.     }
  273. }
  274. /// return a list of all the feature descriptions for a menu or other control.
  275. void CFeatConfigList::GetDescriptions(vector<string> &descs, bool hierarchical) const
  276. {
  277.     descs.clear();
  278.     
  279.     ITERATE (TFeatTypeContainer, iter, m_FeatTypes) {
  280.         string  this_desc = iter->GetDescription();
  281.         
  282.         if (hierarchical) {
  283.             string parent_desc;
  284.             if (iter->GetSubtype() != CSeqFeatData::eSubtype_any) {
  285.                 parent_desc = GetDescription(iter->GetType(), CSeqFeatData::eSubtype_any);
  286.             } else if (iter->GetType() != CSeqFeatData::e_not_set) {
  287.                 parent_desc = this_desc;
  288.             }
  289.             if ( ! parent_desc.empty()) {
  290.                 this_desc = parent_desc + "/" + this_desc;
  291.             }
  292.         }
  293.         
  294.         descs.push_back(this_desc);
  295.     }
  296. }
  297. END_NCBI_SCOPE
  298. /*
  299.  * ===========================================================================
  300.  * $Log: feat_config_list.cpp,v $
  301.  * Revision 1000.1  2004/06/01 20:43:13  gouriano
  302.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  303.  *
  304.  * Revision 1.6  2004/05/21 22:27:39  gorelenk
  305.  * Added PCH ncbi_pch.hpp
  306.  *
  307.  * Revision 1.5  2004/05/20 12:27:41  dicuccio
  308.  * Removed unnecessary doxygen module directives - they're in the headers
  309.  *
  310.  * Revision 1.4  2004/01/15 14:48:09  rsmith
  311.  * add GetTypeSubType method from CFeatConfig (deprecated).
  312.  *
  313.  * Revision 1.3  2004/01/14 20:30:43  rsmith
  314.  * Add method GetDescriptions to easily get all feature descriptions.
  315.  * Change the uility function ChangeMasterFeatDescription to search and replace
  316.  * all "master" strings.
  317.  *
  318.  * Revision 1.2  2003/12/30 15:45:10  dicuccio
  319.  * Fixed compilation errors on Linux
  320.  *
  321.  * Revision 1.1  2003/12/29 14:34:38  rsmith
  322.  * split out from feat_config.cpp
  323.  *
  324.  *
  325.  * ===========================================================================
  326.  */