

char *
ndk_conf_set_regex_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char  *p = conf;

    ngx_str_t               *value;
    ngx_conf_post_t         *post;
    ngx_regex_elt_t         *re;   
    ngx_regex_compile_t      rc;
    u_char                   errstr[NGX_MAX_CONF_ERRSTR];

    re = (ngx_regex_elt_t *) (p + cmd->offset);

    if (re->name) {
        return  "is duplicate";
    }

    value = cf->args->elts;
    value++;

    ndk_zerov (rc);

    rc.pool = cf->pool;
    rc.err.len = NGX_MAX_CONF_ERRSTR;
    rc.err.data = errstr;
    rc.pattern = *value;

    if (ngx_regex_compile(&rc) != NGX_OK) {
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
        return NGX_CONF_ERROR;
    }

    re->regex = rc.regex;
    re->name = value->data;

    if (cmd->post) {
        post = cmd->post;
        return  post->post_handler (cf, post, re);
    }

    return  NGX_CONF_OK;
}
 

char *
ndk_conf_set_regex_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char  *p = conf;

    ngx_str_t               *value;
    ngx_conf_post_t         *post;
    ngx_regex_elt_t         *re;   
    ngx_regex_compile_t      rc;
    u_char                   errstr[NGX_MAX_CONF_ERRSTR];

    re = (ngx_regex_elt_t *) (p + cmd->offset);

    if (re->name) {
        return  "is duplicate";
    }

    value = cf->args->elts;
    value++;

    ndk_zerov (rc);

    rc.pool = cf->pool;
    rc.err.len = NGX_MAX_CONF_ERRSTR;
    rc.err.data = errstr;
    rc.pattern = *value;
    rc.options = NGX_REGEX_CASELESS;

    if (ngx_regex_compile(&rc) != NGX_OK) {
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
        return NGX_CONF_ERROR;
    }

    re->regex = rc.regex;
    re->name = value->data;

    if (cmd->post) {
        post = cmd->post;
        return  post->post_handler (cf, post, re);
    }

    return  NGX_CONF_OK;
}



char *
ndk_conf_set_regex_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char  *p = conf;

    ngx_str_t               *value;
    ngx_conf_post_t         *post;
    ngx_array_t            **a;
    ngx_regex_elt_t         *re;   
    ngx_regex_compile_t      rc;
    ngx_uint_t               i, n;
    u_char                   errstr[NGX_MAX_CONF_ERRSTR];

    a = (ngx_array_t **) (p + cmd->offset);

    if (*a != NGX_CONF_UNSET_PTR) {

        n = cf->args->nelts > 4 ? cf->args->nelts : 4;

        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));
        if (*a == NULL) {
            return  NGX_CONF_ERROR;
        }
    }

    ndk_zerov (rc);

    rc.pool = cf->pool;
    rc.err.len = NGX_MAX_CONF_ERRSTR;
    rc.err.data = errstr;

    value = cf->args->elts;
    value++;

    for (i=0; i<n; i++, value++) {

        re = ngx_array_push (*a);
        if (re == NULL)
            return  NGX_CONF_ERROR;

        rc.pattern = *value;

        if (ngx_regex_compile(&rc) != NGX_OK) {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
            return NGX_CONF_ERROR;
        }

        re->regex = rc.regex;
        re->name = value->data;
    }


    if (cmd->post) {
        post = cmd->post;
        return  post->post_handler (cf, post, a);
    }

    return  NGX_CONF_OK;
}



char *
ndk_conf_set_regex_array_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char  *p = conf;

    ngx_str_t               *value;
    ngx_conf_post_t         *post;
    ngx_array_t            **a;
    ngx_regex_elt_t         *re;   
    ngx_regex_compile_t      rc;
    ngx_uint_t               i, n;
    u_char                   errstr[NGX_MAX_CONF_ERRSTR];

    a = (ngx_array_t **) (p + cmd->offset);

    if (*a != NGX_CONF_UNSET_PTR) {

        n = cf->args->nelts > 4 ? cf->args->nelts : 4;

        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));
        if (*a == NULL) {
            return  NGX_CONF_ERROR;
        }
    }

    ndk_zerov (rc);

    rc.pool = cf->pool;
    rc.err.len = NGX_MAX_CONF_ERRSTR;
    rc.err.data = errstr;

    value = cf->args->elts;
    value++;

    for (i=0; i<n; i++, value++) {

        re = ngx_array_push (*a);
        if (re == NULL)
            return  NGX_CONF_ERROR;

        rc.pattern = *value;
        rc.options = NGX_REGEX_CASELESS;

        if (ngx_regex_compile(&rc) != NGX_OK) {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
            return NGX_CONF_ERROR;
        }

        re->regex = rc.regex;
        re->name = value->data;
    }


    if (cmd->post) {
        post = cmd->post;
        return  post->post_handler (cf, post, a);
    }

    return  NGX_CONF_OK;
}

