📄 datatool.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: datatool.cpp,v $ * PRODUCTION Revision 1000.2 2004/06/01 19:42:43 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.72 * PRODUCTION * =========================================================================== *//* $Id: datatool.cpp,v 1000.2 2004/06/01 19:42:43 gouriano Exp $* ===========================================================================** PUBLIC DOMAIN NOTICE* National Center for Biotechnology Information** This software/database is a "United States Government Work" under the* terms of the United States Copyright Act. It was written as part of* the author's official duties as a United States Government employee and* thus cannot be copyrighted. This software/database is freely available* to the public for use. The National Library of Medicine and the U.S.* Government have not placed any restriction on its use or reproduction.** Although all reasonable efforts have been taken to ensure the accuracy* and reliability of the software and data, the NLM and the U.S.* Government do not and cannot warrant the performance or results that* may be obtained by using this software or data. The NLM and the U.S.* Government disclaim all warranties, express or implied, including* warranties of performance, merchantability or fitness for any particular* purpose.** Please cite the author in any work or product based on this material.** ===========================================================================** Author: Eugene Vasilchenko** File Description:* main datatool file: argument processing and task manager*/#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <corelib/ncbiargs.hpp>#include <serial/objistr.hpp>#include <serial/objostr.hpp>#include <serial/objcopy.hpp>#include <memory>#include <serial/datatool/exceptions.hpp>#include <serial/datatool/code.hpp>#include <serial/datatool/lexer.hpp>#include <serial/datatool/dtdlexer.hpp>#include <serial/datatool/parser.hpp>#include <serial/datatool/dtdparser.hpp>#include <serial/datatool/moduleset.hpp>#include <serial/datatool/module.hpp>#include <serial/datatool/type.hpp>#include <serial/datatool/generate.hpp>#include <serial/datatool/datatool.hpp>#include <serial/datatool/filecode.hpp>#include <serial/objistrxml.hpp>#include <serial/objostrxml.hpp>BEGIN_NCBI_SCOPEint CDataTool::Run(void){ if ( !ProcessModules() ) return 1; if ( !ProcessData() ) return 1; if ( !GenerateCode() ) return 1; return 0;}void CDataTool::Init(void){ SetDiagPostLevel(eDiag_Warning); auto_ptr<CArgDescriptions> d(new CArgDescriptions); d->SetUsageContext("datatool", "work with ASN.1/XML data"); // module arguments d->AddKey("m", "moduleFile", "module file(s)", CArgDescriptions::eInputFile); d->AddDefaultKey("M", "externalModuleFile", "external module file(s)", CArgDescriptions::eInputFile, NcbiEmptyString); d->AddFlag("i", "ignore unresolved symbols"); d->AddOptionalKey("f", "moduleFile", "write ASN.1 module file", CArgDescriptions::eOutputFile); d->AddOptionalKey("fx", "dtdFile", "write DTD file (\"-fx m\" writes modular DTD file)", CArgDescriptions::eOutputFile); d->AddOptionalKey("fxs", "XMLSchemaFile", "write XML Schema file", CArgDescriptions::eOutputFile); // data arguments d->AddOptionalKey("v", "valueFile", "read value in ASN.1 text format", CArgDescriptions::eInputFile); d->AddOptionalKey("vx", "valueFile", "read value in XML format", CArgDescriptions::eInputFile); d->AddOptionalKey("d", "valueFile", "read value in ASN.1 binary format (-t is required)", CArgDescriptions::eInputFile); d->AddOptionalKey("t", "type", "binary value type (see \"-d\" argument)", CArgDescriptions::eString); d->AddOptionalKey("dn", "filename", "DTD module name in XML header (no extension)", CArgDescriptions::eString); d->AddFlag("F", "read value completely into memory"); d->AddOptionalKey("p", "valueFile", "write value in ASN.1 text format", CArgDescriptions::eOutputFile); d->AddOptionalKey("px", "valueFile", "write value in XML format", CArgDescriptions::eOutputFile); d->AddOptionalKey("e", "valueFile", "write value in ASN.1 binary format", CArgDescriptions::eOutputFile); d->AddFlag("sxo", "no scope prefixes in XML output"); d->AddFlag("sxi", "no scope prefixes in XML input"); // code generation arguments d->AddOptionalKey("oex", "exportSpec", "class export specifier for MSVC", CArgDescriptions::eString); d->AddOptionalKey("od", "defFile", "code definition file", CArgDescriptions::eInputFile); d->AddFlag("odi", "silently ignore absent code definition file"); d->AddFlag("odw", "issue a warning about absent code definition file"); d->AddOptionalKey("of", "listFile", "write list of generated C++ files", CArgDescriptions::eOutputFile); d->AddOptionalKey("oc", "basename", "write combining C++ files", CArgDescriptions::eString); d->AddFlag("oA", "generate C++ files for all types"); d->AddOptionalKey("ot", "types", "generate C++ files for listed types", CArgDescriptions::eString); d->AddOptionalKey("ox", "types", "exclude listed types from generation", CArgDescriptions::eString); d->AddFlag("oX", "turn off recursive type generation"); d->AddOptionalKey("on", "namespace", "default namespace", CArgDescriptions::eString); d->AddOptionalKey("opm", "directory", "directory for searching source modules", CArgDescriptions::eString); d->AddOptionalKey("oph", "directory", "directory for generated *.hpp files", CArgDescriptions::eString); d->AddOptionalKey("opc", "directory", "directory for generated *.cpp files", CArgDescriptions::eString); d->AddOptionalKey("or", "prefix", "add prefix to generated file names", CArgDescriptions::eString); d->AddFlag("orq", "use quoted syntax form for generated include files"); d->AddFlag("ors", "add source file dir to generated file names"); d->AddFlag("orm", "add module name to generated file names"); d->AddFlag("orA", "combine all -or* prefixes"); d->AddFlag("ocvs", "create \".cvsignore\" files"); d->AddOptionalKey("oR", "rootDirectory", "set \"-o*\" arguments for NCBI directory tree", CArgDescriptions::eString); d->AddFlag("oDc", "turn on generation of DOXYGEN-style comments"); d->AddOptionalKey("odx", "URL", "URL of documentation root folder (for DOXYGEN)", CArgDescriptions::eString); d->AddFlag("lax_syntax", "allow non-standard ASN.1 syntax accepted by asntool"); d->AddOptionalKey("pch", "file", "name of the precompiled header to include in all *.cpp files", CArgDescriptions::eString); SetupArgDescriptions(d.release());}bool CDataTool::ProcessModules(void){ const CArgs& args = GetArgs(); list<string> modulesPath; if ( const CArgValue& oR = args["oR"] ) { // NCBI directory tree const string& rootDir = oR.AsString(); generator.SetRootDir(rootDir); generator.SetHPPDir(Path(rootDir, "include")); string srcDir = Path(rootDir, "src"); generator.SetCPPDir(srcDir); modulesPath.push_back(srcDir); generator.SetFileNamePrefixSource(eFileName_FromSourceFileName); generator.SetDefaultNamespace("NCBI_NS_NCBI::objects"); } if ( const CArgValue& opm = args["opm"] ) { modulesPath.clear(); NStr::Split(opm.AsString(), ",", modulesPath); } SourceFile::EType srctype = LoadDefinitions(generator.GetMainModules(), modulesPath, args["m"].AsString()); if ( const CArgValue& sxo = args["sxo"] ) { CDataType::SetEnforcedStdXml(true); } if ( const CArgValue& f = args["f"] ) { generator.GetMainModules().PrintASN(f.AsOutputFile()); f.CloseFile(); } if ( const CArgValue& fx = args["fx"] ) { if ( fx.AsString() == "m" ) generator.GetMainModules().PrintDTDModular(); else { generator.GetMainModules().PrintDTD(fx.AsOutputFile()); fx.CloseFile(); } } if ( const CArgValue& ax = args["fxs"] ) { if (srctype == SourceFile::eDTD) { CDataType::SetEnforcedStdXml(true); } generator.GetMainModules().PrintXMLSchema(ax.AsOutputFile()); ax.CloseFile(); } LoadDefinitions(generator.GetImportModules(), modulesPath, args["M"].AsString(),srctype); if ( !generator.Check() ) { if ( !args["i"] ) { // ignored ERR_POST("some types are unknown"); return false; } else { ERR_POST(Warning << "some types are unknown: ignoring"); } } return true;}bool CDataTool::ProcessData(void){ const CArgs& args = GetArgs(); bool stdXmlIn = false; if ( const CArgValue& sxi = args["sxi"] ) { stdXmlIn = true; } bool stdXmlOut = false; if ( const CArgValue& sxo = args["sxo"] ) { stdXmlOut = true; } // convert data ESerialDataFormat inFormat; string inFileName; const CArgValue& t = args["t"]; if ( const CArgValue& v = args["v"] ) { inFormat = eSerial_AsnText; inFileName = v.AsString(); } else if ( const CArgValue& vx = args["vx"] ) { inFormat = eSerial_Xml; inFileName = vx.AsString(); } else if ( const CArgValue& d = args["d"] ) { if ( !t ) { ERR_POST("ASN.1 value type must be specified (-t)"); return false; } inFormat = eSerial_AsnBinary; inFileName = d.AsString(); } else // no input data return true; auto_ptr<CObjectIStream> in(CObjectIStream::Open(inFormat, inFileName, eSerial_StdWhenAny)); if (stdXmlIn && inFormat == eSerial_Xml) { CObjectIStreamXml *is = dynamic_cast<CObjectIStreamXml*>(in.get()); is->SetEnforcedStdXml(true); } string typeName; if ( t ) { typeName = t.AsString(); in->ReadFileHeader(); } else { typeName = in->ReadFileHeader(); } TTypeInfo typeInfo = generator.GetMainModules().ResolveInAnyModule(typeName, true)-> GetTypeInfo().Get(); // determine output data file ESerialDataFormat outFormat; string outFileName; if ( const CArgValue& p = args["p"] ) { outFormat = eSerial_AsnText; outFileName = p.AsString(); } else if ( const CArgValue& px = args["px"] ) { outFormat = eSerial_Xml; outFileName = px.AsString(); } else if ( const CArgValue& e = args["e"] ) { outFormat = eSerial_AsnBinary; outFileName = e.AsString(); } else { // no input data outFormat = eSerial_None; } if ( args["F"] ) { // read fully in memory AnyType value; in->Read(&value, typeInfo, CObjectIStream::eNoFileHeader); if ( outFormat != eSerial_None ) { // store data auto_ptr<CObjectOStream> out(CObjectOStream::Open(outFormat, outFileName, eSerial_StdWhenAny)); if ( outFormat == eSerial_Xml ) { CObjectOStreamXml *os = dynamic_cast<CObjectOStreamXml*>(out.get()); if (stdXmlOut) { os->SetEnforcedStdXml(true); } // Set DTD file name (default prefix is added in any case) if( const CArgValue& dn = args["dn"] ) { os->SetDTDFileName(dn.AsString()); } } out->Write(&value, typeInfo); } } else { if ( outFormat != eSerial_None ) { // copy auto_ptr<CObjectOStream> out(CObjectOStream::Open(outFormat, outFileName, eSerial_StdWhenAny)); if ( outFormat == eSerial_Xml ) { CObjectOStreamXml *os = dynamic_cast<CObjectOStreamXml*>(out.get()); if (stdXmlOut) { os->SetEnforcedStdXml(true); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -