Program Listing for File environment.h#

Return to documentation for file (sdv_idl_compiler\environment.h)

#ifndef ENV_H
#define ENV_H

#include <filesystem>
#include <set>
#include <stack>

#include "logger.h"
#include "core_idl_backup.h"
#include "../global/cmdlnparser/cmdlnparser.h"
#include "includes.h"
#include "macro.h"
#include "token.h"
#include "exception.h"

class CIdlCompilerEnvironment
    : public sdv::idl::ICompilerOption
    , public sdv::IInterfaceAccess
{
public:
    CIdlCompilerEnvironment();

    CIdlCompilerEnvironment(const std::vector<std::string>& rvecArgs);

    template <typename TCharType>
    CIdlCompilerEnvironment(size_t nArgs, const TCharType** rgszArgs);

    virtual sdv::interface_t GetInterface(sdv::interface_id idInterface) override;

    std::filesystem::path GetNextFile();

    bool Help() const { return m_bCLHelp; }

    void ShowHelp() const { m_cmdln.PrintHelp(std::cout); }

    bool Version() const { return m_bCLVersion; }

    const std::vector<std::filesystem::path>& GetIncludeDirs() const { return m_vecIncludeDirs; }

    std::filesystem::path GetOutputDir() const { return m_pathOutputDir; }

    void AddDefinition(const char* szDefinition);

    void AddDefinition(const CToken& rtoken, const CMacro& rMacro);

    void RemoveDefinition(const char* szMacro);

    bool Defined(const char* szMacro) const;

    bool TestAndExpand(const std::string&   rssIdentifier,
                       CCodePos&            rcode,
                       bool                 bInMacroExpansion,
                       CUsedMacroSet&       rsetPreviousExpanded) const;

    bool TestAndExpand(const std::string& rssIdentifier, CCodePos& rcode, bool bInMacroExpansion = false) const
    {
        CUsedMacroSet setDummy;
        return TestAndExpand(rssIdentifier, rcode, bInMacroExpansion, setDummy);
    }

    bool ResolveConst() const;

    bool NoProxyStub() const;

    const std::string& GetProxStubCMakeTarget() const;

    virtual sdv::u8string GetOption(/*in*/ const sdv::u8string& rssOption) const override;

    virtual uint32_t GetOptionCnt(/*in*/ const sdv::u8string& rssOption) const override;

    virtual sdv::u8string GetOptionN(/*in*/ const sdv::u8string& rssOption, /*in*/ uint32_t uiIndex) const override;

    bool InterfaceTypeExtension() const { return m_bEnableInterfaceTypeExtension; }
    bool ExceptionTypeExtension() const { return m_bEnableExceptionTypeExtension; }
    bool PointerTypeExtension() const { return m_bEnablePointerTypeExtension; }
    bool UnicodeExtension() const { return m_bEnableUnicodeExtension; }
    bool CaseSensitiveTypeExtension() const { return m_bEnableCaseSensitiveNameExtension; }
    bool ContextDependentNamesExtension() const { return m_bEnableContextDependentNamesExtension; }
    bool MultiDimArrayExtension() const { return m_bEnableMultiDimArrayExtension; }
private:
    CCommandLine m_cmdln;
    CMacroMap m_mapMacros;
    std::vector<std::filesystem::path> m_vecIncludeDirs;
    std::vector<std::filesystem::path> m_vecFileNames;
    std::filesystem::path m_pathOutputDir;
    mutable CUsedMacroSet m_setMacrosUsedInExpansion;
    bool m_bCLHelp       = false;
    bool m_bCLVersion    = false;
    bool m_bResolveConst = false;
    bool m_bNoPS = false;
    std::string m_ssProxyStubLibName = "proxystub";
    std::filesystem::path m_pathCompilerPath;
    int32_t m_iFileIndex = -1;
    bool m_bEnableInterfaceTypeExtension = true;
    bool m_bEnableExceptionTypeExtension = true;
    bool m_bEnablePointerTypeExtension = true;
    bool m_bEnableUnicodeExtension = true;
    bool m_bEnableCaseSensitiveNameExtension = true;
    bool m_bEnableContextDependentNamesExtension = true;
    bool m_bEnableMultiDimArrayExtension = true;
};

