various menuselect fixes as a result of boredom during a 9 hour flight and
[asterisk/asterisk.git] / build_tools / menuselect.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005-2006, Russell Bryant
5  *
6  * Russell Bryant <russell@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 /*!
20  * \file
21  *
22  * \brief public data structures and defaults for menuselect
23  *
24  */
25
26 #ifndef MENUSELECT_H
27 #define MENUSELECT_H
28
29 #include "asterisk/linkedlists.h"
30
31 #define OUTPUT_MAKEOPTS_DEFAULT "menuselect.makeopts"
32 #define MENUSELECT_DEPS         "build_tools/menuselect-deps"
33
34 struct depend;
35 struct conflict;
36
37 struct member {
38         /*! What will be sent to the makeopts file */
39         const char *name;
40         /*! Default setting */
41         const char *defaultenabled;
42         /*! This module is currently selected */
43         int enabled;
44         /*! This module has failed dependencies */
45         int depsfailed;
46         /*! This module has failed conflicts */
47         int conflictsfailed;
48         /*! dependencies of this module */
49         AST_LIST_HEAD_NOLOCK(, depend) deps;
50         /*! conflicts of this module */
51         AST_LIST_HEAD_NOLOCK(, conflict) conflicts;
52         /*! for making a list of modules */
53         AST_LIST_ENTRY(member) list;
54 };
55
56 struct category {
57         /*! the Makefile variable */
58         const char *name;
59         /*! the name displayed in the menu */
60         const char *displayname;
61         /*! Display what is selected, as opposed to not selected */
62         int positive_output;
63         /*! Force a clean of the source tree if anything in this category changes */
64         int force_clean_on_change;
65         /*! the list of possible values to be set in this variable */
66         AST_LIST_HEAD_NOLOCK(, member) members;
67         /*! for linking */
68         AST_LIST_ENTRY(category) list;
69 };
70
71 extern AST_LIST_HEAD_NOLOCK(categories, category) categories;
72
73 /*! This is implemented by the frontend */
74 int run_menu(void);
75
76 int count_categories(void);
77
78 int count_members(struct category *cat);
79
80 /*! \brief Toggle a member of a category at the specified index to enabled/disabled */
81 void toggle_enabled(struct category *cat, int index);
82
83 /*! \brief Enable/Disable all members of a category as long as dependencies have been met and no conflicts are found */
84 void set_all(struct category *cat, int val);
85
86 /*! \brief returns non-zero if the string is not defined, or has zero length */
87 static inline int strlen_zero(const char *s)
88 {
89         return (!s || (*s == '\0'));
90 }
91
92 #endif /* MENUSELECT_H */