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