source: perlglue.xs @ 65b9a40

release-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 65b9a40 was ba6c8bd, checked in by Anders Kaseorg <andersk@mit.edu>, 15 years ago
Get rid of a few more useless casts. Signed-off-by: Anders Kaseorg <andersk@mit.edu>
  • Property mode set to 100644
File size: 9.1 KB
Line 
1/* -*- mode: c; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2#ifdef HAVE_LIBZEPHYR
3#include <zephyr/zephyr.h>
4#endif
5#include <EXTERN.h>
6
7#define OWL_PERL
8#include "owl.h"
9SV *owl_perlconfig_curmessage2hashref(void);
10
11#define SV_IS_CODEREF(sv) (SvROK((sv)) && SvTYPE(SvRV((sv))) == SVt_PVCV)
12
13        /*************************************************************
14         * NOTE
15         *************************************************************
16         * These functions, when they are intended to be user-visible,
17         * are documented in perl/lib/BarnOwl.pm. If you add functions
18         * to this file, add the appropriate documentation there!
19         *
20         * If the function is simple enough, we simply define its
21         * entire functionality here in XS. If, however, it needs
22         * complex argument processing or something, we define a
23         * simple version here that takes arguments in as flat a
24         * manner as possible, to simplify the XS code, put it in
25         * BarnOwl::Intenal::, and write a perl wrapper in BarnOwl.pm
26         * that munges the arguments as appropriate and calls the
27         * internal version.
28         */
29
30MODULE = BarnOwl                PACKAGE = BarnOwl
31
32char *
33command(cmd, ...)
34        char *cmd
35        PREINIT:
36                char *rv = NULL;
37                char **argv;
38                int i;
39        CODE:
40        {
41                if (items == 1) {
42                        rv = owl_function_command(cmd);
43                } else {
44                        argv = owl_malloc((items + 1) * sizeof *argv);
45                        argv[0] = cmd;
46                        for(i = 1; i < items; i++) {
47                                argv[i] = SvPV_nolen(ST(i));
48                        }
49                        rv = owl_function_command_argv(argv, items);
50                        owl_free(argv);
51                }
52                RETVAL = rv;
53        }
54        OUTPUT:
55                RETVAL
56        CLEANUP:
57                if (rv) owl_free(rv);
58
59SV *
60getcurmsg()
61        CODE:
62                RETVAL = owl_perlconfig_curmessage2hashref();
63        OUTPUT:
64                RETVAL
65
66int
67getnumcols()
68        CODE:
69                RETVAL = owl_global_get_cols(&g);
70        OUTPUT:
71                RETVAL
72               
73time_t
74getidletime()
75        CODE:
76                RETVAL = owl_global_get_idletime(&g);
77        OUTPUT:
78                RETVAL
79
80const char *
81zephyr_getrealm()
82        CODE:
83                RETVAL = owl_zephyr_get_realm();
84        OUTPUT:
85                RETVAL
86
87char *
88zephyr_getsender()
89        CODE:
90                RETVAL = owl_zephyr_get_sender();
91        OUTPUT:
92                RETVAL
93
94void
95zephyr_zwrite(cmd,msg)
96        char *cmd
97        char *msg
98        PREINIT:
99                int i;
100        CODE:
101                i = owl_zwrite_create_and_send_from_line(cmd, msg);
102
103char *
104ztext_stylestrip(ztext)
105        char *ztext
106        PREINIT:
107                char *rv = NULL;
108        CODE:
109                rv = owl_function_ztext_stylestrip(ztext);
110                RETVAL = rv;
111        OUTPUT:
112                RETVAL
113        CLEANUP:
114                if (rv) owl_free(rv);
115
116char *
117zephyr_smartstrip_user(in)
118        char *in
119        PREINIT:
120                char *rv = NULL;
121        CODE:
122        {
123                rv = owl_zephyr_smartstripped_user(in);
124                RETVAL = rv;
125        }
126        OUTPUT:
127                RETVAL
128        CLEANUP:
129                owl_free(rv);
130
131char *
132zephyr_getsubs()
133        PREINIT:
134                char *rv = NULL;
135        CODE:
136                rv = owl_zephyr_getsubs();
137                RETVAL = rv;
138    OUTPUT:
139                RETVAL
140    CLEANUP:
141                if (rv) owl_free(rv);
142
143void queue_message(msg) 
144        SV *msg
145        PREINIT:
146                owl_message *m;
147        CODE:
148        {
149                if(!SvROK(msg) || SvTYPE(SvRV(msg)) != SVt_PVHV) {
150                        croak("Usage: BarnOwl::queue_message($message)");
151                }
152
153                m = owl_perlconfig_hashref2message(msg);
154
155                owl_global_messagequeue_addmsg(&g, m);
156        }
157
158void admin_message(header, body) 
159        char *header
160        char *body
161        CODE:
162        {
163                owl_function_adminmsg(header, body);           
164        }
165
166void start_question(line, callback)
167        char *line
168        SV *callback
169        PREINIT:
170        CODE:
171        {
172                if(!SV_IS_CODEREF(callback))
173                        croak("Callback must be a subref");
174
175                owl_function_start_question(line);
176
177                SvREFCNT_inc(callback);
178                owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
179                owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
180        }
181
182void start_password(line, callback)
183        char *line
184        SV *callback
185        PREINIT:
186        CODE:
187        {
188                if(!SV_IS_CODEREF(callback))
189                        croak("Callback must be a subref");
190
191                owl_function_start_password(line);
192
193                SvREFCNT_inc(callback);
194                owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
195                owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
196        }
197
198void start_edit_win(line, callback)
199        char *line
200        SV *callback
201        PREINIT:
202                owl_editwin * e;
203                char buff[1024];
204        CODE:
205        {
206                if(!SV_IS_CODEREF(callback))
207                        croak("Callback must be a subref");
208
209                e = owl_global_get_typwin(&g);
210                owl_editwin_new_style(e, OWL_EDITWIN_STYLE_MULTILINE,
211                                      owl_global_get_msg_history(&g));
212                owl_editwin_clear(e);
213                owl_editwin_set_dotsend(e);
214                snprintf(buff, 1023, "----> %s\n", line);
215                owl_editwin_set_locktext(e, buff);
216
217                owl_global_set_typwin_active(&g);
218
219                SvREFCNT_inc(callback);
220                owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
221                owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
222        }
223
224
225char * 
226get_data_dir ()
227        CODE:
228                RETVAL = owl_get_datadir();
229        OUTPUT:
230        RETVAL
231
232char * 
233get_config_dir ()
234        CODE:
235                RETVAL = owl_global_get_confdir(&g);
236        OUTPUT:
237        RETVAL 
238
239void
240popless_text(text) 
241        char *text
242        CODE:
243        {
244                owl_function_popless_text(text);
245        }
246
247void
248popless_ztext(text) 
249        char *text
250        CODE:
251        {
252                owl_fmtext fm;
253                owl_fmtext_init_null(&fm);
254                owl_fmtext_append_ztext(&fm, text);
255                owl_function_popless_fmtext(&fm);
256                owl_fmtext_free(&fm);
257        }
258
259void
260error(text) 
261        char *text
262        CODE:
263        {
264                owl_function_error("%s", text);
265        }
266
267void
268create_style(name, object)
269     char *name
270     SV  *object
271     PREINIT:
272                owl_style *s;
273     CODE:
274        {
275                s = owl_malloc(sizeof(owl_style));
276                owl_style_create_perl(s, name, object);
277                owl_global_add_style(&g, s);
278        }
279
280int
281getnumcolors()
282        CODE:
283                RETVAL = owl_function_get_color_count();
284        OUTPUT:
285                RETVAL
286
287void
288_remove_filter(filterName)
289        char *filterName
290        CODE:
291        {
292                /* Don't delete the current view, or the 'all' filter */
293                if (strcmp(filterName, owl_view_get_filtname(owl_global_get_current_view(&g)))
294                    && strcmp(filterName, "all")) {
295                        owl_global_remove_filter(&g,filterName);
296                }
297        }
298
299char *
300wordwrap(in, cols)
301        char *in
302        int cols
303        PREINIT:
304                char *rv = NULL;
305        CODE:
306                rv = owl_text_wordwrap(in, cols);
307                RETVAL = rv;   
308        OUTPUT:
309                RETVAL
310        CLEANUP:
311                if (rv) owl_free(rv);
312
313void
314add_dispatch(fd, cb)
315        int fd
316        SV * cb
317        CODE:
318        SvREFCNT_inc(cb);
319        owl_select_add_perl_dispatch(fd, cb);
320
321void
322remove_dispatch(fd)
323        int fd
324        CODE:
325        owl_select_remove_perl_dispatch(fd);
326
327MODULE = BarnOwl                PACKAGE = BarnOwl::Internal
328
329
330void
331new_command(name, func, summary, usage, description)
332        char *name
333        SV *func
334        char *summary
335        char *usage
336        char *description
337        PREINIT:
338                owl_cmd cmd;
339        CODE:
340        {
341                if(!SV_IS_CODEREF(func)) {
342                        croak("Command function must be a coderef!");
343                }
344                SvREFCNT_inc(func);
345                cmd.name = name;
346                cmd.cmd_perl = func;
347                cmd.summary = summary;
348                cmd.usage = usage;
349                cmd.description = description;
350                cmd.validctx = OWL_CTX_ANY;
351                cmd.cmd_aliased_to = NULL;
352                cmd.cmd_args_fn = NULL;
353                cmd.cmd_v_fn = NULL;
354                cmd.cmd_i_fn = NULL;
355                cmd.cmd_ctxargs_fn = NULL;
356                cmd.cmd_ctxv_fn = NULL;
357                cmd.cmd_ctxi_fn = NULL;
358                owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
359           }
360
361void
362new_variable_string(name, ival, summ, desc)
363        char * name
364        char * ival
365        char * summ
366        char * desc
367        CODE:
368        owl_variable_dict_newvar_string(owl_global_get_vardict(&g),
369                                        name,
370                                        summ,
371                                        desc,
372                                        ival);
373
374void
375new_variable_int(name, ival, summ, desc)
376        char * name
377        int ival
378        char * summ
379        char * desc
380        CODE:
381        owl_variable_dict_newvar_int(owl_global_get_vardict(&g),
382                                     name,
383                                     summ,
384                                     desc,
385                                     ival);
386
387void
388new_variable_bool(name, ival, summ, desc)
389        char * name
390        int ival
391        char * summ
392        char * desc
393        CODE:
394        owl_variable_dict_newvar_bool(owl_global_get_vardict(&g),
395                                      name,
396                                      summ,
397                                      desc,
398                                      ival);
399
400IV
401add_timer(after, interval, cb)
402        int after
403        int interval
404        SV *cb
405        PREINIT:
406                SV *ref;
407                owl_timer *t;
408        CODE:
409                ref = sv_rvweaken(newSVsv(cb));
410                t = owl_select_add_timer(after,
411                                         interval,
412                                         owl_perlconfig_perl_timer,
413                                         owl_perlconfig_perl_timer_destroy,
414                                         ref);
415        owl_function_debugmsg("Created timer %p", t);
416        RETVAL = (IV)t;
417        OUTPUT:
418                RETVAL
419
420void
421remove_timer(timer)
422        IV timer
423        PREINIT:
424                owl_timer *t;
425        CODE:
426                t = (owl_timer*)timer;
427                owl_function_debugmsg("Freeing timer %p", t);
428                                owl_select_remove_timer(t);
429
430MODULE = BarnOwl                PACKAGE = BarnOwl::Editwin
431
432int
433replace(count, string)
434        int count;
435        char *string;
436        CODE:
437                RETVAL = owl_editwin_replace(owl_global_get_typwin(&g), count, string);
438        OUTPUT:
439                RETVAL
440
441int
442point_move(delta)
443        int delta;
444        CODE:
445                RETVAL = owl_editwin_point_move(owl_global_get_typwin(&g), delta);
446        OUTPUT:
447                RETVAL
448
449int
450replace_region(string)
451        char *string;
452        CODE:
453                RETVAL = owl_editwin_replace_region(owl_global_get_typwin(&g), string);
454        OUTPUT:
455                RETVAL
456
457char *
458get_region()
459        PREINIT:
460                char *region;
461        CODE:
462                region = owl_editwin_get_region(owl_global_get_typwin(&g));
463                RETVAL = region;
464        OUTPUT:
465                RETVAL
466        CLEANUP:
467                owl_free(region);
468
469SV *
470save_excursion(sub)
471        SV *sub;
472        PROTOTYPE: &
473        PREINIT:
474                int count;
475                owl_editwin_excursion *x;
476        CODE:
477        {
478                x = owl_editwin_begin_excursion(owl_global_get_typwin(&g));
479                count = call_sv(sub, G_SCALAR|G_EVAL|G_NOARGS);
480                owl_editwin_end_excursion(owl_global_get_typwin(&g), x);
481
482                if(SvTRUE(ERRSV)) {
483                        croak(NULL);
484                }
485
486                SPAGAIN;
487                if(count == 1)
488                        RETVAL = SvREFCNT_inc(POPs);
489                else
490                        XSRETURN_UNDEF;
491
492        }
493        OUTPUT:
494                RETVAL
495
496int
497current_column()
498        CODE:
499                RETVAL = owl_editwin_current_column(owl_global_get_typwin(&g));
500        OUTPUT:
501                RETVAL
502
503int
504point()
505        CODE:
506                RETVAL = owl_editwin_get_point(owl_global_get_typwin(&g));
507        OUTPUT:
508                RETVAL
509
510int
511mark()
512        CODE:
513                RETVAL = owl_editwin_get_mark(owl_global_get_typwin(&g));
514        OUTPUT:
515                RETVAL
Note: See TracBrowser for help on using the repository browser.