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