updates.
[silc.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_full(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_continue(...)
81 CODE:
82         void *p[SIGNAL_MAX_ARGUMENTS];
83         int n;
84
85         memset(p, 0, sizeof(p));
86         for (n = 0; n < items && n < SIGNAL_MAX_ARGUMENTS; n++) {
87                 if (SvPOKp(ST(n)))
88                         p[n] = SvPV(ST(n), PL_na);
89                 else if (irssi_is_ref_object(ST(n)))
90                         p[n] = irssi_ref_object(ST(n));
91                 else if (SvROK(ST(n)))
92                         p[n] = (void *) SvIV((SV*)SvRV(ST(n)));
93                 else
94                         p[n] = NULL;
95         }
96         signal_continue(items, p[0], p[1], p[2], p[3], p[4], p[5]);
97
98 void
99 signal_add(...)
100 CODE:
101         if (items != 1 && items != 2)
102                 croak("Usage: Irssi::signal_add(signal, func)");
103         if (items == 2)
104                 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
105                                      SIGNAL_PRIORITY_DEFAULT);
106         else
107                 perl_signal_add_hash(SIGNAL_PRIORITY_DEFAULT, ST(0));
108
109 void
110 signal_add_first(...)
111 CODE:
112         if (items != 1 && items != 2)
113                 croak("Usage: Irssi::signal_add_first(signal, func)");
114         if (items == 2)
115                 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
116                                      SIGNAL_PRIORITY_HIGH);
117         else
118                 perl_signal_add_hash(SIGNAL_PRIORITY_HIGH, ST(0));
119
120 void
121 signal_add_last(...)
122 CODE:
123         if (items != 1 && items != 2)
124                 croak("Usage: Irssi::signal_add_last(signal, func)");
125         if (items == 2)
126                 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
127                                      SIGNAL_PRIORITY_LOW);
128         else
129                 perl_signal_add_hash(SIGNAL_PRIORITY_LOW, ST(0));
130
131 void
132 signal_add_priority(...)
133 CODE:
134         if (items != 2 && items != 3)
135                 croak("Usage: Irssi::signal_add_priority(signal, func, priority)");
136         if (items == 3)
137                 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1), SvIV(ST(2)));
138         else
139                 perl_signal_add_hash(SvIV(ST(0)), ST(1));
140
141 int
142 SIGNAL_PRIORITY_LOW()
143 CODE:
144         RETVAL = SIGNAL_PRIORITY_LOW;
145 OUTPUT:
146         RETVAL
147
148 int
149 SIGNAL_PRIORITY_DEFAULT()
150 CODE:
151         RETVAL = SIGNAL_PRIORITY_DEFAULT;
152 OUTPUT:
153         RETVAL
154
155 int
156 SIGNAL_PRIORITY_HIGH()
157 CODE:
158         RETVAL = SIGNAL_PRIORITY_HIGH;
159 OUTPUT:
160         RETVAL
161
162 void
163 signal_remove(signal, func)
164         char *signal
165         SV *func
166 CODE:
167         perl_signal_remove(signal, func);
168
169 void
170 signal_stop()
171
172 void
173 signal_stop_by_name(signal)
174         char *signal
175
176 char *
177 signal_get_emitted()
178 CODE:
179         RETVAL = (char *) signal_get_emitted();
180 OUTPUT:
181         RETVAL
182
183 int
184 signal_get_emitted_id()
185
186 int
187 timeout_add(msecs, func, data)
188         int msecs
189         SV *func
190         SV *data
191 CODE:
192         if (msecs < 10) {
193                 croak("Irssi::timeout() : msecs must be >= 10");
194                 RETVAL = -1;
195         } else {
196                 RETVAL = perl_timeout_add(msecs, func, data, FALSE);
197         }
198 OUTPUT:
199         RETVAL
200
201 int
202 timeout_add_once(msecs, func, data)
203         int msecs
204         SV *func
205         SV *data
206 CODE:
207         if (msecs < 10) {
208                 croak("Irssi::timeout_once() : msecs must be >= 10");
209                 RETVAL = -1;
210         } else {
211                 RETVAL = perl_timeout_add(msecs, func, data, TRUE);
212         }
213 OUTPUT:
214         RETVAL
215
216 void
217 timeout_remove(tag)
218         int tag
219 CODE:
220         perl_source_remove(tag);
221
222
223 int
224 INPUT_READ()
225 CODE:
226         RETVAL = G_INPUT_READ;
227 OUTPUT:
228         RETVAL
229
230 int
231 INPUT_WRITE()
232 CODE:
233         RETVAL = G_INPUT_WRITE;
234 OUTPUT:
235         RETVAL
236
237 int
238 input_add(source, condition, func, data)
239         int source
240         int condition
241         SV *func
242         SV *data
243 CODE:
244         RETVAL = perl_input_add(source, condition, func, data);
245 OUTPUT:
246         RETVAL
247
248 void
249 input_remove(tag)
250         int tag
251 CODE:
252         perl_source_remove(tag);
253
254 # maybe there's some easier way than this..? :)
255 int
256 MSGLEVEL_CRAP()
257 CODE:
258         RETVAL = MSGLEVEL_CRAP;
259 OUTPUT:
260         RETVAL
261
262 int
263 MSGLEVEL_MSGS()
264 CODE:
265         RETVAL = MSGLEVEL_MSGS;
266 OUTPUT:
267         RETVAL
268
269 int
270 MSGLEVEL_PUBLIC()
271 CODE:
272         RETVAL = MSGLEVEL_PUBLIC;
273 OUTPUT:
274         RETVAL
275
276 int
277 MSGLEVEL_NOTICES()
278 CODE:
279         RETVAL = MSGLEVEL_NOTICES;
280 OUTPUT:
281         RETVAL
282
283 int
284 MSGLEVEL_SNOTES()
285 CODE:
286         RETVAL = MSGLEVEL_SNOTES;
287 OUTPUT:
288         RETVAL
289
290 int
291 MSGLEVEL_CTCPS()
292 CODE:
293         RETVAL = MSGLEVEL_CTCPS;
294 OUTPUT:
295         RETVAL
296
297 int
298 MSGLEVEL_ACTIONS()
299 CODE:
300         RETVAL = MSGLEVEL_ACTIONS;
301 OUTPUT:
302         RETVAL
303
304 int
305 MSGLEVEL_JOINS()
306 CODE:
307         RETVAL = MSGLEVEL_JOINS;
308 OUTPUT:
309         RETVAL
310
311 int
312 MSGLEVEL_PARTS()
313 CODE:
314         RETVAL = MSGLEVEL_PARTS;
315 OUTPUT:
316         RETVAL
317
318 int
319 MSGLEVEL_QUITS()
320 CODE:
321         RETVAL = MSGLEVEL_QUITS;
322 OUTPUT:
323         RETVAL
324
325 int
326 MSGLEVEL_KICKS()
327 CODE:
328         RETVAL = MSGLEVEL_KICKS;
329 OUTPUT:
330         RETVAL
331
332 int
333 MSGLEVEL_MODES()
334 CODE:
335         RETVAL = MSGLEVEL_MODES;
336 OUTPUT:
337         RETVAL
338
339 int
340 MSGLEVEL_TOPICS()
341 CODE:
342         RETVAL = MSGLEVEL_TOPICS;
343 OUTPUT:
344         RETVAL
345
346 int
347 MSGLEVEL_WALLOPS()
348 CODE:
349         RETVAL = MSGLEVEL_WALLOPS;
350 OUTPUT:
351         RETVAL
352
353 int
354 MSGLEVEL_INVITES()
355 CODE:
356         RETVAL = MSGLEVEL_INVITES;
357 OUTPUT:
358         RETVAL
359
360 int
361 MSGLEVEL_NICKS()
362 CODE:
363         RETVAL = MSGLEVEL_NICKS;
364 OUTPUT:
365         RETVAL
366
367 int
368 MSGLEVEL_DCC()
369 CODE:
370         RETVAL = MSGLEVEL_DCC;
371 OUTPUT:
372         RETVAL
373
374 int
375 MSGLEVEL_DCCMSGS()
376 CODE:
377         RETVAL = MSGLEVEL_DCCMSGS;
378 OUTPUT:
379         RETVAL
380
381 int
382 MSGLEVEL_CLIENTNOTICE()
383 CODE:
384         RETVAL = MSGLEVEL_CLIENTNOTICE;
385 OUTPUT:
386         RETVAL
387
388 int
389 MSGLEVEL_CLIENTCRAP()
390 CODE:
391         RETVAL = MSGLEVEL_CLIENTCRAP;
392 OUTPUT:
393         RETVAL
394
395 int
396 MSGLEVEL_CLIENTERROR()
397 CODE:
398         RETVAL = MSGLEVEL_CLIENTERROR;
399 OUTPUT:
400         RETVAL
401
402 int
403 MSGLEVEL_HILIGHT()
404 CODE:
405         RETVAL = MSGLEVEL_HILIGHT;
406 OUTPUT:
407         RETVAL
408
409 int
410 MSGLEVEL_ALL()
411 CODE:
412         RETVAL = MSGLEVEL_ALL;
413 OUTPUT:
414         RETVAL
415
416 int
417 MSGLEVEL_NOHILIGHT()
418 CODE:
419         RETVAL = MSGLEVEL_NOHILIGHT;
420 OUTPUT:
421         RETVAL
422
423 int
424 MSGLEVEL_NO_ACT()
425 CODE:
426         RETVAL = MSGLEVEL_NO_ACT;
427 OUTPUT:
428         RETVAL
429
430 int
431 MSGLEVEL_NEVER()
432 CODE:
433         RETVAL = MSGLEVEL_NEVER;
434 OUTPUT:
435         RETVAL
436
437 int
438 MSGLEVEL_LASTLOG()
439 CODE:
440         RETVAL = MSGLEVEL_LASTLOG;
441 OUTPUT:
442         RETVAL
443
444 int
445 level2bits(str)
446         char *str
447
448 void
449 bits2level(bits)
450         int bits
451 PREINIT:
452         char *ret;
453 PPCODE:
454         ret = bits2level(bits);
455         XPUSHs(sv_2mortal(new_pv(ret)));
456         g_free(ret);
457
458 int
459 combine_level(level, str)
460         int level
461         char *str
462
463 void
464 command(cmd)
465         char *cmd
466 CODE:
467         perl_command(cmd, NULL, NULL);
468
469 void
470 commands()
471 PREINIT:
472         GSList *tmp;
473 PPCODE:
474         for (tmp = commands; tmp != NULL; tmp = tmp->next) {
475                 XPUSHs(sv_2mortal(plain_bless(tmp->data, "Irssi::Command")));
476         }
477
478 void
479 command_bind_first(...)
480 CODE:
481         handle_command_bind(SIGNAL_PRIORITY_HIGH, items, ST(0), ST(1), ST(2));
482
483 void
484 command_bind(...)
485 CODE:
486         handle_command_bind(SIGNAL_PRIORITY_DEFAULT, items, ST(0), ST(1), ST(2));
487
488 void
489 command_bind_last(...)
490 CODE:
491         handle_command_bind(SIGNAL_PRIORITY_LOW, items, ST(0), ST(1), ST(2));
492
493 void
494 command_runsub(cmd, data, server, item)
495         char *cmd
496         char *data
497         Irssi::Server server
498         Irssi::Windowitem item
499 CODE:
500         perl_command_runsub(cmd, data, server, item);
501
502 void
503 command_unbind(cmd, func)
504         char *cmd
505         SV *func
506 CODE:
507         perl_command_unbind(cmd, func);
508
509 void
510 command_set_options(cmd, options)
511         char *cmd
512         char *options
513
514 void
515 pidwait_add(pid)
516         int pid
517
518 void 
519 pidwait_remove(pid)
520         int pid
521
522 void
523 parse_special(cmd, data="", flags=0)
524         char *cmd
525         char *data
526         int flags
527 PREINIT:
528         char *ret;
529 PPCODE:
530         ret = parse_special_string(cmd, NULL, NULL, data, NULL, flags);
531         XPUSHs(sv_2mortal(new_pv(ret)));
532         g_free_not_null(ret);
533
534 char *
535 get_irssi_dir()
536 CODE:
537         RETVAL = (char *) get_irssi_dir();
538 OUTPUT:
539         RETVAL
540
541 char *
542 get_irssi_config()
543 CODE:
544         RETVAL = (char *) get_irssi_config();
545 OUTPUT:
546         RETVAL
547
548 char *
549 version()
550 PREINIT:
551         char version[100];
552 CODE:
553         g_snprintf(version, sizeof(version), "%d.%04d",
554                    IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
555         RETVAL = version;
556 OUTPUT:
557         RETVAL
558
559 #*******************************
560 MODULE = Irssi::Core    PACKAGE = Irssi::Server
561 #*******************************
562
563 void
564 parse_special(server, cmd, data="", flags=0)
565         Irssi::Server server
566         char *cmd
567         char *data
568         int flags
569 PREINIT:
570         char *ret;
571 PPCODE:
572         ret = parse_special_string(cmd, server, NULL, data, NULL, flags);
573         XPUSHs(sv_2mortal(new_pv(ret)));
574         g_free_not_null(ret);
575
576 void
577 command(server, cmd)
578         Irssi::Server server
579         char *cmd
580 CODE:
581         perl_command(cmd, server, NULL);
582
583
584 #*******************************
585 MODULE = Irssi::Core    PACKAGE = Irssi::Windowitem
586 #*******************************
587
588 void
589 parse_special(item, cmd, data="", flags=0)
590         Irssi::Windowitem item
591         char *cmd
592         char *data
593         int flags
594 PREINIT:
595         char *ret;
596 PPCODE:
597         ret = parse_special_string(cmd, item->server, item, data, NULL, flags);
598         XPUSHs(sv_2mortal(new_pv(ret)));
599         g_free_not_null(ret);
600
601 void
602 command(item, cmd)
603         Irssi::Windowitem item
604         char *cmd
605 CODE:
606         perl_command(cmd, item->server, item);
607