perl 4.0 patch 22: patch #20, continued
[p5sagit/p5-mst-13.2.git] / usub / bsdcurses.mus
CommitLineData
68decaef 1/* $RCSfile: bsdcurses.mus,v $$Revision: 4.0.1.2 $$Date: 92/06/08 16:05:28 $
f1ca563b 2 *
3 * $Log: bsdcurses.mus,v $
68decaef 4 * Revision 4.0.1.2 92/06/08 16:05:28 lwall
5 * patch20: &getcap eventually dumped core in bsdcurses
6 *
f1ca563b 7 * Revision 4.0.1.1 91/11/05 19:04:53 lwall
8 * initial checkin
9 *
10 * Revision 4.0 91/03/20 01:56:13 lwall
11 * 4.0 baseline.
12 *
13 * Revision 3.0.1.1 90/08/09 04:05:21 lwall
14 * patch19: Initial revision
15 *
16 */
17
18#include "EXTERN.h"
19#include "perl.h"
20
21char *savestr();
22
23#include <curses.h>
24
25static enum uservars {
26 UV_curscr,
27 UV_stdscr,
28 UV_Def_term,
29 UV_My_term,
30 UV_ttytype,
31 UV_LINES,
32 UV_COLS,
33 UV_ERR,
34 UV_OK,
35};
36
37static enum usersubs {
38 US_addch,
39 US_waddch,
40 US_addstr,
41 US_waddstr,
42 US_box,
43 US_clear,
44 US_wclear,
45 US_clearok,
46 US_clrtobot,
47 US_wclrtobot,
48 US_clrtoeol,
49 US_wclrtoeol,
50 US_delch,
51 US_wdelch,
52 US_deleteln,
53 US_wdeleteln,
54 US_erase,
55 US_werase,
56 US_flushok,
57 US_idlok,
58 US_insch,
59 US_winsch,
60 US_insertln,
61 US_winsertln,
62 US_move,
63 US_wmove,
64 US_overlay,
65 US_overwrite,
66 US_printw,
67 US_wprintw,
68 US_refresh,
69 US_wrefresh,
70 US_standout,
71 US_wstandout,
72 US_standend,
73 US_wstandend,
74 US_cbreak,
75 US_nocbreak,
76 US_echo,
77 US_noecho,
78 US_getch,
79 US_wgetch,
80 US_getstr,
81 US_wgetstr,
82 US_raw,
83 US_noraw,
84 US_scanw,
85 US_wscanw,
86 US_baudrate,
87 US_delwin,
88 US_endwin,
89 US_erasechar,
90 US_getcap,
91 US_getyx,
92 US_inch,
93 US_winch,
94 US_initscr,
95 US_killchar,
96 US_leaveok,
97 US_longname,
98 US_fullname,
99 US_mvwin,
100 US_newwin,
101 US_nl,
102 US_nonl,
103 US_scrollok,
104 US_subwin,
105 US_touchline,
106 US_touchoverlap,
107 US_touchwin,
108 US_unctrl,
109 US_gettmode,
110 US_mvcur,
111 US_scroll,
112 US_savetty,
113 US_resetty,
114 US_setterm,
115 US_tstp,
116 US__putchar,
117 US_testcallback,
118};
119
120static int usersub();
121static int userset();
122static int userval();
123
124int
125init_curses()
126{
127 struct ufuncs uf;
128 char *filename = "curses.c";
129
130 uf.uf_set = userset;
131 uf.uf_val = userval;
132
133#define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
134
135 MAGICVAR("curscr", UV_curscr);
136 MAGICVAR("stdscr", UV_stdscr);
137 MAGICVAR("Def_term",UV_Def_term);
138 MAGICVAR("My_term", UV_My_term);
139 MAGICVAR("ttytype", UV_ttytype);
140 MAGICVAR("LINES", UV_LINES);
141 MAGICVAR("COLS", UV_COLS);
142 MAGICVAR("ERR", UV_ERR);
143 MAGICVAR("OK", UV_OK);
144
145 make_usub("addch", US_addch, usersub, filename);
146 make_usub("waddch", US_waddch, usersub, filename);
147 make_usub("addstr", US_addstr, usersub, filename);
148 make_usub("waddstr", US_waddstr, usersub, filename);
149 make_usub("box", US_box, usersub, filename);
150 make_usub("clear", US_clear, usersub, filename);
151 make_usub("wclear", US_wclear, usersub, filename);
152 make_usub("clearok", US_clearok, usersub, filename);
153 make_usub("clrtobot", US_clrtobot, usersub, filename);
154 make_usub("wclrtobot", US_wclrtobot, usersub, filename);
155 make_usub("clrtoeol", US_clrtoeol, usersub, filename);
156 make_usub("wclrtoeol", US_wclrtoeol, usersub, filename);
157 make_usub("delch", US_delch, usersub, filename);
158 make_usub("wdelch", US_wdelch, usersub, filename);
159 make_usub("deleteln", US_deleteln, usersub, filename);
160 make_usub("wdeleteln", US_wdeleteln, usersub, filename);
161 make_usub("erase", US_erase, usersub, filename);
162 make_usub("werase", US_werase, usersub, filename);
163 make_usub("flushok", US_flushok, usersub, filename);
164 make_usub("idlok", US_idlok, usersub, filename);
165 make_usub("insch", US_insch, usersub, filename);
166 make_usub("winsch", US_winsch, usersub, filename);
167 make_usub("insertln", US_insertln, usersub, filename);
168 make_usub("winsertln", US_winsertln, usersub, filename);
169 make_usub("move", US_move, usersub, filename);
170 make_usub("wmove", US_wmove, usersub, filename);
171 make_usub("overlay", US_overlay, usersub, filename);
172 make_usub("overwrite", US_overwrite, usersub, filename);
173 make_usub("printw", US_printw, usersub, filename);
174 make_usub("wprintw", US_wprintw, usersub, filename);
175 make_usub("refresh", US_refresh, usersub, filename);
176 make_usub("wrefresh", US_wrefresh, usersub, filename);
177 make_usub("standout", US_standout, usersub, filename);
178 make_usub("wstandout", US_wstandout, usersub, filename);
179 make_usub("standend", US_standend, usersub, filename);
180 make_usub("wstandend", US_wstandend, usersub, filename);
181 make_usub("cbreak", US_cbreak, usersub, filename);
182 make_usub("nocbreak", US_nocbreak, usersub, filename);
183 make_usub("echo", US_echo, usersub, filename);
184 make_usub("noecho", US_noecho, usersub, filename);
185 make_usub("getch", US_getch, usersub, filename);
186 make_usub("wgetch", US_wgetch, usersub, filename);
187 make_usub("getstr", US_getstr, usersub, filename);
188 make_usub("wgetstr", US_wgetstr, usersub, filename);
189 make_usub("raw", US_raw, usersub, filename);
190 make_usub("noraw", US_noraw, usersub, filename);
191 make_usub("scanw", US_scanw, usersub, filename);
192 make_usub("wscanw", US_wscanw, usersub, filename);
193 make_usub("baudrate", US_baudrate, usersub, filename);
194 make_usub("delwin", US_delwin, usersub, filename);
195 make_usub("endwin", US_endwin, usersub, filename);
196 make_usub("erasechar", US_erasechar, usersub, filename);
197 make_usub("getcap", US_getcap, usersub, filename);
198 make_usub("getyx", US_getyx, usersub, filename);
199 make_usub("inch", US_inch, usersub, filename);
200 make_usub("winch", US_winch, usersub, filename);
201 make_usub("initscr", US_initscr, usersub, filename);
202 make_usub("killchar", US_killchar, usersub, filename);
203 make_usub("leaveok", US_leaveok, usersub, filename);
204 make_usub("longname", US_longname, usersub, filename);
205 make_usub("fullname", US_fullname, usersub, filename);
206 make_usub("mvwin", US_mvwin, usersub, filename);
207 make_usub("newwin", US_newwin, usersub, filename);
208 make_usub("nl", US_nl, usersub, filename);
209 make_usub("nonl", US_nonl, usersub, filename);
210 make_usub("scrollok", US_scrollok, usersub, filename);
211 make_usub("subwin", US_subwin, usersub, filename);
212 make_usub("touchline", US_touchline, usersub, filename);
213 make_usub("touchoverlap", US_touchoverlap,usersub, filename);
214 make_usub("touchwin", US_touchwin, usersub, filename);
215 make_usub("unctrl", US_unctrl, usersub, filename);
216 make_usub("gettmode", US_gettmode, usersub, filename);
217 make_usub("mvcur", US_mvcur, usersub, filename);
218 make_usub("scroll", US_scroll, usersub, filename);
219 make_usub("savetty", US_savetty, usersub, filename);
220 make_usub("resetty", US_resetty, usersub, filename);
221 make_usub("setterm", US_setterm, usersub, filename);
222 make_usub("tstp", US_tstp, usersub, filename);
223 make_usub("_putchar", US__putchar, usersub, filename);
224 make_usub("testcallback", US_testcallback,usersub, filename);
225};
226
227static int
228usersub(ix, sp, items)
229int ix;
230register int sp;
231register int items;
232{
233 STR **st = stack->ary_array + sp;
234 register int i;
235 register char *tmps;
236 register STR *Str; /* used in str_get and str_gnum macros */
237
238 switch (ix) {
239CASE int addch
240I char ch
241END
242
243CASE int waddch
244I WINDOW* win
245I char ch
246END
247
248CASE int addstr
249I char* str
250END
251
252CASE int waddstr
253I WINDOW* win
254I char* str
255END
256
257CASE int box
258I WINDOW* win
259I char vert
260I char hor
261END
262
263CASE int clear
264END
265
266CASE int wclear
267I WINDOW* win
268END
269
270CASE int clearok
271I WINDOW* win
272I bool boolf
273END
274
275CASE int clrtobot
276END
277
278CASE int wclrtobot
279I WINDOW* win
280END
281
282CASE int clrtoeol
283END
284
285CASE int wclrtoeol
286I WINDOW* win
287END
288
289CASE int delch
290END
291
292CASE int wdelch
293I WINDOW* win
294END
295
296CASE int deleteln
297END
298
299CASE int wdeleteln
300I WINDOW* win
301END
302
303CASE int erase
304END
305
306CASE int werase
307I WINDOW* win
308END
309
310CASE int flushok
311I WINDOW* win
312I bool boolf
313END
314
315CASE int idlok
316I WINDOW* win
317I bool boolf
318END
319
320CASE int insch
321I char c
322END
323
324CASE int winsch
325I WINDOW* win
326I char c
327END
328
329CASE int insertln
330END
331
332CASE int winsertln
333I WINDOW* win
334END
335
336CASE int move
337I int y
338I int x
339END
340
341CASE int wmove
342I WINDOW* win
343I int y
344I int x
345END
346
347CASE int overlay
348I WINDOW* win1
349I WINDOW* win2
350END
351
352CASE int overwrite
353I WINDOW* win1
354I WINDOW* win2
355END
356
357 case US_printw:
358 if (items < 1)
359 fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
360 else {
361 int retval;
362 STR* str = str_new(0);
363
364 do_sprintf(str, items - 1, st + 1);
365 retval = addstr(str->str_ptr);
366 str_numset(st[0], (double) retval);
367 str_free(str);
368 }
369 return sp;
370
371 case US_wprintw:
372 if (items < 2)
373 fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
374 else {
375 int retval;
376 STR* str = str_new(0);
377 WINDOW* win = *(WINDOW**) str_get(st[1]);
378
379 do_sprintf(str, items - 1, st + 1);
380 retval = waddstr(win, str->str_ptr);
381 str_numset(st[0], (double) retval);
382 str_free(str);
383 }
384 return sp;
385
386CASE int refresh
387END
388
389CASE int wrefresh
390I WINDOW* win
391END
392
393CASE int standout
394END
395
396CASE int wstandout
397I WINDOW* win
398END
399
400CASE int standend
401END
402
403CASE int wstandend
404I WINDOW* win
405END
406
407CASE int cbreak
408END
409
410CASE int nocbreak
411END
412
413CASE int echo
414END
415
416CASE int noecho
417END
418
419 case US_getch:
420 if (items != 0)
421 fatal("Usage: &getch()");
422 else {
423 int retval;
424 char retch;
425
426 retval = getch();
427 if (retval == EOF)
428 st[0] = &str_undef;
429 else {
430 retch = retval;
431 str_nset(st[0], &retch, 1);
432 }
433 }
434 return sp;
435
436 case US_wgetch:
437 if (items != 1)
438 fatal("Usage: &wgetch($win)");
439 else {
440 int retval;
441 char retch;
442 WINDOW* win = *(WINDOW**) str_get(st[1]);
443
444 retval = wgetch(win);
445 if (retval == EOF)
446 st[0] = &str_undef;
447 else {
448 retch = retval;
449 str_nset(st[0], &retch, 1);
450 }
451 }
452 return sp;
453
454CASE int getstr
455IO char* str
456END
457
458CASE int wgetstr
459I WINDOW* win
460IO char* str
461END
462
463CASE int raw
464END
465
466CASE int noraw
467END
468
469CASE int baudrate
470END
471
472CASE int delwin
473I WINDOW* win
474END
475
476CASE int endwin
477END
478
479CASE int erasechar
480END
481
68decaef 482 case US_getcap:
483 if (items != 1)
484 fatal("Usage: &getcap($str)");
485 else {
486 char* retval;
487 char* str = (char*) str_get(st[1]);
488 char output[50], *outputp = output;
489
490 retval = tgetstr(str, &outputp);
491 str_set(st[0], (char*) retval);
492 }
493 return sp;
f1ca563b 494
495 case US_getyx:
496 if (items != 3)
497 fatal("Usage: &getyx($win, $y, $x)");
498 else {
499 int retval;
500 STR* str = str_new(0);
501 WINDOW* win = *(WINDOW**) str_get(st[1]);
502 int y;
503 int x;
504
505 do_sprintf(str, items - 1, st + 1);
506 retval = getyx(win, y, x);
507 str_numset(st[2], (double)y);
508 str_numset(st[3], (double)x);
509 str_numset(st[0], (double) retval);
510 str_free(str);
511 }
512 return sp;
513
514
515CASE int inch
516END
517
518CASE int winch
519I WINDOW* win
520END
521
522CASE WINDOW* initscr
523END
524
525CASE int killchar
526END
527
528CASE int leaveok
529I WINDOW* win
530I bool boolf
531END
532
533CASE char* longname
534I char* termbuf
535IO char* name
536END
537
538CASE int fullname
539I char* termbuf
540IO char* name
541END
542
543CASE int mvwin
544I WINDOW* win
545I int y
546I int x
547END
548
549CASE WINDOW* newwin
550I int lines
551I int cols
552I int begin_y
553I int begin_x
554END
555
556CASE int nl
557END
558
559CASE int nonl
560END
561
562CASE int scrollok
563I WINDOW* win
564I bool boolf
565END
566
567CASE WINDOW* subwin
568I WINDOW* win
569I int lines
570I int cols
571I int begin_y
572I int begin_x
573END
574
575CASE int touchline
576I WINDOW* win
577I int y
578I int startx
579I int endx
580END
581
582CASE int touchoverlap
583I WINDOW* win1
584I WINDOW* win2
585END
586
587CASE int touchwin
588I WINDOW* win
589END
590
591CASE char* unctrl
592I char ch
593END
594
595CASE int gettmode
596END
597
598CASE int mvcur
599I int lasty
600I int lastx
601I int newy
602I int newx
603END
604
605CASE int scroll
606I WINDOW* win
607END
608
609CASE int savetty
610END
611
612CASE void resetty
613END
614
615CASE int setterm
616I char* name
617END
618
619CASE int tstp
620END
621
622CASE int _putchar
623I char ch
624END
625
626 case US_testcallback:
627 sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
628 break;
629
630 default:
631 fatal("Unimplemented user-defined subroutine");
632 }
633 return sp;
634}
635
636static int
637userval(ix, str)
638int ix;
639STR *str;
640{
641 switch (ix) {
642 case UV_COLS:
643 str_numset(str, (double)COLS);
644 break;
645 case UV_Def_term:
646 str_set(str, Def_term);
647 break;
648 case UV_ERR:
649 str_numset(str, (double)ERR);
650 break;
651 case UV_LINES:
652 str_numset(str, (double)LINES);
653 break;
654 case UV_My_term:
655 str_numset(str, (double)My_term);
656 break;
657 case UV_OK:
658 str_numset(str, (double)OK);
659 break;
660 case UV_curscr:
661 str_nset(str, &curscr, sizeof(WINDOW*));
662 break;
663 case UV_stdscr:
664 str_nset(str, &stdscr, sizeof(WINDOW*));
665 break;
666 case UV_ttytype:
667 str_set(str, ttytype);
668 break;
669 }
670 return 0;
671}
672
673static int
674userset(ix, str)
675int ix;
676STR *str;
677{
678 switch (ix) {
679 case UV_COLS:
680 COLS = (int)str_gnum(str);
681 break;
682 case UV_Def_term:
683 Def_term = savestr(str_get(str)); /* never freed */
684 break;
685 case UV_LINES:
686 LINES = (int)str_gnum(str);
687 break;
688 case UV_My_term:
689 My_term = (bool)str_gnum(str);
690 break;
691 case UV_ttytype:
692 strcpy(ttytype, str_get(str)); /* hope it fits */
693 break;
694 }
695 return 0;
696}