Merges from Irssi CVS.
[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_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);
197         }
198 OUTPUT:
199         RETVAL
200
201 void
202 timeout_remove(tag)
203         int tag
204 CODE:
205         perl_source_remove(tag);
206
207
208 int
209 INPUT_READ()
210 CODE:
211         RETVAL = G_INPUT_READ;
212 OUTPUT:
213         RETVAL
214
215 int
216 INPUT_WRITE()
217 CODE:
218         RETVAL = G_INPUT_WRITE;
219 OUTPUT:
220         RETVAL
221
222 int
223 input_add(source, condition, func, data)
224         int source
225         int condition
226         SV *func
227         SV *data
228 CODE:
229         RETVAL = perl_input_add(source, condition, func, data);
230 OUTPUT:
231         RETVAL
232
233 void
234 input_remove(tag)
235         int tag
236 CODE:
237         perl_source_remove(tag);
238
239 # maybe there's some easier way than this..? :)
240 int
241 MSGLEVEL_CRAP()
242 CODE:
243         RETVAL = MSGLEVEL_CRAP;
244 OUTPUT:
245         RETVAL
246
247 int
248 MSGLEVEL_MSGS()
249 CODE:
250         RETVAL = MSGLEVEL_MSGS;
251 OUTPUT:
252         RETVAL
253
254 int
255 MSGLEVEL_PUBLIC()
256 CODE:
257         RETVAL = MSGLEVEL_PUBLIC;
258 OUTPUT:
259         RETVAL
260
261 int
262 MSGLEVEL_NOTICES()
263 CODE:
264         RETVAL = MSGLEVEL_NOTICES;
265 OUTPUT:
266         RETVAL
267
268 int
269 MSGLEVEL_SNOTES()
270 CODE:
271         RETVAL = MSGLEVEL_SNOTES;
272 OUTPUT:
273         RETVAL
274
275 int
276 MSGLEVEL_CTCPS()
277 CODE:
278         RETVAL = MSGLEVEL_CTCPS;
279 OUTPUT:
280         RETVAL
281
282 int
283 MSGLEVEL_ACTIONS()
284 CODE:
285         RETVAL = MSGLEVEL_ACTIONS;
286 OUTPUT:
287         RETVAL
288
289 int
290 MSGLEVEL_JOINS()
291 CODE:
292         RETVAL = MSGLEVEL_JOINS;
293 OUTPUT:
294         RETVAL
295
296 int
297 MSGLEVEL_PARTS()
298 CODE:
299         RETVAL = MSGLEVEL_PARTS;
300 OUTPUT:
301         RETVAL
302
303 int
304 MSGLEVEL_QUITS()
305 CODE:
306         RETVAL = MSGLEVEL_QUITS;
307 OUTPUT:
308         RETVAL
309
310 int
311 MSGLEVEL_KICKS()
312 CODE:
313         RETVAL = MSGLEVEL_KICKS;
314 OUTPUT:
315         RETVAL
316
317 int
318 MSGLEVEL_MODES()
319 CODE:
320         RETVAL = MSGLEVEL_MODES;
321 OUTPUT:
322         RETVAL
323
324 int
325 MSGLEVEL_TOPICS()
326 CODE:
327         RETVAL = MSGLEVEL_TOPICS;
328 OUTPUT:
329         RETVAL
330
331 int
332 MSGLEVEL_WALLOPS()
333 CODE:
334         RETVAL = MSGLEVEL_WALLOPS;
335 OUTPUT:
336         RETVAL
337
338 int
339 MSGLEVEL_INVITES()
340 CODE:
341         RETVAL = MSGLEVEL_INVITES;
342 OUTPUT:
343         RETVAL
344
345 int
346 MSGLEVEL_NICKS()
347 CODE:
348         RETVAL = MSGLEVEL_NICKS;
349 OUTPUT:
350         RETVAL
351
352 int
353 MSGLEVEL_DCC()
354 CODE:
355         RETVAL = MSGLEVEL_DCC;
356 OUTPUT:
357         RETVAL
358
359 int
360 MSGLEVEL_DCCMSGS()
361 CODE:
362         RETVAL = MSGLEVEL_DCCMSGS;
363 OUTPUT:
364         RETVAL
365
366 int
367 MSGLEVEL_CLIENTNOTICE()
368 CODE:
369         RETVAL = MSGLEVEL_CLIENTNOTICE;
370 OUTPUT:
371         RETVAL
372
373 int
374 MSGLEVEL_CLIENTCRAP()
375 CODE:
376         RETVAL = MSGLEVEL_CLIENTCRAP;
377 OUTPUT:
378         RETVAL
379
380 int
381 MSGLEVEL_CLIENTERROR()
382 CODE:
383         RETVAL = MSGLEVEL_CLIENTERROR;
384 OUTPUT:
385         RETVAL
386
387 int
388 MSGLEVEL_HILIGHT()
389 CODE:
390         RETVAL = MSGLEVEL_HILIGHT;
391 OUTPUT:
392         RETVAL
393
394 int
395 MSGLEVEL_ALL()
396 CODE:
397         RETVAL = MSGLEVEL_ALL;
398 OUTPUT:
399         RETVAL
400
401 int
402 MSGLEVEL_NOHILIGHT()
403 CODE:
404         RETVAL = MSGLEVEL_NOHILIGHT;
405 OUTPUT:
406         RETVAL
407
408 int
409 MSGLEVEL_NO_ACT()
410 CODE:
411         RETVAL = MSGLEVEL_NO_ACT;
412 OUTPUT:
413         RETVAL
414
415 int
416 MSGLEVEL_NEVER()
417 CODE:
418         RETVAL = MSGLEVEL_NEVER;
419 OUTPUT:
420         RETVAL
421
422 int
423 MSGLEVEL_LASTLOG()
424 CODE:
425         RETVAL = MSGLEVEL_LASTLOG;
426 OUTPUT:
427         RETVAL
428
429 int
430 level2bits(str)
431         char *str
432
433 char *
434 bits2level(bits)
435         int bits
436
437 int
438 combine_level(level, str)
439         int level
440         char *str
441
442 void
443 command(cmd)
444         char *cmd
445 CODE:
446         perl_command(cmd, NULL, NULL);
447
448 void
449 commands()
450 PREINIT:
451         GSList *tmp;
452 PPCODE:
453         for (tmp = commands; tmp != NULL; tmp = tmp->next) {
454                 XPUSHs(sv_2mortal(plain_bless(tmp->data, "Irssi::Command")));
455         }
456
457 void
458 command_bind_first(...)
459 CODE:
460         handle_command_bind(SIGNAL_PRIORITY_HIGH, items, ST(0), ST(1), ST(2));
461
462 void
463 command_bind(...)
464 CODE:
465         handle_command_bind(SIGNAL_PRIORITY_DEFAULT, items, ST(0), ST(1), ST(2));
466
467 void
468 command_bind_last(...)
469 CODE:
470         handle_command_bind(SIGNAL_PRIORITY_LOW, items, ST(0), ST(1), ST(2));
471
472 void
473 command_runsub(cmd, data, server, item)
474         char *cmd
475         char *data
476         Irssi::Server server
477         Irssi::Windowitem item
478 CODE:
479         perl_command_runsub(cmd, data, server, item);
480
481 void
482 command_unbind(cmd, func)
483         char *cmd
484         SV *func
485 CODE:
486         perl_command_unbind(cmd, func);
487
488 void
489 command_set_options(cmd, options)
490         char *cmd
491         char *options
492
493 void
494 pidwait_add(pid)
495         int pid
496
497 void 
498 pidwait_remove(pid)
499         int pid
500
501 char *
502 parse_special(cmd, data="", flags=0)
503         char *cmd
504         char *data
505         int flags
506 PREINIT:
507         char *ret;
508 PPCODE:
509         ret = parse_special_string(cmd, NULL, NULL, data, NULL, flags);
510         XPUSHs(sv_2mortal(new_pv(ret)));
511         g_free_not_null(ret);
512
513 char *
514 get_irssi_dir()
515 CODE:
516         RETVAL = (char *) get_irssi_dir();
517 OUTPUT:
518         RETVAL
519
520 char *
521 get_irssi_config()
522 CODE:
523         RETVAL = (char *) get_irssi_config();
524 OUTPUT:
525         RETVAL
526
527 char *
528 version()
529 PREINIT:
530         char version[100];
531 CODE:
532         g_snprintf(version, sizeof(version), "%d.%04d",
533                    IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
534         RETVAL = version;
535 OUTPUT:
536         RETVAL
537
538 #*******************************
539 MODULE = Irssi::Core    PACKAGE = Irssi::Server
540 #*******************************
541
542 void
543 parse_special(server, cmd, data="", flags=0)
544         Irssi::Server server
545         char *cmd
546         char *data
547         int flags
548 PREINIT:
549         char *ret;
550 PPCODE:
551         ret = parse_special_string(cmd, server, NULL, data, NULL, flags);
552         XPUSHs(sv_2mortal(new_pv(ret)));
553         g_free_not_null(ret);
554
555 void
556 command(server, cmd)
557         Irssi::Server server
558         char *cmd
559 CODE:
560         perl_command(cmd, server, NULL);
561
562
563 #*******************************
564 MODULE = Irssi::Core    PACKAGE = Irssi::Windowitem
565 #*******************************
566
567 void
568 parse_special(item, cmd, data="", flags=0)
569         Irssi::Windowitem item
570         char *cmd
571         char *data
572         int flags
573 PREINIT:
574         char *ret;
575 PPCODE:
576         ret = parse_special_string(cmd, item->server, item, data, NULL, flags);
577         XPUSHs(sv_2mortal(new_pv(ret)));
578         g_free_not_null(ret);
579
580 void
581 command(item, cmd)
582         Irssi::Windowitem item
583         char *cmd
584 CODE:
585         perl_command(cmd, item->server, item);
586