Commit | Line | Data |
db4e6270 |
1 | /* $RCSfile: curses.mus,v $$Revision: 4.0.1.1 $$Date: 91/11/05 19:06:19 $ |
ff8e2863 |
2 | * |
3 | * $Log: curses.mus,v $ |
db4e6270 |
4 | * Revision 4.0.1.1 91/11/05 19:06:19 lwall |
5 | * patch11: usub/curses.mus now supports SysV curses |
6 | * |
fe14fcc3 |
7 | * Revision 4.0 91/03/20 01:56:13 lwall |
8 | * 4.0 baseline. |
9 | * |
ff8e2863 |
10 | * Revision 3.0.1.1 90/08/09 04:05:21 lwall |
11 | * patch19: Initial revision |
12 | * |
13 | */ |
14 | |
15 | #include "EXTERN.h" |
16 | #include "perl.h" |
ff8e2863 |
17 | |
18 | char *savestr(); |
19 | |
db4e6270 |
20 | #undef bool |
ff8e2863 |
21 | #include <curses.h> |
22 | |
db4e6270 |
23 | #ifndef A_UNDERLINE |
24 | #define NOSETATTR |
25 | #define A_STANDOUT 0x0200 |
26 | #define A_UNDERLINE 0x0100 |
27 | #define A_REVERSE 0x0200 |
28 | #define A_BLINK 0x0400 |
29 | #define A_BOLD 0x0800 |
30 | #define A_ALTCHARSET 0x1000 |
31 | #define A_NORMAL 0 |
32 | #endif |
33 | |
34 | #ifdef USG |
35 | static char *tcbuf = NULL; |
36 | #endif |
37 | |
38 | #ifdef NOSETATTR |
39 | static unsigned curattr = NORMAL; |
40 | #endif |
41 | |
ff8e2863 |
42 | static enum uservars { |
43 | UV_curscr, |
44 | UV_stdscr, |
ff8e2863 |
45 | UV_ttytype, |
46 | UV_LINES, |
47 | UV_COLS, |
48 | UV_ERR, |
49 | UV_OK, |
db4e6270 |
50 | #ifdef BSD |
51 | UV_Def_term, |
52 | UV_My_term, |
53 | #endif |
54 | UV_A_STANDOUT, |
55 | UV_A_UNDERLINE, |
56 | UV_A_REVERSE, |
57 | UV_A_BLINK, |
58 | UV_A_DIM, |
59 | UV_A_BOLD, |
60 | UV_A_NORMAL, |
ff8e2863 |
61 | }; |
62 | |
63 | static enum usersubs { |
64 | US_addch, |
65 | US_waddch, |
66 | US_addstr, |
67 | US_waddstr, |
68 | US_box, |
69 | US_clear, |
70 | US_wclear, |
71 | US_clearok, |
72 | US_clrtobot, |
73 | US_wclrtobot, |
74 | US_clrtoeol, |
75 | US_wclrtoeol, |
76 | US_delch, |
77 | US_wdelch, |
78 | US_deleteln, |
79 | US_wdeleteln, |
80 | US_erase, |
81 | US_werase, |
ff8e2863 |
82 | US_idlok, |
83 | US_insch, |
84 | US_winsch, |
85 | US_insertln, |
86 | US_winsertln, |
87 | US_move, |
88 | US_wmove, |
89 | US_overlay, |
90 | US_overwrite, |
ff8e2863 |
91 | US_refresh, |
92 | US_wrefresh, |
93 | US_standout, |
94 | US_wstandout, |
95 | US_standend, |
96 | US_wstandend, |
97 | US_cbreak, |
98 | US_nocbreak, |
99 | US_echo, |
100 | US_noecho, |
101 | US_getch, |
102 | US_wgetch, |
103 | US_getstr, |
104 | US_wgetstr, |
105 | US_raw, |
106 | US_noraw, |
ff8e2863 |
107 | US_baudrate, |
108 | US_delwin, |
109 | US_endwin, |
110 | US_erasechar, |
ff8e2863 |
111 | US_getyx, |
112 | US_inch, |
113 | US_winch, |
114 | US_initscr, |
115 | US_killchar, |
116 | US_leaveok, |
117 | US_longname, |
ff8e2863 |
118 | US_mvwin, |
119 | US_newwin, |
120 | US_nl, |
121 | US_nonl, |
122 | US_scrollok, |
123 | US_subwin, |
124 | US_touchline, |
ff8e2863 |
125 | US_touchwin, |
126 | US_unctrl, |
127 | US_gettmode, |
128 | US_mvcur, |
129 | US_scroll, |
130 | US_savetty, |
131 | US_resetty, |
132 | US_setterm, |
db4e6270 |
133 | US_attroff, |
134 | US_wattroff, |
135 | US_attron, |
136 | US_wattron, |
137 | US_attrset, |
138 | US_wattrset, |
139 | #ifdef CURSEFMT |
140 | US_printw, /* remove */ |
141 | US_wprintw, /* remove */ |
142 | US_scanw, /* delete */ |
143 | US_wscanw, /* delete */ |
144 | #endif |
145 | US_getcap, |
146 | #ifdef BSD |
147 | US_flushok, |
148 | US_fullname, |
149 | US_touchoverlap, |
ff8e2863 |
150 | US_tstp, |
151 | US__putchar, |
db4e6270 |
152 | #endif |
153 | US_mysub, |
154 | US_testcallback, |
ff8e2863 |
155 | }; |
156 | |
157 | static int usersub(); |
158 | static int userset(); |
159 | static int userval(); |
160 | |
161 | int |
162 | init_curses() |
163 | { |
164 | struct ufuncs uf; |
165 | char *filename = "curses.c"; |
166 | |
167 | uf.uf_set = userset; |
168 | uf.uf_val = userval; |
169 | |
170 | #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf) |
171 | |
172 | MAGICVAR("curscr", UV_curscr); |
173 | MAGICVAR("stdscr", UV_stdscr); |
ff8e2863 |
174 | MAGICVAR("ttytype", UV_ttytype); |
175 | MAGICVAR("LINES", UV_LINES); |
176 | MAGICVAR("COLS", UV_COLS); |
177 | MAGICVAR("ERR", UV_ERR); |
178 | MAGICVAR("OK", UV_OK); |
db4e6270 |
179 | #ifdef BSD |
180 | MAGICVAR("Def_term",UV_Def_term); |
181 | MAGICVAR("My_term", UV_My_term); |
182 | #endif |
183 | MAGICVAR("A_STANDOUT", UV_A_STANDOUT); |
184 | MAGICVAR("A_UNDERLINE", UV_A_UNDERLINE); |
185 | MAGICVAR("A_REVERSE", UV_A_REVERSE); |
186 | MAGICVAR("A_BLINK", UV_A_BLINK); |
187 | MAGICVAR("A_DIM", UV_A_DIM); |
188 | MAGICVAR("A_BOLD", UV_A_BOLD); |
189 | MAGICVAR("A_NORMAL", UV_A_NORMAL); |
ff8e2863 |
190 | |
191 | make_usub("addch", US_addch, usersub, filename); |
192 | make_usub("waddch", US_waddch, usersub, filename); |
193 | make_usub("addstr", US_addstr, usersub, filename); |
194 | make_usub("waddstr", US_waddstr, usersub, filename); |
195 | make_usub("box", US_box, usersub, filename); |
196 | make_usub("clear", US_clear, usersub, filename); |
197 | make_usub("wclear", US_wclear, usersub, filename); |
198 | make_usub("clearok", US_clearok, usersub, filename); |
199 | make_usub("clrtobot", US_clrtobot, usersub, filename); |
200 | make_usub("wclrtobot", US_wclrtobot, usersub, filename); |
201 | make_usub("clrtoeol", US_clrtoeol, usersub, filename); |
202 | make_usub("wclrtoeol", US_wclrtoeol, usersub, filename); |
203 | make_usub("delch", US_delch, usersub, filename); |
204 | make_usub("wdelch", US_wdelch, usersub, filename); |
205 | make_usub("deleteln", US_deleteln, usersub, filename); |
206 | make_usub("wdeleteln", US_wdeleteln, usersub, filename); |
207 | make_usub("erase", US_erase, usersub, filename); |
208 | make_usub("werase", US_werase, usersub, filename); |
ff8e2863 |
209 | make_usub("idlok", US_idlok, usersub, filename); |
210 | make_usub("insch", US_insch, usersub, filename); |
211 | make_usub("winsch", US_winsch, usersub, filename); |
212 | make_usub("insertln", US_insertln, usersub, filename); |
213 | make_usub("winsertln", US_winsertln, usersub, filename); |
214 | make_usub("move", US_move, usersub, filename); |
215 | make_usub("wmove", US_wmove, usersub, filename); |
216 | make_usub("overlay", US_overlay, usersub, filename); |
217 | make_usub("overwrite", US_overwrite, usersub, filename); |
ff8e2863 |
218 | make_usub("refresh", US_refresh, usersub, filename); |
219 | make_usub("wrefresh", US_wrefresh, usersub, filename); |
220 | make_usub("standout", US_standout, usersub, filename); |
221 | make_usub("wstandout", US_wstandout, usersub, filename); |
222 | make_usub("standend", US_standend, usersub, filename); |
223 | make_usub("wstandend", US_wstandend, usersub, filename); |
224 | make_usub("cbreak", US_cbreak, usersub, filename); |
225 | make_usub("nocbreak", US_nocbreak, usersub, filename); |
226 | make_usub("echo", US_echo, usersub, filename); |
227 | make_usub("noecho", US_noecho, usersub, filename); |
228 | make_usub("getch", US_getch, usersub, filename); |
229 | make_usub("wgetch", US_wgetch, usersub, filename); |
230 | make_usub("getstr", US_getstr, usersub, filename); |
231 | make_usub("wgetstr", US_wgetstr, usersub, filename); |
232 | make_usub("raw", US_raw, usersub, filename); |
233 | make_usub("noraw", US_noraw, usersub, filename); |
ff8e2863 |
234 | make_usub("baudrate", US_baudrate, usersub, filename); |
235 | make_usub("delwin", US_delwin, usersub, filename); |
236 | make_usub("endwin", US_endwin, usersub, filename); |
237 | make_usub("erasechar", US_erasechar, usersub, filename); |
ff8e2863 |
238 | make_usub("getyx", US_getyx, usersub, filename); |
239 | make_usub("inch", US_inch, usersub, filename); |
240 | make_usub("winch", US_winch, usersub, filename); |
241 | make_usub("initscr", US_initscr, usersub, filename); |
242 | make_usub("killchar", US_killchar, usersub, filename); |
243 | make_usub("leaveok", US_leaveok, usersub, filename); |
244 | make_usub("longname", US_longname, usersub, filename); |
ff8e2863 |
245 | make_usub("mvwin", US_mvwin, usersub, filename); |
246 | make_usub("newwin", US_newwin, usersub, filename); |
247 | make_usub("nl", US_nl, usersub, filename); |
248 | make_usub("nonl", US_nonl, usersub, filename); |
249 | make_usub("scrollok", US_scrollok, usersub, filename); |
250 | make_usub("subwin", US_subwin, usersub, filename); |
251 | make_usub("touchline", US_touchline, usersub, filename); |
ff8e2863 |
252 | make_usub("touchwin", US_touchwin, usersub, filename); |
253 | make_usub("unctrl", US_unctrl, usersub, filename); |
254 | make_usub("gettmode", US_gettmode, usersub, filename); |
255 | make_usub("mvcur", US_mvcur, usersub, filename); |
256 | make_usub("scroll", US_scroll, usersub, filename); |
257 | make_usub("savetty", US_savetty, usersub, filename); |
258 | make_usub("resetty", US_resetty, usersub, filename); |
259 | make_usub("setterm", US_setterm, usersub, filename); |
db4e6270 |
260 | make_usub("getcap", US_getcap, usersub, filename); |
261 | make_usub("attroff", US_attroff, usersub, filename); |
262 | make_usub("wattroff", US_wattroff, usersub, filename); |
263 | make_usub("attron", US_attron, usersub, filename); |
264 | make_usub("wattron", US_wattron, usersub, filename); |
265 | make_usub("attrset", US_attrset, usersub, filename); |
266 | make_usub("wattrset", US_wattrset, usersub, filename); |
267 | #ifdef CURSEFMT |
268 | make_usub("printw", US_printw, usersub, filename); |
269 | make_usub("wprintw", US_wprintw, usersub, filename); |
270 | make_usub("scanw", US_scanw, usersub, filename); |
271 | make_usub("wscanw", US_wscanw, usersub, filename); |
272 | #endif |
273 | #ifdef BSD |
274 | make_usub("flushok", US_flushok, usersub, filename); |
275 | make_usub("fullname", US_fullname, usersub, filename); |
276 | make_usub("touchoverlap", US_touchoverlap,usersub, filename); |
ff8e2863 |
277 | make_usub("tstp", US_tstp, usersub, filename); |
278 | make_usub("_putchar", US__putchar, usersub, filename); |
db4e6270 |
279 | #endif |
280 | make_usub("testcallback", US_testcallback,usersub, filename); |
281 | }; |
282 | |
283 | #ifdef USG |
284 | static char |
285 | *getcap(cap) |
286 | register char *cap; |
287 | { |
288 | static char nocaperr[] = "Cannot read termcap entry."; |
289 | |
290 | extern char *tgetstr(); |
291 | |
292 | if (tcbuf == NULL) { |
293 | if ((tcbuf = malloc(1024)) == NULL) { |
294 | fatal(nocaperr); |
295 | } |
296 | if (tgetent(tcbuf, ttytype) == -1) { |
297 | fatal(nocaperr); |
298 | } |
299 | } |
300 | |
301 | return (tgetstr(cap, NULL)); |
302 | } |
303 | #endif |
304 | |
305 | #ifdef NOSETATTR |
306 | #define attron(attr) wattron(stdscr, attr) |
307 | #define attroff(attr) wattroff(stdscr, attr) |
308 | #define attset(attr) wattset(stdscr, attr) |
309 | |
310 | int |
311 | wattron(win, attr) |
312 | WINDOW *win; |
313 | chtype attr; |
314 | { |
315 | curattr |= attr; |
316 | if (curattr & A_STANDOUT) { |
317 | return(wstandout(win)); |
318 | } else { |
319 | return(wstandend(win)); |
320 | } |
321 | } |
322 | |
323 | int |
324 | wattroff(win, attr) |
325 | WINDOW *win; |
326 | chtype attr; |
327 | { |
328 | curattr &= (~attr); |
329 | if (curattr & A_STANDOUT) { |
330 | return(wstandout(win)); |
331 | } else { |
332 | return(wstandend(win)); |
333 | } |
334 | } |
ff8e2863 |
335 | |
db4e6270 |
336 | int |
337 | wattrset(win, attr) |
338 | WINDOW *win; |
339 | chtype attr; |
340 | { |
341 | curattr = attr; |
342 | if (curattr & A_STANDOUT) { |
343 | return(wstandout(win)); |
344 | } else { |
345 | return(wstandend(win)); |
346 | } |
347 | } |
348 | |
349 | #endif |
350 | |
ff8e2863 |
351 | static int |
352 | usersub(ix, sp, items) |
353 | int ix; |
354 | register int sp; |
355 | register int items; |
356 | { |
357 | STR **st = stack->ary_array + sp; |
358 | register int i; |
359 | register char *tmps; |
360 | register STR *Str; /* used in str_get and str_gnum macros */ |
361 | |
362 | switch (ix) { |
363 | CASE int addch |
364 | I char ch |
365 | END |
366 | |
367 | CASE int waddch |
368 | I WINDOW* win |
369 | I char ch |
370 | END |
371 | |
372 | CASE int addstr |
373 | I char* str |
374 | END |
375 | |
376 | CASE int waddstr |
377 | I WINDOW* win |
378 | I char* str |
379 | END |
380 | |
381 | CASE int box |
382 | I WINDOW* win |
383 | I char vert |
384 | I char hor |
385 | END |
386 | |
387 | CASE int clear |
388 | END |
389 | |
390 | CASE int wclear |
391 | I WINDOW* win |
392 | END |
393 | |
394 | CASE int clearok |
395 | I WINDOW* win |
396 | I bool boolf |
397 | END |
398 | |
399 | CASE int clrtobot |
400 | END |
401 | |
402 | CASE int wclrtobot |
403 | I WINDOW* win |
404 | END |
405 | |
406 | CASE int clrtoeol |
407 | END |
408 | |
409 | CASE int wclrtoeol |
410 | I WINDOW* win |
411 | END |
412 | |
413 | CASE int delch |
414 | END |
415 | |
416 | CASE int wdelch |
417 | I WINDOW* win |
418 | END |
419 | |
420 | CASE int deleteln |
421 | END |
422 | |
423 | CASE int wdeleteln |
424 | I WINDOW* win |
425 | END |
426 | |
427 | CASE int erase |
428 | END |
429 | |
430 | CASE int werase |
431 | I WINDOW* win |
432 | END |
433 | |
ff8e2863 |
434 | CASE int idlok |
435 | I WINDOW* win |
436 | I bool boolf |
437 | END |
438 | |
439 | CASE int insch |
440 | I char c |
441 | END |
442 | |
443 | CASE int winsch |
444 | I WINDOW* win |
445 | I char c |
446 | END |
447 | |
448 | CASE int insertln |
449 | END |
450 | |
451 | CASE int winsertln |
452 | I WINDOW* win |
453 | END |
454 | |
455 | CASE int move |
456 | I int y |
457 | I int x |
458 | END |
459 | |
460 | CASE int wmove |
461 | I WINDOW* win |
462 | I int y |
463 | I int x |
464 | END |
465 | |
466 | CASE int overlay |
467 | I WINDOW* win1 |
468 | I WINDOW* win2 |
469 | END |
470 | |
471 | CASE int overwrite |
472 | I WINDOW* win1 |
473 | I WINDOW* win2 |
474 | END |
475 | |
ff8e2863 |
476 | CASE int refresh |
477 | END |
478 | |
479 | CASE int wrefresh |
480 | I WINDOW* win |
481 | END |
482 | |
483 | CASE int standout |
484 | END |
485 | |
486 | CASE int wstandout |
487 | I WINDOW* win |
488 | END |
489 | |
490 | CASE int standend |
491 | END |
492 | |
493 | CASE int wstandend |
494 | I WINDOW* win |
495 | END |
496 | |
497 | CASE int cbreak |
498 | END |
499 | |
500 | CASE int nocbreak |
501 | END |
502 | |
503 | CASE int echo |
504 | END |
505 | |
506 | CASE int noecho |
507 | END |
508 | |
509 | case US_getch: |
db4e6270 |
510 | if (items != 0) |
511 | fatal("Usage: &getch()"); |
512 | else { |
513 | int retval; |
ff8e2863 |
514 | char retch; |
515 | |
db4e6270 |
516 | retval = getch(); |
ff8e2863 |
517 | if (retval == EOF) |
518 | st[0] = &str_undef; |
519 | else { |
520 | retch = retval; |
521 | str_nset(st[0], &retch, 1); |
522 | } |
db4e6270 |
523 | } |
524 | return sp; |
ff8e2863 |
525 | |
526 | case US_wgetch: |
db4e6270 |
527 | if (items != 1) |
528 | fatal("Usage: &wgetch($win)"); |
529 | else { |
530 | int retval; |
ff8e2863 |
531 | char retch; |
db4e6270 |
532 | WINDOW* win = *(WINDOW**) str_get(st[1]); |
ff8e2863 |
533 | |
db4e6270 |
534 | retval = wgetch(win); |
ff8e2863 |
535 | if (retval == EOF) |
536 | st[0] = &str_undef; |
537 | else { |
538 | retch = retval; |
539 | str_nset(st[0], &retch, 1); |
540 | } |
db4e6270 |
541 | } |
542 | return sp; |
ff8e2863 |
543 | |
544 | CASE int getstr |
db4e6270 |
545 | O char* str |
ff8e2863 |
546 | END |
547 | |
548 | CASE int wgetstr |
549 | I WINDOW* win |
db4e6270 |
550 | O char* str |
ff8e2863 |
551 | END |
552 | |
553 | CASE int raw |
554 | END |
555 | |
556 | CASE int noraw |
557 | END |
558 | |
559 | CASE int baudrate |
560 | END |
561 | |
562 | CASE int delwin |
563 | I WINDOW* win |
564 | END |
565 | |
566 | CASE int endwin |
567 | END |
568 | |
569 | CASE int erasechar |
570 | END |
571 | |
ff8e2863 |
572 | case US_getyx: |
573 | if (items != 3) |
574 | fatal("Usage: &getyx($win, $y, $x)"); |
575 | else { |
576 | int retval; |
577 | STR* str = str_new(0); |
578 | WINDOW* win = *(WINDOW**) str_get(st[1]); |
579 | int y; |
580 | int x; |
581 | |
582 | do_sprintf(str, items - 1, st + 1); |
583 | retval = getyx(win, y, x); |
584 | str_numset(st[2], (double)y); |
585 | str_numset(st[3], (double)x); |
586 | str_numset(st[0], (double) retval); |
587 | str_free(str); |
588 | } |
589 | return sp; |
ff8e2863 |
590 | |
591 | CASE int inch |
592 | END |
593 | |
594 | CASE int winch |
595 | I WINDOW* win |
596 | END |
597 | |
598 | CASE WINDOW* initscr |
599 | END |
600 | |
601 | CASE int killchar |
602 | END |
603 | |
604 | CASE int leaveok |
605 | I WINDOW* win |
606 | I bool boolf |
607 | END |
608 | |
db4e6270 |
609 | #ifdef BSD |
ff8e2863 |
610 | CASE char* longname |
611 | I char* termbuf |
612 | IO char* name |
613 | END |
db4e6270 |
614 | #else |
615 | CASE char* longname |
616 | I char* termbug |
617 | I char* name |
ff8e2863 |
618 | END |
db4e6270 |
619 | #endif |
ff8e2863 |
620 | |
621 | CASE int mvwin |
622 | I WINDOW* win |
623 | I int y |
624 | I int x |
625 | END |
626 | |
627 | CASE WINDOW* newwin |
628 | I int lines |
629 | I int cols |
630 | I int begin_y |
631 | I int begin_x |
632 | END |
633 | |
634 | CASE int nl |
635 | END |
636 | |
637 | CASE int nonl |
638 | END |
639 | |
640 | CASE int scrollok |
641 | I WINDOW* win |
642 | I bool boolf |
643 | END |
644 | |
645 | CASE WINDOW* subwin |
646 | I WINDOW* win |
647 | I int lines |
648 | I int cols |
649 | I int begin_y |
650 | I int begin_x |
651 | END |
652 | |
653 | CASE int touchline |
654 | I WINDOW* win |
655 | I int y |
656 | I int startx |
657 | I int endx |
658 | END |
659 | |
ff8e2863 |
660 | CASE int touchwin |
661 | I WINDOW* win |
662 | END |
663 | |
664 | CASE char* unctrl |
665 | I char ch |
666 | END |
667 | |
668 | CASE int gettmode |
669 | END |
670 | |
671 | CASE int mvcur |
672 | I int lasty |
673 | I int lastx |
674 | I int newy |
675 | I int newx |
676 | END |
677 | |
678 | CASE int scroll |
679 | I WINDOW* win |
680 | END |
681 | |
682 | CASE int savetty |
683 | END |
684 | |
685 | CASE void resetty |
686 | END |
687 | |
688 | CASE int setterm |
689 | I char* name |
690 | END |
691 | |
db4e6270 |
692 | CASE int attroff |
693 | I chtype str |
694 | END |
695 | |
696 | CASE int wattroff |
697 | I chtype str |
698 | END |
699 | |
700 | CASE int wattron |
701 | I chtype str |
702 | END |
703 | |
704 | CASE int attron |
705 | I chtype str |
706 | END |
707 | |
708 | CASE int attrset |
709 | I chtype str |
710 | END |
711 | |
712 | CASE int wattrset |
713 | I chtype str |
714 | END |
715 | |
716 | #ifdef CURSEFMT |
717 | case US_printw: |
718 | if (items < 1) |
719 | fatal("Usage: &printw($fmt, $arg1, $arg2, ... )"); |
720 | else { |
721 | int retval; |
722 | STR* str = str_new(0); |
723 | |
724 | do_sprintf(str, items - 1, st + 1); |
725 | retval = addstr(str->str_ptr); |
726 | str_numset(st[0], (double) retval); |
727 | str_free(str); |
728 | } |
729 | return sp; |
730 | |
731 | case US_wprintw: |
732 | if (items < 2) |
733 | fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )"); |
734 | else { |
735 | int retval; |
736 | STR* str = str_new(0); |
737 | WINDOW* win = *(WINDOW**) str_get(st[1]); |
738 | |
739 | do_sprintf(str, items - 1, st + 1); |
740 | retval = waddstr(win, str->str_ptr); |
741 | str_numset(st[0], (double) retval); |
742 | str_free(str); |
743 | } |
744 | return sp; |
745 | |
746 | #endif |
747 | |
748 | CASE char* getcap |
749 | I char* str |
750 | END |
751 | |
752 | #ifdef BSD |
753 | CASE int flushok |
754 | I WINDOW* win |
755 | I bool boolf |
756 | END |
757 | |
758 | CASE int fullname |
759 | I char* termbuf |
760 | IO char* name |
761 | END |
762 | |
763 | CASE int touchoverlap |
764 | I WINDOW* win1 |
765 | I WINDOW* win2 |
766 | END |
767 | |
ff8e2863 |
768 | CASE int tstp |
769 | END |
770 | |
771 | CASE int _putchar |
772 | I char ch |
773 | END |
774 | |
db4e6270 |
775 | case US_testcallback: |
776 | sp = callback("callback", sp + items, curcsv->wantarray, 1, items); |
777 | break; |
778 | |
779 | #endif |
780 | |
ff8e2863 |
781 | default: |
782 | fatal("Unimplemented user-defined subroutine"); |
783 | } |
784 | return sp; |
785 | } |
786 | |
787 | static int |
788 | userval(ix, str) |
789 | int ix; |
790 | STR *str; |
791 | { |
792 | switch (ix) { |
793 | case UV_COLS: |
794 | str_numset(str, (double)COLS); |
795 | break; |
ff8e2863 |
796 | case UV_ERR: |
797 | str_numset(str, (double)ERR); |
798 | break; |
799 | case UV_LINES: |
800 | str_numset(str, (double)LINES); |
801 | break; |
ff8e2863 |
802 | case UV_OK: |
803 | str_numset(str, (double)OK); |
804 | break; |
805 | case UV_curscr: |
806 | str_nset(str, &curscr, sizeof(WINDOW*)); |
807 | break; |
808 | case UV_stdscr: |
809 | str_nset(str, &stdscr, sizeof(WINDOW*)); |
810 | break; |
811 | case UV_ttytype: |
812 | str_set(str, ttytype); |
813 | break; |
db4e6270 |
814 | #ifdef BSD |
815 | case UV_Def_term: |
816 | str_set(str, Def_term); |
817 | break; |
818 | case UV_My_term: |
819 | str_numset(str, (double)My_term); |
820 | break; |
821 | #endif |
822 | case UV_A_STANDOUT: |
823 | str_numset(str, (double)A_STANDOUT); |
824 | break; |
825 | case UV_A_UNDERLINE: |
826 | str_numset(str, (double)A_UNDERLINE); |
827 | break; |
828 | case UV_A_REVERSE: |
829 | str_numset(str, (double)A_REVERSE); |
830 | break; |
831 | case UV_A_BLINK: |
832 | str_numset(str, (double)A_BLINK); |
833 | break; |
834 | case UV_A_DIM: |
835 | str_numset(str, (double)A_DIM); |
836 | break; |
837 | case UV_A_BOLD: |
838 | str_numset(str, (double)A_BOLD); |
839 | break; |
840 | case UV_A_NORMAL: |
841 | str_numset(str, (double)A_NORMAL); |
842 | break; |
ff8e2863 |
843 | } |
844 | return 0; |
845 | } |
846 | |
847 | static int |
848 | userset(ix, str) |
849 | int ix; |
850 | STR *str; |
851 | { |
852 | switch (ix) { |
853 | case UV_COLS: |
854 | COLS = (int)str_gnum(str); |
855 | break; |
ff8e2863 |
856 | case UV_LINES: |
857 | LINES = (int)str_gnum(str); |
858 | break; |
ff8e2863 |
859 | case UV_ttytype: |
860 | strcpy(ttytype, str_get(str)); /* hope it fits */ |
db4e6270 |
861 | #ifdef USG |
862 | if (tcbuf != NULL) { |
863 | free(tcbuf); |
864 | tcbuf = NULL; |
865 | } |
866 | #endif |
867 | break; |
868 | #ifdef BSD |
869 | case UV_Def_term: |
870 | Def_term = savestr(str_get(str)); /* never freed */ |
871 | break; |
872 | case UV_My_term: |
873 | My_term = (bool)str_gnum(str); |
ff8e2863 |
874 | break; |
db4e6270 |
875 | #endif |
ff8e2863 |
876 | } |
877 | return 0; |
878 | } |