#define CORE_PRIVATE
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"

char *options[] = {
    "OR_NONE ",
    "OR_LIMIT ",
    "OR_OPTIONS ",
    "OR_FILEINFO ",
    "OR_AUTHCFG ",
    "OR_INDEXES ",
    "OR_UNSET ",
    "ACCESS_CONF ",
    "RSRC_CONF ",
    "EXEC_ON_READ ",
    "OR_UNKNOWN"
};

struct how_now_t {
    int   how;
    char *str;
} how_now[] =
{
    {RAW_ARGS,	"RAW_ARGS"},
    {TAKE1,	"TAKE1"},
    {TAKE2,	"TAKE2"},
    {ITERATE,	"ITERATE"},
    {ITERATE2,	"ITERATE2"},
    {FLAG,	"FLAG"},
    {NO_ARGS,	"NO_ARGS"},
    {TAKE12,	"TAKE12"},
    {TAKE3,	"TAKE3"},
    {TAKE23,	"TAKE23"},
    {TAKE123,	"TAKE123"},
    {TAKE13,	"TAKE13"},
    {-1,        "UNKNOWN"}
};

static char *options_str(unsigned int f)
{
    static char res[120];
    char **str = options;
    if (!f) {
        return *str;
    }
    strcpy (res, "");

    while (f) {
        ++str;
        if (strcmp(*str, "OR_UNKNOWN") == 0) {
            f = 1;
        }
        if (f & 1) {
            strcat(res, *str);
        }
        f >>= 1;
    }

    return res;
}

#ifdef STANDARD20_MODULE_STUFF

static void dump_config(apr_pool_t *p);

module AP_MODULE_DECLARE_DATA cmds_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,			/* dir config creater */
    NULL,			/* dir merger --- default is to override */
    NULL,			/* server config */
    NULL,			/* merge server config */
    NULL,		        /* command table */
    dump_config              /* register_hooks */
};

static void dump_config(apr_pool_t *p)

#else /* 1.3 module */

static void* dump_config(pool *p, server_rec *s);

module MODULE_VAR_EXPORT cmds_module =
{
    STANDARD_MODULE_STUFF,
    NULL,			/* initializer */
    NULL,			/* dir config creater */
    NULL,			/* dir merger --- default is to override */
    dump_config,		/* server config */
    NULL,			/* merge server configs */
    NULL,			/* command table */
    NULL,			/* handlers */
    NULL,			/* filename translation */
    NULL,			/* check_user_id */
    NULL,			/* check auth */
    NULL,			/* check access */
    NULL,			/* type_checker */
    NULL,			/* fixups */
    NULL,			/* logger */
    NULL,			/* header parser */
    NULL,			/* child_init */
    NULL,			/* child_exit */
    NULL			/* post read-request */
};

#define ap_top_module top_module

static void* dump_config(pool *p, server_rec *s)

#endif

/* dump_config() [changes args and return type between versions] */
{
    const command_rec *cmdp;
    module *modp;
    int i;

#ifndef STANDARD20_MODULE_STUFF
    if (s->is_virtual) return NULL;
#endif

    for (modp = ap_top_module; modp; modp = modp->next) {
        for (cmdp = modp->cmds; cmdp && cmdp->name; ++cmdp) {
            for (i = 0; how_now[i].how >= 0; ++i) {
                if (how_now[i].how == cmdp->args_how) {
                    break;
                }
            }
#ifdef STANDARD20_MODULE_STUFF
            if (cmdp->func != ap_set_deprecated)
#endif
              printf("%s::%s\n %s %s\n %s\n", 
                   modp->name, cmdp->name, 
                   how_now[i].str, 
                   options_str(cmdp->req_override), 
                   (cmdp->errmsg ? cmdp->errmsg : "<NONE>"));
	}
    }
#ifndef STANDARD20_MODULE_STUFF
    if (s->is_virtual) return NULL;
#endif
}

