Merge rgagnon's pedantic string changes (apps n-z) (bug #2038)
[asterisk/asterisk.git] / apps / app_striplsd.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Skeleton application
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <sys/types.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/channel.h>
18 #include <asterisk/pbx.h>
19 #include <asterisk/module.h>
20 #include <asterisk/lock.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <stdlib.h>
25
26 static char *tdesc = "Strip trailing digits";
27
28 static char *descrip =
29 "  StripLSD(count): Strips the trailing  'count'  digits  from  the  channel's\n"
30 "associated extension. For example, the  number  5551212 when stripped with a\n"
31 "count of 4 would be changed to 555.  This app always returns 0, and the PBX\n"
32 "will continue processing at the next priority for the *new* extension.\n"
33 "  So, for  example, if  priority 3 of 5551212  is  StripLSD 4, the next step\n"
34 "executed will be priority 4 of 555.  If you switch into an  extension which\n"
35 "has no first step, the PBX will treat it as though the user dialed an\n"
36 "invalid extension.\n";
37
38 static char *app = "StripLSD";
39
40 static char *synopsis = "Strip Least Significant Digits";
41
42 STANDARD_LOCAL_USER;
43
44 LOCAL_USER_DECL;
45
46 static int striplsd_exec(struct ast_channel *chan, void *data)
47 {
48         char newexten[AST_MAX_EXTENSION] = "";
49         int maxbytes = 0;
50         int stripcount = 0;
51         int extlen = strlen(chan->exten);
52
53         maxbytes = sizeof(newexten) - 1;
54         if (data) {
55                 stripcount = atoi(data);
56         }
57         if (!stripcount) {
58                 ast_log(LOG_DEBUG, "Ignoring, since number of digits to strip is 0\n");
59                 return 0;
60         }
61         if (extlen > stripcount) {
62                 if (extlen - stripcount <= maxbytes) {
63                         maxbytes = extlen - stripcount;
64                 }
65                 strncpy(newexten, chan->exten, maxbytes);
66         }
67         strncpy(chan->exten, newexten, sizeof(chan->exten)-1);
68         return 0;
69 }
70
71 int unload_module(void)
72 {
73         STANDARD_HANGUP_LOCALUSERS;
74         return ast_unregister_application(app);
75 }
76
77 int load_module(void)
78 {
79         return ast_register_application(app, striplsd_exec, synopsis, descrip);
80 }
81
82 char *description(void)
83 {
84         return tdesc;
85 }
86
87 int usecount(void)
88 {
89         int res;
90         STANDARD_USECOUNT(res);
91         return res;
92 }
93
94 char *key()
95 {
96         return ASTERISK_GPL_KEY;
97 }