pbx: Create pbx_sw.c for management of 'struct ast_sw'.
[asterisk/asterisk.git] / main / pbx_sw.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2016, CFWare, LLC
5  *
6  * Corey Farrell <git@cfware.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 Dialplan switch routines.
22  *
23  * \author Corey Farrell <git@cfware.com>
24  */
25
26 /*** MODULEINFO
27         <support_level>core</support_level>
28  ***/
29
30 #include "asterisk.h"
31
32 ASTERISK_REGISTER_FILE()
33
34 #include "asterisk/_private.h"
35 #include "asterisk/pbx.h"
36 #include "pbx_private.h"
37
38 /*! \brief ast_sw: Switch statement in extensions.conf */
39 struct ast_sw {
40         const char *name;
41         /*! Registrar */
42         const char *registrar;
43         /*! Data load */
44         const char *data;
45         int eval;
46         AST_LIST_ENTRY(ast_sw) list;
47         char stuff[0];
48 };
49
50 const char *ast_get_switch_name(const struct ast_sw *sw)
51 {
52         return sw ? sw->name : NULL;
53 }
54
55 const char *ast_get_switch_data(const struct ast_sw *sw)
56 {
57         return sw ? sw->data : NULL;
58 }
59
60 int ast_get_switch_eval(const struct ast_sw *sw)
61 {
62         return sw->eval;
63 }
64
65 const char *ast_get_switch_registrar(const struct ast_sw *sw)
66 {
67         return sw ? sw->registrar : NULL;
68 }
69
70 struct ast_sw *sw_alloc(const char *value, const char *data, int eval, const char *registrar)
71 {
72         struct ast_sw *new_sw;
73         int length;
74         char *p;
75
76         if (!data) {
77                 data = "";
78         }
79         length = sizeof(struct ast_sw);
80         length += strlen(value) + 1;
81         length += strlen(data) + 1;
82
83         /* allocate new sw structure ... */
84         if (!(new_sw = ast_calloc(1, length))) {
85                 return NULL;
86         }
87
88         /* ... fill in this structure ... */
89         p = new_sw->stuff;
90         new_sw->name = p;
91         strcpy(p, value);
92
93         p += strlen(value) + 1;
94         new_sw->data = p;
95         strcpy(p, data);
96
97         new_sw->eval      = eval;
98         new_sw->registrar = registrar;
99
100         return new_sw;
101 }
102
103 void sw_free(struct ast_sw *sw)
104 {
105         ast_free(sw);
106 }
107