[Asterisk-Dev] Misbehaviour in ast_variable_browse

Brian West brian.west at mac.com
Mon Feb 21 18:56:46 MST 2005


Also on more thinking you can do this too(and reading this again):

v = ast_variable_browse(cfg, "mystuff");
while(v) {
	/* do our thinng */
	v = v->next;
}

You could also do:

for (v = ast_variable_browse(config, "mystuff"); v; v = v->next) {
	/* do our thing here */
}

/b

On Feb 21, 2005, at 7:20 PM, Brian West wrote:

> I don't think this is needed because if you know the var you want why 
> not use ast_variable_retrieve to just get it.
>
> /b
>
> On Feb 21, 2005, at 12:29 PM, Luis Vazquez wrote:
>
>> Hello all,
>> despite I have made many minor changes to asterisk code and some bugs 
>> reports and fixes this is my first mail to the dev list (I was only a 
>> "voyeur" here until now) so first of all I want to congratulate every 
>> one at the list for the great list it's and to thank a lot for the 
>> many things I have learned reading the mails here.
>>
>> I want to comment of what I consider is a inconsistency in the 
>> behavior of the method ast_variable_browse respect to the (suposedly 
>> analog, even said in the inline doc) ast_category_browse method in 
>> config.c.
>>
>> The point is that with ast_category_browse(config, prev) you can 
>> really iterate over the config sections with a code snippet like 
>> this:
>>
>> /************ works now****************/
>>  cat = ast_category_browse(cfg, NULL);
>>  while(cat) {
>>    .....
>>    cat = ast_category_browse(cfg, cat);
>>  }
>> /************************************/
>>
>> So it would be logic to be able to do the same with 
>> ast_variable_browse, like this:
>>
>> /***** not posible now **************/
>> var = ast_variable_browse(cfg, cat, NULL);
>> while( var ) {
>>  .........
>>  var = ast_variable_browse(cfg, cat, var);
>> }
>> /*************************************/
>>
>> But this is not posible now because the actual prototype of 
>> ast_variable_browse() is:
>>
>> > struct ast_variable *ast_variable_browse(struct ast_config *config, 
>> char *category)
>>
>> and allways returns the root ast_variable in the given category, even 
>> when the doc text in the header file config.h suggests it should work 
>> as ast_category_browse.
>> ...................................
>> //! Goes through variables
>> /*!
>> * Somewhat similar in intent as the ast_category_browse.....
>> */
>> ..........................................
>>
>> The best solution I think would be to replace the prototype for 
>> something like this:
>>
>> > struct ast_variable *ast_variable_browse(struct ast_config *config, 
>> char *category, struct ast_variable *prev[=NULL])
>>
>> but because gcc (at least with the compile options used in asterisk) 
>> do not allow default param values it would require to change all 
>> places where ast_variable_browse() is used with the prior prototipe 
>> (and meaning) with an extra NULL parameter like this:
>> - var = ast_variable_browse(config, cat);
>> + var = ast_variable_browse(config, cat, NULL);
>>
>>
>> So to avoid this odd changes what I have done is to add a new 
>> function:
>>
>> struct ast_variable *ast_variable_next(struct ast_config *config, 
>> char *category,struct ast_variable *prev);
>>
>> that returns the next ast_variable in a config category if prev is 
>> not null, and the root var (as the current ast_variable_browse) if 
>> prev==NULL.
>>
>> This approach allows to write code like this:
>> /***************************************/
>>  var = ast_variable_browse(cfg, cat);
>>  while( var ) {
>>    ............
>>  var = ast_variable_next(cfg, cat, var);
>>  }
>> /***************************************/
>> without changing the places where ast_variable_browse() was used 
>> previously.
>>
>> This is needed when you want to retrieve all the vars in a section 
>> and don't know the variable names in advance.
>> I need this because I'm using a custom asterisk application to load 
>> the configuration parameters used in the many pbx facility 
>> applications (mostly perl or c++ agi scripts) into the asterisk db; 
>> and I want to be able to add a new parameter without needing to 
>> recompilate the loader application (what I should do to use 
>> ast_variable_retrieve() because I need to know the variable names in 
>> advance)
>>
>> Attached is the code with the proposed new ast_variable_next() 
>> function.
>>
>> Best regards and I would like to receive any feedback and opinions 
>> about this suggestion.
>> Luis
>>
>>
>>
>>
>>
>> --- config.c.ipc	2005-01-27 17:04:46.000000000 -0300
>> +++ config.c	2005-02-21 16:18:06.990108528 -0300
>> @@ -149,6 +149,24 @@
>>  	return NULL;
>>  }
>>
>> +struct ast_variable *ast_variable_next(struct ast_config *config, 
>> char *category,struct ast_variable *prev)
>> +{
>> +	struct ast_variable *v = NULL;
>> +	v = ast_variable_browse(config, category);
>> +	if(v) {
>> +	  if(prev) {
>> +		while (v) {
>> +		  if (v == prev)
>> +			return v->next;
>> +		  v=v->next;
>> +		}
>> +	  } else {
>> +		return v;
>> +	  }
>> +	}
>> +	return NULL;
>> +}
>> +
>>  char *ast_variable_retrieve(struct ast_config *config, char 
>> *category, char *value)
>>  {
>>  	struct ast_variable *v;
>> --- include/asterisk/config.h.orig	2004-03-02 04:57:06.000000000 -0300
>> +++ include/asterisk/config.h	2005-02-21 16:13:08.389809756 -0300
>> @@ -69,6 +69,14 @@
>>   */
>>  struct ast_variable *ast_variable_browse(struct ast_config *config, 
>> char *category);
>>
>> +//! Iterates through variables
>> +/*!
>> + * Somewhat similar in intent as the ast_category_browse.  The prev 
>> variable MUST be an actual pointer to an actual variable (such as one 
>> obtained by using ast_variable_browse() or ast_variable_next() 
>> itself).
>> + * List variables of config file
>> + * Returns next variable on the list, or NULL on failure
>> + */
>> +struct ast_variable *ast_variable_next(struct ast_config *config, 
>> char *category,struct ast_variable *prev);
>> +
>>  //! Gets a variable
>>  /*!
>>   * \param config which (opened) config to use
>> _______________________________________________
>> Asterisk-Dev mailing list
>> Asterisk-Dev at lists.digium.com
>> http://lists.digium.com/mailman/listinfo/asterisk-dev
>> To UNSUBSCRIBE or update options visit:
>>    http://lists.digium.com/mailman/listinfo/asterisk-dev
>
> _______________________________________________
> Asterisk-Dev mailing list
> Asterisk-Dev at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-dev
> To UNSUBSCRIBE or update options visit:
>   http://lists.digium.com/mailman/listinfo/asterisk-dev




More information about the asterisk-dev mailing list