#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
#include "asterisk/module.h"
#include "asterisk/options.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/localtime.h"
Go to the source code of this file.
Defines | |
#define | SPRINTF_CONVERSION 4 |
#define | SPRINTF_FLAG 0 |
#define | SPRINTF_LENGTH 3 |
#define | SPRINTF_PRECISION 2 |
#define | SPRINTF_WIDTH 1 |
Functions | |
static int | acf_sprintf (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | acf_strftime (struct ast_channel *chan, char *cmd, char *parse, char *buf, size_t len) |
static int | acf_strptime (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | array (struct ast_channel *chan, char *cmd, char *var, const char *value) |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"String handling dialplan functions") | |
static int | filter (struct ast_channel *chan, char *cmd, char *parse, char *buf, size_t len) |
static int | function_eval (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | function_fieldqty (struct ast_channel *chan, char *cmd, char *parse, char *buf, size_t len) |
static int | keypadhash (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | len (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | load_module (void) |
static int | quote (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
static int | regex (struct ast_channel *chan, char *cmd, char *parse, char *buf, size_t len) |
static int | unload_module (void) |
Variables | |
static struct ast_custom_function | array_function |
static struct ast_custom_function | eval_function |
static struct ast_custom_function | fieldqty_function |
static struct ast_custom_function | filter_function |
static struct ast_custom_function | keypadhash_function |
static struct ast_custom_function | len_function |
static struct ast_custom_function | quote_function |
static struct ast_custom_function | regex_function |
static struct ast_custom_function | sprintf_function |
static struct ast_custom_function | strftime_function |
static struct ast_custom_function | strptime_function |
Definition in file func_strings.c.
#define SPRINTF_CONVERSION 4 |
Referenced by acf_sprintf().
#define SPRINTF_FLAG 0 |
Referenced by acf_sprintf().
#define SPRINTF_LENGTH 3 |
Referenced by acf_sprintf().
#define SPRINTF_PRECISION 2 |
Referenced by acf_sprintf().
#define SPRINTF_WIDTH 1 |
Referenced by acf_sprintf().
static int acf_sprintf | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 241 of file func_strings.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, format, LOG_ERROR, SPRINTF_CONVERSION, SPRINTF_FLAG, SPRINTF_LENGTH, SPRINTF_PRECISION, SPRINTF_WIDTH, and var.
00242 { 00243 #define SPRINTF_FLAG 0 00244 #define SPRINTF_WIDTH 1 00245 #define SPRINTF_PRECISION 2 00246 #define SPRINTF_LENGTH 3 00247 #define SPRINTF_CONVERSION 4 00248 int i, state = -1, argcount = 0; 00249 char *formatstart = NULL, *bufptr = buf; 00250 char formatbuf[256] = ""; 00251 int tmpi; 00252 double tmpd; 00253 AST_DECLARE_APP_ARGS(arg, 00254 AST_APP_ARG(format); 00255 AST_APP_ARG(var)[100]; 00256 ); 00257 00258 AST_STANDARD_APP_ARGS(arg, data); 00259 00260 /* Scan the format, converting each argument into the requisite format type. */ 00261 for (i = 0; arg.format[i]; i++) { 00262 switch (state) { 00263 case SPRINTF_FLAG: 00264 if (strchr("#0- +'I", arg.format[i])) 00265 break; 00266 state = SPRINTF_WIDTH; 00267 case SPRINTF_WIDTH: 00268 if (arg.format[i] >= '0' && arg.format[i] <= '9') 00269 break; 00270 00271 /* Next character must be a period to go into a precision */ 00272 if (arg.format[i] == '.') { 00273 state = SPRINTF_PRECISION; 00274 } else { 00275 state = SPRINTF_LENGTH; 00276 i--; 00277 } 00278 break; 00279 case SPRINTF_PRECISION: 00280 if (arg.format[i] >= '0' && arg.format[i] <= '9') 00281 break; 00282 state = SPRINTF_LENGTH; 00283 case SPRINTF_LENGTH: 00284 if (strchr("hl", arg.format[i])) { 00285 if (arg.format[i + 1] == arg.format[i]) 00286 i++; 00287 state = SPRINTF_CONVERSION; 00288 break; 00289 } else if (strchr("Lqjzt", arg.format[i])) 00290 state = SPRINTF_CONVERSION; 00291 break; 00292 state = SPRINTF_CONVERSION; 00293 case SPRINTF_CONVERSION: 00294 if (strchr("diouxXc", arg.format[i])) { 00295 /* Integer */ 00296 00297 /* Isolate this format alone */ 00298 ast_copy_string(formatbuf, formatstart, sizeof(formatbuf)); 00299 formatbuf[&arg.format[i] - formatstart + 1] = '\0'; 00300 00301 /* Convert the argument into the required type */ 00302 if (sscanf(arg.var[argcount++], "%d", &tmpi) != 1) { 00303 ast_log(LOG_ERROR, "Argument '%s' is not an integer number for format '%s'\n", arg.var[argcount - 1], formatbuf); 00304 goto sprintf_fail; 00305 } 00306 00307 /* Format the argument */ 00308 snprintf(bufptr, buf + len - bufptr, formatbuf, tmpi); 00309 00310 /* Update the position of the next parameter to print */ 00311 bufptr = strchr(buf, '\0'); 00312 } else if (strchr("eEfFgGaA", arg.format[i])) { 00313 /* Double */ 00314 00315 /* Isolate this format alone */ 00316 ast_copy_string(formatbuf, formatstart, sizeof(formatbuf)); 00317 formatbuf[&arg.format[i] - formatstart + 1] = '\0'; 00318 00319 /* Convert the argument into the required type */ 00320 if (sscanf(arg.var[argcount++], "%lf", &tmpd) != 1) { 00321 ast_log(LOG_ERROR, "Argument '%s' is not a floating point number for format '%s'\n", arg.var[argcount - 1], formatbuf); 00322 goto sprintf_fail; 00323 } 00324 00325 /* Format the argument */ 00326 snprintf(bufptr, buf + len - bufptr, formatbuf, tmpd); 00327 00328 /* Update the position of the next parameter to print */ 00329 bufptr = strchr(buf, '\0'); 00330 } else if (arg.format[i] == 's') { 00331 /* String */ 00332 00333 /* Isolate this format alone */ 00334 ast_copy_string(formatbuf, formatstart, sizeof(formatbuf)); 00335 formatbuf[&arg.format[i] - formatstart + 1] = '\0'; 00336 00337 /* Format the argument */ 00338 snprintf(bufptr, buf + len - bufptr, formatbuf, arg.var[argcount++]); 00339 00340 /* Update the position of the next parameter to print */ 00341 bufptr = strchr(buf, '\0'); 00342 } else if (arg.format[i] == '%') { 00343 /* Literal data to copy */ 00344 *bufptr++ = arg.format[i]; 00345 } else { 00346 /* Not supported */ 00347 00348 /* Isolate this format alone */ 00349 ast_copy_string(formatbuf, formatstart, sizeof(formatbuf)); 00350 formatbuf[&arg.format[i] - formatstart + 1] = '\0'; 00351 00352 ast_log(LOG_ERROR, "Format type not supported: '%s' with argument '%s'\n", formatbuf, arg.var[argcount++]); 00353 goto sprintf_fail; 00354 } 00355 state = -1; 00356 break; 00357 default: 00358 if (arg.format[i] == '%') { 00359 state = SPRINTF_FLAG; 00360 formatstart = &arg.format[i]; 00361 break; 00362 } else { 00363 /* Literal data to copy */ 00364 *bufptr++ = arg.format[i]; 00365 } 00366 } 00367 } 00368 return 0; 00369 sprintf_fail: 00370 return -1; 00371 }
static int acf_strftime | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | parse, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 434 of file func_strings.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_get_time_t(), ast_localtime(), ast_log(), AST_STANDARD_APP_ARGS, format, and LOG_WARNING.
00436 { 00437 AST_DECLARE_APP_ARGS(args, 00438 AST_APP_ARG(epoch); 00439 AST_APP_ARG(timezone); 00440 AST_APP_ARG(format); 00441 ); 00442 time_t epochi; 00443 struct tm tm; 00444 00445 buf[0] = '\0'; 00446 00447 AST_STANDARD_APP_ARGS(args, parse); 00448 00449 ast_get_time_t(args.epoch, &epochi, time(NULL), NULL); 00450 ast_localtime(&epochi, &tm, args.timezone); 00451 00452 if (!args.format) 00453 args.format = "%c"; 00454 00455 if (!strftime(buf, len, args.format, &tm)) 00456 ast_log(LOG_WARNING, "C function strftime() output nothing?!!\n"); 00457 00458 buf[len - 1] = '\0'; 00459 00460 return 0; 00461 }
static int acf_strptime | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 470 of file func_strings.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), ast_mktime(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), format, LOG_ERROR, and LOG_WARNING.
00472 { 00473 AST_DECLARE_APP_ARGS(args, 00474 AST_APP_ARG(timestring); 00475 AST_APP_ARG(timezone); 00476 AST_APP_ARG(format); 00477 ); 00478 struct tm time; 00479 00480 memset(&time, 0, sizeof(struct tm)); 00481 00482 buf[0] = '\0'; 00483 00484 if (!data) { 00485 ast_log(LOG_ERROR, 00486 "Asterisk function STRPTIME() requires an argument.\n"); 00487 return -1; 00488 } 00489 00490 AST_STANDARD_APP_ARGS(args, data); 00491 00492 if (ast_strlen_zero(args.format)) { 00493 ast_log(LOG_ERROR, 00494 "No format supplied to STRPTIME(<timestring>|<timezone>|<format>)"); 00495 return -1; 00496 } 00497 00498 if (!strptime(args.timestring, args.format, &time)) { 00499 ast_log(LOG_WARNING, "C function strptime() output nothing?!!\n"); 00500 } else { 00501 snprintf(buf, len, "%d", (int) ast_mktime(&time, args.timezone)); 00502 } 00503 00504 return 0; 00505 }
static int array | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | var, | |||
const char * | value | |||
) | [static] |
Definition at line 171 of file func_strings.c.
References AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, AST_STANDARD_APP_ARGS, ast_strdupa, LOG_DEBUG, option_debug, and pbx_builtin_setvar_helper().
00173 { 00174 AST_DECLARE_APP_ARGS(arg1, 00175 AST_APP_ARG(var)[100]; 00176 ); 00177 AST_DECLARE_APP_ARGS(arg2, 00178 AST_APP_ARG(val)[100]; 00179 ); 00180 char *value2; 00181 int i; 00182 00183 value2 = ast_strdupa(value); 00184 if (!var || !value2) 00185 return -1; 00186 00187 if (chan) 00188 ast_autoservice_start(chan); 00189 00190 /* The functions this will generally be used with are SORT and ODBC_*, which 00191 * both return comma-delimited lists. However, if somebody uses literal lists, 00192 * their commas will be translated to vertical bars by the load, and I don't 00193 * want them to be surprised by the result. Hence, we prefer commas as the 00194 * delimiter, but we'll fall back to vertical bars if commas aren't found. 00195 */ 00196 if (option_debug) 00197 ast_log(LOG_DEBUG, "array (%s=%s)\n", var, value2); 00198 if (strchr(var, ',')) 00199 AST_NONSTANDARD_APP_ARGS(arg1, var, ','); 00200 else 00201 AST_STANDARD_APP_ARGS(arg1, var); 00202 00203 if (strchr(value2, ',')) 00204 AST_NONSTANDARD_APP_ARGS(arg2, value2, ','); 00205 else 00206 AST_STANDARD_APP_ARGS(arg2, value2); 00207 00208 for (i = 0; i < arg1.argc; i++) { 00209 if (option_debug) 00210 ast_log(LOG_DEBUG, "array set value (%s=%s)\n", arg1.var[i], 00211 arg2.val[i]); 00212 if (i < arg2.argc) { 00213 pbx_builtin_setvar_helper(chan, arg1.var[i], arg2.val[i]); 00214 } else { 00215 /* We could unset the variable, by passing a NULL, but due to 00216 * pushvar semantics, that could create some undesired behavior. */ 00217 pbx_builtin_setvar_helper(chan, arg1.var[i], ""); 00218 } 00219 } 00220 00221 if (chan) 00222 ast_autoservice_stop(chan); 00223 00224 return 0; 00225 }
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"String handling dialplan functions" | ||||
) |
static int filter | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | parse, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 89 of file func_strings.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, and LOG_ERROR.
00091 { 00092 AST_DECLARE_APP_ARGS(args, 00093 AST_APP_ARG(allowed); 00094 AST_APP_ARG(string); 00095 ); 00096 char *outbuf = buf; 00097 00098 AST_STANDARD_APP_ARGS(args, parse); 00099 00100 if (!args.string) { 00101 ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>|<string>)\n"); 00102 return -1; 00103 } 00104 00105 for (; *(args.string) && (buf + len - 1 > outbuf); (args.string)++) { 00106 if (strchr(args.allowed, *(args.string))) 00107 *outbuf++ = *(args.string); 00108 } 00109 *outbuf = '\0'; 00110 00111 return 0; 00112 }
static int function_eval | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 522 of file func_strings.c.
References ast_autoservice_start(), ast_autoservice_stop(), ast_log(), ast_strlen_zero(), LOG_WARNING, and pbx_substitute_variables_helper().
00524 { 00525 memset(buf, 0, len); 00526 00527 if (ast_strlen_zero(data)) { 00528 ast_log(LOG_WARNING, "EVAL requires an argument: EVAL(<string>)\n"); 00529 return -1; 00530 } 00531 00532 if (chan) 00533 ast_autoservice_start(chan); 00534 pbx_substitute_variables_helper(chan, data, buf, len - 1); 00535 if (chan) 00536 ast_autoservice_stop(chan); 00537 00538 return 0; 00539 }
static int function_fieldqty | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | parse, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 46 of file func_strings.c.
References AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, ast_strlen_zero(), pbx_substitute_variables_helper(), and strsep().
00048 { 00049 char *varsubst, varval[8192] = "", *varval2 = varval; 00050 int fieldcount = 0; 00051 AST_DECLARE_APP_ARGS(args, 00052 AST_APP_ARG(varname); 00053 AST_APP_ARG(delim); 00054 ); 00055 00056 if (chan) 00057 ast_autoservice_start(chan); 00058 00059 AST_STANDARD_APP_ARGS(args, parse); 00060 if (args.delim) { 00061 varsubst = alloca(strlen(args.varname) + 4); 00062 00063 sprintf(varsubst, "${%s}", args.varname); 00064 pbx_substitute_variables_helper(chan, varsubst, varval, sizeof(varval) - 1); 00065 if (ast_strlen_zero(varval2)) 00066 fieldcount = 0; 00067 else { 00068 while (strsep(&varval2, args.delim)) 00069 fieldcount++; 00070 } 00071 } else { 00072 fieldcount = 1; 00073 } 00074 snprintf(buf, len, "%d", fieldcount); 00075 00076 if (chan) 00077 ast_autoservice_stop(chan); 00078 00079 return 0; 00080 }
static int keypadhash | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 557 of file func_strings.c.
00558 { 00559 char *bufptr, *dataptr; 00560 00561 for (bufptr = buf, dataptr = data; bufptr < buf + len - 1; dataptr++) { 00562 if (*dataptr == '1') { 00563 *bufptr++ = '1'; 00564 } else if (strchr("AaBbCc2", *dataptr)) { 00565 *bufptr++ = '2'; 00566 } else if (strchr("DdEeFf3", *dataptr)) { 00567 *bufptr++ = '3'; 00568 } else if (strchr("GgHhIi4", *dataptr)) { 00569 *bufptr++ = '4'; 00570 } else if (strchr("JjKkLl5", *dataptr)) { 00571 *bufptr++ = '5'; 00572 } else if (strchr("MmNnOo6", *dataptr)) { 00573 *bufptr++ = '6'; 00574 } else if (strchr("PpQqRrSs7", *dataptr)) { 00575 *bufptr++ = '7'; 00576 } else if (strchr("TtUuVv8", *dataptr)) { 00577 *bufptr++ = '8'; 00578 } else if (strchr("WwXxYyZz9", *dataptr)) { 00579 *bufptr++ = '9'; 00580 } else if (*dataptr == '0') { 00581 *bufptr++ = '0'; 00582 } else if (*dataptr == '\0') { 00583 *bufptr++ = '\0'; 00584 break; 00585 } 00586 } 00587 buf[len - 1] = '\0'; 00588 00589 return 0; 00590 }
static int len | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 414 of file func_strings.c.
00416 { 00417 int length = 0; 00418 00419 if (data) 00420 length = strlen(data); 00421 00422 snprintf(buf, len, "%d", length); 00423 00424 return 0; 00425 }
static int load_module | ( | void | ) | [static] |
Definition at line 619 of file func_strings.c.
References ast_custom_function_register().
00620 { 00621 int res = 0; 00622 00623 res |= ast_custom_function_register(&fieldqty_function); 00624 res |= ast_custom_function_register(&filter_function); 00625 res |= ast_custom_function_register(®ex_function); 00626 res |= ast_custom_function_register(&array_function); 00627 res |= ast_custom_function_register("e_function); 00628 res |= ast_custom_function_register(&len_function); 00629 res |= ast_custom_function_register(&strftime_function); 00630 res |= ast_custom_function_register(&strptime_function); 00631 res |= ast_custom_function_register(&eval_function); 00632 res |= ast_custom_function_register(&keypadhash_function); 00633 res |= ast_custom_function_register(&sprintf_function); 00634 00635 return res; 00636 }
static int quote | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 384 of file func_strings.c.
Referenced by ast_app_separate_args(), and make_email_file().
00385 { 00386 char *bufptr = buf, *dataptr = data; 00387 *bufptr++ = '"'; 00388 for (; bufptr < buf + len - 1; dataptr++) { 00389 if (*dataptr == '\\') { 00390 *bufptr++ = '\\'; 00391 *bufptr++ = '\\'; 00392 } else if (*dataptr == '"') { 00393 *bufptr++ = '\\'; 00394 *bufptr++ = '"'; 00395 } else if (*dataptr == '\0') { 00396 break; 00397 } else { 00398 *bufptr++ = *dataptr; 00399 } 00400 } 00401 *bufptr++ = '"'; 00402 *bufptr = '\0'; 00403 return 0; 00404 }
static int regex | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | parse, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 121 of file func_strings.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, LOG_DEBUG, LOG_ERROR, LOG_WARNING, and option_debug.
00123 { 00124 AST_DECLARE_APP_ARGS(args, 00125 AST_APP_ARG(null); 00126 AST_APP_ARG(reg); 00127 AST_APP_ARG(str); 00128 ); 00129 int errcode; 00130 regex_t regexbuf; 00131 00132 buf[0] = '\0'; 00133 00134 AST_NONSTANDARD_APP_ARGS(args, parse, '"'); 00135 00136 if (args.argc != 3) { 00137 ast_log(LOG_ERROR, "Unexpected arguments: should have been in the form '\"<regex>\" <string>'\n"); 00138 return -1; 00139 } 00140 if ((*args.str == ' ') || (*args.str == '\t')) 00141 args.str++; 00142 00143 if (option_debug) 00144 ast_log(LOG_DEBUG, "FUNCTION REGEX (%s)(%s)\n", args.reg, args.str); 00145 00146 if ((errcode = regcomp(®exbuf, args.reg, REG_EXTENDED | REG_NOSUB))) { 00147 regerror(errcode, ®exbuf, buf, len); 00148 ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, parse, buf); 00149 return -1; 00150 } 00151 00152 strcpy(buf, regexec(®exbuf, args.str, 0, NULL, 0) ? "0" : "1"); 00153 00154 regfree(®exbuf); 00155 00156 return 0; 00157 }
static int unload_module | ( | void | ) | [static] |
Definition at line 600 of file func_strings.c.
References ast_custom_function_unregister().
00601 { 00602 int res = 0; 00603 00604 res |= ast_custom_function_unregister(&fieldqty_function); 00605 res |= ast_custom_function_unregister(&filter_function); 00606 res |= ast_custom_function_unregister(®ex_function); 00607 res |= ast_custom_function_unregister(&array_function); 00608 res |= ast_custom_function_unregister("e_function); 00609 res |= ast_custom_function_unregister(&len_function); 00610 res |= ast_custom_function_unregister(&strftime_function); 00611 res |= ast_custom_function_unregister(&strptime_function); 00612 res |= ast_custom_function_unregister(&eval_function); 00613 res |= ast_custom_function_unregister(&keypadhash_function); 00614 res |= ast_custom_function_unregister(&sprintf_function); 00615 00616 return res; 00617 }
struct ast_custom_function array_function [static] |
Definition at line 227 of file func_strings.c.
struct ast_custom_function eval_function [static] |
Definition at line 541 of file func_strings.c.
struct ast_custom_function fieldqty_function [static] |
Definition at line 82 of file func_strings.c.
struct ast_custom_function filter_function [static] |
Definition at line 114 of file func_strings.c.
struct ast_custom_function keypadhash_function [static] |
Definition at line 592 of file func_strings.c.
struct ast_custom_function len_function [static] |
Definition at line 427 of file func_strings.c.
struct ast_custom_function quote_function [static] |
Definition at line 406 of file func_strings.c.
struct ast_custom_function regex_function [static] |
Definition at line 159 of file func_strings.c.
struct ast_custom_function sprintf_function [static] |
Definition at line 373 of file func_strings.c.
struct ast_custom_function strftime_function [static] |
Definition at line 463 of file func_strings.c.
struct ast_custom_function strptime_function [static] |
Definition at line 507 of file func_strings.c.