⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsdcurses.mus

📁 早期freebsd实现
💻 MUS
字号:
/* $RCSfile: bsdcurses.mus,v $$Revision: 4.0.1.2 $$Date: 92/06/08 16:05:28 $ * * $Log:	bsdcurses.mus,v $ * Revision 4.0.1.2  92/06/08  16:05:28  lwall * patch20: &getcap eventually dumped core in bsdcurses *  * Revision 4.0.1.1  91/11/05  19:04:53  lwall * initial checkin *  * 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"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,    US_testcallback,};static int usersub();static int userset();static int userval();intinit_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);    make_usub("testcallback",	US_testcallback,usersub, filename);};static intusersub(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 addchI	char		chENDCASE int waddchI	WINDOW*		winI	char		chENDCASE int addstrI	char*		strENDCASE int waddstrI	WINDOW*		winI	char*		strENDCASE int boxI	WINDOW*		winI	char		vertI	char		horENDCASE int clearENDCASE int wclearI	WINDOW*		winENDCASE int clearokI	WINDOW*		winI	bool		boolfENDCASE int clrtobotENDCASE int wclrtobotI	WINDOW*		winENDCASE int clrtoeolENDCASE int wclrtoeolI	WINDOW*		winENDCASE int delchENDCASE int wdelchI	WINDOW*		winENDCASE int deletelnENDCASE int wdeletelnI	WINDOW*		winENDCASE int eraseENDCASE int weraseI	WINDOW*		winENDCASE int flushokI	WINDOW*		winI	bool		boolfENDCASE int idlokI	WINDOW*		winI	bool		boolfENDCASE int inschI	char		cENDCASE int winschI	WINDOW*		winI	char		cENDCASE int insertlnENDCASE int winsertlnI	WINDOW*		winENDCASE int moveI	int		yI	int		xENDCASE int wmoveI	WINDOW*		winI	int		yI	int		xENDCASE int overlayI	WINDOW*		win1I	WINDOW*		win2ENDCASE int overwriteI	WINDOW*		win1I	WINDOW*		win2END    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 refreshENDCASE int wrefreshI	WINDOW*		winENDCASE int standoutENDCASE int wstandoutI	WINDOW*		winENDCASE int standendENDCASE int wstandendI	WINDOW*		winENDCASE int cbreakENDCASE int nocbreakENDCASE int echoENDCASE int noechoEND    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 getstrIO	char*		strENDCASE int wgetstrI	WINDOW*		winIO	char*		strENDCASE int rawENDCASE int norawENDCASE int baudrateENDCASE int delwinI	WINDOW*		winENDCASE int endwinENDCASE int erasecharEND    case US_getcap:	if (items != 1)	    fatal("Usage: &getcap($str)");	else {	    char* retval;	    char*	str =		(char*)		str_get(st[1]);	    char output[50], *outputp = output;	    retval = tgetstr(str, &outputp);	    str_set(st[0], (char*) retval);	}	return sp;    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 inchENDCASE int winchI	WINDOW*		winENDCASE WINDOW* initscrENDCASE int killcharENDCASE int leaveokI	WINDOW*		winI	bool		boolfENDCASE char* longnameI	char*		termbufIO	char*		nameENDCASE int fullnameI	char*		termbufIO	char*		nameENDCASE int mvwinI	WINDOW*		winI	int		yI	int		xENDCASE WINDOW* newwinI	int		linesI	int		colsI	int		begin_yI	int		begin_xENDCASE int nlENDCASE int nonlENDCASE int scrollokI	WINDOW*		winI	bool		boolfENDCASE WINDOW* subwinI	WINDOW*		winI	int		linesI	int		colsI	int		begin_yI	int		begin_xENDCASE int touchlineI	WINDOW*		winI	int		yI	int		startxI	int		endxENDCASE int touchoverlapI	WINDOW*		win1I	WINDOW*		win2ENDCASE int touchwinI	WINDOW*		winENDCASE char* unctrlI	char		chENDCASE int gettmodeENDCASE int mvcurI	int		lastyI	int		lastxI	int		newyI	int		newxENDCASE int scrollI	WINDOW*		winENDCASE int savettyENDCASE void resettyENDCASE int settermI	char*		nameENDCASE int tstpENDCASE int _putcharI	char		chEND    case US_testcallback:	sp = callback("callback", sp + items, curcsv->wantarray, 1, items);	break;    default:	fatal("Unimplemented user-defined subroutine");    }    return sp;}static intuserval(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 intuserset(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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -