1 /* $RCSfile: curses.mus,v $$Revision: 4.0.1.2 $$Date: 92/06/08 16:06:12 $
4 * Revision 4.0.1.2 92/06/08 16:06:12 lwall
5 * patch20: function key support added to curses.mus
7 * Revision 4.0.1.1 91/11/05 19:06:19 lwall
8 * patch11: usub/curses.mus now supports SysV curses
10 * Revision 4.0 91/03/20 01:56:13 lwall
13 * Revision 3.0.1.1 90/08/09 04:05:21 lwall
14 * patch19: Initial revision
28 #define A_STANDOUT 0x0200
29 #define A_UNDERLINE 0x0100
30 #define A_REVERSE 0x0200
31 #define A_BLINK 0x0400
33 #define A_ALTCHARSET 0x1000
38 static char *tcbuf = NULL;
42 static unsigned curattr = NORMAL;
45 static enum uservars {
66 static enum usersubs {
143 US_printw, /* remove */
144 US_wprintw, /* remove */
145 US_scanw, /* delete */
146 US_wscanw, /* delete */
160 static int usersub();
161 static int userset();
162 static int userval();
168 char *filename = "curses.c";
173 #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
175 MAGICVAR("curscr", UV_curscr);
176 MAGICVAR("stdscr", UV_stdscr);
177 MAGICVAR("ttytype", UV_ttytype);
178 MAGICVAR("LINES", UV_LINES);
179 MAGICVAR("COLS", UV_COLS);
180 MAGICVAR("ERR", UV_ERR);
181 MAGICVAR("OK", UV_OK);
183 MAGICVAR("Def_term",UV_Def_term);
184 MAGICVAR("My_term", UV_My_term);
186 MAGICVAR("A_STANDOUT", UV_A_STANDOUT);
187 MAGICVAR("A_UNDERLINE", UV_A_UNDERLINE);
188 MAGICVAR("A_REVERSE", UV_A_REVERSE);
189 MAGICVAR("A_BLINK", UV_A_BLINK);
190 MAGICVAR("A_DIM", UV_A_DIM);
191 MAGICVAR("A_BOLD", UV_A_BOLD);
192 MAGICVAR("A_NORMAL", UV_A_NORMAL);
194 make_usub("addch", US_addch, usersub, filename);
195 make_usub("waddch", US_waddch, usersub, filename);
196 make_usub("addstr", US_addstr, usersub, filename);
197 make_usub("waddstr", US_waddstr, usersub, filename);
198 make_usub("box", US_box, usersub, filename);
199 make_usub("clear", US_clear, usersub, filename);
200 make_usub("wclear", US_wclear, usersub, filename);
201 make_usub("clearok", US_clearok, usersub, filename);
202 make_usub("clrtobot", US_clrtobot, usersub, filename);
203 make_usub("wclrtobot", US_wclrtobot, usersub, filename);
204 make_usub("clrtoeol", US_clrtoeol, usersub, filename);
205 make_usub("wclrtoeol", US_wclrtoeol, usersub, filename);
206 make_usub("delch", US_delch, usersub, filename);
207 make_usub("wdelch", US_wdelch, usersub, filename);
208 make_usub("deleteln", US_deleteln, usersub, filename);
209 make_usub("wdeleteln", US_wdeleteln, usersub, filename);
210 make_usub("erase", US_erase, usersub, filename);
211 make_usub("werase", US_werase, usersub, filename);
212 make_usub("idlok", US_idlok, usersub, filename);
213 make_usub("insch", US_insch, usersub, filename);
214 make_usub("winsch", US_winsch, usersub, filename);
215 make_usub("insertln", US_insertln, usersub, filename);
216 make_usub("winsertln", US_winsertln, usersub, filename);
217 make_usub("move", US_move, usersub, filename);
218 make_usub("wmove", US_wmove, usersub, filename);
219 make_usub("overlay", US_overlay, usersub, filename);
220 make_usub("overwrite", US_overwrite, usersub, filename);
221 make_usub("refresh", US_refresh, usersub, filename);
222 make_usub("wrefresh", US_wrefresh, usersub, filename);
223 make_usub("standout", US_standout, usersub, filename);
224 make_usub("wstandout", US_wstandout, usersub, filename);
225 make_usub("standend", US_standend, usersub, filename);
226 make_usub("wstandend", US_wstandend, usersub, filename);
227 make_usub("cbreak", US_cbreak, usersub, filename);
228 make_usub("nocbreak", US_nocbreak, usersub, filename);
229 make_usub("echo", US_echo, usersub, filename);
230 make_usub("noecho", US_noecho, usersub, filename);
231 make_usub("getch", US_getch, usersub, filename);
232 make_usub("wgetch", US_wgetch, usersub, filename);
233 make_usub("getstr", US_getstr, usersub, filename);
234 make_usub("wgetstr", US_wgetstr, usersub, filename);
235 make_usub("raw", US_raw, usersub, filename);
236 make_usub("noraw", US_noraw, usersub, filename);
237 make_usub("baudrate", US_baudrate, usersub, filename);
238 make_usub("delwin", US_delwin, usersub, filename);
239 make_usub("endwin", US_endwin, usersub, filename);
240 make_usub("erasechar", US_erasechar, usersub, filename);
241 make_usub("getyx", US_getyx, usersub, filename);
242 make_usub("inch", US_inch, usersub, filename);
243 make_usub("winch", US_winch, usersub, filename);
244 make_usub("initscr", US_initscr, usersub, filename);
245 make_usub("killchar", US_killchar, usersub, filename);
246 make_usub("leaveok", US_leaveok, usersub, filename);
247 make_usub("longname", US_longname, usersub, filename);
248 make_usub("mvwin", US_mvwin, usersub, filename);
249 make_usub("newwin", US_newwin, usersub, filename);
250 make_usub("nl", US_nl, usersub, filename);
251 make_usub("nonl", US_nonl, usersub, filename);
252 make_usub("scrollok", US_scrollok, usersub, filename);
253 make_usub("subwin", US_subwin, usersub, filename);
254 make_usub("touchline", US_touchline, usersub, filename);
255 make_usub("touchwin", US_touchwin, usersub, filename);
256 make_usub("unctrl", US_unctrl, usersub, filename);
257 make_usub("gettmode", US_gettmode, usersub, filename);
258 make_usub("mvcur", US_mvcur, usersub, filename);
259 make_usub("scroll", US_scroll, usersub, filename);
260 make_usub("savetty", US_savetty, usersub, filename);
261 make_usub("resetty", US_resetty, usersub, filename);
262 make_usub("setterm", US_setterm, usersub, filename);
263 make_usub("getcap", US_getcap, usersub, filename);
264 make_usub("attroff", US_attroff, usersub, filename);
265 make_usub("wattroff", US_wattroff, usersub, filename);
266 make_usub("attron", US_attron, usersub, filename);
267 make_usub("wattron", US_wattron, usersub, filename);
268 make_usub("attrset", US_attrset, usersub, filename);
269 make_usub("wattrset", US_wattrset, usersub, filename);
271 make_usub("printw", US_printw, usersub, filename);
272 make_usub("wprintw", US_wprintw, usersub, filename);
273 make_usub("scanw", US_scanw, usersub, filename);
274 make_usub("wscanw", US_wscanw, usersub, filename);
277 make_usub("flushok", US_flushok, usersub, filename);
278 make_usub("fullname", US_fullname, usersub, filename);
279 make_usub("touchoverlap", US_touchoverlap,usersub, filename);
280 make_usub("tstp", US_tstp, usersub, filename);
281 make_usub("_putchar", US__putchar, usersub, filename);
283 make_usub("testcallback", US_testcallback,usersub, filename);
291 static char nocaperr[] = "Cannot read termcap entry.";
293 extern char *tgetstr();
296 if ((tcbuf = malloc(1024)) == NULL) {
299 if (tgetent(tcbuf, ttytype) == -1) {
304 return (tgetstr(cap, NULL));
309 #define attron(attr) wattron(stdscr, attr)
310 #define attroff(attr) wattroff(stdscr, attr)
311 #define attset(attr) wattset(stdscr, attr)
319 if (curattr & A_STANDOUT) {
320 return(wstandout(win));
322 return(wstandend(win));
332 if (curattr & A_STANDOUT) {
333 return(wstandout(win));
335 return(wstandend(win));
345 if (curattr & A_STANDOUT) {
346 return(wstandout(win));
348 return(wstandend(win));
355 usersub(ix, sp, items)
360 STR **st = stack->ary_array + sp;
363 register STR *Str; /* used in str_get and str_gnum macros */
514 fatal("Usage: &getch()");
525 str_numset(st[0], (double) retval);
527 str_nset(st[0], &retch, 1);
534 fatal("Usage: &wgetch($win)");
538 WINDOW* win = *(WINDOW**) str_get(st[1]);
540 retval = wgetch(win);
546 str_numset(st[0], (double) retval);
548 str_nset(st[0], &retch, 1);
583 fatal("Usage: &getyx($win, $y, $x)");
586 STR* str = str_new(0);
587 WINDOW* win = *(WINDOW**) str_get(st[1]);
591 do_sprintf(str, items - 1, st + 1);
592 retval = getyx(win, y, x);
593 str_numset(st[2], (double)y);
594 str_numset(st[3], (double)x);
595 str_numset(st[0], (double) retval);
728 fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
731 STR* str = str_new(0);
733 do_sprintf(str, items - 1, st + 1);
734 retval = addstr(str->str_ptr);
735 str_numset(st[0], (double) retval);
742 fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
745 STR* str = str_new(0);
746 WINDOW* win = *(WINDOW**) str_get(st[1]);
748 do_sprintf(str, items - 1, st + 1);
749 retval = waddstr(win, str->str_ptr);
750 str_numset(st[0], (double) retval);
772 CASE int touchoverlap
784 case US_testcallback:
785 sp = callback("callback", sp + items, curcsv->wantarray, 1, items);
791 fatal("Unimplemented user-defined subroutine");
803 str_numset(str, (double)COLS);
806 str_numset(str, (double)ERR);
809 str_numset(str, (double)LINES);
812 str_numset(str, (double)OK);
815 str_nset(str, &curscr, sizeof(WINDOW*));
818 str_nset(str, &stdscr, sizeof(WINDOW*));
821 str_set(str, ttytype);
825 str_set(str, Def_term);
828 str_numset(str, (double)My_term);
832 str_numset(str, (double)A_STANDOUT);
835 str_numset(str, (double)A_UNDERLINE);
838 str_numset(str, (double)A_REVERSE);
841 str_numset(str, (double)A_BLINK);
844 str_numset(str, (double)A_DIM);
847 str_numset(str, (double)A_BOLD);
850 str_numset(str, (double)A_NORMAL);
863 COLS = (int)str_gnum(str);
866 LINES = (int)str_gnum(str);
869 strcpy(ttytype, str_get(str)); /* hope it fits */
879 Def_term = savestr(str_get(str)); /* never freed */
882 My_term = (bool)str_gnum(str);