diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-02-06 05:57:43 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-02-06 05:57:43 +0000 |
commit | 4dd5d189c1149c4e76a2c62b4e0edb7e4370029b (patch) | |
tree | 6a4a8fe816508e9d41883b4948cb77596c545850 | |
parent | 84b6dfc48a66c09f0bdd5f6ffeaa91d67463884f (diff) |
Version 0.3.0 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@606 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | apps/app_substring.c | 131 |
1 files changed, 131 insertions, 0 deletions
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 <markster@linux-support.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <asterisk/pbx.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> + +#include <pthread.h> + + +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; +} |