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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: datatool.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:42:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.72
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: datatool.cpp,v 1000.2 2004/06/01 19:42:43 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: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   main datatool file: argument processing and task manager
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <serial/objistr.hpp>
  43. #include <serial/objostr.hpp>
  44. #include <serial/objcopy.hpp>
  45. #include <memory>
  46. #include <serial/datatool/exceptions.hpp>
  47. #include <serial/datatool/code.hpp>
  48. #include <serial/datatool/lexer.hpp>
  49. #include <serial/datatool/dtdlexer.hpp>
  50. #include <serial/datatool/parser.hpp>
  51. #include <serial/datatool/dtdparser.hpp>
  52. #include <serial/datatool/moduleset.hpp>
  53. #include <serial/datatool/module.hpp>
  54. #include <serial/datatool/type.hpp>
  55. #include <serial/datatool/generate.hpp>
  56. #include <serial/datatool/datatool.hpp>
  57. #include <serial/datatool/filecode.hpp>
  58. #include <serial/objistrxml.hpp>
  59. #include <serial/objostrxml.hpp>
  60. BEGIN_NCBI_SCOPE
  61. int CDataTool::Run(void)
  62. {
  63.     if ( !ProcessModules() )
  64.         return 1;
  65.     if ( !ProcessData() )
  66.         return 1;
  67.     if ( !GenerateCode() )
  68.         return 1;
  69.     return 0;
  70. }
  71. void CDataTool::Init(void)
  72. {
  73.     SetDiagPostLevel(eDiag_Warning);
  74.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  75.     d->SetUsageContext("datatool", "work with ASN.1/XML data");
  76.     // module arguments
  77.     d->AddKey("m", "moduleFile",
  78.               "module file(s)",
  79.               CArgDescriptions::eInputFile);
  80.     d->AddDefaultKey("M", "externalModuleFile",
  81.                      "external module file(s)",
  82.                      CArgDescriptions::eInputFile, NcbiEmptyString);
  83.     d->AddFlag("i",
  84.                "ignore unresolved symbols");
  85.     d->AddOptionalKey("f", "moduleFile",
  86.                       "write ASN.1 module file",
  87.                       CArgDescriptions::eOutputFile);
  88.     d->AddOptionalKey("fx", "dtdFile",
  89.                       "write DTD file ("-fx m" writes modular DTD file)",
  90.                       CArgDescriptions::eOutputFile);
  91.     d->AddOptionalKey("fxs", "XMLSchemaFile",
  92.                       "write XML Schema file",
  93.                       CArgDescriptions::eOutputFile);
  94.     // data arguments
  95.     d->AddOptionalKey("v", "valueFile",
  96.                       "read value in ASN.1 text format",
  97.                       CArgDescriptions::eInputFile);
  98.     d->AddOptionalKey("vx", "valueFile",
  99.                       "read value in XML format",
  100.                       CArgDescriptions::eInputFile);
  101.     d->AddOptionalKey("d", "valueFile",
  102.                       "read value in ASN.1 binary format (-t is required)",
  103.                       CArgDescriptions::eInputFile);
  104.     d->AddOptionalKey("t", "type",
  105.                       "binary value type (see "-d" argument)",
  106.                       CArgDescriptions::eString);
  107.     d->AddOptionalKey("dn", "filename",
  108.                       "DTD module name in XML header (no extension)",
  109.                       CArgDescriptions::eString);
  110.     d->AddFlag("F",
  111.                "read value completely into memory");
  112.     d->AddOptionalKey("p", "valueFile",
  113.                       "write value in ASN.1 text format",
  114.                       CArgDescriptions::eOutputFile);
  115.     d->AddOptionalKey("px", "valueFile",
  116.                       "write value in XML format",
  117.                       CArgDescriptions::eOutputFile);
  118.     d->AddOptionalKey("e", "valueFile",
  119.                       "write value in ASN.1 binary format",
  120.                       CArgDescriptions::eOutputFile);
  121.     d->AddFlag("sxo",
  122.                "no scope prefixes in XML output");
  123.     d->AddFlag("sxi",
  124.                "no scope prefixes in XML input");
  125.     // code generation arguments
  126.     d->AddOptionalKey("oex", "exportSpec",
  127.                       "class export specifier for MSVC",
  128.                       CArgDescriptions::eString);
  129.     d->AddOptionalKey("od", "defFile",
  130.                       "code definition file",
  131.                       CArgDescriptions::eInputFile);
  132.     d->AddFlag("odi",
  133.                "silently ignore absent code definition file");
  134.     d->AddFlag("odw",
  135.                "issue a warning about absent code definition file");
  136.     d->AddOptionalKey("of", "listFile",
  137.                       "write list of generated C++ files",
  138.                       CArgDescriptions::eOutputFile);
  139.     d->AddOptionalKey("oc", "basename",
  140.                       "write combining C++ files",
  141.                       CArgDescriptions::eString);
  142.     d->AddFlag("oA",
  143.                "generate C++ files for all types");
  144.     d->AddOptionalKey("ot", "types",
  145.                       "generate C++ files for listed types",
  146.                       CArgDescriptions::eString);
  147.     d->AddOptionalKey("ox", "types",
  148.                       "exclude listed types from generation",
  149.                       CArgDescriptions::eString);
  150.     d->AddFlag("oX",
  151.                "turn off recursive type generation");
  152.     d->AddOptionalKey("on", "namespace",
  153.                       "default namespace", 
  154.                       CArgDescriptions::eString);
  155.     d->AddOptionalKey("opm", "directory",
  156.                       "directory for searching source modules",
  157.                       CArgDescriptions::eString);
  158.     d->AddOptionalKey("oph", "directory",
  159.                       "directory for generated *.hpp files",
  160.                       CArgDescriptions::eString);
  161.     d->AddOptionalKey("opc", "directory",
  162.                       "directory for generated *.cpp files",
  163.                       CArgDescriptions::eString);
  164.     d->AddOptionalKey("or", "prefix",
  165.                       "add prefix to generated file names",
  166.                       CArgDescriptions::eString);
  167.     d->AddFlag("orq",
  168.                "use quoted syntax form for generated include files");
  169.     d->AddFlag("ors",
  170.                "add source file dir to generated file names");
  171.     d->AddFlag("orm",
  172.                "add module name to generated file names");
  173.     d->AddFlag("orA",
  174.                "combine all -or* prefixes");
  175.     d->AddFlag("ocvs",
  176.                "create ".cvsignore" files");
  177.     d->AddOptionalKey("oR", "rootDirectory",
  178.                       "set "-o*" arguments for NCBI directory tree",
  179.                       CArgDescriptions::eString);
  180.     d->AddFlag("oDc",
  181.                "turn on generation of DOXYGEN-style comments");
  182.     d->AddOptionalKey("odx", "URL",
  183.                       "URL of documentation root folder (for DOXYGEN)",
  184.                       CArgDescriptions::eString);
  185.     d->AddFlag("lax_syntax",
  186.                "allow non-standard ASN.1 syntax accepted by asntool");
  187.     d->AddOptionalKey("pch", "file",
  188.                       "name of the precompiled header to include in all *.cpp files",
  189.                       CArgDescriptions::eString);
  190.     SetupArgDescriptions(d.release());
  191. }
  192. bool CDataTool::ProcessModules(void)
  193. {
  194.     const CArgs& args = GetArgs();
  195.     list<string> modulesPath;
  196.     if ( const CArgValue& oR = args["oR"] ) {
  197.         // NCBI directory tree
  198.         const string& rootDir = oR.AsString();
  199.         generator.SetRootDir(rootDir);
  200.         generator.SetHPPDir(Path(rootDir, "include"));
  201.         string srcDir = Path(rootDir, "src");
  202.         generator.SetCPPDir(srcDir);
  203.         modulesPath.push_back(srcDir);
  204.         generator.SetFileNamePrefixSource(eFileName_FromSourceFileName);
  205.         generator.SetDefaultNamespace("NCBI_NS_NCBI::objects");
  206.     }
  207.     
  208.     if ( const CArgValue& opm = args["opm"] ) {
  209.         modulesPath.clear();
  210.         NStr::Split(opm.AsString(), ",", modulesPath);
  211.     }
  212.     
  213.     SourceFile::EType srctype =
  214.         LoadDefinitions(generator.GetMainModules(),
  215.                         modulesPath, args["m"].AsString());
  216.     if ( const CArgValue& sxo = args["sxo"] ) {
  217.         CDataType::SetEnforcedStdXml(true);
  218.     }
  219.     if ( const CArgValue& f = args["f"] ) {
  220.         generator.GetMainModules().PrintASN(f.AsOutputFile());
  221.         f.CloseFile();
  222.     }
  223.     if ( const CArgValue& fx = args["fx"] ) {
  224.         if ( fx.AsString() == "m" )
  225.             generator.GetMainModules().PrintDTDModular();
  226.         else {
  227.             generator.GetMainModules().PrintDTD(fx.AsOutputFile());
  228.             fx.CloseFile();
  229.         }
  230.     }
  231.     if ( const CArgValue& ax = args["fxs"] ) {
  232.         if (srctype == SourceFile::eDTD) {
  233.             CDataType::SetEnforcedStdXml(true);
  234.         }
  235.         generator.GetMainModules().PrintXMLSchema(ax.AsOutputFile());
  236.         ax.CloseFile();
  237.     }
  238.     
  239.     LoadDefinitions(generator.GetImportModules(),
  240.                     modulesPath, args["M"].AsString(),srctype);
  241.     if ( !generator.Check() ) {
  242.         if ( !args["i"] ) { // ignored
  243.             ERR_POST("some types are unknown");
  244.             return false;
  245.         }
  246.         else {
  247.             ERR_POST(Warning << "some types are unknown: ignoring");
  248.         }
  249.     }
  250.     return true;
  251. }
  252. bool CDataTool::ProcessData(void)
  253. {    
  254.     const CArgs& args = GetArgs();
  255.     bool stdXmlIn = false;
  256.     if ( const CArgValue& sxi = args["sxi"] ) {
  257.         stdXmlIn = true;
  258.     }
  259.     bool stdXmlOut = false;
  260.     if ( const CArgValue& sxo = args["sxo"] ) {
  261.         stdXmlOut = true;
  262.     }
  263.     // convert data
  264.     ESerialDataFormat inFormat;
  265.     string inFileName;
  266.     const CArgValue& t = args["t"];
  267.     
  268.     if ( const CArgValue& v = args["v"] ) {
  269.         inFormat = eSerial_AsnText;
  270.         inFileName = v.AsString();
  271.     }
  272.     else if ( const CArgValue& vx = args["vx"] ) {
  273.         inFormat = eSerial_Xml;
  274.         inFileName = vx.AsString();
  275.     }
  276.     else if ( const CArgValue& d = args["d"] ) {
  277.         if ( !t ) {
  278.             ERR_POST("ASN.1 value type must be specified (-t)");
  279.             return false;
  280.         }
  281.         inFormat = eSerial_AsnBinary;
  282.         inFileName = d.AsString();
  283.     }
  284.     else // no input data
  285.         return true;
  286.     auto_ptr<CObjectIStream>
  287.         in(CObjectIStream::Open(inFormat, inFileName, eSerial_StdWhenAny));
  288.     if (stdXmlIn && inFormat == eSerial_Xml) {
  289.         CObjectIStreamXml *is = dynamic_cast<CObjectIStreamXml*>(in.get());
  290.         is->SetEnforcedStdXml(true);
  291.     }
  292.     string typeName;
  293.     if ( t ) {
  294.         typeName = t.AsString();
  295.         in->ReadFileHeader();
  296.     }
  297.     else {
  298.         typeName = in->ReadFileHeader();
  299.     }
  300.     TTypeInfo typeInfo =
  301.         generator.GetMainModules().ResolveInAnyModule(typeName, true)->
  302.         GetTypeInfo().Get();
  303.     
  304.     // determine output data file
  305.     ESerialDataFormat outFormat;
  306.     string outFileName;
  307.     
  308.     if ( const CArgValue& p = args["p"] ) {
  309.         outFormat = eSerial_AsnText;
  310.         outFileName = p.AsString();
  311.     }
  312.     else if ( const CArgValue& px = args["px"] ) {
  313.         outFormat = eSerial_Xml;
  314.         outFileName = px.AsString();
  315.     }
  316.     else if ( const CArgValue& e = args["e"] ) {
  317.         outFormat = eSerial_AsnBinary;
  318.         outFileName = e.AsString();
  319.     }
  320.     else {
  321.         // no input data
  322.         outFormat = eSerial_None;
  323.     }
  324.     if ( args["F"] ) {
  325.         // read fully in memory
  326.         AnyType value;
  327.         in->Read(&value, typeInfo, CObjectIStream::eNoFileHeader);
  328.         if ( outFormat != eSerial_None ) {
  329.             // store data
  330.             auto_ptr<CObjectOStream>
  331.                 out(CObjectOStream::Open(outFormat, outFileName,
  332.                                          eSerial_StdWhenAny));
  333.             if ( outFormat == eSerial_Xml ) {
  334.                 CObjectOStreamXml *os = dynamic_cast<CObjectOStreamXml*>(out.get());
  335.                 if (stdXmlOut) {
  336.                     os->SetEnforcedStdXml(true);
  337.                 }
  338.                 // Set DTD file name (default prefix is added in any case)
  339.                 if( const CArgValue& dn = args["dn"] ) {
  340.                   os->SetDTDFileName(dn.AsString());
  341.                 }
  342.             }
  343.             out->Write(&value, typeInfo);
  344.         }
  345.     }
  346.     else {
  347.         if ( outFormat != eSerial_None ) {
  348.             // copy
  349.             auto_ptr<CObjectOStream>
  350.                 out(CObjectOStream::Open(outFormat, outFileName,
  351.                                          eSerial_StdWhenAny));
  352.             if ( outFormat == eSerial_Xml ) {
  353.                 CObjectOStreamXml *os = dynamic_cast<CObjectOStreamXml*>(out.get());
  354.                 if (stdXmlOut) {
  355.                     os->SetEnforcedStdXml(true);
  356.                 }
  357.                 // Set DTD file name (default prefix is added in any case)
  358.                 if( const CArgValue& dn = args["dn"] ) {
  359.                   os->SetDTDFileName(dn.AsString());
  360.                 }
  361.             }
  362.             CObjectStreamCopier copier(*in, *out);
  363.             copier.Copy(typeInfo, CObjectStreamCopier::eNoFileHeader);
  364.         }
  365.         else {
  366.             // skip
  367.             in->Skip(typeInfo, CObjectIStream::eNoFileHeader);
  368.         }
  369.     }
  370.     return true;
  371. }
  372. bool CDataTool::GenerateCode(void)
  373. {
  374.     const CArgs& args = GetArgs();
  375.     // load generator config
  376.     if ( const CArgValue& od = args["od"] )
  377.         generator.LoadConfig(od.AsString(), args["odi"], args["odw"]);
  378.     //if ( const CArgValue& oD = args["oD"] )
  379.     //    generator.AddConfigLine(oD.AsString());
  380.     // set list of types for generation
  381.     if ( args["oX"] )
  382.         generator.ExcludeRecursion();
  383.     if ( args["oA"] )
  384.         generator.IncludeAllMainTypes();
  385.     if ( const CArgValue& ot = args["ot"] )
  386.         generator.IncludeTypes(ot.AsString());
  387.     if ( const CArgValue& ox = args["ox"] )
  388.         generator.ExcludeTypes(ox.AsString());
  389.     if ( !generator.HaveGenerateTypes() )
  390.         return true;
  391.     // set the export specifier, if provided
  392.     if ( const CArgValue& oex = args["oex"] ) {
  393.         string ex;
  394.         ex = generator.GetConfig().Get("-","_export");
  395.         if (ex.empty()) {
  396.             ex = oex.AsString();
  397.         }
  398.         CClassCode::SetExportSpecifier(ex);
  399.     }
  400.     // define the Doxygen group
  401.     {
  402.         if ( args["oDc"] ) {
  403.             CClassCode::SetDoxygenComments(true);
  404.             if ( const CArgValue& odx = args["odx"] ) {
  405.                 string root = odx.AsString();
  406.                 if (root.empty()) {
  407.                     // default
  408.                     root = "http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/lxr/source";
  409.                 }
  410.                 CClassCode::SetDocRootURL(root);
  411.             }
  412.             string group = generator.GetConfig().Get("-","_addtogroup_name");
  413.             CClassCode::SetDoxygenGroup(group);
  414.             group = generator.GetConfig().Get("-","_ingroup_name");
  415.             generator.SetDoxygenIngroup(group);
  416.             group = generator.GetConfig().Get("-","_addtogroup_description");
  417.             generator.SetDoxygenGroupDescription(group);
  418.         } else {
  419.             CClassCode::SetDoxygenComments(false);
  420.         }
  421.     }
  422.     // prepare generator
  423.     
  424.     // set namespace
  425.     if ( const CArgValue& on = args["on"] )
  426.         generator.SetDefaultNamespace(on.AsString());
  427.     
  428.     // set output files
  429.     if ( const CArgValue& oc = args["oc"] ) {
  430.         const string& fileName = oc.AsString();
  431.         generator.SetCombiningFileName(fileName);
  432.         generator.SetFileListFileName(fileName+".files");
  433.     }
  434.     if ( const CArgValue& of = args["of"] )
  435.         generator.SetFileListFileName(of.AsString());
  436.     
  437.     // set directories
  438.     if ( const CArgValue& oph = args["oph"] )
  439.         generator.SetHPPDir(oph.AsString());
  440.     if ( const CArgValue& opc = args["opc"] )
  441.         generator.SetCPPDir(opc.AsString());
  442.     
  443.     // set file names prefixes
  444.     if ( const CArgValue& orF = args["or"] )
  445.         generator.SetFileNamePrefix(orF.AsString());
  446.     if ( args["orq"] )
  447.         generator.UseQuotedForm(true);
  448.     if ( args["ocvs"] )
  449.         generator.CreateCvsignore(true);
  450.     if ( args["ors"] )
  451.         generator.SetFileNamePrefixSource(eFileName_FromSourceFileName);
  452.     if ( args["orm"] )
  453.         generator.SetFileNamePrefixSource(eFileName_FromModuleName);
  454.     if ( args["orA"] )
  455.         generator.SetFileNamePrefixSource(eFileName_UseAllPrefixes);
  456.     // precompiled header
  457.     if ( const CArgValue& pch = args["pch"] )
  458.         CFileCode::SetPchHeader(pch.AsString());
  459.     
  460.     // generate code
  461.     generator.GenerateCode();
  462.     return true;
  463. }
  464. SourceFile::EType CDataTool::LoadDefinitions(
  465.     CFileSet& fileSet, const list<string>& modulesPath,
  466.     const string& nameList, SourceFile::EType srctype)
  467. {
  468.     SourceFile::EType moduleType;
  469.     list<string> names;
  470.     NStr::Split(nameList, " ", names);
  471.     ITERATE ( list<string>, fi, names ) {
  472.         const string& name = *fi;
  473.         if ( !name.empty() ) {
  474.             SourceFile fName(name, modulesPath);
  475.             moduleType = fName.GetType();
  476. // if first module has unknown type - assume ASN
  477.             if (srctype == SourceFile::eUnknown) {
  478.                 if (moduleType == SourceFile::eUnknown) {
  479.                     moduleType = SourceFile::eASN;
  480.                 }
  481.                 srctype = moduleType;
  482.             }
  483. // if second module has unknown type - assume same as the previous one
  484.             else {
  485.                 if (moduleType == SourceFile::eUnknown) {
  486.                     moduleType = srctype;
  487.                 }
  488. // if modules have different types - exception
  489.                 else if (moduleType != srctype) {
  490.                     NCBI_THROW(CDatatoolException,eWrongInput,
  491.                                "Unable to process modules of different types"
  492.                                " simultaneously: "+name);
  493.                 }
  494.             }
  495.             switch (moduleType) {
  496.             default:
  497.                 NCBI_THROW(CDatatoolException,eWrongInput,"Unknown file type: "+name);
  498.             case SourceFile::eASN:
  499.                 {
  500.                     ASNLexer lexer(fName);
  501.                     lexer.AllowIDsEndingWithMinus(GetArgs()["lax_syntax"]);
  502.                     ASNParser parser(lexer);
  503.                     fileSet.AddFile(parser.Modules(name));
  504.                 }
  505.                 break;
  506.             case SourceFile::eDTD:
  507.                 {
  508.                     DTDLexer lexer(fName);
  509.                     DTDParser parser(lexer);
  510.                     fileSet.AddFile(parser.Modules(name));
  511.                 }
  512.                 break;
  513.             }
  514.         }
  515.     }
  516.     return srctype;
  517. }
  518. END_NCBI_SCOPE
  519. int main(int argc, const char* argv[])
  520. {
  521.     USING_NCBI_SCOPE;
  522.     CException::EnableBackgroundReporting(false);
  523.     return CDataTool().AppMain(argc, argv, 0, eDS_Default, 0, "datatool");
  524. }
  525. /*
  526. * ===========================================================================
  527. *
  528. * $Log: datatool.cpp,v $
  529. * Revision 1000.2  2004/06/01 19:42:43  gouriano
  530. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.72
  531. *
  532. * Revision 1.72  2004/05/17 21:03:13  gorelenk
  533. * Added include of PCH ncbi_pch.hpp
  534. *
  535. * Revision 1.71  2004/05/17 14:50:54  gouriano
  536. * Added possibility to include precompiled header
  537. *
  538. * Revision 1.70  2004/05/03 19:31:03  gouriano
  539. * Made generation of DOXYGEN-style comments optional
  540. *
  541. * Revision 1.69  2004/04/29 20:11:39  gouriano
  542. * Generate DOXYGEN-style comments in C++ headers
  543. *
  544. * Revision 1.68  2004/03/19 15:45:19  gouriano
  545. * corrected fxs argument description
  546. *
  547. * Revision 1.67  2003/06/16 14:41:05  gouriano
  548. * added possibility to convert DTD to XML schema
  549. *
  550. * Revision 1.66  2003/05/29 17:26:49  gouriano
  551. * added possibility of generation .cvsignore file
  552. *
  553. * Revision 1.65  2003/05/23 19:18:39  gouriano
  554. * modules of unknown type are assumed to be ASN
  555. * all modules must have the same type
  556. *
  557. * Revision 1.64  2003/05/23 13:54:48  gouriano
  558. * throw exception on unknown module file type
  559. *
  560. * Revision 1.63  2003/05/14 14:42:22  gouriano
  561. * added generation of XML schema
  562. *
  563. * Revision 1.62  2003/03/11 20:06:47  kuznets
  564. * iterate -> ITERATE
  565. *
  566. * Revision 1.61  2003/03/10 18:55:18  gouriano
  567. * use new structured exceptions (based on CException)
  568. *
  569. * Revision 1.60  2003/02/24 21:57:46  gouriano
  570. * added odw flag - to issue a warning about missing DEF file
  571. *
  572. * Revision 1.59  2003/02/10 17:56:15  gouriano
  573. * make it possible to disable scope prefixes when reading and writing objects generated from ASN specification in XML format, or when converting an ASN spec into DTD.
  574. *
  575. * Revision 1.58  2002/12/31 20:14:24  gouriano
  576. * corrected usage of export specifiers when generating C++ classes
  577. *
  578. * Revision 1.57  2002/12/23 18:40:07  dicuccio
  579. * Added new command-line option: -oex <export-specifier> for adding WIn32 export
  580. * specifiers to generated objects.
  581. *
  582. * Revision 1.56  2002/10/22 15:06:12  gouriano
  583. * added possibillity to use quoted syntax form for generated include files
  584. *
  585. * Revision 1.55  2002/10/15 13:57:09  gouriano
  586. * recognize DTD files and handle them using DTD lexer/parser
  587. *
  588. * Revision 1.54  2002/09/26 16:57:31  vasilche
  589. * Added flag for compatibility with asntool
  590. *
  591. * Revision 1.53  2002/08/06 17:03:48  ucko
  592. * Let -opm take a comma-delimited list; move relevant CVS logs to end.
  593. *
  594. * Revision 1.52  2001/12/13 19:32:41  juran
  595. * Make main()'s argv of type (const char*), for use with jTools.
  596. *
  597. * Revision 1.51  2001/10/17 18:19:52  grichenk
  598. * Updated to use CObjectOStreamXml::GetFileXXX
  599. *
  600. * Revision 1.50  2001/04/16 17:53:45  kholodov
  601. * Added: Option -dn to specify the DTD file name in XML header
  602. *
  603. * Revision 1.49  2000/12/26 22:24:53  vasilche
  604. * Updated for new behaviour of CNcbiArgs.
  605. *
  606. * Revision 1.48  2000/12/12 17:57:06  vasilche
  607. * Avoid using of new C++ keywords ('or' in this case).
  608. *
  609. * Revision 1.47  2000/12/12 14:28:17  vasilche
  610. * Changed the way arguments are processed.
  611. *
  612. * Revision 1.46  2000/11/27 18:19:47  vasilche
  613. * Datatool now conforms CNcbiApplication requirements.
  614. *
  615. * Revision 1.45  2000/11/20 17:26:32  vasilche
  616. * Fixed warnings on 64 bit platforms.
  617. * Updated names of config variables.
  618. *
  619. * Revision 1.44  2000/11/08 17:50:18  vasilche
  620. * Fixed compilation error on MSVC.
  621. *
  622. * Revision 1.43  2000/11/08 17:02:51  vasilche
  623. * Added generation of modular DTD files.
  624. *
  625. * Revision 1.42  2000/11/01 20:38:59  vasilche
  626. * OPTIONAL and DEFAULT are not permitted in CHOICE.
  627. * Fixed code generation for DEFAULT.
  628. *
  629. * Revision 1.41  2000/09/29 16:18:28  vasilche
  630. * Fixed binary format encoding/decoding on 64 bit compulers.
  631. * Implemented CWeakMap<> for automatic cleaning map entries.
  632. * Added cleaning local hooks via CWeakMap<>.
  633. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  634. * Added some user interface methods to CObjectIStream, CObjectOStream and
  635. * CObjectStreamCopier.
  636. *
  637. * Revision 1.40  2000/09/26 17:38:26  vasilche
  638. * Fixed incomplete choiceptr implementation.
  639. * Removed temporary comments.
  640. *
  641. * Revision 1.39  2000/09/18 20:00:28  vasilche
  642. * Separated CVariantInfo and CMemberInfo.
  643. * Implemented copy hooks.
  644. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  645. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  646. *
  647. * Revision 1.38  2000/09/18 13:53:00  vasilche
  648. * Fixed '.files' extension.
  649. *
  650. * Revision 1.37  2000/09/01 13:16:27  vasilche
  651. * Implemented class/container/choice iterators.
  652. * Implemented CObjectStreamCopier for copying data without loading into memory.
  653. *
  654. * Revision 1.36  2000/08/25 15:59:20  vasilche
  655. * Renamed directory tool -> datatool.
  656. *
  657. * Revision 1.35  2000/07/10 17:32:00  vasilche
  658. * Macro arguments made more clear.
  659. * All old ASN stuff moved to serialasn.hpp.
  660. * Changed prefix of enum info functions to GetTypeInfo_enum_.
  661. *
  662. * Revision 1.34  2000/06/16 16:31:39  vasilche
  663. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  664. *
  665. * Revision 1.33  2000/05/24 20:09:29  vasilche
  666. * Implemented DTD generation.
  667. *
  668. * Revision 1.32  2000/04/28 16:58:16  vasilche
  669. * Added classes CByteSource and CByteSourceReader for generic reading.
  670. * Added delayed reading of choice variants.
  671. *
  672. * Revision 1.31  2000/04/13 17:30:37  vasilche
  673. * Avoid INTERNAL COMPILER ERROR on MSVC.
  674. * Problem is in "static inline" function which cannot be expanded inline.
  675. *
  676. * Revision 1.30  2000/04/13 14:50:36  vasilche
  677. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  678. *
  679. * Revision 1.29  2000/04/12 15:36:51  vasilche
  680. * Added -on <namespace> argument to datatool.
  681. * Removed unnecessary namespace specifications in generated files.
  682. *
  683. * Revision 1.28  2000/04/07 19:26:28  vasilche
  684. * Added namespace support to datatool.
  685. * By default with argument -oR datatool will generate objects in namespace
  686. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  687. * Datatool's classes also moved to NCBI namespace.
  688. *
  689. * Revision 1.27  2000/03/10 17:59:31  vasilche
  690. * Fixed error reporting.
  691. *
  692. * Revision 1.26  2000/02/01 21:48:01  vasilche
  693. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  694. * Removed CMemberInfo subclasses.
  695. * Added support for DEFAULT/OPTIONAL members.
  696. * Changed class generation.
  697. * Moved datatool headers to include/internal/serial/tool.
  698. *
  699. * Revision 1.25  2000/01/06 16:13:43  vasilche
  700. * Updated help messages.
  701. *
  702. * Revision 1.24  1999/12/30 21:33:39  vasilche
  703. * Changed arguments - more structured.
  704. * Added intelligence in detection of source directories.
  705. *
  706. * Revision 1.23  1999/12/28 18:55:58  vasilche
  707. * Reduced size of compiled object files:
  708. * 1. avoid inline or implicit virtual methods (especially destructors).
  709. * 2. avoid std::string's methods usage in inline methods.
  710. * 3. avoid string literals ("xxx") in inline methods.
  711. *
  712. * Revision 1.22  1999/12/21 17:18:35  vasilche
  713. * Added CDelayedFostream class which rewrites file only if contents is changed.
  714. *
  715. * Revision 1.21  1999/12/20 21:00:18  vasilche
  716. * Added generation of sources in different directories.
  717. *
  718. * Revision 1.20  1999/12/01 17:36:26  vasilche
  719. * Fixed CHOICE processing.
  720. *
  721. * Revision 1.19  1999/11/15 20:01:34  vasilche
  722. * Fixed GCC error
  723. *
  724. * Revision 1.18  1999/11/15 19:36:16  vasilche
  725. * Fixed warnings on GCC
  726. *
  727. * ===========================================================================
  728. */