📄 util.c
字号:
*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 + -