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