template <typename TCharType>
CIdlCompilerEnvironment::CIdlCompilerEnvironment(size_t nArgs, const TCharType** rgszArgs) :
    m_cmdln(static_cast<uint32_t>(CCommandLine::EParseFlags::no_assignment_character))
{
    try
    {
        bool bSilent = false;
        bool bVerbose = false;
        bool bStrict = false;
        std::vector<std::string> vecMacros;
        auto& rArgHelpDef = m_cmdln.DefineOption("?", m_bCLHelp, "Show help");
        rArgHelpDef.AddSubOptionName("help");
        auto& rArgSilentDef = m_cmdln.DefineOption("s", bSilent, "Do not show any information on STDOUT. Not compatible with 'verbose'.");
        rArgSilentDef.AddSubOptionName("silent");
        auto& rArgVerboseDef = m_cmdln.DefineOption("v", bVerbose, "Provide verbose information. Not compatible with 'silent'.");
        rArgVerboseDef.AddSubOptionName("verbose");
        m_cmdln.DefineSubOption("version", m_bCLVersion, "Show version information");
        m_cmdln.DefineOption("I", m_vecIncludeDirs, "Set include directory");
        m_cmdln.DefineOption("O", m_pathOutputDir, "Set output directory");
        m_cmdln.DefineOption("D", vecMacros, "Set a macro definition in the form of macro, macro=<value>, macro(arg1,...)=<value>");
        m_cmdln.DefineSubOption("resolve_const", m_bResolveConst, "Use the calculated value for const values, instead of the defined expression.");
        m_cmdln.DefineSubOption("no_ps", m_bNoPS, "Do not create any proxy and stub code (interface definitions only).");
        m_cmdln.DefineSubOption("ps_lib_name", m_ssProxyStubLibName, "Proxy and stub library target name in the generated cmake file (default=\"proxystub\").");

        m_cmdln.DefineGroup("Extensions", "Enable/disable compatibility extensions.");
        m_cmdln.DefineFlagSubOption("interface_type", m_bEnableInterfaceTypeExtension, "Enable/disable support of the interface type extensions 'interface_t' and 'interface_id'.Default enabled.");
        m_cmdln.DefineFlagSubOption("exception_type", m_bEnableExceptionTypeExtension, "Enable/disable support of the exception type extension 'exception_id'. Default enabled.");
        m_cmdln.DefineFlagSubOption("pointer_type", m_bEnablePointerTypeExtension, "Enable/disable support of the pointer type extension 'pointer'. Default enabled.");
        m_cmdln.DefineFlagSubOption("unicode_char", m_bEnableUnicodeExtension, "Enable/disable support of the UTF-8, UTF-16 and UTF-32 Unicode extensions. Default enabled.");
        m_cmdln.DefineFlagSubOption("case_sensitive", m_bEnableCaseSensitiveNameExtension, "Enable/disable case sensitive name restriction extension. Default enabled.");
        m_cmdln.DefineFlagSubOption("context_names", m_bEnableContextDependentNamesExtension, "Enable/disable the use of context dependent names in declarations. Default enabled.");
        m_cmdln.DefineFlagSubOption("multi_dimensional_array", m_bEnableMultiDimArrayExtension, "Enable/disable support of multi-dimensional arrays extension. Default enabled.");
        m_cmdln.DefineSubOption("strict", bStrict, "Strictly maintaining OMG-IDL conformance; disabling extensions.");

        m_cmdln.DefineDefaultArgument(m_vecFileNames, "IDL files");
        m_cmdln.Parse(nArgs, rgszArgs);

        // Add the macros.
        for (const std::string& rssMacro : vecMacros)
        {
            try
            {
                AddDefinition(rssMacro.c_str());
            }
            catch (const sdv::idl::XCompileError&)
            {
                throw CCompileException("Invalid command line option: -D");
            }
        }

        // If strict, disable all extensions.
        if (bStrict)
        {
            m_bEnableInterfaceTypeExtension = false;
            m_bEnableExceptionTypeExtension = false;
            m_bEnablePointerTypeExtension = false;
            m_bEnableUnicodeExtension = false;
            m_bEnableCaseSensitiveNameExtension = false;
            m_bEnableContextDependentNamesExtension = false;
            m_bEnableMultiDimArrayExtension = false;
        }

        // Set the verbosity mode.
        if (bSilent)
            g_log_control.SetVerbosityMode(EVerbosityMode::report_none);
        else if (bVerbose)
            g_log_control.SetVerbosityMode(EVerbosityMode::report_all);
    }
    catch (const SArgumentParseException& rsExcept)
    {
        m_bCLHelp = true;
        throw CCompileException(rsExcept.what());
    }
}

#endif // !defined ENV_H