Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / perl / common / Settings.xs
1 #include "module.h"
2 #include "misc.h"
3
4 static GHashTable *perl_settings;
5
6 static void perl_settings_add(const char *key)
7 {
8         PERL_SCRIPT_REC *script;
9         GSList *list;
10
11         script = perl_script_find_package(perl_get_package());
12         g_return_if_fail(script != NULL);
13
14         list = g_hash_table_lookup(perl_settings, script);
15         list = g_slist_append(list, g_strdup(key));
16         g_hash_table_insert(perl_settings, script, list);
17 }
18
19 static void perl_settings_remove(const char *key)
20 {
21         PERL_SCRIPT_REC *script;
22         GSList *list, *pos;
23
24         script = perl_script_find_package(perl_get_package());
25         g_return_if_fail(script != NULL);
26
27         list = g_hash_table_lookup(perl_settings, script);
28         pos = gslist_find_icase_string(list, key);
29         if (pos != NULL) {
30                 list = g_slist_remove(list, pos->data);
31                 g_hash_table_insert(perl_settings, script, list);
32         }
33 }
34
35 static void perl_settings_free(PERL_SCRIPT_REC *script, GSList *list)
36 {
37         g_slist_foreach(list, (GFunc) g_free, NULL);
38         g_slist_free(list);
39 }
40
41 static void sig_script_destroyed(PERL_SCRIPT_REC *script)
42 {
43         GSList *list;
44
45         list = g_hash_table_lookup(perl_settings, script);
46         if (list != NULL) {
47                 g_slist_foreach(list, (GFunc) settings_remove, NULL);
48                 perl_settings_free(script, list);
49                 g_hash_table_remove(perl_settings, script);
50         }
51 }
52
53 void perl_settings_init(void)
54 {
55         perl_settings = g_hash_table_new((GHashFunc) g_direct_hash,
56                                          (GCompareFunc) g_direct_equal);
57         signal_add("script destroyed", (SIGNAL_FUNC) sig_script_destroyed);
58 }
59
60 void perl_settings_deinit(void)
61 {
62         signal_remove("script destroyed", (SIGNAL_FUNC) sig_script_destroyed);
63
64         g_hash_table_foreach(perl_settings, (GHFunc) perl_settings_free, NULL);
65         g_hash_table_destroy(perl_settings);
66 }
67
68 MODULE = Irssi::Settings  PACKAGE = Irssi
69 PROTOTYPES: ENABLE
70
71 SV *
72 settings_get_str(key)
73         char *key
74 PREINIT:
75         const char *str;
76 CODE:
77         str = settings_get_str(key);
78         RETVAL = new_pv(str);
79 OUTPUT:
80         RETVAL
81
82 int
83 settings_get_int(key)
84         char *key
85
86 int
87 settings_get_bool(key)
88         char *key
89
90 int
91 settings_get_time(key)
92        char *key
93
94 int
95 settings_get_level(key)
96        char *key
97
98 int
99 settings_get_size(key)
100        char *key
101
102 void
103 settings_set_str(key, value)
104         char *key
105         char *value
106
107 void
108 settings_set_int(key, value)
109         char *key
110         int value
111
112 void
113 settings_set_bool(key, value)
114         char *key
115         int value
116
117 int
118 settings_set_time(key, value)
119         char *key
120         char *value
121
122 int
123 settings_set_level(key, value)
124         char *key
125         char *value
126
127 int
128 settings_set_size(key, value)
129         char *key
130         char *value
131
132 void
133 settings_add_str(section, key, def)
134         char *section
135         char *key
136         char *def
137 CODE:
138         perl_settings_add(key);
139         settings_add_str_module(MODULE_NAME"/scripts", section, key, def);
140
141 void
142 settings_add_int(section, key, def)
143         char *section
144         char *key
145         int def
146 CODE:
147         perl_settings_add(key);
148         settings_add_int_module(MODULE_NAME"/scripts", section, key, def);
149
150 void
151 settings_add_bool(section, key, def)
152         char *section
153         char *key
154         int def
155 CODE:
156         perl_settings_add(key);
157         settings_add_bool_module(MODULE_NAME"/scripts", section, key, def);
158
159 void
160 settings_add_time(section, key, def)
161         char *section
162         char *key
163         char *def
164 CODE:
165         perl_settings_add(key);
166         settings_add_time_module(MODULE_NAME"/scripts", section, key, def);
167
168 void
169 settings_add_level(section, key, def)
170         char *section
171         char *key
172         char *def
173 CODE:
174         perl_settings_add(key);
175         settings_add_level_module(MODULE_NAME"/scripts", section, key, def);
176
177 void
178 settings_add_size(section, key, def)
179         char *section
180         char *key
181         char *def
182 CODE:
183         perl_settings_add(key);
184         settings_add_size_module(MODULE_NAME"/scripts", section, key, def);
185
186 void
187 settings_remove(key)
188         char *key
189 CODE:
190         perl_settings_remove(key);
191         settings_remove(key);