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

📄 util.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	*line1 = *line2;	*char1 = *char2;	*line2 = tline;	*char2 = tchar;	return YES;}boolinlist(first, what)register Line	*first,		*what;{	while (first) {		if (first == what)			return YES;		first = first->l_next;	}	return NO;}/* Make `buf' (un)modified and tell the redisplay code to update the modeline   if it will need to be changed. */int	ModCount = 0;voidmodify(){	if (!curbuf->b_modified) {		UpdModLine = YES;		curbuf->b_modified = YES;	}	DOLsave = YES;	if (!Asking)		ModCount += 1;}voidunmodify(){	if (curbuf->b_modified) {		UpdModLine = YES;		curbuf->b_modified = NO;	}}intnumcomp(s1, s2)register char	*s1,		*s2;{	register int	count = 0;	while (*s1 != '\0' && *s1++ == *s2++)		count += 1;	return count;}char *copystr(str)char	*str;{	char	*val;	if (str == NULL)		return NULL;	val = emalloc((size_t) (strlen(str) + 1));	strcpy(val, str);	return val;}#ifndef	byte_copyvoidbyte_copy(from, to, count)UnivConstPtr	*from;UnivPtr		*to;register size_t	count;{	register const char	*p = from;	register char		*q = to;	if (count != 0) {	    do *q++ = *p++; while (--count != 0);	}}#endifvoidlen_error(flag)int	flag;{	char	*mesg = "[line too long]";	if (flag == COMPLAIN)		complain(mesg);	else		error(mesg);}/* Insert num number of c's at offset atchar in a linebuf of LBSIZE */voidins_c(c, buf, atchar, num, max)int	c;char	*buf;int	atchar,	num,	max;{	register char	*pp, *pp1;	register int	len;	int	numchars;	/* number of characters to copy forward */	if (num <= 0)		return;	len = atchar + strlen(&buf[atchar]);	if (len + num >= max)		len_error(COMPLAIN);	pp = &buf[len + 1];		/* + 1 so we can --pp (not pp--) */	pp1 = &buf[len + num + 1];	numchars = len - atchar;	while (numchars-- >= 0)		*--pp1 = *--pp;	pp = &buf[atchar];	while (--num >= 0)		*pp++ = c;}intTwoBlank(){	register Line	*next = curline->l_next;	return ((next != NULL) &&		(*(lcontents(next)) == '\0') &&		(next->l_next != NULL) &&		(*(lcontents(next->l_next)) == '\0'));}voidlinecopy(onto, atchar, from)register char	*onto,		*from;int	atchar;{	register char	*endp = &onto[LBSIZE];	onto += atchar;	do {		if (onto >= endp)			len_error(ERROR);	} while ((*onto++ = *from++) != '\0');}char *IOerr(err, file)char	*err, *file;{	return sprint("Couldn't %s \"%s\".", err, file);}#ifdef	UNIXvoiddopipe(p)int	*p;{	if (pipe(p) == -1)		complain("[Pipe failed: %s]", strerror(errno));}voidpipeclose(p)int	*p;{	(void) close(p[0]);	(void) close(p[1]);}#endif	/* UNIX *//* NOSTRICT */UnivPtremalloc(size)size_t	size;{	register UnivPtr	ptr;	if ((ptr = malloc(size)) == NULL) {		/* Try garbage collecting lines */		GCchunks();		if ((ptr = malloc(size)) == NULL) {			/* Uh ... Oh screw it! */			error("[Out of memory] ");			/* NOTREACHED */		}	}	return ptr;}UnivPtrerealloc(ptr, size)UnivPtr	ptr;size_t	size;{	if ((ptr = realloc(ptr, size)) == NULL) {		/* no second chance for realloc! */		error("[out of memory]");		/* NOTREACHED */	}	return ptr;}/* Return the basename of file F. */char *basename(f)register char	*f;{	register char	*cp;	if ((cp = strrchr(f, '/')) != NULL)		return cp + 1;	else#ifdef	MSDOS		if (cp = strrchr(f, '\\'))			return cp + 1;	else		if (cp = strrchr(f, ':'))			return cp + 1;#endif	/* MSDOS */		return f;}voidpush_env(savejmp)jmp_buf	savejmp;{	byte_copy((UnivPtr) mainjmp, (UnivPtr) savejmp, sizeof (jmp_buf));}voidpop_env(savejmp)jmp_buf	savejmp;{	byte_copy((UnivPtr) savejmp, (UnivPtr) mainjmp, sizeof (jmp_buf));}/* get the time buf, designated by *timep, from FROM to TO. */char *get_time(timep, buf, from, to)time_t	*timep;char	*buf;int	from,	to;{	time_t	now;	char	*cp;	if (timep != NULL)		now = *timep;	else		(void) time(&now);	cp = ctime(&now) + from;#ifndef	MSDOS	if (to == -1)#else	/* MSDOS */	if ((to == -1) && (cp[strlen(cp)-1] == '\n'))#endif	/* MSDOS */		cp[strlen(cp) - 1] = '\0';		/* Get rid of \n */	else		cp[to - from] = '\0';	if (buf) {		strcpy(buf, cp);		return buf;	} else {		return cp;	}}intcasecmp(s1, s2)register char	*s1,		*s2;{	if (s1==NULL || s2==NULL)		return 1;	/* which is not zero ... */	while (CharUpcase(*s1) == CharUpcase(*s2++))		if (*s1++ == '\0')			return 0;	return (*s1 - *--s2);}intcasencmp(s1, s2, n)register char	*s1,		*s2;register size_t	n;{	if (s1==NULL || s2==NULL)		return 1;	/* which is not zero ... */	for (;;) {		if (n == 0)			return 0;		n--;		if (CharUpcase(*s1) != CharUpcase(*s2++))			return *s1 - *--s2;		if (*s1++ == '\0')			return 0;	}}voidnull_ncpy(to, from, n)char	*to,	*from;size_t	n;{	(void) strncpy(to, from, n);	to[n] = '\0';}/* Tries to pause for delay/10 seconds OR until a character is typed   at the keyboard.  This works well on BSD4_2 and not so well on the   rest. */#ifdef	BSD4_2# ifndef	BSD2_10#   include <sys/time.h># endif#endif#ifdef	MSDOS# include <bios.h># include <dos.h>#endifvoidSitFor(delay)int	delay;{#ifdef	MAC	long	start,		end;#define Ticks ((long *) 0x16A)	/* 1/60 sec */	Keyonly = YES;	redisplay();	start = *Ticks;	end = start + delay * 6;	do {		if ((InputPending = charp()) != NO)			break;	} while (*Ticks < end);#undef	Ticks#else	/* !MAC */#ifndef	MSDOS	if (!charp()) {#if	defined(BSD4_2) && !defined(BSD2_10)		struct timeval	timer;		fd_set	readfds;		FD_ZERO(&readfds);		FD_SET(0, &readfds);				/* So messages that aren't error messages don't		 * hang around forever.		 * Gross that I had to snarf this from getch()		 */		if (!UpdMesg && !Asking && mesgbuf[0] && !errormsg)			message(NullStr);		redisplay();		timer.tv_sec = (delay / 10);		timer.tv_usec = (delay % 10) * 100000;		select(1, &readfds, (fd_set *)0, (fd_set *)0, &timer);#else	/* !(defined(BSD4_2) && !defined(BSD2_10)) */		/* Pause by spitting NULs at the terminal.  Ugh! */		static const int cps[] = {			0,			5,			7,			11,			13,			15,			20,			30,			60,			120,			180,			240,			480,			960,			1920,			1920,		};		register int	nchars,				check_cnt;		nchars = (delay * cps[ospeed]) / 10;		check_cnt = BufSize;		redisplay();		if (!NP) {			while ((--nchars > 0) && !InputPending) {				jputchar(PC);				if (--check_cnt == 0) {					check_cnt = BufSize;					InputPending = charp();				}			}		}#endif	/* !(defined(BSD4_2) && !defined(BSD2_10)) */	}#else	/* MSDOS */	long	start,		end;#ifndef	IBMPC	struct dostime_t tc;#endif	redisplay();#ifdef	IBMPC	_bios_timeofday(_TIME_GETCLOCK, &start);#else	_dos_gettime(&tc);	start = (long)(tc.hour*60L*60L*10L)+(long)(tc.minute*60L*10L)+	    (long)(tc.second*10)+(long)(tc.hsecond/10);#endif	end = (start + delay);	do  {		if ((InputPending = charp()) != NO)			break;#ifdef	IBMPC		if (_bios_timeofday(_TIME_GETCLOCK, &start))			break;	/* after midnight */#else		start = (long)(tc.hour*60L*60L*10L)+(long)(tc.minute*60L*10L)+			(long)(tc.second*10)+(long)(tc.hsecond/10);#endif	} while (start < end);#endif	/* MSDOS */#endif	/* !MAC */}boolsindex(pattern, string)register char	*pattern,		*string;{	register size_t	len = strlen(pattern);	while (*string != '\0') {		if (*pattern == *string && strncmp(pattern, string, len) == 0)			return TRUE;		string += 1;	}	return FALSE;}voidmake_argv(argv, ap)register char	*argv[];va_list	ap;{	register int	i = 0;	argv[i++] = va_arg(ap, char *);	argv[i++] = basename(argv[0]);	do ; while ((argv[i++] = va_arg(ap, char *)) != NULL);}intpnt_line(){	register Line	*lp = curbuf->b_first;	register int	i;	for (i = 0; lp != NULL; i++, lp = lp->l_next)		if (lp == curline)			break;	return i + 1;}/* Free, then allocate a block. * Like erealloc, except that the previous contents of the block are lost. */UnivPtrfreealloc(obj, size)register UnivPtr	obj;size_t	size;{	register UnivPtr	new = NULL;	if (obj)		new = realloc(obj, size);	if (new == NULL)		new = emalloc(size);	return new;}#ifndef HAVE_STRERROR/* * Unix version of strerror - map error number to descriptive string. * ANSI systems should have this. */char *strerror(errnum)int errnum;{	extern int sys_nerr;	extern char *sys_errlist[];	if (errnum > 0 && errnum < sys_nerr)		return(sys_errlist[errnum]);	return sprint("Error number %d", errnum);}#endif

⌨️ 快捷键说明

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