From ddcc8fad13dbe473e3c6a3acefff601cd626dda6 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Thu, 6 Feb 2003 05:57:43 +0000 Subject: Version 0.3.0 from FTP git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@606 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_substring.c | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100755 apps/app_substring.c diff --git a/apps/app_substring.c b/apps/app_substring.c new file mode 100755 index 000000000..a1edf64ae --- /dev/null +++ b/apps/app_substring.c @@ -0,0 +1,131 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Skeleton application + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +static char *tdesc = "Save substring digits in a given variable"; + +extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value); + +static char *descrip = +" StripLSD(variable=string_of_digits|count1|count2): Assigns the substring\n" +"of string_of_digits to a given variable. Parameter count1 may be positive\n" +"or negative. If it's positive then we skip the first count1 digits from the\n" +"left. If it's negative, we move count1 digits counting from the end of\n" +"the string to the left. Parameter count2 may be only positive and implies\n" +"how many digits we're taking from the point that count1 placed us.\n" +"For example:\n" +"exten => _NXXXXXX,1,SubString,test=2564286161|0|3\n" +"assigns the area code (3 first digits) to variable test.\n" +"exten => _NXXXXXX,1,SubString,test=2564286161|-7|7\n" +"assigns the last 7 digits to variable test.\n" +"If there are no parameters it'll return with -1.\n" +"If there wrong parameters it go on and return with 0\n"; + +static char *app = "SubString"; + +static char *synopsis = "Save substring digits in a given variable"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int substring_exec(struct ast_channel *chan, void *data) +{ + char newexten[AST_MAX_EXTENSION] = ""; + char *count1, *count2; + char *first, *second, *stringp; + stringp=alloca(strlen(data)+1); + strncpy(stringp,data,strlen(data)+1); + if (strchr(stringp,'|')&&strchr(stringp,'=')) { + int icount1,icount2; + first=strsep(&stringp,"="); + second=strsep(&stringp,"|"); + count1=strsep(&stringp,"|"); + count2=strsep(&stringp,"\0"); + if (!first || !second || !count1 || !count2) { + ast_log(LOG_DEBUG, "Ignoring, since there is no argument: variable or string or count1 or count2\n"); + return 0; + } + icount1=atoi(count1); + icount2=atoi(count2); + if (icount2<=0) { + ast_log(LOG_DEBUG, "Exiting, wrong parameter count2\n"); + return -1; + } + if (abs(icount1)>strlen(second)) { + ast_log(LOG_WARNING, "Limiting count1 parameter because it exceeds the length of the string\n"); + if (icount1>=0) + icount1=strlen(second); + else + icount1=0; + } + if ((icount1<0 && icount2>-icount1) || (icount1>=0 && icount1+icount2>strlen(second))) { + ast_log(LOG_WARNING, "Limiting count2 parameter because it exceeds the length of the string\n"); + if (icount1>=0) + icount2=strlen(second)-icount1; + else + icount2=strlen(second)+icount1; + } + if (first&&second) { + if (icount1>=0) + strncpy(newexten,second+icount1,icount2); + else + strncpy(newexten,second+strlen(second)+icount1,icount2); + pbx_builtin_setvar_helper(chan,first,newexten); + } + } else { + ast_log(LOG_DEBUG, "Ignoring, no parameters\n"); + } + return 0; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, substring_exec, synopsis, descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} -- cgit v1.2.3