Subversion Repositories spk

Rev

Rev 303 | Rev 324 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#pragma once

#include "WString.h"
#include "WStringList.h"
#include "../File_IO.h"
#include "../DirIO.h"

namespace Utils
{
        class CommandLine
        {
        private:
                std::shared_ptr<CFileIO> _file;
                Utils::WStringList _options;
                std::vector<Utils::WString> _args;

        public:
                CommandLine(int argc, char* argv[])
                {
                        _file = std::make_shared<CFileIO>(argv[0]);

                        for (int i = 1; i < argc; i++)
                        {
                                Utils::WString arg(argv[i]);
                                if (arg.startsWith(L"--"))
                                {
                                        arg = arg.substr(2);

                                        if (arg.contains(L":"))
                                        {
                                                Utils::WString a = arg.token(L":", 1);
                                                Utils::WString b = arg.tokens(L":", 2);
                                                _options.pushBack(a, b);
                                        }
                                        else
                                                _options.pushBack(arg);
                                }
                                else
                                        _args.push_back(arg);
                        }

                        if (_file->dir().empty() || !_file->dir().contains("/"))
                        {
                                Utils::WString d;
#ifdef _WIN32
                                d = Utils::WString(_getcwd(NULL, 0));
#else
                                d = Utils::WString(getcwd(NULL, 0));
#endif
                                if (d.empty())
                                        d = L"./";
                                _file->setDir(d);
                        }
                }

                const std::shared_ptr<CFileIO> file() const
                {
                        return _file;
                }

                const Utils::WString& cmdName() const
                {
                        return _file->filename();
                }

                const Utils::WString& cmdDir() const
                {
                        return _file->dir();
                }

                const Utils::WStringList options() const
                {
                        return _options;
                }

                const std::vector<Utils::WString>& args() const
                {
                        return _args;
                }

                size_t argCount() const
                {
                        return _args.size();
                }

                Utils::WString arg(size_t i) const
                {
                        if(i >= _args.size())
                                return Utils::WString::Null();
                        return _args[i];
                }

                bool hasSwitch(const Utils::WString& s) const
                {
                        return _options.contains(s);
                }

                Utils::WString switchData(const Utils::WString& s) const
                {
                        if (_options.contains(s))
                                return _options[s]->data;
                        return Utils::WString::Null();
                }
        };
}