httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian Akins <bak...@web.turner.com>
Subject Re: [PATCH] Add AP_INIT_TAKE_ARGV
Date Wed, 04 May 2005 20:00:22 GMT
Paul Querna wrote:
> Attached is a patch that adds a new configuration command type.
> 

What about key=value args?  I kept writing the same parser over and over 
so, I generalized it.  This could be hacked to be included as normal parser:

/*in mod_util.h file*/
typedef struct{
     const char *name;
     util_option_fn_t *func;
} option_rec ;


const char *util_parse_options(apr_pool_t *pool, const char *config, 
const option_rec *options, void *user_data);

/*in mod_util.c**/

static const option_rec *find_option(const char *name, const option_rec 
*options)
{
     while (options->name) {
         if (!strcasecmp(name, options->name))
             return options;

         ++options;
     }

     return NULL;
}

const char *util_parse_options(apr_pool_t *pool, const char *config, 
const option_rec *options, void *user_data) {
     char *key;
     char *val;
     const char *error;

     const option_rec *option;

     util_option_fn_t *func;

     while(*config) {
         key = ap_getword_conf(pool, &config);

         if((val = strchr(key, '=')) != NULL) {
             *val = '\0';
             val++;
             if(!*val) {
                 return "invalid value";
             }
         } else {
             return "no = in option";
         }

         if((option = find_option(key, options)) == NULL) {
             return apr_psprintf(pool, "no func for %s", key);
         } else {
             func = option->func;
             if(func == NULL) {
                 return apr_psprintf(pool, "null func for %s", key);
             } else {
                 error = func(pool, key, val, user_data);

                 if(error != NULL) {
                     return error;
                 }
             }
         }
     }

     return NULL;
}


To use it in another module:

static const char* set_min(apr_pool_t *pool, char *key, char* val, void* 
user_data) {
     my_conf *conf = (my_conf*)user_data;

     conf->min = apr_atoi64(val);

     return NULL;
}
....

static option_rec options[] = {
     { "max", set_max},
     { "min", set_min},
     {NULL}
};

/*in config directive function*/

my_conf*conf =
         ap_get_module_config(parms->server->module_config,
                              &my_module);

     return  util_parse_options(parms->pool, option, options, conf);


-- 
Brian Akins
Lead Systems Engineer
CNN Internet Technologies

Mime
View raw message