Commit | Line | Data |
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" |
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 | } |