a7c5e6f62c8070e21a21449a019b652fb6f9736a
[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 char *
72 settings_get_str(key)
73         char *key
74 CODE:
75         RETVAL = (char *) settings_get_str(key);
76 OUTPUT:
77         RETVAL
78
79 int
80 settings_get_int(key)
81         char *key
82
83 int
84 settings_get_bool(key)
85         char *key
86
87 void
88 settings_set_str(key, value)
89         char *key
90         char *value
91
92 void
93 settings_set_int(key, value)
94         char *key
95         int value
96
97 void
98 settings_set_bool(key, value)
99         char *key
100         int value
101
102 void
103 settings_add_str(section, key, def)
104         char *section
105         char *key
106         char *def
107 CODE:
108         perl_settings_add(key);
109         settings_add_str_module(MODULE_NAME"/scripts", section, key, def);
110
111 void
112 settings_add_int(section, key, def)
113         char *section
114         char *key
115         int def
116 CODE:
117         perl_settings_add(key);
118         settings_add_int_module(MODULE_NAME"/scripts", section, key, def);
119
120 void
121 settings_add_bool(section, key, def)
122         char *section
123         char *key
124         int def
125 CODE:
126         perl_settings_add(key);
127         settings_add_bool_module(MODULE_NAME"/scripts", section, key, def);
128
129 void
130 settings_remove(key)
131         char *key
132 CODE:
133         perl_settings_remove(key);
134         settings_remove(key);