perl 4.0.00: (no release announcement available)
[p5sagit/p5-mst-13.2.git] / usub / curses.mus
1 /* $Header: curses.mus,v 4.0 91/03/20 01:56:13 lwall Locked $
2  *
3  * $Log:        curses.mus,v $
4  * Revision 4.0  91/03/20  01:56:13  lwall
5  * 4.0 baseline.
6  * 
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"
14 extern int wantarray;
15
16 char *savestr();
17
18 #include <curses.h>
19
20 static 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
32 static 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
114 static int usersub();
115 static int userset();
116 static int userval();
117
118 int
119 init_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
220 static int
221 usersub(ix, sp, items)
222 int ix;
223 register int sp;
224 register 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) {
232 CASE int addch
233 I       char            ch
234 END
235
236 CASE int waddch
237 I       WINDOW*         win
238 I       char            ch
239 END
240
241 CASE int addstr
242 I       char*           str
243 END
244
245 CASE int waddstr
246 I       WINDOW*         win
247 I       char*           str
248 END
249
250 CASE int box
251 I       WINDOW*         win
252 I       char            vert
253 I       char            hor
254 END
255
256 CASE int clear
257 END
258
259 CASE int wclear
260 I       WINDOW*         win
261 END
262
263 CASE int clearok
264 I       WINDOW*         win
265 I       bool            boolf
266 END
267
268 CASE int clrtobot
269 END
270
271 CASE int wclrtobot
272 I       WINDOW*         win
273 END
274
275 CASE int clrtoeol
276 END
277
278 CASE int wclrtoeol
279 I       WINDOW*         win
280 END
281
282 CASE int delch
283 END
284
285 CASE int wdelch
286 I       WINDOW*         win
287 END
288
289 CASE int deleteln
290 END
291
292 CASE int wdeleteln
293 I       WINDOW*         win
294 END
295
296 CASE int erase
297 END
298
299 CASE int werase
300 I       WINDOW*         win
301 END
302
303 CASE int flushok
304 I       WINDOW*         win
305 I       bool            boolf
306 END
307
308 CASE int idlok
309 I       WINDOW*         win
310 I       bool            boolf
311 END
312
313 CASE int insch
314 I       char            c
315 END
316
317 CASE int winsch
318 I       WINDOW*         win
319 I       char            c
320 END
321
322 CASE int insertln
323 END
324
325 CASE int winsertln
326 I       WINDOW*         win
327 END
328
329 CASE int move
330 I       int             y
331 I       int             x
332 END
333
334 CASE int wmove
335 I       WINDOW*         win
336 I       int             y
337 I       int             x
338 END
339
340 CASE int overlay
341 I       WINDOW*         win1
342 I       WINDOW*         win2
343 END
344
345 CASE int overwrite
346 I       WINDOW*         win1
347 I       WINDOW*         win2
348 END
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
379 CASE int refresh
380 END
381
382 CASE int wrefresh
383 I       WINDOW*         win
384 END
385
386 CASE int standout
387 END
388
389 CASE int wstandout
390 I       WINDOW*         win
391 END
392
393 CASE int standend
394 END
395
396 CASE int wstandend
397 I       WINDOW*         win
398 END
399
400 CASE int cbreak
401 END
402
403 CASE int nocbreak
404 END
405
406 CASE int echo
407 END
408
409 CASE int noecho
410 END
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
447 CASE int getstr
448 IO      char*           str
449 END
450
451 CASE int wgetstr
452 I       WINDOW*         win
453 IO      char*           str
454 END
455
456 CASE int raw
457 END
458
459 CASE int noraw
460 END
461
462 CASE int baudrate
463 END
464
465 CASE int delwin
466 I       WINDOW*         win
467 END
468
469 CASE int endwin
470 END
471
472 CASE int erasechar
473 END
474
475 CASE char* getcap
476 I       char*           str
477 END
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         
499 CASE int inch
500 END
501
502 CASE int winch
503 I       WINDOW*         win
504 END
505
506 CASE WINDOW* initscr
507 END
508
509 CASE int killchar
510 END
511
512 CASE int leaveok
513 I       WINDOW*         win
514 I       bool            boolf
515 END
516
517 CASE char* longname
518 I       char*           termbuf
519 IO      char*           name
520 END
521
522 CASE int fullname
523 I       char*           termbuf
524 IO      char*           name
525 END
526
527 CASE int mvwin
528 I       WINDOW*         win
529 I       int             y
530 I       int             x
531 END
532
533 CASE WINDOW* newwin
534 I       int             lines
535 I       int             cols
536 I       int             begin_y
537 I       int             begin_x
538 END
539
540 CASE int nl
541 END
542
543 CASE int nonl
544 END
545
546 CASE int scrollok
547 I       WINDOW*         win
548 I       bool            boolf
549 END
550
551 CASE WINDOW* subwin
552 I       WINDOW*         win
553 I       int             lines
554 I       int             cols
555 I       int             begin_y
556 I       int             begin_x
557 END
558
559 CASE int touchline
560 I       WINDOW*         win
561 I       int             y
562 I       int             startx
563 I       int             endx
564 END
565
566 CASE int touchoverlap
567 I       WINDOW*         win1
568 I       WINDOW*         win2
569 END
570
571 CASE int touchwin
572 I       WINDOW*         win
573 END
574
575 CASE char* unctrl
576 I       char            ch
577 END
578
579 CASE int gettmode
580 END
581
582 CASE int mvcur
583 I       int             lasty
584 I       int             lastx
585 I       int             newy
586 I       int             newx
587 END
588
589 CASE int scroll
590 I       WINDOW*         win
591 END
592
593 CASE int savetty
594 END
595
596 CASE void resetty
597 END
598
599 CASE int setterm
600 I       char*           name
601 END
602
603 CASE int tstp
604 END
605
606 CASE int _putchar
607 I       char            ch
608 END
609
610     default:
611         fatal("Unimplemented user-defined subroutine");
612     }
613     return sp;
614 }
615
616 static int
617 userval(ix, str)
618 int ix;
619 STR *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
653 static int
654 userset(ix, str)
655 int ix;
656 STR *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 }