perl 4.0 patch 13: patch #11, continued
[p5sagit/p5-mst-13.2.git] / usub / curses.mus
CommitLineData
db4e6270 1/* $RCSfile: curses.mus,v $$Revision: 4.0.1.1 $$Date: 91/11/05 19:06:19 $
ff8e2863 2 *
3 * $Log: curses.mus,v $
db4e6270 4 * Revision 4.0.1.1 91/11/05 19:06:19 lwall
5 * patch11: usub/curses.mus now supports SysV curses
6 *
fe14fcc3 7 * Revision 4.0 91/03/20 01:56:13 lwall
8 * 4.0 baseline.
9 *
ff8e2863 10 * Revision 3.0.1.1 90/08/09 04:05:21 lwall
11 * patch19: Initial revision
12 *
13 */
14
15#include "EXTERN.h"
16#include "perl.h"
ff8e2863 17
18char *savestr();
19
db4e6270 20#undef bool
ff8e2863 21#include <curses.h>
22
db4e6270 23#ifndef A_UNDERLINE
24#define NOSETATTR
25#define A_STANDOUT 0x0200
26#define A_UNDERLINE 0x0100
27#define A_REVERSE 0x0200
28#define A_BLINK 0x0400
29#define A_BOLD 0x0800
30#define A_ALTCHARSET 0x1000
31#define A_NORMAL 0
32#endif
33
34#ifdef USG
35static char *tcbuf = NULL;
36#endif
37
38#ifdef NOSETATTR
39static unsigned curattr = NORMAL;
40#endif
41
ff8e2863 42static enum uservars {
43 UV_curscr,
44 UV_stdscr,
ff8e2863 45 UV_ttytype,
46 UV_LINES,
47 UV_COLS,
48 UV_ERR,
49 UV_OK,
db4e6270 50#ifdef BSD
51 UV_Def_term,
52 UV_My_term,
53#endif
54 UV_A_STANDOUT,
55 UV_A_UNDERLINE,
56 UV_A_REVERSE,
57 UV_A_BLINK,
58 UV_A_DIM,
59 UV_A_BOLD,
60 UV_A_NORMAL,
ff8e2863 61};
62
63static enum usersubs {
64 US_addch,
65 US_waddch,
66 US_addstr,
67 US_waddstr,
68 US_box,
69 US_clear,
70 US_wclear,
71 US_clearok,
72 US_clrtobot,
73 US_wclrtobot,
74 US_clrtoeol,
75 US_wclrtoeol,
76 US_delch,
77 US_wdelch,
78 US_deleteln,
79 US_wdeleteln,
80 US_erase,
81 US_werase,
ff8e2863 82 US_idlok,
83 US_insch,
84 US_winsch,
85 US_insertln,
86 US_winsertln,
87 US_move,
88 US_wmove,
89 US_overlay,
90 US_overwrite,
ff8e2863 91 US_refresh,
92 US_wrefresh,
93 US_standout,
94 US_wstandout,
95 US_standend,
96 US_wstandend,
97 US_cbreak,
98 US_nocbreak,
99 US_echo,
100 US_noecho,
101 US_getch,
102 US_wgetch,
103 US_getstr,
104 US_wgetstr,
105 US_raw,
106 US_noraw,
ff8e2863 107 US_baudrate,
108 US_delwin,
109 US_endwin,
110 US_erasechar,
ff8e2863 111 US_getyx,
112 US_inch,
113 US_winch,
114 US_initscr,
115 US_killchar,
116 US_leaveok,
117 US_longname,
ff8e2863 118 US_mvwin,
119 US_newwin,
120 US_nl,
121 US_nonl,
122 US_scrollok,
123 US_subwin,
124 US_touchline,
ff8e2863 125 US_touchwin,
126 US_unctrl,
127 US_gettmode,
128 US_mvcur,
129 US_scroll,
130 US_savetty,
131 US_resetty,
132 US_setterm,
db4e6270 133 US_attroff,
134 US_wattroff,
135 US_attron,
136 US_wattron,
137 US_attrset,
138 US_wattrset,
139#ifdef CURSEFMT
140 US_printw, /* remove */
141 US_wprintw, /* remove */
142 US_scanw, /* delete */
143 US_wscanw, /* delete */
144#endif
145 US_getcap,
146#ifdef BSD
147 US_flushok,
148 US_fullname,
149 US_touchoverlap,
ff8e2863 150 US_tstp,
151 US__putchar,
db4e6270 152#endif
153 US_mysub,
154 US_testcallback,
ff8e2863 155};
156
157static int usersub();
158static int userset();
159static int userval();
160
161int
162init_curses()
163{
164 struct ufuncs uf;
165 char *filename = "curses.c";
166
167 uf.uf_set = userset;
168 uf.uf_val = userval;
169
170#define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
171
172 MAGICVAR("curscr", UV_curscr);
173 MAGICVAR("stdscr", UV_stdscr);
ff8e2863 174 MAGICVAR("ttytype", UV_ttytype);
175 MAGICVAR("LINES", UV_LINES);
176 MAGICVAR("COLS", UV_COLS);
177 MAGICVAR("ERR", UV_ERR);
178 MAGICVAR("OK", UV_OK);
db4e6270 179#ifdef BSD
180 MAGICVAR("Def_term",UV_Def_term);
181 MAGICVAR("My_term", UV_My_term);
182#endif
183 MAGICVAR("A_STANDOUT", UV_A_STANDOUT);
184 MAGICVAR("A_UNDERLINE", UV_A_UNDERLINE);
185 MAGICVAR("A_REVERSE", UV_A_REVERSE);
186 MAGICVAR("A_BLINK", UV_A_BLINK);
187 MAGICVAR("A_DIM", UV_A_DIM);
188 MAGICVAR("A_BOLD", UV_A_BOLD);
189 MAGICVAR("A_NORMAL", UV_A_NORMAL);
ff8e2863 190
191 make_usub("addch", US_addch, usersub, filename);
192 make_usub("waddch", US_waddch, usersub, filename);
193 make_usub("addstr", US_addstr, usersub, filename);
194 make_usub("waddstr", US_waddstr, usersub, filename);
195 make_usub("box", US_box, usersub, filename);
196 make_usub("clear", US_clear, usersub, filename);
197 make_usub("wclear", US_wclear, usersub, filename);
198 make_usub("clearok", US_clearok, usersub, filename);
199 make_usub("clrtobot", US_clrtobot, usersub, filename);
200 make_usub("wclrtobot", US_wclrtobot, usersub, filename);
201 make_usub("clrtoeol", US_clrtoeol, usersub, filename);
202 make_usub("wclrtoeol", US_wclrtoeol, usersub, filename);
203 make_usub("delch", US_delch, usersub, filename);
204 make_usub("wdelch", US_wdelch, usersub, filename);
205 make_usub("deleteln", US_deleteln, usersub, filename);
206 make_usub("wdeleteln", US_wdeleteln, usersub, filename);
207 make_usub("erase", US_erase, usersub, filename);
208 make_usub("werase", US_werase, usersub, filename);
ff8e2863 209 make_usub("idlok", US_idlok, usersub, filename);
210 make_usub("insch", US_insch, usersub, filename);
211 make_usub("winsch", US_winsch, usersub, filename);
212 make_usub("insertln", US_insertln, usersub, filename);
213 make_usub("winsertln", US_winsertln, usersub, filename);
214 make_usub("move", US_move, usersub, filename);
215 make_usub("wmove", US_wmove, usersub, filename);
216 make_usub("overlay", US_overlay, usersub, filename);
217 make_usub("overwrite", US_overwrite, usersub, filename);
ff8e2863 218 make_usub("refresh", US_refresh, usersub, filename);
219 make_usub("wrefresh", US_wrefresh, usersub, filename);
220 make_usub("standout", US_standout, usersub, filename);
221 make_usub("wstandout", US_wstandout, usersub, filename);
222 make_usub("standend", US_standend, usersub, filename);
223 make_usub("wstandend", US_wstandend, usersub, filename);
224 make_usub("cbreak", US_cbreak, usersub, filename);
225 make_usub("nocbreak", US_nocbreak, usersub, filename);
226 make_usub("echo", US_echo, usersub, filename);
227 make_usub("noecho", US_noecho, usersub, filename);
228 make_usub("getch", US_getch, usersub, filename);
229 make_usub("wgetch", US_wgetch, usersub, filename);
230 make_usub("getstr", US_getstr, usersub, filename);
231 make_usub("wgetstr", US_wgetstr, usersub, filename);
232 make_usub("raw", US_raw, usersub, filename);
233 make_usub("noraw", US_noraw, usersub, filename);
ff8e2863 234 make_usub("baudrate", US_baudrate, usersub, filename);
235 make_usub("delwin", US_delwin, usersub, filename);
236 make_usub("endwin", US_endwin, usersub, filename);
237 make_usub("erasechar", US_erasechar, usersub, filename);
ff8e2863 238 make_usub("getyx", US_getyx, usersub, filename);
239 make_usub("inch", US_inch, usersub, filename);
240 make_usub("winch", US_winch, usersub, filename);
241 make_usub("initscr", US_initscr, usersub, filename);
242 make_usub("killchar", US_killchar, usersub, filename);
243 make_usub("leaveok", US_leaveok, usersub, filename);
244 make_usub("longname", US_longname, usersub, filename);
ff8e2863 245 make_usub("mvwin", US_mvwin, usersub, filename);
246 make_usub("newwin", US_newwin, usersub, filename);
247 make_usub("nl", US_nl, usersub, filename);
248 make_usub("nonl", US_nonl, usersub, filename);
249 make_usub("scrollok", US_scrollok, usersub, filename);
250 make_usub("subwin", US_subwin, usersub, filename);
251 make_usub("touchline", US_touchline, usersub, filename);
ff8e2863 252 make_usub("touchwin", US_touchwin, usersub, filename);
253 make_usub("unctrl", US_unctrl, usersub, filename);
254 make_usub("gettmode", US_gettmode, usersub, filename);
255 make_usub("mvcur", US_mvcur, usersub, filename);
256 make_usub("scroll", US_scroll, usersub, filename);
257 make_usub("savetty", US_savetty, usersub, filename);
258 make_usub("resetty", US_resetty, usersub, filename);
259 make_usub("setterm", US_setterm, usersub, filename);
db4e6270 260 make_usub("getcap", US_getcap, usersub, filename);
261 make_usub("attroff", US_attroff, usersub, filename);
262 make_usub("wattroff", US_wattroff, usersub, filename);
263 make_usub("attron", US_attron, usersub, filename);
264 make_usub("wattron", US_wattron, usersub, filename);
265 make_usub("attrset", US_attrset, usersub, filename);
266 make_usub("wattrset", US_wattrset, usersub, filename);
267#ifdef CURSEFMT
268 make_usub("printw", US_printw, usersub, filename);
269 make_usub("wprintw", US_wprintw, usersub, filename);
270 make_usub("scanw", US_scanw, usersub, filename);
271 make_usub("wscanw", US_wscanw, usersub, filename);
272#endif
273#ifdef BSD
274 make_usub("flushok", US_flushok, usersub, filename);
275 make_usub("fullname", US_fullname, usersub, filename);
276 make_usub("touchoverlap", US_touchoverlap,usersub, filename);
ff8e2863 277 make_usub("tstp", US_tstp, usersub, filename);
278 make_usub("_putchar", US__putchar, usersub, filename);
db4e6270 279#endif
280 make_usub("testcallback", US_testcallback,usersub, filename);
281 };
282
283#ifdef USG
284static char
285*getcap(cap)
286register char *cap;
287{
288 static char nocaperr[] = "Cannot read termcap entry.";
289
290 extern char *tgetstr();
291
292 if (tcbuf == NULL) {
293 if ((tcbuf = malloc(1024)) == NULL) {
294 fatal(nocaperr);
295 }
296 if (tgetent(tcbuf, ttytype) == -1) {
297 fatal(nocaperr);
298 }
299 }
300
301 return (tgetstr(cap, NULL));
302}
303#endif
304
305#ifdef NOSETATTR
306#define attron(attr) wattron(stdscr, attr)
307#define attroff(attr) wattroff(stdscr, attr)
308#define attset(attr) wattset(stdscr, attr)
309
310int
311wattron(win, attr)
312WINDOW *win;
313chtype attr;
314{
315 curattr |= attr;
316 if (curattr & A_STANDOUT) {
317 return(wstandout(win));
318 } else {
319 return(wstandend(win));
320 }
321}
322
323int
324wattroff(win, attr)
325WINDOW *win;
326chtype attr;
327{
328 curattr &= (~attr);
329 if (curattr & A_STANDOUT) {
330 return(wstandout(win));
331 } else {
332 return(wstandend(win));
333 }
334}
ff8e2863 335
db4e6270 336int
337wattrset(win, attr)
338WINDOW *win;
339chtype attr;
340{
341 curattr = attr;
342 if (curattr & A_STANDOUT) {
343 return(wstandout(win));
344 } else {
345 return(wstandend(win));
346 }
347}
348
349#endif
350
ff8e2863 351static int
352usersub(ix, sp, items)
353int ix;
354register int sp;
355register int items;
356{
357 STR **st = stack->ary_array + sp;
358 register int i;
359 register char *tmps;
360 register STR *Str; /* used in str_get and str_gnum macros */
361
362 switch (ix) {
363CASE int addch
364I char ch
365END
366
367CASE int waddch
368I WINDOW* win
369I char ch
370END
371
372CASE int addstr
373I char* str
374END
375
376CASE int waddstr
377I WINDOW* win
378I char* str
379END
380
381CASE int box
382I WINDOW* win
383I char vert
384I char hor
385END
386
387CASE int clear
388END
389
390CASE int wclear
391I WINDOW* win
392END
393
394CASE int clearok
395I WINDOW* win
396I bool boolf
397END
398
399CASE int clrtobot
400END
401
402CASE int wclrtobot
403I WINDOW* win
404END
405
406CASE int clrtoeol
407END
408
409CASE int wclrtoeol
410I WINDOW* win
411END
412
413CASE int delch
414END
415
416CASE int wdelch
417I WINDOW* win
418END
419
420CASE int deleteln
421END
422
423CASE int wdeleteln
424I WINDOW* win
425END
426
427CASE int erase
428END
429
430CASE int werase
431I WINDOW* win
432END
433
ff8e2863 434CASE int idlok
435I WINDOW* win
436I bool boolf
437END
438
439CASE int insch
440I char c
441END
442
443CASE int winsch
444I WINDOW* win
445I char c
446END
447
448CASE int insertln
449END
450
451CASE int winsertln
452I WINDOW* win
453END
454
455CASE int move
456I int y
457I int x
458END
459
460CASE int wmove
461I WINDOW* win
462I int y
463I int x
464END
465
466CASE int overlay
467I WINDOW* win1
468I WINDOW* win2
469END
470
471CASE int overwrite
472I WINDOW* win1
473I WINDOW* win2
474END
475
ff8e2863 476CASE int refresh
477END
478
479CASE int wrefresh
480I WINDOW* win
481END
482
483CASE int standout
484END
485
486CASE int wstandout
487I WINDOW* win
488END
489
490CASE int standend
491END
492
493CASE int wstandend
494I WINDOW* win
495END
496
497CASE int cbreak
498END
499
500CASE int nocbreak
501END
502
503CASE int echo
504END
505
506CASE int noecho
507END
508
509 case US_getch:
db4e6270 510 if (items != 0)
511 fatal("Usage: &getch()");
512 else {
513 int retval;
ff8e2863 514 char retch;
515
db4e6270 516 retval = getch();
ff8e2863 517 if (retval == EOF)
518 st[0] = &str_undef;
519 else {
520 retch = retval;
521 str_nset(st[0], &retch, 1);
522 }
db4e6270 523 }
524 return sp;
ff8e2863 525
526 case US_wgetch:
db4e6270 527 if (items != 1)
528 fatal("Usage: &wgetch($win)");
529 else {
530 int retval;
ff8e2863 531 char retch;
db4e6270 532 WINDOW* win = *(WINDOW**) str_get(st[1]);
ff8e2863 533
db4e6270 534 retval = wgetch(win);
ff8e2863 535 if (retval == EOF)
536 st[0] = &str_undef;
537 else {
538 retch = retval;
539 str_nset(st[0], &retch, 1);
540 }
db4e6270 541 }
542 return sp;
ff8e2863 543
544CASE int getstr
db4e6270 545O char* str
ff8e2863 546END
547
548CASE int wgetstr
549I WINDOW* win
db4e6270 550O char* str
ff8e2863 551END
552
553CASE int raw
554END
555
556CASE int noraw
557END
558
559CASE int baudrate
560END
561
562CASE int delwin
563I WINDOW* win
564END
565
566CASE int endwin
567END
568
569CASE int erasechar
570END
571
ff8e2863 572 case US_getyx:
573 if (items != 3)
574 fatal("Usage: &getyx($win, $y, $x)");
575 else {
576 int retval;
577 STR* str = str_new(0);
578 WINDOW* win = *(WINDOW**) str_get(st[1]);
579 int y;
580 int x;
581
582 do_sprintf(str, items - 1, st + 1);
583 retval = getyx(win, y, x);
584 str_numset(st[2], (double)y);
585 str_numset(st[3], (double)x);
586 str_numset(st[0], (double) retval);
587 str_free(str);
588 }
589 return sp;
ff8e2863 590
591CASE int inch
592END
593
594CASE int winch
595I WINDOW* win
596END
597
598CASE WINDOW* initscr
599END
600
601CASE int killchar
602END
603
604CASE int leaveok
605I WINDOW* win
606I bool boolf
607END
608
db4e6270 609#ifdef BSD
ff8e2863 610CASE char* longname
611I char* termbuf
612IO char* name
613END
db4e6270 614#else
615CASE char* longname
616I char* termbug
617I char* name
ff8e2863 618END
db4e6270 619#endif
ff8e2863 620
621CASE int mvwin
622I WINDOW* win
623I int y
624I int x
625END
626
627CASE WINDOW* newwin
628I int lines
629I int cols
630I int begin_y
631I int begin_x
632END
633
634CASE int nl
635END
636
637CASE int nonl
638END
639
640CASE int scrollok
641I WINDOW* win
642I bool boolf
643END
644
645CASE WINDOW* subwin
646I WINDOW* win
647I int lines
648I int cols
649I int begin_y
650I int begin_x
651END
652
653CASE int touchline
654I WINDOW* win
655I int y
656I int startx
657I int endx
658END
659
ff8e2863 660CASE int touchwin
661I WINDOW* win
662END
663
664CASE char* unctrl
665I char ch
666END
667
668CASE int gettmode
669END
670
671CASE int mvcur
672I int lasty
673I int lastx
674I int newy
675I int newx
676END
677
678CASE int scroll
679I WINDOW* win
680END
681
682CASE int savetty
683END
684
685CASE void resetty
686END
687
688CASE int setterm
689I char* name
690END
691
db4e6270 692CASE int attroff
693I chtype str
694END
695
696CASE int wattroff
697I chtype str
698END
699
700CASE int wattron
701I chtype str
702END
703
704CASE int attron
705I chtype str
706END
707
708CASE int attrset
709I chtype str
710END
711
712CASE int wattrset
713I chtype str
714END
715
716#ifdef CURSEFMT
717 case US_printw:
718 if (items < 1)
719 fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
720 else {
721 int retval;
722 STR* str = str_new(0);
723
724 do_sprintf(str, items - 1, st + 1);
725 retval = addstr(str->str_ptr);
726 str_numset(st[0], (double) retval);
727 str_free(str);
728 }
729 return sp;
730
731 case US_wprintw:
732 if (items < 2)
733 fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
734 else {
735 int retval;
736 STR* str = str_new(0);
737 WINDOW* win = *(WINDOW**) str_get(st[1]);
738
739 do_sprintf(str, items - 1, st + 1);
740 retval = waddstr(win, str->str_ptr);
741 str_numset(st[0], (double) retval);
742 str_free(str);
743 }
744 return sp;
745
746#endif
747
748CASE char* getcap
749I char* str
750END
751
752#ifdef BSD
753CASE int flushok
754I WINDOW* win
755I bool boolf
756END
757
758CASE int fullname
759I char* termbuf
760IO char* name
761END
762
763CASE int touchoverlap
764I WINDOW* win1
765I WINDOW* win2
766END
767
ff8e2863 768CASE int tstp
769END
770
771CASE int _putchar
772I char ch
773END
774
db4e6270 775 case US_testcallback:
776 sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
777 break;
778
779#endif
780
ff8e2863 781 default:
782 fatal("Unimplemented user-defined subroutine");
783 }
784 return sp;
785}
786
787static int
788userval(ix, str)
789int ix;
790STR *str;
791{
792 switch (ix) {
793 case UV_COLS:
794 str_numset(str, (double)COLS);
795 break;
ff8e2863 796 case UV_ERR:
797 str_numset(str, (double)ERR);
798 break;
799 case UV_LINES:
800 str_numset(str, (double)LINES);
801 break;
ff8e2863 802 case UV_OK:
803 str_numset(str, (double)OK);
804 break;
805 case UV_curscr:
806 str_nset(str, &curscr, sizeof(WINDOW*));
807 break;
808 case UV_stdscr:
809 str_nset(str, &stdscr, sizeof(WINDOW*));
810 break;
811 case UV_ttytype:
812 str_set(str, ttytype);
813 break;
db4e6270 814#ifdef BSD
815 case UV_Def_term:
816 str_set(str, Def_term);
817 break;
818 case UV_My_term:
819 str_numset(str, (double)My_term);
820 break;
821#endif
822 case UV_A_STANDOUT:
823 str_numset(str, (double)A_STANDOUT);
824 break;
825 case UV_A_UNDERLINE:
826 str_numset(str, (double)A_UNDERLINE);
827 break;
828 case UV_A_REVERSE:
829 str_numset(str, (double)A_REVERSE);
830 break;
831 case UV_A_BLINK:
832 str_numset(str, (double)A_BLINK);
833 break;
834 case UV_A_DIM:
835 str_numset(str, (double)A_DIM);
836 break;
837 case UV_A_BOLD:
838 str_numset(str, (double)A_BOLD);
839 break;
840 case UV_A_NORMAL:
841 str_numset(str, (double)A_NORMAL);
842 break;
ff8e2863 843 }
844 return 0;
845}
846
847static int
848userset(ix, str)
849int ix;
850STR *str;
851{
852 switch (ix) {
853 case UV_COLS:
854 COLS = (int)str_gnum(str);
855 break;
ff8e2863 856 case UV_LINES:
857 LINES = (int)str_gnum(str);
858 break;
ff8e2863 859 case UV_ttytype:
860 strcpy(ttytype, str_get(str)); /* hope it fits */
db4e6270 861#ifdef USG
862 if (tcbuf != NULL) {
863 free(tcbuf);
864 tcbuf = NULL;
865 }
866#endif
867 break;
868#ifdef BSD
869 case UV_Def_term:
870 Def_term = savestr(str_get(str)); /* never freed */
871 break;
872 case UV_My_term:
873 My_term = (bool)str_gnum(str);
ff8e2863 874 break;
db4e6270 875#endif
ff8e2863 876 }
877 return 0;
878}