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

📄 os.c

📁 早期freebsd实现
💻 C
字号:
/* * Operating system dependent routines. * * Most of the stuff in here is based on Unix, but an attempt * has been made to make things work on other operating systems. * This will sometimes result in a loss of functionality, unless * someone rewrites code specifically for the new operating system. * * The makefile provides defines to decide whether various * Unix features are present. */#include <stdio.h>#include <signal.h>#include <setjmp.h>#include "less.h"/* * BSD setjmp() saves (and longjmp() restores) the signal mask. * This costs a system call or two per setjmp(), so if possible we clear the * signal mask with sigsetmask(), and use _setjmp()/_longjmp() instead. * On other systems, setjmp() doesn't affect the signal mask and so * _setjmp() does not exist; we just use setjmp(). */#if HAS__SETJMP && SIGSETMASK#define SET_JUMP	_setjmp#define LONG_JUMP	_longjmp#else#define SET_JUMP	setjmp#define LONG_JUMP	longjmp#endifextern char *getenv();public int reading;static jmp_buf read_label;/* * Like read() system call, but is deliberately interruptible. * A call to intread() from a signal handler will interrupt * any pending iread(). */	public intiread(fd, buf, len)	int fd;	char *buf;	unsigned int len;{	register int n;	if (SET_JUMP(read_label))	{		/*		 * We jumped here from intread.		 */		reading = 0;#if SIGSETMASK		sigsetmask(0);#endif		return (READ_INTR);	}	flush();	reading = 1;	n = read(fd, buf, len);	reading = 0;	if (n < 0)		return (-1);	return (n);}/* * Interrupt a pending iread(). */	public voidintread(){	LONG_JUMP(read_label, 1);}#if GET_TIME	public longget_time(){	long t;	time(&t);	return (t);}#endif/* * errno_message: Return an error message based on the value of "errno". */#if PERRORextern char *sys_errlist[];extern int sys_nerr;extern int errno;	public char *errno_message(filename)	char *filename;{	register char *p;	register char *m;	char msg[16];	if (errno < sys_nerr)		p = sys_errlist[errno];	else	{		sprintf(msg, "Error %d", errno);		p = msg;	}	m = (char *) ecalloc(strlen(filename) + strlen(p) + 3, sizeof(char));	sprintf(m, "%s: %s", filename, p);	return (m);}#else	public char *errno_message(filename)	char *filename;{	register char *m;	static char msg[] = ": cannot open";	m = (char *) ecalloc(strlen(filename) + sizeof(msg), sizeof(char));	strcpy(m, filename);	strcat(m, msg);	return (m);}#endif

⌨️ 快捷键说明

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