⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datatool.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * =========================================================================== * 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 + -