/*
 * Copyright 2009-2010 JRuby Team (www.jruby.org).
 */


#ifndef _ARGPARSER_H_
#define _ARGPARSER_H_

#include <string>
#include <list>
#include <set>

class ArgParser {
protected:
    static const char *REQ_JAVA_VERSION;
    static const char *HELP_MSG;

    static const char *OPT_JDK_HOME;
    static const char *OPT_JRUBY_HOME;
    static const char *OPT_JRUBY_COMMAND_NAME;

    static const char *OPT_CLASS_PATH;
    static const char *OPT_BOOT_CLASS_PATH;

    static const char *OPT_JFFI_PATH;
    static const char *OPT_JRUBY_SHELL;
    static const char *OPT_JRUBY_SCRIPT;

    static const char *MAIN_CLASS;
    static const char *DEFAULT_EXECUTABLE;

public:
    ArgParser();
    virtual ~ArgParser();
    bool parseArgs(int argc, char *argv[]);
    void appendToHelp(const char *msg);
    std::string* buildCommandLine(int argc, char* argv[]);

protected:
    ArgParser(const ArgParser& orig);

    bool initPlatformDir();
    void prepareOptions();
    void setupMaxHeapAndStack();
    void addEnvVarToOptions(std::list<std::string> & optionsList, const char * envvar);
    void constructClassPath();
    void constructBootClassPath();
    void addFilesToClassPath(const char *dir, const char *subdir, const char *pattern);
    void addToClassPath(const char *path, bool onlyIfExists = false);
    void addToBootClassPath(const char *path, bool onlyIfExists = false);
    void addJarsToClassPathFrom(const char *dir);
    void addOptionsToCommandLine(std::list<std::string> & commandLine);

protected:
    bool separateProcess;
    bool nailgunClient;
    bool noBootClassPath;
    bool printCommandLine;
    std::string platformDir;
    std::string bootclass;
    std::string jdkhome;
    std::string cpBefore;
    std::string cpExplicit;
    std::string cpAfter;
    std::string nextAction;

    std::list<std::string> javaOptions;
    std::set<std::string> addedToCP;
    std::string classPath;
    std::string bootClassPath;
    std::set<std::string> addedToBootCP;
    std::string appendHelp;
    std::list<std::string> progArgs;
};

#endif // ! _ARGPARSER_H_