Thu Apr 28 2011 16:57:10

Asterisk developer's documentation


func_strings.c File Reference

String manipulation dialplan functions. More...

#include "asterisk.h"
#include <regex.h>
#include <ctype.h>
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/localtime.h"
Include dependency graph for func_strings.c:

Go to the source code of this file.

Defines

#define HASH_FORMAT   HASH_PREFIX "%s~"
#define HASH_PREFIX   "~HASH~%s~"

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int acf_strftime (struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t buflen)
static int acf_strptime (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int array (struct ast_channel *chan, const char *cmd, char *var, const char *value)
 AST_THREADSTORAGE_CUSTOM_SCOPE (result_buf, NULL, ast_free_ptr, static)
static void clearvar_prefix (struct ast_channel *chan, const char *prefix)
static int csv_quote (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int exec_clearhash (struct ast_channel *chan, void *data)
static int filter (struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
static int function_eval (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int function_fieldqty (struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
static int hash_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int hash_write (struct ast_channel *chan, const char *cmd, char *var, const char *value)
static int hashkeys_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int keypadhash (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int len (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int listfilter (struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
static int load_module (void)
static int quote (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int regex (struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
static int string_tolower (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int string_toupper (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "String handling dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static char * app_clearhash = "ClearHash"
static struct ast_custom_function array_function
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_custom_function csv_quote_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 hash_function
static struct ast_custom_function hashkeys_function
static struct ast_custom_function keypadhash_function
static struct ast_custom_function len_function
static struct ast_custom_function listfilter_function
static struct ast_custom_function quote_function
static struct ast_custom_function regex_function
static struct ast_custom_function strftime_function
static struct ast_custom_function strptime_function
static struct ast_custom_function tolower_function
static struct ast_custom_function toupper_function

Detailed Description

String manipulation dialplan functions.

Author:
Tilghman Lesher
Anothony Minessale II

Definition in file func_strings.c.


Define Documentation

#define HASH_FORMAT   HASH_PREFIX "%s~"

Definition at line 551 of file func_strings.c.

Referenced by array(), hash_read(), and hash_write().

#define HASH_PREFIX   "~HASH~%s~"

Definition at line 550 of file func_strings.c.

Referenced by exec_clearhash(), and hashkeys_read().


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 1050 of file func_strings.c.

static void __unreg_module ( void  ) [static]

Definition at line 1050 of file func_strings.c.

static int acf_strftime ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buf,
size_t  buflen 
) [static]

Definition at line 838 of file func_strings.c.

References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_get_timeval(), ast_localtime(), ast_log(), AST_STANDARD_APP_ARGS, ast_strftime(), ast_tvnow(), format, and LOG_WARNING.

{
   AST_DECLARE_APP_ARGS(args,
              AST_APP_ARG(epoch);
              AST_APP_ARG(timezone);
              AST_APP_ARG(format);
   );
   struct timeval when;
   struct ast_tm tm;

   buf[0] = '\0';

   AST_STANDARD_APP_ARGS(args, parse);

   ast_get_timeval(args.epoch, &when, ast_tvnow(), NULL);
   ast_localtime(&when, &tm, args.timezone);

   if (!args.format)
      args.format = "%c";

   if (ast_strftime(buf, buflen, args.format, &tm) <= 0)
      ast_log(LOG_WARNING, "C function strftime() output nothing?!!\n");

   buf[buflen - 1] = '\0';

   return 0;
}
static int acf_strptime ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 872 of file func_strings.c.

References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), ast_mktime(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_strptime(), format, LOG_ERROR, and LOG_WARNING.

{
   AST_DECLARE_APP_ARGS(args,
              AST_APP_ARG(timestring);
              AST_APP_ARG(timezone);
              AST_APP_ARG(format);
   );
   struct ast_tm tm;

   buf[0] = '\0';

   if (!data) {
      ast_log(LOG_ERROR,
            "Asterisk function STRPTIME() requires an argument.\n");
      return -1;
   }

   AST_STANDARD_APP_ARGS(args, data);

   if (ast_strlen_zero(args.format)) {
      ast_log(LOG_ERROR,
            "No format supplied to STRPTIME(<timestring>,<timezone>,<format>)");
      return -1;
   }

   if (!ast_strptime(args.timestring, args.format, &tm)) {
      ast_log(LOG_WARNING, "STRPTIME() found no time specified within the string\n");
   } else {
      struct timeval when;
      when = ast_mktime(&tm, args.timezone);
      snprintf(buf, buflen, "%d", (int) when.tv_sec);
   }

   return 0;
}
static int array ( struct ast_channel chan,
const char *  cmd,
char *  var,
const char *  value 
) [static]

Definition at line 577 of file func_strings.c.

References AST_APP_ARG, ast_autoservice_stop(), ast_debug, AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, ast_strdupa, HASH_FORMAT, pbx_builtin_getvar_helper(), pbx_builtin_setvar_helper(), S_OR, and var.

Referenced by hash_write().

{
   AST_DECLARE_APP_ARGS(arg1,
              AST_APP_ARG(var)[100];
   );
   AST_DECLARE_APP_ARGS(arg2,
              AST_APP_ARG(val)[100];
   );
   char *origvar = "", *value2, varname[256];
   int i, ishash = 0;

   value2 = ast_strdupa(value);
   if (!var || !value2)
      return -1;

   if (!strcmp(cmd, "HASH")) {
      const char *var2 = pbx_builtin_getvar_helper(chan, "~ODBCFIELDS~");
      origvar = var;
      if (var2)
         var = ast_strdupa(var2);
      else {
         if (chan)
            ast_autoservice_stop(chan);
         return -1;
      }
      ishash = 1;
   }

   /* The functions this will generally be used with are SORT and ODBC_*, which
    * both return comma-delimited lists.  However, if somebody uses literal lists,
    * their commas will be translated to vertical bars by the load, and I don't
    * want them to be surprised by the result.  Hence, we prefer commas as the
    * delimiter, but we'll fall back to vertical bars if commas aren't found.
    */
   ast_debug(1, "array (%s=%s)\n", var, S_OR(value2, ""));
   AST_STANDARD_APP_ARGS(arg1, var);

   AST_STANDARD_APP_ARGS(arg2, value2);

   for (i = 0; i < arg1.argc; i++) {
      ast_debug(1, "array set value (%s=%s)\n", arg1.var[i],
            S_OR(arg2.val[i], ""));
      if (i < arg2.argc) {
         if (ishash) {
            snprintf(varname, sizeof(varname), HASH_FORMAT, origvar, arg1.var[i]);
            pbx_builtin_setvar_helper(chan, varname, arg2.val[i]);
         } else {
            pbx_builtin_setvar_helper(chan, arg1.var[i], arg2.val[i]);
         }
      } else {
         /* We could unset the variable, by passing a NULL, but due to
          * pushvar semantics, that could create some undesired behavior. */
         if (ishash) {
            snprintf(varname, sizeof(varname), HASH_FORMAT, origvar, arg1.var[i]);
            pbx_builtin_setvar_helper(chan, varname, "");
         } else {
            pbx_builtin_setvar_helper(chan, arg1.var[i], "");
         }
      }
   }

   return 0;
}
AST_THREADSTORAGE_CUSTOM_SCOPE ( result_buf  ,
NULL  ,
ast_free_ptr  ,
static   
)
static void clearvar_prefix ( struct ast_channel chan,
const char *  prefix 
) [static]
static int csv_quote ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 785 of file func_strings.c.

References ast_copy_string(), ast_log(), ast_strlen_zero(), buf, LOG_ERROR, and LOG_WARNING.

{
   char *bufptr = buf, *dataptr = data;

   if (len < 3){ /* at least two for quotes and one for binary zero */
      ast_log(LOG_ERROR, "Not enough buffer");
      return -1;
   }

   if (ast_strlen_zero(data)) {
      ast_log(LOG_WARNING, "No argument specified!\n");
      ast_copy_string(buf,"\"\"",len);
      return 0;
   }

   *bufptr++ = '"';
   for (; bufptr < buf + len - 3; dataptr++){
      if (*dataptr == '"') {
         *bufptr++ = '"';
         *bufptr++ = '"';
      } else if (*dataptr == '\0') {
         break;
      } else {
         *bufptr++ = *dataptr;
      }
   }
   *bufptr++ = '"';
   *bufptr='\0';
   return 0;
}
static int exec_clearhash ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 569 of file func_strings.c.

References clearvar_prefix(), HASH_PREFIX, and prefix.

Referenced by load_module().

{
   char prefix[80];
   snprintf(prefix, sizeof(prefix), HASH_PREFIX, data ? (char *)data : "null");
   clearvar_prefix(chan, prefix);
   return 0;
}
static int filter ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buf,
size_t  len 
) [static]

Note:
Looks a little strange, until you realize that we can overflow the size of a char.

Definition at line 427 of file func_strings.c.

References AST_APP_ARG, ast_debug, AST_DECLARE_APP_ARGS, ast_get_encoded_char(), ast_log(), ast_opt_dont_warn, AST_STANDARD_RAW_ARGS, buf, LOG_ERROR, and LOG_WARNING.

Referenced by realtime_ldap_base_ap(), set_egress_subscription(), update2_ldap(), and update_ldap().

{
   AST_DECLARE_APP_ARGS(args,
              AST_APP_ARG(allowed);
              AST_APP_ARG(string);
   );
   char *outbuf = buf;
   unsigned char ac;
   char allowed[256] = "";
   size_t allowedlen = 0;
   int32_t bitfield[8] = { 0, }; /* 256 bits */

   AST_STANDARD_RAW_ARGS(args, parse);

   if (!args.string) {
      ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>,<string>)\n");
      return -1;
   }

   if (args.allowed[0] == '"' && !ast_opt_dont_warn) {
      ast_log(LOG_WARNING, "FILTER allowed characters includes the quote (\") character.  This may not be what you want.\n");
   }

   /* Expand ranges */
   for (; *(args.allowed);) {
      char c1 = 0, c2 = 0;
      size_t consumed = 0;

      if (ast_get_encoded_char(args.allowed, &c1, &consumed))
         return -1;
      args.allowed += consumed;

      if (*(args.allowed) == '-') {
         if (ast_get_encoded_char(args.allowed + 1, &c2, &consumed))
            c2 = c1;
         args.allowed += consumed + 1;

         if ((unsigned char) c2 < (unsigned char) c1 && !ast_opt_dont_warn) {
            ast_log(LOG_WARNING, "Range wrapping in FILTER(%s,%s).  This may not be what you want.\n", parse, args.string);
         }

         /*!\note
          * Looks a little strange, until you realize that we can overflow
          * the size of a char.
          */
         for (ac = (unsigned char) c1; ac != (unsigned char) c2; ac++) {
            bitfield[ac / 32] |= 1 << (ac % 32);
         }
         bitfield[ac / 32] |= 1 << (ac % 32);

         ast_debug(4, "c1=%d, c2=%d\n", c1, c2);
      } else {
         ac = (unsigned char) c1;
         ast_debug(4, "c1=%d, consumed=%d, args.allowed=%s\n", c1, (int) consumed, args.allowed - consumed);
         bitfield[ac / 32] |= 1 << (ac % 32);
      }
   }

   for (ac = 1; ac != 0; ac++) {
      if (bitfield[ac / 32] & (1 << (ac % 32))) {
         allowed[allowedlen++] = ac;
      }
   }

   ast_debug(1, "Allowed: %s\n", allowed);

   for (; *(args.string) && (buf + len - 1 > outbuf); (args.string)++) {
      if (strchr(allowed, *(args.string)))
         *outbuf++ = *(args.string);
   }
   *outbuf = '\0';

   return 0;
}
static int function_eval ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 914 of file func_strings.c.

References ast_log(), ast_strlen_zero(), LOG_WARNING, and pbx_substitute_variables_helper().

{
   if (ast_strlen_zero(data)) {
      ast_log(LOG_WARNING, "EVAL requires an argument: EVAL(<string>)\n");
      return -1;
   }

   pbx_substitute_variables_helper(chan, data, buf, buflen - 1);

   return 0;
}
static int function_fieldqty ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buf,
size_t  len 
) [static]

Definition at line 292 of file func_strings.c.

References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_get_encoded_char(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), pbx_substitute_variables_helper(), and strsep().

{
   char *varsubst, varval[8192], *varval2 = varval;
   int fieldcount = 0;
   AST_DECLARE_APP_ARGS(args,
              AST_APP_ARG(varname);
              AST_APP_ARG(delim);
      );
   char delim[2] = "";
   size_t delim_used;

   AST_STANDARD_APP_ARGS(args, parse);
   if (args.delim) {
      ast_get_encoded_char(args.delim, delim, &delim_used);

      varsubst = alloca(strlen(args.varname) + 4);

      sprintf(varsubst, "${%s}", args.varname);
      pbx_substitute_variables_helper(chan, varsubst, varval, sizeof(varval) - 1);
      if (ast_strlen_zero(varval2))
         fieldcount = 0;
      else {
         while (strsep(&varval2, delim))
            fieldcount++;
      }
   } else {
      fieldcount = 1;
   }
   snprintf(buf, len, "%d", fieldcount);

   return 0;
}
static int hash_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 684 of file func_strings.c.

References AST_APP_ARG, ast_copy_string(), AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, HASH_FORMAT, hashkeys_read(), pbx_builtin_getvar_helper(), and pbx_builtin_setvar_helper().

{
   char varname[256];
   const char *varvalue;
   AST_DECLARE_APP_ARGS(arg,
      AST_APP_ARG(hashname);
      AST_APP_ARG(hashkey);
   );

   AST_STANDARD_APP_ARGS(arg, data);
   if (arg.argc == 2) {
      snprintf(varname, sizeof(varname), HASH_FORMAT, arg.hashname, arg.hashkey);
      varvalue = pbx_builtin_getvar_helper(chan, varname);
      if (varvalue)
         ast_copy_string(buf, varvalue, len);
      else
         *buf = '\0';
   } else if (arg.argc == 1) {
      char colnames[4096];
      int i;
      AST_DECLARE_APP_ARGS(arg2,
         AST_APP_ARG(col)[100];
      );

      /* Get column names, in no particular order */
      hashkeys_read(chan, "HASHKEYS", arg.hashname, colnames, sizeof(colnames));
      pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", colnames);

      AST_STANDARD_APP_ARGS(arg2, colnames);
      *buf = '\0';

      /* Now get the corresponding column values, in exactly the same order */
      for (i = 0; i < arg2.argc; i++) {
         snprintf(varname, sizeof(varname), HASH_FORMAT, arg.hashname, arg2.col[i]);
         varvalue = pbx_builtin_getvar_helper(chan, varname);
         strncat(buf, varvalue, len - strlen(buf) - 1);
         strncat(buf, ",", len - strlen(buf) - 1);
      }

      /* Strip trailing comma */
      buf[strlen(buf) - 1] = '\0';
   }

   return 0;
}
static int hash_write ( struct ast_channel chan,
const char *  cmd,
char *  var,
const char *  value 
) [static]

Definition at line 664 of file func_strings.c.

References array(), AST_APP_ARG, AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, HASH_FORMAT, and pbx_builtin_setvar_helper().

{
   char varname[256];
   AST_DECLARE_APP_ARGS(arg,
      AST_APP_ARG(hashname);
      AST_APP_ARG(hashkey);
   );

   if (!strchr(var, ',')) {
      /* Single argument version */
      return array(chan, "HASH", var, value);
   }

   AST_STANDARD_APP_ARGS(arg, var);
   snprintf(varname, sizeof(varname), HASH_FORMAT, arg.hashname, arg.hashkey);
   pbx_builtin_setvar_helper(chan, varname, value);

   return 0;
}
static int hashkeys_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 642 of file func_strings.c.

References AST_LIST_TRAVERSE, ast_var_name(), ast_var_t::entries, HASH_PREFIX, prefix, and ast_channel::varshead.

Referenced by hash_read().

{
   struct ast_var_t *newvar;
   int plen;
   char prefix[80];
   snprintf(prefix, sizeof(prefix), HASH_PREFIX, data);
   plen = strlen(prefix);

   memset(buf, 0, len);
   AST_LIST_TRAVERSE(&chan->varshead, newvar, entries) {
      if (strncasecmp(prefix, ast_var_name(newvar), plen) == 0) {
         /* Copy everything after the prefix */
         strncat(buf, ast_var_name(newvar) + plen, len - strlen(buf) - 1);
         /* Trim the trailing ~ */
         buf[strlen(buf) - 1] = ',';
      }
   }
   /* Trim the trailing comma */
   buf[strlen(buf) - 1] = '\0';
   return 0;
}
static int keypadhash ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 932 of file func_strings.c.

{
   char *bufptr, *dataptr;

   for (bufptr = buf, dataptr = data; bufptr < buf + buflen - 1; dataptr++) {
      if (*dataptr == '\0') {
         *bufptr++ = '\0';
         break;
      } else if (*dataptr == '1') {
         *bufptr++ = '1';
      } else if (strchr("AaBbCc2", *dataptr)) {
         *bufptr++ = '2';
      } else if (strchr("DdEeFf3", *dataptr)) {
         *bufptr++ = '3';
      } else if (strchr("GgHhIi4", *dataptr)) {
         *bufptr++ = '4';
      } else if (strchr("JjKkLl5", *dataptr)) {
         *bufptr++ = '5';
      } else if (strchr("MmNnOo6", *dataptr)) {
         *bufptr++ = '6';
      } else if (strchr("PpQqRrSs7", *dataptr)) {
         *bufptr++ = '7';
      } else if (strchr("TtUuVv8", *dataptr)) {
         *bufptr++ = '8';
      } else if (strchr("WwXxYyZz9", *dataptr)) {
         *bufptr++ = '9';
      } else if (*dataptr == '0') {
         *bufptr++ = '0';
      }
   }
   buf[buflen - 1] = '\0';

   return 0;
}
static int len ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 821 of file func_strings.c.

Referenced by __ast_cli_register(), __ast_dsp_call_progress(), __ast_dsp_silence_noise(), __ast_str_helper(), __get_header(), _parse(), acf_escape(), add_sdp(), adsi_careful_send(), ael_token_subst(), aji_io_recv(), aji_recv(), aji_send_header(), aji_send_raw(), aji_start_sasl(), alsa_write(), amdf_pitch(), anti_injection(), append_interface(), append_var_and_value_to_filter(), ast_agi_register_multiple(), ast_agi_unregister_multiple(), ast_app_group_set_channel(), ast_app_options2str64(), ast_cdr_appenduserfield(), ast_cli_complete(), ast_cli_register_multiple(), ast_cli_unregister_multiple(), ast_codec_get_len(), ast_complete_source_filename(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_event_cb(), ast_format_str_reduce(), ast_frdup(), ast_getformatname_multiple(), ast_http_uri_link(), ast_join(), ast_mkdir(), ast_read_image(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_lookup_mime_multiple(), ast_rtp_read(), ast_say_number_full_ka(), ast_smoother_read(), ast_str_buffer(), ast_tdd_gen_ecdisa(), ast_translate(), ast_udptl_read(), ast_udptl_write(), auth_exec(), authenticate(), build_device(), build_facility(), builtin_automixmonitor(), builtin_automonitor(), calc_energy(), callerid_feed(), callerid_feed_jp(), callerid_generate(), cleaned_basedn(), clearvar_prefix(), cli_console_sendtext(), complete_agent_logoff_cmd(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_meetmecmd(), complete_peer_helper(), conf_play(), config_jitterbuffer(), copy(), create_video_frame(), dahdi_digit_begin(), dahdi_sendtext(), dahdi_setoption(), decimals2int(), decode_length(), decode_open_type(), devstate_write(), dialgroup_refreshdb(), dictate_exec(), do_tone(), dump_prefs(), dump_raw(), dump_string(), dundi_encrypt(), dundi_parse_ies(), dundi_send(), encode_length(), evt_event_deliver_cb(), expr2_token_subst(), fax_generator_generate(), fbuf_append(), feature_request_and_dial(), ffmpeg_decode(), file_read(), flip_buf_bits(), fsk_serial(), gen_tone(), gen_tones(), get_sdp(), get_sdp_iterate(), get_to_address(), gsm_write(), gsmtolin_framein(), h261_encap(), h263_encap(), h263_read(), h263_write(), h263p_encap(), h264_read(), h264_write(), handle_cli_devstate_change(), handle_commandmatchesarray(), handle_output(), handle_response(), handle_subscribe(), help1(), iax_parse_ies(), iax_str2flags(), iconv_read(), jpeg_read_image(), launch_monitor_thread(), listener(), load_file(), local_call(), lpc10tolin_framein(), make_tone_burst(), manager_rpt_status(), memcpy_decrypt(), memcpy_encrypt(), message_template_parse_emailbody(), mgcp_postrequest(), mgcp_ss(), mgcpsock_read(), milliwatt_generate(), misdn_jb_empty(), misdn_jb_fill(), misdn_lib_tx2misdn_frm(), misdn_read(), misdn_tx_jitter(), monmp3thread(), mpeg4_encap(), my_dahdi_write(), newpvt(), ogg_vorbis_read(), parse_ie(), ParseBookmark(), pbx_load_users(), pbx_substitute_variables_helper_full(), phone_write_buf(), phoneprov_callback(), playtones_generator(), plc_fillin(), plc_rx(), process_sdp(), readfile_exec(), reschedule_precache(), run_agi(), save_history(), schedule_delivery(), send_morse(), set(), set_egress_subscription(), skinny_ss(), sms_messagetx(), socket_process_meta(), socket_read(), ss_thread(), static_callback(), strndup(), strnlen(), strnncpy(), tdd_feed(), term_filter_escapes(), tonepair_generator(), transfer_exec(), try_firmware(), udptl_build_packet(), unistim_sp(), unquote(), vmwi_generate(), and wav_write().

{
   int length = 0;

   if (data)
      length = strlen(data);

   snprintf(buf, buflen, "%d", length);

   return 0;
}
static int listfilter ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buf,
size_t  len 
) [static]

Definition at line 331 of file func_strings.c.

References AST_APP_ARG, ast_channel_lock, ast_channel_unlock, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_get_encoded_str(), ast_log(), AST_STANDARD_APP_ARGS, ast_str_append(), ast_str_append_substr(), ast_str_buffer(), ast_str_make_space(), ast_str_reset(), ast_str_thread_get(), first, LOG_ERROR, and pbx_builtin_getvar_helper().

{
   AST_DECLARE_APP_ARGS(args,
      AST_APP_ARG(listname);
      AST_APP_ARG(delimiter);
      AST_APP_ARG(fieldvalue);
   );
   const char *orig_list, *ptr;
   const char *begin, *cur, *next;
   int dlen, flen, first = 1;
   struct ast_str *result = ast_str_thread_get(&result_buf, 16);
   char *delim;

   AST_STANDARD_APP_ARGS(args, parse);

   if (args.argc < 3) {
      ast_log(LOG_ERROR, "Usage: LISTFILTER(<listname>,<delimiter>,<fieldvalue>)\n");
      return -1;
   }

   /* If we don't lock the channel, the variable could disappear out from underneath us. */
   if (chan) {
      ast_channel_lock(chan);
   }
   if (!(orig_list = pbx_builtin_getvar_helper(chan, args.listname))) {
      ast_log(LOG_ERROR, "List variable '%s' not found\n", args.listname);
      if (chan) {
         ast_channel_unlock(chan);
      }
      return -1;
   }

   /* If the string isn't there, just copy out the string and be done with it. */
   if (!(ptr = strstr(orig_list, args.fieldvalue))) {
      ast_copy_string(buf, orig_list, len);
      if (chan) {
         ast_channel_unlock(chan);
      }
      return 0;
   }

   dlen = strlen(args.delimiter);
   delim = alloca(dlen + 1);
   ast_get_encoded_str(args.delimiter, delim, dlen + 1);

   if ((dlen = strlen(delim)) == 0) {
      delim = ",";
      dlen = 1;
   }

   flen = strlen(args.fieldvalue);

   ast_str_reset(result);
   /* Enough space for any result */
   ast_str_make_space(&result, strlen(orig_list) + 1);

   begin = orig_list;
   next = strstr(begin, delim);

   do {
      /* Find next boundary */
      if (next) {
         cur = next;
         next = strstr(cur + dlen, delim);
      } else {
         cur = strchr(begin + dlen, '\0');
      }

      if (flen == cur - begin && !strncmp(begin, args.fieldvalue, flen)) {
         /* Skip field */
         begin += flen + dlen;
      } else {
         /* Copy field to output */
         if (!first) {
            ast_str_append(&result, 0, "%s", delim);
         }

         ast_str_append_substr(&result, 0, begin, cur - begin);
         first = 0;
         begin = cur + dlen;
      }
   } while (*cur != '\0');
   if (chan) {
      ast_channel_unlock(chan);
   }

   ast_copy_string(buf, ast_str_buffer(result), len);

   return 0;
}
static int quote ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 746 of file func_strings.c.

References ast_copy_string(), ast_log(), ast_strlen_zero(), buf, LOG_ERROR, and LOG_WARNING.

{
   char *bufptr = buf, *dataptr = data;

   if (len < 3){ /* at least two for quotes and one for binary zero */
      ast_log(LOG_ERROR, "Not enough buffer");
      return -1;
   }

   if (ast_strlen_zero(data)) {
      ast_log(LOG_WARNING, "No argument specified!\n");
      ast_copy_string(buf, "\"\"", len);
      return 0;
   }

   *bufptr++ = '"';
   for (; bufptr < buf + len - 3; dataptr++) {
      if (*dataptr == '\\') {
         *bufptr++ = '\\';
         *bufptr++ = '\\';
      } else if (*dataptr == '"') {
         *bufptr++ = '\\';
         *bufptr++ = '"';
      } else if (*dataptr == '\0') {
         break;
      } else {
         *bufptr++ = *dataptr;
      }
   }
   *bufptr++ = '"';
   *bufptr = '\0';
   return 0;
}
static int regex ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buf,
size_t  len 
) [static]

Definition at line 508 of file func_strings.c.

References AST_APP_ARG, ast_debug, AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, LOG_ERROR, LOG_WARNING, and str.

{
   AST_DECLARE_APP_ARGS(args,
              AST_APP_ARG(null);
              AST_APP_ARG(reg);
              AST_APP_ARG(str);
   );
   int errcode;
   regex_t regexbuf;

   buf[0] = '\0';

   AST_NONSTANDARD_APP_ARGS(args, parse, '"');

   if (args.argc != 3) {
      ast_log(LOG_ERROR, "Unexpected arguments: should have been in the form '\"<regex>\" <string>'\n");
      return -1;
   }
   if ((*args.str == ' ') || (*args.str == '\t'))
      args.str++;

   ast_debug(1, "FUNCTION REGEX (%s)(%s)\n", args.reg, args.str);

   if ((errcode = regcomp(&regexbuf, args.reg, REG_EXTENDED | REG_NOSUB))) {
      regerror(errcode, &regexbuf, buf, len);
      ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, parse, buf);
      return -1;
   }
   
   strcpy(buf, regexec(&regexbuf, args.str, 0, NULL, 0) ? "0" : "1");

   regfree(&regexbuf);

   return 0;
}
static int string_tolower ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 986 of file func_strings.c.

References buf.

{
   char *bufptr = buf, *dataptr = data;

   while ((bufptr < buf + buflen - 1) && (*bufptr++ = tolower(*dataptr++)));

   return 0;
}
static int string_toupper ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  buflen 
) [static]

Definition at line 972 of file func_strings.c.

References buf.

{
   char *bufptr = buf, *dataptr = data;

   while ((bufptr < buf + buflen - 1) && (*bufptr++ = toupper(*dataptr++)));

   return 0;
}

Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "String handling dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 1050 of file func_strings.c.

char* app_clearhash = "ClearHash" [static]

Definition at line 553 of file func_strings.c.

Initial value:
 {
   .name = "ARRAY",
   .write = array,
}

Definition at line 741 of file func_strings.c.

Definition at line 1050 of file func_strings.c.

Initial value:
 {
   .name = "CSV_QUOTE",
   .read = csv_quote,
}

Definition at line 816 of file func_strings.c.

Initial value:
 {
   .name = "EVAL",
   .read = function_eval,
}

Definition at line 927 of file func_strings.c.

Initial value:
 {
   .name = "FIELDQTY",
   .read = function_fieldqty,
}

Definition at line 326 of file func_strings.c.

Initial value:
 {
   .name = "FILTER",
   .read = filter,
}

Definition at line 503 of file func_strings.c.

Initial value:
 {
   .name = "HASH",
   .write = hash_write,
   .read = hash_read,
}

Definition at line 730 of file func_strings.c.

Initial value:
 {
   .name = "HASHKEYS",
   .read = hashkeys_read,
}

Definition at line 736 of file func_strings.c.

Initial value:
 {
   .name = "KEYPADHASH",
   .read = keypadhash,
}

Definition at line 967 of file func_strings.c.

Initial value:
 {
   .name = "LEN",
   .read = len,
}

Definition at line 833 of file func_strings.c.

Initial value:
 {
   .name = "LISTFILTER",
   .read = listfilter,
}

Definition at line 422 of file func_strings.c.

Initial value:
 {
   .name = "QUOTE",
   .read = quote,
}

Definition at line 780 of file func_strings.c.

Initial value:
 {
   .name = "REGEX",
   .read = regex,
}

Definition at line 545 of file func_strings.c.

Initial value:
 {
   .name = "STRFTIME",
   .read = acf_strftime,
}

Definition at line 867 of file func_strings.c.

Initial value:
 {
   .name = "STRPTIME",
   .read = acf_strptime,
}

Definition at line 909 of file func_strings.c.

Initial value:
 {
   .name = "TOLOWER",
   .read = string_tolower,
}

Definition at line 995 of file func_strings.c.

Initial value:
 {
   .name = "TOUPPER",
   .read = string_toupper,
}

Definition at line 981 of file func_strings.c.