diff options
| author | Thomas Ulmer <thomasmulmer02@gmail.com> | 2026-03-01 11:37:31 -0800 |
|---|---|---|
| committer | Thomas Ulmer <thomasmulmer02@gmail.com> | 2026-03-01 11:37:31 -0800 |
| commit | e01b84a6698f5060fd7dea789fc0ffa872f26b15 (patch) | |
| tree | da1d4369048833f0496ae51d400d118f30c499bd /tree/src/vi/ex-070224/ex_temp.c | |
| parent | 6d8430971dada74478a0cd2c9eca2272a105b744 (diff) | |
remove tree
Diffstat (limited to 'tree/src/vi/ex-070224/ex_temp.c')
| -rw-r--r-- | tree/src/vi/ex-070224/ex_temp.c | 777 |
1 files changed, 0 insertions, 777 deletions
diff --git a/tree/src/vi/ex-070224/ex_temp.c b/tree/src/vi/ex-070224/ex_temp.c deleted file mode 100644 index da908b3..0000000 --- a/tree/src/vi/ex-070224/ex_temp.c +++ /dev/null @@ -1,777 +0,0 @@ -/* - * This code contains changes by - * Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved. - * - * Conditions 1, 2, and 4 and the no-warranty notice below apply - * to these changes. - * - * - * Copyright (c) 1980, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * - * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * Redistributions of source code and documentation must retain the - * above copyright notice, this list of conditions and the following - * disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed or owned by Caldera - * International, Inc. - * Neither the name of Caldera International, Inc. nor the names of - * other contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA - * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE - * LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef lint -#ifdef DOSCCS -static char sccsid[] = "@(#)ex_temp.c 1.27 (gritter) 12/25/06"; -#endif -#endif - -/* from ex_temp.c 7.5.1.1 (Berkeley) 8/12/86 */ - -#include "ex.h" -#include "ex_temp.h" -#include "ex_vis.h" -#include "ex_tty.h" -#include <sys/wait.h> -#include <time.h> - -/* - * Editor temporary file routines. - * Very similar to those of ed, except uses 2 input buffers. - */ -#define READ 0 -#define WRITE 1 - -/* - * Maximum number of attempts to create temporary file. - */ -#define ATTEMPTS 20 - -char *tfname; -char *rfname; -int havetmp; -int tfile = -1; -int rfile = -1; - -void -fileinit(void) -{ - register char *p; - struct stat stbuf; - register int i, j; - pid_t mypid = getpid(); - char *tfend; - int attempts = 0; - - CLOBBGRD(attempts); - if (tline == INCRMT * (HBLKS+2)) - return; - cleanup(0); - if (tfile != -1) - close(tfile); - tline = INCRMT * (HBLKS+2); - blocks[0] = HBLKS; - blocks[1] = HBLKS+1; - blocks[2] = -1; - dirtcnt = 0; - iblock = -1; - iblock2 = -1; - oblock = -1; - tfname = realloc(tfname, strlen(svalue(DIRECTORY)) + 14); - CP(tfname, svalue(DIRECTORY)); - if (stat(tfname, &stbuf)) { -dumbness: - if (setexit() == 0) - filioerr(tfname); - else - putNFL(); - cleanup(1); - exitex(1); - } - if ((stbuf.st_mode & S_IFMT) != S_IFDIR) { - errno = ENOTDIR; - goto dumbness; - } - ichanged = 0; - ichang2 = 0; -#ifdef notdef /* GR */ - ignore(strcat(tfname, "/ExXXXXX")); - for (p = strend(tfname), i = 5, j = getpid(); i > 0; i--, j /= 10) - *--p = j % 10 | '0'; - tfile = creat(tfname, 0600); -#else - ignore(strcat(tfname, "/ExXXXXXXXXXX")); - tfend = strend(tfname); - do { - for (p = tfend, i = 10, j = mypid + attempts; - i > 0; i--, j /= 10) - *--p = j % 10 | '0'; - tfile = open(tfname, O_CREAT|O_EXCL|O_RDWR -#ifdef O_NOFOLLOW - |O_NOFOLLOW -#endif /* O_NOFOLLOW */ - , 0600); - } while (tfile < 0 && attempts++ < ATTEMPTS); -#endif /* !notdef */ - if (tfile < 0) - goto dumbness; -#ifdef INCORB - { - extern bloc stilinc; /* see below */ - stilinc = 0; - } -#endif - havetmp = 1; -/* brk((char *)fendcore); */ -} - -void -cleanup(bool all) -{ - if (all) { - putpad(TE); - flush(); - } - if (havetmp) - unlink(tfname); - havetmp = 0; - if (all && rfile >= 0) { - unlink(rfname); - close(rfile); - rfile = -1; - } -} - -void -getline(line tl) -{ - register char *bp, *lp; - register bbloc nl; - - lp = linebuf; - bp = getblock(tl, READ); - nl = nleft; - tl &= ~OFFMSK; - while (*lp++ = *bp++) - if (--nl == 0) { - bp = getblock(tl += INCRMT, READ); - nl = nleft; - } -} - -line -putline(void) -{ - register char *bp, *lp; - register bbloc nl; - line tl; - - dirtcnt++; - lp = linebuf; - change(); - tl = tline; - bp = getblock(tl, WRITE); - nl = nleft; - tl &= ~OFFMSK; - while (*bp = *lp++) { - if (*bp++ == '\n') { - *--bp = 0; - linebp = lp; - break; - } - if (--nl == 0) { - bp = getblock(tl += INCRMT, WRITE); - nl = nleft; - } - } - tl = tline; - tline += (((lp - linebuf) + BNDRY - 1) >> SHFT) & TLNMSK; - return (tl); -} - -char * -getblock(line atl, int iof) -{ - register bbloc bno, off; - - bno = (atl >> OFFBTS) & BLKMSK; - off = (atl << SHFT) & LBTMSK; - if (bno >= NMBLKS) - error(catgets(catd, 1, 183, " Tmp file too large")); - nleft = BUFSIZ - off; - if (bno == iblock) { - ichanged |= iof; - hitin2 = 0; - return (ibuff + off); - } - if (bno == iblock2) { - ichang2 |= iof; - hitin2 = 1; - return (ibuff2 + off); - } - if (bno == oblock) - return (obuff + off); - if (iof == READ) { - if (hitin2 == 0) { - if (ichang2) { - blkio(iblock2, ibuff2, - (ssize_t(*)(int, void *, size_t))write); - } - ichang2 = 0; - iblock2 = bno; - blkio(bno, ibuff2, - (ssize_t(*)(int, void *, size_t))read); - hitin2 = 1; - return (ibuff2 + off); - } - hitin2 = 0; - if (ichanged) { - blkio(iblock, ibuff, - (ssize_t(*)(int, void *, size_t))write); - } - ichanged = 0; - iblock = bno; - blkio(bno, ibuff, (ssize_t(*)(int, void *, size_t))read); - return (ibuff + off); - } - if (oblock >= 0) { - blkio(oblock, obuff, - (ssize_t(*)(int, void *, size_t))write); - } - oblock = bno; - return (obuff + off); -} - -#ifdef INCORB -char incorb[INCORB+1][BUFSIZ]; -#define pagrnd(a) ((char *)(((size_t)a)&~(BUFSIZ-1))) -bloc stilinc; /* up to here not written yet */ -#endif - -void -blkio(bloc b, char *buf, ssize_t (*iofcn)(int, void *, size_t)) -{ - -#ifdef INCORB - if (b < INCORB) { - if (iofcn == (ssize_t(*)(int, void *, size_t))read) { - copy(buf, pagrnd(incorb[b+1]), (size_t) BUFSIZ); - return; - } - copy(pagrnd(incorb[b+1]), buf, (size_t) BUFSIZ); - if (laste) { - if (b >= stilinc) - stilinc = b + 1; - return; - } - } else if (stilinc) - tflush(); -#endif - lseek(tfile, (off_t) ((b & BLKMSK) * BUFSIZ), SEEK_SET); - if ((*iofcn)(tfile, buf, BUFSIZ) != BUFSIZ) - filioerr(tfname); -} - -#ifdef INCORB -void -tlaste(void) -{ - - if (stilinc) - dirtcnt = 0; -} - -void -tflush(void) -{ - bbloc i = stilinc; - - stilinc = 0; - lseek(tfile, (off_t) 0, SEEK_SET); - if (write(tfile, pagrnd(incorb[1]), i * BUFSIZ) != (i * BUFSIZ)) - filioerr(tfname); -} -#endif - -/* - * Synchronize the state of the temporary file in case - * a crash occurs. - */ -void -synctmp(void) -{ - register bbloc cnt; - register line *a; - register bloc *bp, *up; - -#ifdef INCORB - if (stilinc) - return; -#endif - if (dol == zero) - return; - if (ichanged) - blkio(iblock, ibuff, (ssize_t(*)(int, void *, size_t))write); - ichanged = 0; - if (ichang2) - blkio(iblock2, ibuff2, (ssize_t(*)(int, void *, size_t))write); - ichang2 = 0; - if (oblock != -1) - blkio(oblock, obuff, (ssize_t(*)(int, void *, size_t))write); - time(&H.Time); - uid = getuid(); - *zero = (line) H.Time; - up = blocks + LBLKS; - for (a = zero, bp = blocks; a <= dol; a += BUFSIZ / sizeof *a, bp++) { - if (bp >= up) - error(catgets(catd, 1, 184, " Tmp file too large")); - if (*bp < 0) { - tline = (tline + OFFMSK) &~ OFFMSK; - *bp = ((tline >> OFFBTS) & BLKMSK); - if (*bp > NMBLKS) - error(catgets(catd, 1, 185, - " Tmp file too large")); - tline += INCRMT; - oblock = *bp + 1; - bp[1] = -1; - } - lseek(tfile, (off_t) ((*bp & BLKMSK) * BUFSIZ), SEEK_SET); - cnt = ((dol - a) + 2) * sizeof (line); - if (cnt > BUFSIZ) - cnt = BUFSIZ; - if (write(tfile, (char *) a, cnt) != cnt) { -oops: - *zero = 0; - filioerr(tfname); - } - *zero = 0; - } - flines = lineDOL(); - lseek(tfile, (off_t) 0, SEEK_SET); - if (write(tfile, (char *) &H, sizeof H) != sizeof H) - goto oops; -#ifdef notdef - /* - * This will insure that exrecover gets as much - * back after a crash as is absolutely possible, - * but can result in pregnant pauses between commands - * when the TSYNC call is made, so... - */ - fsync(tfile); -#endif -} - -void -TSYNC(void) -{ - - if (dirtcnt > MAXDIRT) { /* mjm: 12 --> MAXDIRT */ -#ifdef INCORB - if (stilinc) - tflush(); -#endif - dirtcnt = 0; - synctmp(); - } -} - -/* - * Named buffer routines. - * These are implemented differently than the main buffer. - * Each named buffer has a chain of blocks in the register file. - * Each block contains roughly 508 chars of text, - * and a previous and next block number. We also have information - * about which blocks came from deletes of multiple partial lines, - * e.g. deleting a sentence or a LISP object. - * - * We maintain a free map for the temp file. To free the blocks - * in a register we must read the blocks to find how they are chained - * together. - * - * BUG: The default savind of deleted lines in numbered - * buffers may be rather inefficient; it hasn't been profiled. - */ -struct strreg { - short rg_flags; - short rg_nleft; - short rg_first; - short rg_last; -} strregs[('z'-'a'+1) + ('9'-'0'+1)], *strp; - -struct rbuf { - short rb_prev; - short rb_next; - char rb_text[BUFSIZ - 2 * sizeof (short)]; -} *rbuf, KILLrbuf, putrbuf, YANKrbuf, regrbuf; -#ifdef VMUNIX -#ifdef LARGEF -short rused[4096]; -#else /* !LARGEF */ -short rused[256]; -#endif /* !LARGEF */ -#else /* !VMUNIX */ -short rused[32]; -#endif /* !VMUNIX */ -short rnleft; -short rblock; -short rnext; -char *rbufcp; - -void -regio(short b, ssize_t (*iofcn)(int, void *, size_t)) -{ - register char *p; - char *rfend; - int attempts = 0; - register int i, j; - pid_t mypid = getpid(); - - if (rfile == -1) { - rfname = realloc(rfname, strlen(svalue(DIRECTORY)) + 14); - CP(rfname, tfname); - rfend = strend(rfname); -#ifdef notdef /* GR */ - *(rfend - 7) = 'R'; -#else - *(rfend - 12) = 'R'; -#endif - do { - for (p = rfend, i = 10, j = mypid + attempts; - i > 0; i--, j /= 10) - *--p = j % 10 | '0'; - rfile = open(rfname, O_CREAT|O_EXCL|O_RDWR -#ifdef O_NOFOLLOW - |O_NOFOLLOW -#endif /* O_NOFOLLOW */ - , 0600); - } while (rfile < 0 && attempts++ < ATTEMPTS); - if (rfile < 0) -oops: - filioerr(rfname); - } - lseek(rfile, (off_t) ((b & BLKMSK) * BUFSIZ), SEEK_SET); - if ((*iofcn)(rfile, rbuf, BUFSIZ) != BUFSIZ) - goto oops; - rblock = b; -} - -int -REGblk(void) -{ - register int i, j, m; - - for (i = 0; i < sizeof rused / sizeof rused[0]; i++) { - m = (rused[i] ^ 0177777) & 0177777; - if (i == 0) - m &= ~1; - if (m != 0) { - j = 0; - while ((m & 1) == 0) - j++, m >>= 1; - rused[i] |= (1 << j); -#ifdef RDEBUG - printf("allocating block %d\n", i * 16 + j); -#endif - return (i * 16 + j); - } - } - error(catgets(catd, 1, 186, "Out of register space (ugh)")); - /*NOTREACHED*/ - return 0; -} - -struct strreg * -mapreg(register int c) -{ - - if (isupper(c)) - c = tolower(c); - return (isdigit(c) ? &strregs[('z'-'a'+1)+(c-'0')] : &strregs[c-'a']); -} - -void -KILLreg(register int c) -{ - register struct strreg *sp; - - rbuf = &KILLrbuf; - sp = mapreg(c); - rblock = sp->rg_first; - sp->rg_first = sp->rg_last = 0; - sp->rg_flags = sp->rg_nleft = 0; - while (rblock != 0) { -#ifdef RDEBUG - printf("freeing block %d\n", rblock); -#endif - rused[rblock / 16] &= ~(1 << (rblock % 16)); - regio(rblock, (ssize_t (*)(int, void *, size_t))shread); - rblock = rbuf->rb_next; - } -} - -ssize_t -shread(void) -{ - struct front { short a; short b; }; - - if (read(rfile, (char *) rbuf, sizeof (struct front)) == sizeof (struct front)) - return (sizeof (struct rbuf)); - return (0); -} - -int getREG(void); - -void -putreg(int c) -{ - register line *odot = dot; - register line *odol = dol; - register int cnt; - - deletenone(); - appendnone(); - rbuf = &putrbuf; - rnleft = 0; - rblock = 0; - rnext = mapreg(c)->rg_first; - if (rnext == 0) { - if (inopen) { - splitw++; - vclean(); - vgoto(WECHO, 0); - } - vreg = -1; - error(catgets(catd, 1, 187, "Nothing in register %c"), c); - } - if (inopen && partreg(c)) { - if (!FIXUNDO) { - splitw++; vclean(); vgoto(WECHO, 0); vreg = -1; - error(catgets(catd, 1, 188, - "Can't put partial line inside macro")); - } - squish(); - addr1 = addr2 = dol; - } - cnt = append(getREG, addr2); - if (inopen && partreg(c)) { - unddol = dol; - dol = odol; - dot = odot; - pragged(0); - } - killcnt(cnt); - notecnt = cnt; -} - -int -partreg(int c) -{ - - return (mapreg(c)->rg_flags); -} - -void -notpart(register int c) -{ - - if (c) - mapreg(c)->rg_flags = 0; -} - -int -getREG(void) -{ - register char *lp = linebuf; - register int c; - - for (;;) { - if (rnleft == 0) { - if (rnext == 0) - return (EOF); - regio(rnext, read); - rnext = rbuf->rb_next; - rbufcp = rbuf->rb_text; - rnleft = sizeof rbuf->rb_text; - } - c = *rbufcp; - if (c == 0) - return (EOF); - rbufcp++, --rnleft; - if (c == '\n') { - *lp++ = 0; - return (0); - } - *lp++ = c; - } -} - -void -YANKreg(register int c) -{ - register line *addr; - register struct strreg *sp; - char *savelb; - - savelb = smalloc(LBSIZE); - if (isdigit(c)) - kshift(); - if (islower(c)) - KILLreg(c); - strp = sp = mapreg(c); - sp->rg_flags = inopen && cursor && wcursor; - rbuf = &YANKrbuf; - if (sp->rg_last) { - regio(sp->rg_last, read); - rnleft = sp->rg_nleft; - rbufcp = &rbuf->rb_text[sizeof rbuf->rb_text - rnleft]; - } else { - rblock = 0; - rnleft = 0; - } - CP(savelb,linebuf); - for (addr = addr1; addr <= addr2; addr++) { - getline(*addr); - if (sp->rg_flags) { - if (addr == addr2) - *wcursor = 0; - if (addr == addr1) - strcpy(linebuf, cursor); - } - YANKline(); - } - rbflush(); - killed(); - CP(linebuf,savelb); - free(savelb); -} - -void -kshift(void) -{ - register int i; - - KILLreg('9'); - for (i = '8'; i >= '0'; i--) - copy(mapreg(i+1), mapreg(i), sizeof (struct strreg)); -} - -void -YANKline(void) -{ - register char *lp = linebuf; - register struct rbuf *rp = rbuf; - register int c; - - do { - c = *lp++; - if (c == 0) - c = '\n'; - if (rnleft == 0) { - rp->rb_next = REGblk(); - rbflush(); - rblock = rp->rb_next; - rp->rb_next = 0; - rp->rb_prev = rblock; - rnleft = sizeof rp->rb_text; - rbufcp = rp->rb_text; - } - *rbufcp++ = c; - --rnleft; - } while (c != '\n'); - if (rnleft) - *rbufcp = 0; -} - -void -rbflush(void) -{ - register struct strreg *sp = strp; - - if (rblock == 0) - return; - regio(rblock, (ssize_t (*)(int, void *, size_t))write); - if (sp->rg_first == 0) - sp->rg_first = rblock; - sp->rg_last = rblock; - sp->rg_nleft = rnleft; -} - -/* Register c to char buffer buf of size buflen */ -void -regbuf(char c, char *buf, int buflen) -{ - register char *p, *lp; - - rbuf = ®rbuf; - rnleft = 0; - rblock = 0; - rnext = mapreg(c)->rg_first; - if (rnext==0) { - *buf = 0; - error(catgets(catd, 1, 189, "Nothing in register %c"),c); - } - p = buf; - while (getREG()==0) { - for (lp=linebuf; *lp;) { - if (p >= &buf[buflen]) - error(catgets(catd, 1, 190, - "Register too long@to fit in memory")); - *p++ = *lp++; - } - *p++ = '\n'; - } - if (partreg(c)) p--; - *p = '\0'; - getDOT(); -} |
