

ndk_http_complex_path_value_t     ndk_empty_http_complex_path_value = {{0,NULL},0};


ngx_int_t
ndk_http_complex_path_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value, ngx_uint_t prefix)
{
    ngx_http_compile_complex_value_t   ccv;

    ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t));

    ccv.cf = cf;
    ccv.value = value;
    ccv.complex_value = cv;

    switch (prefix) {

    case    1 :
        ccv.root_prefix = 1;
        break;

    case    2 :
        ccv.conf_prefix = 1;
        break;
    }

    ndk_path_to_dir_safe (value, 1, 0);

    if (!value->len)
        return  NGX_OK;

    return  ngx_http_compile_complex_value (&ccv);
}



ngx_array_t *
ndk_http_complex_path_create_compile (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix)
{
    ndk_http_complex_path_elt_t     *cpe;
    ngx_array_t                     *a;
    ngx_int_t                        n;
    u_char                          *m, *s, *e;
    ngx_str_t                        value;

    n = ndk_strcntc (path, ':') + 1;

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

    s = path->data;
    e = s + path->len;


    while (s < e) {

        m = s;

        while (m < e && *m != ':') m++;

        if (m == s) {
            s = m+1;
            continue;
        }

        cpe = ngx_array_push (a);
        if (cpe == NULL) {
            return  NULL;
        }

        if (*s == '#') {
            s++;
            cpe->dynamic = 1;
        } else {
            cpe->dynamic = 0;
        }

        value.data = s;
        value.len = m - s;

        if (ndk_http_complex_path_value_compile (cf, &cpe->val, &value, prefix) == NGX_ERROR)
            return  NULL;       

        s = m+1;
    }

    return  a;
}




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

    ngx_str_t                   *path;
    ngx_array_t                 *a;
    ngx_conf_post_t             *post;
    ndk_http_complex_path_t     *cp;

    cp = (ndk_http_complex_path_t *) (p + cmd->offset);

    if (cp->a != NGX_CONF_UNSET_PTR) {
        return  "is duplicate";
    }

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

    cp->a = ndk_http_complex_path_create_compile (cf, path, cp->prefix);
    if (cp->a == NULL)
        // TODO : log
        return  NGX_CONF_ERROR;    

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

    return  NGX_CONF_OK;
}



