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

📄 io.c

📁 早期freebsd实现
💻 C
字号:
/* * io.c - input/output routines for Phantasia */#include "include.h"/************************************************************************// FUNCTION NAME: getstring()// FUNCTION: read a string from operator// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS:/	char *cp - pointer to buffer area to fill/	int mx - maximum number of characters to put in buffer// RETURN VALUE: none// MODULES CALLED: wmove(), _filbuf(), clearok(), waddstr(), wrefresh(), /	wclrtoeol()// GLOBAL INPUTS: Echo, _iob[], Wizard, *stdscr// GLOBAL OUTPUTS: _iob[]// DESCRIPTION:/	Read a string from the keyboard./	This routine is specially designed to://	    - strip non-printing characters (unless Wizard)/	    - echo, if desired/	    - redraw the screen if CH_REDRAW is entered/	    - read in only 'mx - 1' characters or less characters/	    - nul-terminate string, and throw away newline//	'mx' is assumed to be at least 2.//************************************************************************/getstring(cp, mx)register char	*cp;register int	mx;{register char	*inptr;		/* pointer into string for next string */int	x, y;			/* original x, y coordinates on screen */int	ch;			/* input */    getyx(stdscr, y, x);	/* get coordinates on screen */    inptr = cp;    *inptr = '\0';		/* clear string to start */    --mx;			/* reserve room in string for nul terminator */    do	/* get characters and process */	{	if (Echo)	    mvaddstr(y, x, cp);	/* print string on screen */	clrtoeol();		/* clear any data after string */	refresh();		/* update screen */	ch = getchar();		/* get character */	switch (ch)	    {	    case CH_ERASE:	/* back up one character */		if (inptr > cp)		    --inptr;		break;	    case CH_KILL:	/* back up to original location */		inptr = cp;		break;	    case CH_NEWLINE:	/* terminate string */		break;	    case CH_REDRAW:	/* redraw screen */		clearok(stdscr, TRUE);		continue;	    default:		/* put data in string */		if (ch >= ' ' || Wizard)		    /* printing char; put in string */		    *inptr++ = ch;	    }	*inptr = '\0';		/* terminate string */	}    while (ch != CH_NEWLINE && inptr < cp + mx);}/**//************************************************************************// FUNCTION NAME: more()// FUNCTION: pause and prompt player// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS:/	int where - line on screen on which to pause// RETURN VALUE: none// MODULES CALLED: wmove(), waddstr(), getanswer()// GLOBAL INPUTS: *stdscr// GLOBAL OUTPUTS: none// DESCRIPTION:/	Print a message, and wait for a space character.//************************************************************************/more(where)int	where;{    mvaddstr(where, 0, "-- more --");    getanswer(" ", FALSE);}/**//************************************************************************// FUNCTION NAME: infloat()// FUNCTION: input a floating point number from operator// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: floating point number from operator// MODULES CALLED: sscanf(), getstring()// GLOBAL INPUTS: Databuf[]// GLOBAL OUTPUTS: none// DESCRIPTION:/	Read a string from player, and scan for a floating point/	number./	If no valid number is found, return 0.0.//************************************************************************/doubleinfloat(){double	result;		/* return value */    getstring(Databuf, SZ_DATABUF);    if (sscanf(Databuf, "%lf", &result) < 1)	/* no valid number entered */	result = 0.0;    return(result);}/**//************************************************************************// FUNCTION NAME: inputoption()// FUNCTION: input an option value from player// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: floor(), drandom(), getanswer()// GLOBAL INPUTS: Player// GLOBAL OUTPUTS: Player// DESCRIPTION:/	Age increases with every move./	Refresh screen, and get a single character option from player./	Return a random value if player's ring has gone bad.//************************************************************************/inputoption(){    ++Player.p_age;		/* increase age */    if (Player.p_ring.ring_type != R_SPOILED)	/* ring ok */	return(getanswer("T ", TRUE));    else	/* bad ring */	{	getanswer(" ", TRUE);	return((int) ROLL(0.0, 5.0) + '0');	}}/**//************************************************************************// FUNCTION NAME: interrupt()// FUNCTION: handle interrupt from operator// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: fork(), exit(), wait(), death(), alarm(), execl(), wmove(), /	getgid(), signal(), getenv(), wclear(), setuid(), getuid(), setgid(), /	crmode(), clearok(), waddstr(), cleanup(), wrefresh(), leavegame(), /	getanswer()// GLOBAL INPUTS: Player, *stdscr// GLOBAL OUTPUTS: none// DESCRIPTION:/	Allow player to quit upon hitting the interrupt key./	If the player wants to quit while in battle, he/she automatically/	dies.//************************************************************************/interrupt(){char	line[81];		/* a place to store data already on screen */register int	loop;		/* counter */int	x, y;			/* coordinates on screen */int	ch;			/* input */unsigned	savealarm;	/* to save alarm value */#ifdef SYS3    signal(SIGINT, SIG_IGN);#endif#ifdef SYS5    signal(SIGINT, SIG_IGN);#endif    savealarm = alarm(0);		/* turn off any alarms */    getyx(stdscr, y, x);		/* save cursor location */    for (loop = 0; loop < 80; ++loop)	/* save line on screen */	{	move(4, loop);	line[loop] = inch();	}    line[80] = '\0';			/* nul terminate */    if (Player.p_status == S_INBATTLE || Player.p_status == S_MONSTER)	/* in midst of fighting */	{	mvaddstr(4, 0, "Quitting now will automatically kill your character.  Still want to ? ");	ch = getanswer("NY", FALSE);	if (ch == 'Y')	    death("Bailing out");	    /*NOTREACHED*/	}    else	{	mvaddstr(4, 0, "Do you really want to quit ? ");	ch = getanswer("NY", FALSE);	if (ch == 'Y')	    leavegame();	    /*NOTREACHED*/	}    mvaddstr(4, 0, line); 		/* restore data on screen */    move(y, x);				/* restore cursor */    refresh();#ifdef SYS3    signal(SIGINT, interrupt);#endif#ifdef SYS5    signal(SIGINT, interrupt);#endif    alarm(savealarm);			/* restore alarm */}/**//************************************************************************// FUNCTION NAME: getanswer()// FUNCTION: get an answer from operator// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS:/	char *choices - string of (upper case) valid choices/	bool def - set if default answer// RETURN VALUE: none// MODULES CALLED: alarm(), wmove(), waddch(), signal(), setjmp(), strchr(), /	_filbuf(), clearok(), toupper(), wrefresh(), mvprintw(), wclrtoeol()// GLOBAL INPUTS: catchalarm(), Echo, _iob[], _ctype[], *stdscr, Timeout, /	Timeoenv[]// GLOBAL OUTPUTS: _iob[]// DESCRIPTION:/	Get a single character answer from operator./	Timeout waiting for response.  If we timeout, or the/	answer in not in the list of valid choices, print choices,/	and wait again, otherwise return the first character in ths/	list of choices./	Give up after 3 tries.//************************************************************************/getanswer(choices, def)char	*choices;bool	def;{int	ch;			/* input */int	loop;			/* counter */int	oldx, oldy;		/* original coordinates on screen */    getyx(stdscr, oldy, oldx);    alarm(0);				/* make sure alarm is off */    for (loop = 3; loop; --loop)	/* try for 3 times */	{	if (setjmp(Timeoenv) != 0)	    /* timed out waiting for response */	    {	    if (def || loop <= 1)		/* return default answer */		break;	    else		/* prompt, and try again */		goto YELL;	    }	else	    /* wait for response */	    {	    clrtoeol();	    refresh();#ifdef BSD41	    sigset(SIGALRM, catchalarm);#else	    signal(SIGALRM, catchalarm);#endif	    /* set timeout */	    if (Timeout)		alarm(7);		/* short */	    else		alarm(600);		/* long */	    ch = getchar();	    alarm(0);			/* turn off timeout */	    if (ch < 0)		/* caught some signal */		{		++loop;		continue;		}	    else if (ch == CH_REDRAW)		/* redraw screen */		{		clearok(stdscr, TRUE);	/* force clear screen */		++loop;			/* don't count this input */		continue;		}	    else if (Echo)		{		addch(ch);		/* echo character */		refresh();		}	    if (islower(ch))		/* convert to upper case */		ch = toupper(ch);	    if (def || strchr(choices, ch) != NULL)		/* valid choice */		return(ch);	    else if (!def && loop > 1)		/* bad choice; prompt, and try again */		{YELL:		mvprintw(oldy + 1, 0, "Please choose one of : [%s]\n", choices);		move(oldy, oldx);		clrtoeol();		continue;		}	    else		/* return default answer */		break;	    }	}    return(*choices);}/**//************************************************************************// FUNCTION NAME: catchalarm()// FUNCTION: catch timer when waiting for input// AUTHOR: E. A. Estes, 12/4/85// ARGUMENTS: none// RETURN VALUE: none// MODULES CALLED: longjmp()// GLOBAL INPUTS: Timeoenv[]// GLOBAL OUTPUTS: none// DESCRIPTION:/	Come here when the alarm expires while waiting for input./	Simply longjmp() into getanswer().//************************************************************************/voidcatchalarm(){    longjmp(Timeoenv, 1);}

⌨️ 快捷键说明

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