4db742c044e29ebc29c6ae573f482bab21505784
[crypto.git] / apps / irssi / src / perl / common / Core.xs
1 #include "module.h"
2 #include "irssi-version.h"
3
4 #define DEFAULT_COMMAND_CATEGORY "Perl scripts' commands"
5
6 void perl_signal_add_hash(int priority, SV *sv)
7 {
8         HV *hv;
9         HE *he;
10         I32 len;
11
12         if (!is_hvref(sv))
13                 croak("Usage: Irssi::signal_add(hash)");
14
15         hv = hvref(sv);
16         hv_iterinit(hv);
17         while ((he = hv_iternext(hv)) != NULL)
18                 perl_signal_add_to(hv_iterkey(he, &len), HeVAL(he), priority);
19 }
20
21 static void perl_command_bind_add_hash(int priority, SV *sv, char *category)
22 {
23         HV *hv;
24         HE *he;
25         I32 len;
26
27         hv = hvref(sv);
28         hv_iterinit(hv);
29         while ((he = hv_iternext(hv)) != NULL)
30                 perl_command_bind_to(hv_iterkey(he, &len), category, HeVAL(he), priority);
31 }
32
33 static void handle_command_bind(int priority, int items, SV *p0, SV *p1, SV *p2)
34 {
35         char *category;
36         int hash;
37
38         hash = items > 0 && is_hvref(p0);
39         if (!hash) {
40                 if (items < 2 || items > 3)
41                         croak("Usage: Irssi::command_bind(signal, func, category)");
42         } else if (items > 2)
43                 croak("Usage: Irssi::command_bind(signals_hash, category)");
44
45         if (!hash) {
46                 category = items < 3 ? DEFAULT_COMMAND_CATEGORY :
47                         (char *)SvPV(p2, PL_na);
48                 perl_command_bind_to((char *)SvPV(p0, PL_na), category, p1, priority);
49         } else {
50                 category = items < 2 ? DEFAULT_COMMAND_CATEGORY :
51                         (char *)SvPV(p1, PL_na);
52                 perl_command_bind_add_hash(priority, p0, category);
53         }
54 }
55
56 MODULE = Irssi::Core  PACKAGE = Irssi
57 PROTOTYPES: ENABLE
58
59 void
60 signal_emit(signal, ...)
61         char *signal
62 CODE:
63         void *p[SIGNAL_MAX_ARGUMENTS];
64         int n;
65
66         memset(p, 0, sizeof(p));
67         for (n = 1; n < items && n < SIGNAL_MAX_ARGUMENTS+1; n++) {
68                 if (SvPOKp(ST(n)))
69                         p[n-1] = SvPV(ST(n), PL_na);
70                 else if (irssi_is_ref_object(ST(n)))
71                         p[n-1] = irssi_ref_object(ST(n));
72                 else if (SvROK(ST(n)))
73                         p[n-1] = (void *) SvIV((SV*)SvRV(ST(n)));
74                 else
75                         p[n-1] = NULL;
76         }
77         signal_emit(signal, items-1, p[0], p[1], p[2], p[3], p[4], p[5]);
78
79 void
80 signal_add(...)
81 CODE:
82         if (items != 1 && items != 2)
83                 croak("Usage: Irssi::signal_add(signal, func)");
84         if (items == 2)
85                 perl_signal_add((char *)SvPV(ST(0),PL_na), ST(1));
86         else
87                 perl_signal_add_hash(1, ST(0));
88
89 void
90 signal_add_first(...)
91 CODE:
92         if (items != 1 && items != 2)
93                 croak("Usage: Irssi::signal_add_first(signal, func)");
94         if (items == 2)
95                 perl_signal_add_first((char *)SvPV(ST(0),PL_na), ST(1));
96         else
97                 perl_signal_add_hash(0, ST(0));
98
99 void
100 signal_add_last(...)
101 CODE:
102         if (items != 1 && items != 2)
103                 croak("Usage: Irssi::signal_add_last(signal, func)");
104         if (items == 2)
105                 perl_signal_add_last((char *)SvPV(ST(0),PL_na), ST(1));
106         else
107                 perl_signal_add_hash(2, ST(0));
108
109 void
110 signal_remove(signal, func)
111         char *signal
112         SV *func
113 CODE:
114         perl_signal_remove(signal, func);
115
116 void
117 signal_stop()
118
119 void
120 signal_stop_by_name(signal)
121         char *signal
122
123 char *
124 signal_get_emitted()
125 CODE:
126         RETVAL = (char *) signal_get_emitted();
127 OUTPUT:
128         RETVAL
129
130 int
131 signal_get_emitted_id()
132
133 int
134 timeout_add(msecs, func, data)
135         int msecs
136         SV *func
137         SV *data
138 CODE:
139         RETVAL = perl_timeout_add(msecs, func, data);
140 OUTPUT:
141         RETVAL
142
143 void
144 timeout_remove(tag)
145         int tag
146 CODE:
147         perl_source_remove(tag);
148
149
150 int
151 INPUT_READ()
152 CODE:
153         RETVAL = G_INPUT_READ;
154 OUTPUT:
155         RETVAL
156
157 int
158 INPUT_WRITE()
159 CODE:
160         RETVAL = G_INPUT_WRITE;
161 OUTPUT:
162         RETVAL
163
164 int
165 input_add(source, condition, func, data)
166         int source
167         int condition
168         SV *func
169         SV *data
170 CODE:
171         RETVAL = perl_input_add(source, condition, func, data);
172 OUTPUT:
173         RETVAL
174
175 void
176 input_remove(tag)
177         int tag
178 CODE:
179         perl_source_remove(tag);
180
181 # maybe there's some easier way than this..? :)
182 int
183 MSGLEVEL_CRAP()
184 CODE:
185         RETVAL = MSGLEVEL_CRAP;
186 OUTPUT:
187         RETVAL
188
189 int
190 MSGLEVEL_MSGS()
191 CODE:
192         RETVAL = MSGLEVEL_MSGS;
193 OUTPUT:
194         RETVAL
195
196 int
197 MSGLEVEL_PUBLIC()
198 CODE:
199         RETVAL = MSGLEVEL_PUBLIC;
200 OUTPUT:
201         RETVAL
202
203 int
204 MSGLEVEL_NOTICES()
205 CODE:
206         RETVAL = MSGLEVEL_NOTICES;
207 OUTPUT:
208         RETVAL
209
210 int
211 MSGLEVEL_SNOTES()
212 CODE:
213         RETVAL = MSGLEVEL_SNOTES;
214 OUTPUT:
215         RETVAL
216
217 int
218 MSGLEVEL_CTCPS()
219 CODE:
220         RETVAL = MSGLEVEL_CTCPS;
221 OUTPUT:
222         RETVAL
223
224 int
225 MSGLEVEL_ACTIONS()
226 CODE:
227         RETVAL = MSGLEVEL_ACTIONS;
228 OUTPUT:
229         RETVAL
230
231 int
232 MSGLEVEL_JOINS()
233 CODE:
234         RETVAL = MSGLEVEL_JOINS;
235 OUTPUT:
236         RETVAL
237
238 int
239 MSGLEVEL_PARTS()
240 CODE:
241         RETVAL = MSGLEVEL_PARTS;
242 OUTPUT:
243         RETVAL
244
245 int
246 MSGLEVEL_QUITS()
247 CODE:
248         RETVAL = MSGLEVEL_QUITS;
249 OUTPUT:
250         RETVAL
251
252 int
253 MSGLEVEL_KICKS()
254 CODE:
255         RETVAL = MSGLEVEL_KICKS;
256 OUTPUT:
257         RETVAL
258
259 int
260 MSGLEVEL_MODES()
261 CODE:
262         RETVAL = MSGLEVEL_MODES;
263 OUTPUT:
264         RETVAL
265
266 int
267 MSGLEVEL_TOPICS()
268 CODE:
269         RETVAL = MSGLEVEL_TOPICS;
270 OUTPUT:
271         RETVAL
272
273 int
274 MSGLEVEL_WALLOPS()
275 CODE:
276         RETVAL = MSGLEVEL_WALLOPS;
277 OUTPUT:
278         RETVAL
279
280 int
281 MSGLEVEL_INVITES()
282 CODE:
283         RETVAL = MSGLEVEL_INVITES;
284 OUTPUT:
285         RETVAL
286
287 int
288 MSGLEVEL_NICKS()
289 CODE:
290         RETVAL = MSGLEVEL_NICKS;
291 OUTPUT:
292         RETVAL
293
294 int
295 MSGLEVEL_DCC()
296 CODE:
297         RETVAL = MSGLEVEL_DCC;
298 OUTPUT:
299         RETVAL
300
301 int
302 MSGLEVEL_DCCMSGS()
303 CODE:
304         RETVAL = MSGLEVEL_DCCMSGS;
305 OUTPUT:
306         RETVAL
307
308 int
309 MSGLEVEL_CLIENTNOTICE()
310 CODE:
311         RETVAL = MSGLEVEL_CLIENTNOTICE;
312 OUTPUT:
313         RETVAL
314
315 int
316 MSGLEVEL_CLIENTCRAP()
317 CODE:
318         RETVAL = MSGLEVEL_CLIENTCRAP;
319 OUTPUT:
320         RETVAL
321
322 int
323 MSGLEVEL_CLIENTERROR()
324 CODE:
325         RETVAL = MSGLEVEL_CLIENTERROR;
326 OUTPUT:
327         RETVAL
328
329 int
330 MSGLEVEL_HILIGHT()
331 CODE:
332         RETVAL = MSGLEVEL_HILIGHT;
333 OUTPUT:
334         RETVAL
335
336 int
337 MSGLEVEL_ALL()
338 CODE:
339         RETVAL = MSGLEVEL_ALL;
340 OUTPUT:
341         RETVAL
342
343 int
344 MSGLEVEL_NOHILIGHT()
345 CODE:
346         RETVAL = MSGLEVEL_NOHILIGHT;
347 OUTPUT:
348         RETVAL
349
350 int
351 MSGLEVEL_NO_ACT()
352 CODE:
353         RETVAL = MSGLEVEL_NO_ACT;
354 OUTPUT:
355         RETVAL
356
357 int
358 MSGLEVEL_NEVER()
359 CODE:
360         RETVAL = MSGLEVEL_NEVER;
361 OUTPUT:
362         RETVAL
363
364 int
365 MSGLEVEL_LASTLOG()
366 CODE:
367         RETVAL = MSGLEVEL_LASTLOG;
368 OUTPUT:
369         RETVAL
370
371 int
372 level2bits(str)
373         char *str
374
375 char *
376 bits2level(bits)
377         int bits
378
379 int
380 combine_level(level, str)
381         int level
382         char *str
383
384 void
385 command(cmd)
386         char *cmd
387 CODE:
388         perl_command(cmd, NULL, NULL);
389
390 void
391 commands()
392 PREINIT:
393         GSList *tmp;
394 PPCODE:
395         for (tmp = commands; tmp != NULL; tmp = tmp->next) {
396                 XPUSHs(sv_2mortal(plain_bless(tmp->data, "Irssi::Command")));
397         }
398
399 void
400 command_bind_first(...)
401 CODE:
402         handle_command_bind(0, items, ST(0), ST(1), ST(2));
403
404 void
405 command_bind(...)
406 CODE:
407         handle_command_bind(1, items, ST(0), ST(1), ST(2));
408
409 void
410 command_bind_last(...)
411 CODE:
412         handle_command_bind(2, items, ST(0), ST(1), ST(2));
413
414 void
415 command_runsub(cmd, data, server, item)
416         char *cmd
417         char *data
418         Irssi::Server server
419         Irssi::Windowitem item
420 CODE:
421         perl_command_runsub(cmd, data, server, item);
422
423 void
424 command_unbind(cmd, func)
425         char *cmd
426         SV *func
427 CODE:
428         perl_command_unbind(cmd, func);
429
430 void
431 command_set_options(cmd, options)
432         char *cmd
433         char *options
434
435 void
436 pidwait_add(pid)
437         int pid
438
439 void 
440 pidwait_remove(pid)
441         int pid
442
443 char *
444 parse_special(cmd, data="", flags=0)
445         char *cmd
446         char *data
447         int flags
448 PREINIT:
449         char *ret;
450 PPCODE:
451         ret = parse_special_string(cmd, NULL, NULL, data, NULL, flags);
452         XPUSHs(sv_2mortal(new_pv(ret)));
453         g_free_not_null(ret);
454
455 char *
456 get_irssi_dir()
457 CODE:
458         RETVAL = (char *) get_irssi_dir();
459 OUTPUT:
460         RETVAL
461
462 char *
463 get_irssi_config()
464 CODE:
465         RETVAL = (char *) get_irssi_config();
466 OUTPUT:
467         RETVAL
468
469 char *
470 version()
471 PREINIT:
472         char version[100];
473 CODE:
474         g_snprintf(version, sizeof(version), "%d.%04d",
475                    IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
476         RETVAL = version;
477 OUTPUT:
478         RETVAL
479
480 #*******************************
481 MODULE = Irssi::Core    PACKAGE = Irssi::Server
482 #*******************************
483
484 void
485 parse_special(server, cmd, data="", flags=0)
486         Irssi::Server server
487         char *cmd
488         char *data
489         int flags
490 PREINIT:
491         char *ret;
492 PPCODE:
493         ret = parse_special_string(cmd, server, NULL, data, NULL, flags);
494         XPUSHs(sv_2mortal(new_pv(ret)));
495         g_free_not_null(ret);
496
497 void
498 command(server, cmd)
499         Irssi::Server server
500         char *cmd
501 CODE:
502         perl_command(cmd, server, NULL);
503
504
505 #*******************************
506 MODULE = Irssi::Core    PACKAGE = Irssi::Windowitem
507 #*******************************
508
509 void
510 parse_special(item, cmd, data="", flags=0)
511         Irssi::Windowitem item
512         char *cmd
513         char *data
514         int flags
515 PREINIT:
516         char *ret;
517 PPCODE:
518         ret = parse_special_string(cmd, item->server, item, data, NULL, flags);
519         XPUSHs(sv_2mortal(new_pv(ret)));
520         g_free_not_null(ret);
521
522 void
523 command(item, cmd)
524         Irssi::Windowitem item
525         char *cmd
526 CODE:
527         perl_command(cmd, item->server, item);
528