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