home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
perl
/
os2perl
/
curses.mus
< prev
next >
Wrap
Text File
|
1991-04-12
|
13KB
|
677 lines
/* $Header: curses.mus,v 4.0 91/03/20 01:56:13 lwall Locked $
*
* $Log: curses.mus,v $
* Revision 4.0 91/03/20 01:56:13 lwall
* 4.0 baseline.
*
* Revision 3.0.1.1 90/08/09 04:05:21 lwall
* patch19: Initial revision
*
*/
#include "EXTERN.h"
#include "perl.h"
extern int wantarray;
char *savestr();
#include <curses.h>
static enum uservars {
UV_curscr,
UV_stdscr,
UV_Def_term,
UV_My_term,
UV_ttytype,
UV_LINES,
UV_COLS,
UV_ERR,
UV_OK,
};
static enum usersubs {
US_addch,
US_waddch,
US_addstr,
US_waddstr,
US_box,
US_clear,
US_wclear,
US_clearok,
US_clrtobot,
US_wclrtobot,
US_clrtoeol,
US_wclrtoeol,
US_delch,
US_wdelch,
US_deleteln,
US_wdeleteln,
US_erase,
US_werase,
US_flushok,
US_idlok,
US_insch,
US_winsch,
US_insertln,
US_winsertln,
US_move,
US_wmove,
US_overlay,
US_overwrite,
US_printw,
US_wprintw,
US_refresh,
US_wrefresh,
US_standout,
US_wstandout,
US_standend,
US_wstandend,
US_cbreak,
US_nocbreak,
US_echo,
US_noecho,
US_getch,
US_wgetch,
US_getstr,
US_wgetstr,
US_raw,
US_noraw,
US_scanw,
US_wscanw,
US_baudrate,
US_delwin,
US_endwin,
US_erasechar,
US_getcap,
US_getyx,
US_inch,
US_winch,
US_initscr,
US_killchar,
US_leaveok,
US_longname,
US_fullname,
US_mvwin,
US_newwin,
US_nl,
US_nonl,
US_scrollok,
US_subwin,
US_touchline,
US_touchoverlap,
US_touchwin,
US_unctrl,
US_gettmode,
US_mvcur,
US_scroll,
US_savetty,
US_resetty,
US_setterm,
US_tstp,
US__putchar,
};
static int usersub();
static int userset();
static int userval();
int
init_curses()
{
struct ufuncs uf;
char *filename = "curses.c";
uf.uf_set = userset;
uf.uf_val = userval;
#define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
MAGICVAR("curscr", UV_curscr);
MAGICVAR("stdscr", UV_stdscr);
MAGICVAR("Def_term",UV_Def_term);
MAGICVAR("My_term", UV_My_term);
MAGICVAR("ttytype", UV_ttytype);
MAGICVAR("LINES", UV_LINES);
MAGICVAR("COLS", UV_COLS);
MAGICVAR("ERR", UV_ERR);
MAGICVAR("OK", UV_OK);
make_usub("addch", US_addch, usersub, filename);
make_usub("waddch", US_waddch, usersub, filename);
make_usub("addstr", US_addstr, usersub, filename);
make_usub("waddstr", US_waddstr, usersub, filename);
make_usub("box", US_box, usersub, filename);
make_usub("clear", US_clear, usersub, filename);
make_usub("wclear", US_wclear, usersub, filename);
make_usub("clearok", US_clearok, usersub, filename);
make_usub("clrtobot", US_clrtobot, usersub, filename);
make_usub("wclrtobot", US_wclrtobot, usersub, filename);
make_usub("clrtoeol", US_clrtoeol, usersub, filename);
make_usub("wclrtoeol", US_wclrtoeol, usersub, filename);
make_usub("delch", US_delch, usersub, filename);
make_usub("wdelch", US_wdelch, usersub, filename);
make_usub("deleteln", US_deleteln, usersub, filename);
make_usub("wdeleteln", US_wdeleteln, usersub, filename);
make_usub("erase", US_erase, usersub, filename);
make_usub("werase", US_werase, usersub, filename);
make_usub("flushok", US_flushok, usersub, filename);
make_usub("idlok", US_idlok, usersub, filename);
make_usub("insch", US_insch, usersub, filename);
make_usub("winsch", US_winsch, usersub, filename);
make_usub("insertln", US_insertln, usersub, filename);
make_usub("winsertln", US_winsertln, usersub, filename);
make_usub("move", US_move, usersub, filename);
make_usub("wmove", US_wmove, usersub, filename);
make_usub("overlay", US_overlay, usersub, filename);
make_usub("overwrite", US_overwrite, usersub, filename);
make_usub("printw", US_printw, usersub, filename);
make_usub("wprintw", US_wprintw, usersub, filename);
make_usub("refresh", US_refresh, usersub, filename);
make_usub("wrefresh", US_wrefresh, usersub, filename);
make_usub("standout", US_standout, usersub, filename);
make_usub("wstandout", US_wstandout, usersub, filename);
make_usub("standend", US_standend, usersub, filename);
make_usub("wstandend", US_wstandend, usersub, filename);
make_usub("cbreak", US_cbreak, usersub, filename);
make_usub("nocbreak", US_nocbreak, usersub, filename);
make_usub("echo", US_echo, usersub, filename);
make_usub("noecho", US_noecho, usersub, filename);
make_usub("getch", US_getch, usersub, filename);
make_usub("wgetch", US_wgetch, usersub, filename);
make_usub("getstr", US_getstr, usersub, filename);
make_usub("wgetstr", US_wgetstr, usersub, filename);
make_usub("raw", US_raw, usersub, filename);
make_usub("noraw", US_noraw, usersub, filename);
make_usub("scanw", US_scanw, usersub, filename);
make_usub("wscanw", US_wscanw, usersub, filename);
make_usub("baudrate", US_baudrate, usersub, filename);
make_usub("delwin", US_delwin, usersub, filename);
make_usub("endwin", US_endwin, usersub, filename);
make_usub("erasechar", US_erasechar, usersub, filename);
make_usub("getcap", US_getcap, usersub, filename);
make_usub("getyx", US_getyx, usersub, filename);
make_usub("inch", US_inch, usersub, filename);
make_usub("winch", US_winch, usersub, filename);
make_usub("initscr", US_initscr, usersub, filename);
make_usub("killchar", US_killchar, usersub, filename);
make_usub("leaveok", US_leaveok, usersub, filename);
make_usub("longname", US_longname, usersub, filename);
make_usub("fullname", US_fullname, usersub, filename);
make_usub("mvwin", US_mvwin, usersub, filename);
make_usub("newwin", US_newwin, usersub, filename);
make_usub("nl", US_nl, usersub, filename);
make_usub("nonl", US_nonl, usersub, filename);
make_usub("scrollok", US_scrollok, usersub, filename);
make_usub("subwin", US_subwin, usersub, filename);
make_usub("touchline", US_touchline, usersub, filename);
make_usub("touchoverlap", US_touchoverlap,usersub, filename);
make_usub("touchwin", US_touchwin, usersub, filename);
make_usub("unctrl", US_unctrl, usersub, filename);
make_usub("gettmode", US_gettmode, usersub, filename);
make_usub("mvcur", US_mvcur, usersub, filename);
make_usub("scroll", US_scroll, usersub, filename);
make_usub("savetty", US_savetty, usersub, filename);
make_usub("resetty", US_resetty, usersub, filename);
make_usub("setterm", US_setterm, usersub, filename);
make_usub("tstp", US_tstp, usersub, filename);
make_usub("_putchar", US__putchar, usersub, filename);
};
static int
usersub(ix, sp, items)
int ix;
register int sp;
register int items;
{
STR **st = stack->ary_array + sp;
register int i;
register char *tmps;
register STR *Str; /* used in str_get and str_gnum macros */
switch (ix) {
CASE int addch
I char ch
END
CASE int waddch
I WINDOW* win
I char ch
END
CASE int addstr
I char* str
END
CASE int waddstr
I WINDOW* win
I char* str
END
CASE int box
I WINDOW* win
I char vert
I char hor
END
CASE int clear
END
CASE int wclear
I WINDOW* win
END
CASE int clearok
I WINDOW* win
I bool boolf
END
CASE int clrtobot
END
CASE int wclrtobot
I WINDOW* win
END
CASE int clrtoeol
END
CASE int wclrtoeol
I WINDOW* win
END
CASE int delch
END
CASE int wdelch
I WINDOW* win
END
CASE int deleteln
END
CASE int wdeleteln
I WINDOW* win
END
CASE int erase
END
CASE int werase
I WINDOW* win
END
CASE int flushok
I WINDOW* win
I bool boolf
END
CASE int idlok
I WINDOW* win
I bool boolf
END
CASE int insch
I char c
END
CASE int winsch
I WINDOW* win
I char c
END
CASE int insertln
END
CASE int winsertln
I WINDOW* win
END
CASE int move
I int y
I int x
END
CASE int wmove
I WINDOW* win
I int y
I int x
END
CASE int overlay
I WINDOW* win1
I WINDOW* win2
END
CASE int overwrite
I WINDOW* win1
I WINDOW* win2
END
case US_printw:
if (items < 1)
fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
else {
int retval;
STR* str = str_new(0);
do_sprintf(str, items - 1, st + 1);
retval = addstr(str->str_ptr);
str_numset(st[0], (double) retval);
str_free(str);
}
return sp;
case US_wprintw:
if (items < 2)
fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
else {
int retval;
STR* str = str_new(0);
WINDOW* win = *(WINDOW**) str_get(st[1]);
do_sprintf(str, items - 1, st + 1);
retval = waddstr(win, str->str_ptr);
str_numset(st[0], (double) retval);
str_free(str);
}
return sp;
CASE int refresh
END
CASE int wrefresh
I WINDOW* win
END
CASE int standout
END
CASE int wstandout
I WINDOW* win
END
CASE int standend
END
CASE int wstandend
I WINDOW* win
END
CASE int cbreak
END
CASE int nocbreak
END
CASE int echo
END
CASE int noecho
END
case US_getch:
if (items != 0)
fatal("Usage: &getch()");
else {
int retval;
char retch;
retval = getch();
if (retval == EOF)
st[0] = &str_undef;
else {
retch = retval;
str_nset(st[0], &retch, 1);
}
}
return sp;
case US_wgetch:
if (items != 1)
fatal("Usage: &wgetch($win)");
else {
int retval;
char retch;
WINDOW* win = *(WINDOW**) str_get(st[1]);
retval = wgetch(win);
if (retval == EOF)
st[0] = &str_undef;
else {
retch = retval;
str_nset(st[0], &retch, 1);
}
}
return sp;
CASE int getstr
IO char* str
END
CASE int wgetstr
I WINDOW* win
IO char* str
END
CASE int raw
END
CASE int noraw
END
CASE int baudrate
END
CASE int delwin
I WINDOW* win
END
CASE int endwin
END
CASE int erasechar
END
CASE char* getcap
I char* str
END
case US_getyx:
if (items != 3)
fatal("Usage: &getyx($win, $y, $x)");
else {
int retval;
STR* str = str_new(0);
WINDOW* win = *(WINDOW**) str_get(st[1]);
int y;
int x;
do_sprintf(str, items - 1, st + 1);
retval = getyx(win, y, x);
str_numset(st[2], (double)y);
str_numset(st[3], (double)x);
str_numset(st[0], (double) retval);
str_free(str);
}
return sp;
CASE int inch
END
CASE int winch
I WINDOW* win
END
CASE WINDOW* initscr
END
CASE int killchar
END
CASE int leaveok
I WINDOW* win
I bool boolf
END
CASE char* longname
I char* termbuf
IO char* name
END
CASE int fullname
I char* termbuf
IO char* name
END
CASE int mvwin
I WINDOW* win
I int y
I int x
END
CASE WINDOW* newwin
I int lines
I int cols
I int begin_y
I int begin_x
END
CASE int nl
END
CASE int nonl
END
CASE int scrollok
I WINDOW* win
I bool boolf
END
CASE WINDOW* subwin
I WINDOW* win
I int lines
I int cols
I int begin_y
I int begin_x
END
CASE int touchline
I WINDOW* win
I int y
I int startx
I int endx
END
CASE int touchoverlap
I WINDOW* win1
I WINDOW* win2
END
CASE int touchwin
I WINDOW* win
END
CASE char* unctrl
I char ch
END
CASE int gettmode
END
CASE int mvcur
I int lasty
I int lastx
I int newy
I int newx
END
CASE int scroll
I WINDOW* win
END
CASE int savetty
END
CASE void resetty
END
CASE int setterm
I char* name
END
CASE int tstp
END
CASE int _putchar
I char ch
END
default:
fatal("Unimplemented user-defined subroutine");
}
return sp;
}
static int
userval(ix, str)
int ix;
STR *str;
{
switch (ix) {
case UV_COLS:
str_numset(str, (double)COLS);
break;
case UV_Def_term:
str_set(str, Def_term);
break;
case UV_ERR:
str_numset(str, (double)ERR);
break;
case UV_LINES:
str_numset(str, (double)LINES);
break;
case UV_My_term:
str_numset(str, (double)My_term);
break;
case UV_OK:
str_numset(str, (double)OK);
break;
case UV_curscr:
str_nset(str, &curscr, sizeof(WINDOW*));
break;
case UV_stdscr:
str_nset(str, &stdscr, sizeof(WINDOW*));
break;
case UV_ttytype:
str_set(str, ttytype);
break;
}
return 0;
}
static int
userset(ix, str)
int ix;
STR *str;
{
switch (ix) {
case UV_COLS:
COLS = (int)str_gnum(str);
break;
case UV_Def_term:
Def_term = savestr(str_get(str)); /* never freed */
break;
case UV_LINES:
LINES = (int)str_gnum(str);
break;
case UV_My_term:
My_term = (bool)str_gnum(str);
break;
case UV_ttytype:
strcpy(ttytype, str_get(str)); /* hope it fits */
break;
}
return 0;
}