https://github.com/shader-slang/slang
Raw File
Tip revision: c5c8cfbb360d9a763f549df48636effde839eacd authored by Sai Praveen Bangaru on 27 September 2023, 00:50:13 UTC
Handle the case where the parent if-else region's after-block is unreachable. (#3241)
Tip revision: c5c8cfb
slang-command-line.h
// slang-command-line.h
#ifndef SLANG_COMMAND_LINE_H
#define SLANG_COMMAND_LINE_H

#include "slang-string.h"
#include "slang-list.h"

namespace Slang {

struct ExecutableLocation
{
    typedef ExecutableLocation ThisType;

    enum Type
    {
        Unknown,                    ///< Not specified 
        Path,                       ///< The executable is set as a path (ie won't be searched for)
        Name,                       ///< The executable is passed as a name which will be searched for
    };

        /// Set the executable path.
        /// NOTE! On some targets the executable path *must* include an extension to be able to start as a process
    void setPath(const String& path) { m_type = Type::Path; m_pathOrName = path; }

        /// Set a filename (such that the path will be looked up)
    void setName(const String& filename) { m_type = Type::Name; m_pathOrName = filename; }

    void set(Type type, const String& pathOrName) { m_type = type; m_pathOrName = pathOrName; }

        /// Set the executable path from a base directory and an executable name (no suffix such as '.exe' needed)
    void set(const String& dir, const String& name);

        /// Determines if it's a name or a path when it sets
    void set(const String& nameOrPath);

        /// Append as text to out. 
    void append(StringBuilder& out) const;

        /// Reset state to be same as ctor
    void reset() { m_type = Type::Unknown; m_pathOrName = String(); }

        /// Equality means exactly the same definition.
        /// *NOT* that exactly the same executable is specified
    bool operator==(const ThisType& rhs) const { return m_type == rhs.m_type && m_pathOrName == rhs.m_pathOrName;  }
    bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }

    ExecutableLocation() {}
    ExecutableLocation(const String& dir, const String& name) { set(dir, name);  }
    ExecutableLocation(Type type, const String& pathOrName) : m_type(type), m_pathOrName(pathOrName) {}

    explicit ExecutableLocation(const String& nameOrPath) { set(nameOrPath); }
    
    Type m_type = Type::Unknown;
    String m_pathOrName;
};

struct CommandLine
{
    typedef CommandLine ThisType;

        /// Add args - assumed unescaped
    void addArg(const String& in) { m_args.add(in); }
    void addArgs(const String* args, Int argsCount) { for (Int i = 0; i < argsCount; ++i) addArg(args[i]); }

    void addArgIfNotFound(const String& in);

        /// Find the index of an arg which is exact match for slice
    SLANG_INLINE Index findArgIndex(const UnownedStringSlice& slice) const { return m_args.indexOf(slice); }

        /// For handling args where the switch is placed directly in front of the path 
    void addPrefixPathArg(const char* prefix, const String& path, const char* pathPostfix = nullptr);

        /// Get the total number of args
    SLANG_FORCE_INLINE Index getArgCount() const { return m_args.getCount(); }

        /// Reset to the initial state
    void reset() { *this = CommandLine();  }

        /// Append the args
    void appendArgs(StringBuilder& out) const;

        /// Append the command line to out
    void append(StringBuilder& out) const;
        /// convert into a string
    String toString() const;

        /// Convert just the args to string
    String toStringArgs() const;

        /// Set an executable location
    void setExecutableLocation(const ExecutableLocation& loc) { m_executableLocation = loc; }

    ExecutableLocation m_executableLocation;        ///< The executable location
    List<String> m_args;                            ///< The arguments (Stored *unescaped*)
};

}

#endif // SLANG_COMMAND_LINE_H
back to top