Steve Murphy
2005-Jun-05 23:26 UTC
[Asterisk-Users] Re: Bison, Flex, Conditional Expression
To any that may be interested in the implementation of the conditional expression in the expression parser (ast_expr2*) in asterisk, I've filed the patch at: http://bugs.digium.com/view.php?id=4459 Right now, a comment has been added noting that the IF func provides this capability, and asks if both would really be necessary. It's a good question. I haven't been following the addition of this new set of capabilities in asterisk, but see that "show functions" returns: DB DB(<family>/<key>) Read or Write from/to the Asterisk database ENV ENV(<envname>) Gets or sets the environment variable specified IF IF(<expr>?<true>:<false>) Conditional: Returns the data following '?' if true else the data following ':' EXISTS EXISTS(<data>) Existence Test: Returns 1 if exists, 0 otherwise ISNULL ISNULL(<data>) NULL Test: Returns 1 if NULL or 0 otherwise CDR CDR(<name>[|options]) Gets or sets a CDR variable STRFTIME STRFTIME([<epoch>][,[timezone][,for Returns the current date/time in a specified format. LEN LEN(<string>) Returns the length of the argument given REGEX REGEX("<regular expression>" <data> Regular Expression: Returns 1 if data matches regular expression. FIELDQTY FIELDQTY(<varname>,<delim>) Count the fields, with an arbitrary delimiter GROUP_LIST GROUP_LIST() Gets a list of the groups set on a channel. GROUP GROUP([category]) Gets or sets the channel group. GROUP_MATCH_COUNT GROUP_MATCH_COUNT(groupmatch[@categ Counts the number of channels in the groups matching the specified pattern GROUP_COUNT GROUP_COUNT([groupname][@category]) Counts the number of channels in the specified group CHECK_MD5 CHECK_MD5(<digest>,<data>) Checks an MD5 digest MD5 MD5(<data>) Computes an MD5 digest IAXPEER IAXPEER(<peername>[:item]) Gets IAX peer information SIP_HEADER SIP_HEADER(<name>) Gets or sets the specified SIP header How are these functions used? The last sentence of the README.variables file says: Certain functional variables may be accessed with $(foo <args>). A list of these functional variables may be found by typing "show functions" at the Asterisk CLI. So, I guess you could say: SetVAR(var=$(IF a=b?true:false)) or do I have to say: SetVAR(var=$(IF $[a=b]?true:false)) or SetVAR(var=$(IF $[a=b]?$[possibly_more_complicated_true_expr]:$[possibly_more_complicated_false_expr])) [ between the two sets above, the second "feels" more realistic than the first, as the actual evaluation of a=b most likely will have be done by the expression parser... if not, the expression parser will no longer be necessary] vs: SetVAR(var=$[a=b ? true :: false]) As I said, I haven't been following the Function additions at all (yet), and haven't actually tried to fit any of them in my extensions.conf (yet). Someone who's more involved with this might show some examples of how functions are used, and maybe we can see then which method might be best, if any, and whether it might be better to toss one, or keep them both... Can anyone help cast some more light on how Functions like IF would be used in extensions.conf? Was I right about the usage above? murf