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