9771df98d6211b6068304edcf7350bc2159fbfa3
[asterisk/asterisk.git] / apps / app_substring.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief substr
22  *
23  * \ingroup applications
24  * \todo Deprecate this application in 1.3dev
25  */
26
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <sys/types.h>
32
33 #include "asterisk.h"
34
35 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
36
37 #include "asterisk/file.h"
38 #include "asterisk/logger.h"
39 #include "asterisk/channel.h"
40 #include "asterisk/pbx.h"
41 #include "asterisk/module.h"
42 #include "asterisk/pbx.h"
43 #include "asterisk/lock.h"
44
45 static char *tdesc = "(Deprecated) Save substring digits in a given variable";
46
47 static char *descrip =
48 "  (Deprecated, use ${variable:a:b} instead)\n"
49 "\n"
50 "  SubString(variable=string_of_digits|count1|count2): Assigns the substring\n"
51 "of string_of_digits to a given variable. Parameter count1 may be positive\n"
52 "or negative. If it's positive then we skip the first count1 digits from the\n"
53 "left. If it's negative, we move count1 digits counting from the end of\n"
54 "the string to the left. Parameter count2 implies how many digits we are\n"
55 "taking from the point that count1 placed us. If count2 is negative, then\n"
56 "that many digits are omitted from the end.\n"
57 "For example:\n"
58 "exten => _NXXXXXX,1,SubString,test=2564286161|0|3\n"
59 "assigns the area code (3 first digits) to variable test.\n"
60 "exten => _NXXXXXX,1,SubString,test=2564286161|-7|7\n"
61 "assigns the last 7 digits to variable test.\n"
62 "exten => _NXXXXXX,1,SubString,test=2564286161|0|-4\n" 
63 "assigns all but the last 4 digits to variable test.\n" 
64 "If there are no parameters it'll return with -1.\n"
65 "If there wrong parameters it go on and return with 0\n";
66
67 static char *app = "SubString";
68
69 static char *synopsis = "(Deprecated) Save substring digits in a given variable";
70
71 STANDARD_LOCAL_USER;
72
73 LOCAL_USER_DECL;
74
75 static int substring_exec(struct ast_channel *chan, void *data)
76 {
77   char newexten[AST_MAX_EXTENSION] = "";
78   char *count1, *count2;
79   char *first, *second, *stringp;
80   struct localuser *u;
81
82   LOCAL_USER_ADD(u);
83
84   stringp=alloca(strlen(data)+1);
85   ast_log(LOG_WARNING, "The use of Substring application is deprecated. Please use ${variable:a:b} instead\n");
86   strncpy(stringp,data,strlen(data));
87   if (strchr(stringp,'|')&&strchr(stringp,'=')) {
88     int icount1,icount2;
89     first=strsep(&stringp,"=");
90     second=strsep(&stringp,"|");
91     count1=strsep(&stringp,"|");
92     count2=strsep(&stringp,"\0");
93     if (!first || !second || !count1 || !count2) {
94       ast_log(LOG_DEBUG, "Ignoring, since there is no argument: variable or string or count1 or count2\n");
95       LOCAL_USER_REMOVE(u);
96       return 0;
97     }
98     icount1=atoi(count1);
99     icount2=atoi(count2);
100         if (icount2<0) {
101           icount2 = icount2 + strlen(second);
102     }
103     if (abs(icount1)>strlen(second)) {
104       ast_log(LOG_WARNING, "Limiting count1 parameter because it exceeds the length of the string\n");
105       if (icount1>=0)
106         icount1=strlen(second);
107       else
108         icount1=0;
109     }
110     if ((icount1<0 && icount2>-icount1) || (icount1>=0 && icount1+icount2>strlen(second))) {
111       ast_log(LOG_WARNING, "Limiting count2 parameter because it exceeds the length of the string\n");
112       if (icount1>=0)
113         icount2=strlen(second)-icount1;
114       else
115         icount2=strlen(second)+icount1;
116     }
117     if (first&&second) {
118       if (icount1>=0)
119         strncpy(newexten,second+icount1,icount2);
120       else
121         strncpy(newexten,second+strlen(second)+icount1,icount2);
122       pbx_builtin_setvar_helper(chan,first,newexten);
123     }
124   } else {
125     ast_log(LOG_DEBUG, "Ignoring, no parameters\n");
126   }
127
128   LOCAL_USER_REMOVE(u);
129
130   return 0;
131 }
132
133 int unload_module(void)
134 {
135         int res;
136
137         res = ast_unregister_application(app);
138
139         STANDARD_HANGUP_LOCALUSERS;
140
141         return res;     
142 }
143
144 int load_module(void)
145 {
146         return ast_register_application(app, substring_exec, synopsis, descrip);
147 }
148
149 char *description(void)
150 {
151         return tdesc;
152 }
153
154 int usecount(void)
155 {
156         int res;
157         STANDARD_USECOUNT(res);
158         return res;
159 }
160
161 char *key()
162 {
163         return ASTERISK_GPL_KEY;
164 }