home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1990,1991,1992 Chris and John Downey */
- #ifndef lint
- static char *sccsid = "@(#)preserve.c 2.1 (Chris & John Downey) 7/29/92";
- #endif
-
- /***
-
- * program name:
- xvi
- * function:
- PD version of UNIX "vi" editor, with extensions.
- * module name:
- preserve.c
- * module function:
- Buffer preservation routines.
-
- The do_preserve() routine saves the contents of all modified
- buffers in temporary files. It can be invoked with the
- :preserve command or it may be called by one of the system
- interface modules when at least PSVKEYS keystrokes have been
- read, & at least Pn(P_preservetime) seconds have elsapsed
- since the last keystroke. (PSVKEYS is defined in xvi.h.) The
- preservebuf() routine can be used to preserve a single buffer.
-
- * history:
- STEVIE - ST Editor for VI Enthusiasts, Version 3.10
- Originally by Tim Thompson (twitch!tjt)
- Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
- Heavily modified by Chris & John Downey
- ***/
-
- #include "xvi.h"
-
- /*
- * Names of values for the P_preserve enumerated parameter.
- */
- char *psv_strings[] =
- {
- "unsafe",
- "standard",
- "safe",
- "paranoid",
- NULL
- };
-
- /*
- * Open temporary file for given buffer.
- */
- static FILE *
- psvfile(window)
- Xviwin *window;
- {
- register Buffer *buffer;
- FILE *fp;
-
- buffer = window->w_buffer;
-
- if (buffer->b_tempfname == NULL) {
- char *fname;
-
- fname = buffer->b_filename;
- if (fname == NULL)
- fname = "unnamed";
- buffer->b_tempfname = tempfname(fname);
- if (buffer->b_tempfname == NULL) {
- show_error(window, "Can't create name for preserve file");
- return(NULL);
- }
- }
- fp = fopenwb(buffer->b_tempfname);
- if (fp == NULL) {
- show_error(window, "Can't open preserve file %s",
- buffer->b_tempfname);
- }
- return(fp);
- }
-
- /*
- * Write contents of buffer to file & close file. Return TRUE if no
- * errors detected.
- */
- static bool_t
- putbuf(wp, fp)
- Xviwin *wp;
- register FILE *fp;
- {
- unsigned long l1, l2;
-
- if (put_file(wp, fp, (Line *) NULL, (Line *) NULL, &l1, &l2) == FALSE) {
- show_error(wp, "Error writing preserve file %s",
- wp->w_buffer->b_tempfname);
- return(FALSE);
- } else {
- return(TRUE);
- }
- }
-
- /*
- * Preserve contents of a single buffer, so that a backup copy is
- * available in case something goes wrong while the file itself is
- * being written.
- *
- * This is controlled by the P_preserve parameter: if it's set to
- * psv_UNSAFE, we just return. If it's psv_STANDARD, to save time, we
- * only preserve the buffer if it doesn't appear to have been
- * preserved recently: otherwise, if it's psv_SAFE or psv_PARANOID, we
- * always preserve it.
- *
- * Return FALSE if an error occurs during preservation, otherwise TRUE.
- */
- bool_t
- preservebuf(window)
- Xviwin *window;
- {
- FILE *fp;
- Buffer *bp;
-
- if (
- Pn(P_preserve) == psv_UNSAFE
- ||
- (
- Pn(P_preserve) == psv_STANDARD
- &&
- /*
- * If there is a preserve file already ...
- */
- (bp = window->w_buffer)->b_tempfname != NULL
- &&
- exists(bp->b_tempfname)
- &&
- /*
- * & a preserve appears to have been done recently ...
- */
- keystrokes < PSVKEYS
- )
- ) {
- /*
- * ... don't bother.
- */
- return(TRUE);
- }
-
- fp = psvfile(window);
- if (fp == NULL) {
- return(FALSE);
- }
-
- return(putbuf(window, fp));
- }
-
- /*
- * Preserve contents of all modified buffers.
- */
- bool_t
- do_preserve()
- {
- Xviwin *wp;
- bool_t psvstatus = TRUE;
-
- wp = curwin;
- do {
- if (is_modified(wp->w_buffer)) {
- FILE *fp;
-
- fp = psvfile(wp);
- if (fp != NULL) {
- if (!putbuf(wp, fp))
- psvstatus = FALSE;
- } else {
- psvstatus = FALSE;
- }
- }
- } while ((wp = next_window(wp)) != curwin);
-
- return(psvstatus);
- }
-