]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_screen.c
ncurses 5.3
[ncurses.git] / ncurses / base / lib_screen.c
index 3038393c226676bb3957f43c7a72642a3794e61e..43f848d8a64df6e9683f0a962c1abd705754a1d8 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998 Free Software Foundation, Inc.                        *
+ * Copyright (c) 1998-2001,2002 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 /****************************************************************************
  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey 1996 on                                        *
  ****************************************************************************/
 
-
 #include <curses.priv.h>
 
-#include <sys/stat.h>
-#include <time.h>
-#include <term.h>      /* exit_ca_mode, non_rev_rmcup */
-
-MODULE_ID("$Id: lib_screen.c,v 1.15 1999/07/24 20:05:29 tom Exp $")
-
-static time_t  dumptime;
+MODULE_ID("$Id: lib_screen.c,v 1.28 2002/09/14 23:30:41 tom Exp $")
 
-WINDOW *getwin(FILE *filep)
+NCURSES_EXPORT(WINDOW *)
+getwin(FILE * filep)
 {
-       WINDOW  tmp, *nwin;
-       int     n;
+    WINDOW tmp, *nwin;
+    int n;
 
-       T((T_CALLED("getwin(%p)"), filep));
+    T((T_CALLED("getwin(%p)"), filep));
 
-       (void) fread(&tmp, sizeof(WINDOW), 1, filep);
-       if (ferror(filep))
-               returnWin(0);
+    clearerr(filep);
+    (void) fread(&tmp, sizeof(WINDOW), 1, filep);
+    if (ferror(filep))
+       returnWin(0);
 
-       if ((nwin = newwin(tmp._maxy+1, tmp._maxx+1, 0, 0)) == 0)
-               returnWin(0);
+    if (tmp._flags & _ISPAD) {
+       nwin = newpad(tmp._maxy + 1, tmp._maxx + 1);
+    } else {
+       nwin = newwin(tmp._maxy + 1, tmp._maxx + 1, 0, 0);
+    }
 
-       /*
-        * We deliberately do not restore the _parx, _pary, or _parent
-        * fields, because the window hierarchy within which they
-        * made sense is probably gone.
-        */
-       nwin->_curx       = tmp._curx;
-       nwin->_cury       = tmp._cury;
-       nwin->_maxy       = tmp._maxy;
-       nwin->_maxx       = tmp._maxx;
-       nwin->_begy       = tmp._begy;
-       nwin->_begx       = tmp._begx;
-       nwin->_yoffset    = tmp._yoffset;
-       nwin->_flags      = tmp._flags & ~(_SUBWIN|_ISPAD);
-
-       nwin->_attrs      = tmp._attrs;
-       nwin->_bkgd       = tmp._bkgd;
-
-       nwin->_clear      = tmp._clear;
-       nwin->_scroll     = tmp._scroll;
-       nwin->_leaveok    = tmp._leaveok;
+    /*
+     * We deliberately do not restore the _parx, _pary, or _parent
+     * fields, because the window hierarchy within which they
+     * made sense is probably gone.
+     */
+    if (nwin != 0) {
+       nwin->_curx = tmp._curx;
+       nwin->_cury = tmp._cury;
+       nwin->_maxy = tmp._maxy;
+       nwin->_maxx = tmp._maxx;
+       nwin->_begy = tmp._begy;
+       nwin->_begx = tmp._begx;
+       nwin->_yoffset = tmp._yoffset;
+       nwin->_flags = tmp._flags & ~(_SUBWIN);
+
+       nwin->_attrs = tmp._attrs;
+       nwin->_nc_bkgd = tmp._nc_bkgd;
+
+       nwin->_notimeout = tmp._notimeout;
+       nwin->_clear = tmp._clear;
+       nwin->_leaveok = tmp._leaveok;
+       nwin->_idlok = tmp._idlok;
+       nwin->_idcok = tmp._idcok;
+       nwin->_immed = tmp._immed;
+       nwin->_scroll = tmp._scroll;
+       nwin->_sync = tmp._sync;
        nwin->_use_keypad = tmp._use_keypad;
-       nwin->_delay      = tmp._delay;
-       nwin->_immed      = tmp._immed;
-       nwin->_sync       = tmp._sync;
-
-       nwin->_regtop     = tmp._regtop;
-       nwin->_regbottom  = tmp._regbottom;
-
-       for (n = 0; n < nwin->_maxy + 1; n++)
-       {
-               (void) fread(nwin->_line[n].text,
-                             sizeof(chtype), (size_t)(nwin->_maxx + 1), filep);
-               if (ferror(filep))
-               {
-                       delwin(nwin);
-                       returnWin(0);
-               }
+       nwin->_delay = tmp._delay;
+
+       nwin->_regtop = tmp._regtop;
+       nwin->_regbottom = tmp._regbottom;
+
+       if (tmp._flags & _ISPAD)
+           nwin->_pad = tmp._pad;
+
+       for (n = 0; n <= nwin->_maxy; n++) {
+           clearerr(filep);
+           (void) fread(nwin->_line[n].text,
+                        sizeof(NCURSES_CH_T),
+                        (size_t) (nwin->_maxx + 1),
+                        filep);
+           if (ferror(filep)) {
+               delwin(nwin);
+               returnWin(0);
+           }
        }
        touchwin(nwin);
-
-       returnWin(nwin);
+    }
+    returnWin(nwin);
 }
 
-int putwin(WINDOW *win, FILE *filep)
+NCURSES_EXPORT(int)
+putwin(WINDOW *win, FILE * filep)
 {
-        int code = ERR; 
-       int n;
+    int code = ERR;
+    int n;
+
+    T((T_CALLED("putwin(%p,%p)"), win, filep));
 
-       T((T_CALLED("putwin(%p,%p)"), win, filep));
+    if (win != 0) {
+       size_t len = (win->_maxx + 1);
 
-       if (win) {
-         (void) fwrite(win, sizeof(WINDOW), 1, filep);
-         if (ferror(filep))
-           returnCode(code);
+       clearerr(filep);
+       if (fwrite(win, sizeof(WINDOW), 1, filep) != 1
+           || ferror(filep))
+             returnCode(code);
 
-         for (n = 0; n < win->_maxy + 1; n++)
-           {
-             (void) fwrite(win->_line[n].text,
-                           sizeof(chtype), (size_t)(win->_maxx + 1), filep);
-             if (ferror(filep))
+       for (n = 0; n <= win->_maxy; n++) {
+           if (fwrite(win->_line[n].text,
+                      sizeof(NCURSES_CH_T), len, filep) != len
+               || ferror(filep)) {
                returnCode(code);
            }
-         code = OK;
        }
-       returnCode(code);
+       code = OK;
+    }
+    returnCode(code);
 }
 
-int scr_restore(const char *file)
+NCURSES_EXPORT(int)
+scr_restore(const char *file)
 {
-       FILE    *fp = 0;
-
-       T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file)));
-
-       if (_nc_access(file, R_OK) < 0
-        || (fp = fopen(file, "rb")) == 0)
-           returnCode(ERR);
-       else
-       {
-           delwin(newscr);
-           newscr = getwin(fp);
-           (void) fclose(fp);
-           returnCode(OK);
-       }
+    FILE *fp = 0;
+
+    T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file)));
+
+    if (_nc_access(file, R_OK) < 0
+       || (fp = fopen(file, "rb")) == 0) {
+       returnCode(ERR);
+    } else {
+       delwin(newscr);
+       SP->_newscr = newscr = getwin(fp);
+       (void) fclose(fp);
+       returnCode(OK);
+    }
 }
 
-int scr_dump(const char *file)
+NCURSES_EXPORT(int)
+scr_dump(const char *file)
 {
-       FILE    *fp = 0;
-
-       T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
-
-       if (_nc_access(file, W_OK) < 0
-        || (fp = fopen(file, "wb")) == 0)
-           returnCode(ERR);
-       else
-       {
-           (void) putwin(newscr, fp);
-           (void) fclose(fp);
-           dumptime = time((time_t *)0);
-           returnCode(OK);
-       }
+    FILE *fp = 0;
+
+    T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
+
+    if (_nc_access(file, W_OK) < 0
+       || (fp = fopen(file, "wb")) == 0) {
+       returnCode(ERR);
+    } else {
+       (void) putwin(newscr, fp);
+       (void) fclose(fp);
+       returnCode(OK);
+    }
 }
 
-int scr_init(const char *file)
+NCURSES_EXPORT(int)
+scr_init(const char *file)
 {
-       FILE    *fp = 0;
-       struct stat     stb;
-
-       T((T_CALLED("scr_init(%s)"), _nc_visbuf(file)));
-
-       if (exit_ca_mode && non_rev_rmcup)
-           returnCode(ERR);
-
-       if (_nc_access(file, R_OK) < 0
-        || (fp = fopen(file, "rb")) == 0)
-           returnCode(ERR);
-       else if (fstat(STDOUT_FILENO, &stb) || stb.st_mtime > dumptime)
-           returnCode(ERR);
-       else
-       {
-           delwin(curscr);
-           curscr = getwin(fp);
-           (void) fclose(fp);
-           returnCode(OK);
-       }
+    FILE *fp = 0;
+
+    T((T_CALLED("scr_init(%s)"), _nc_visbuf(file)));
+
+    if (exit_ca_mode && non_rev_rmcup)
+       returnCode(ERR);
+
+    if (_nc_access(file, R_OK) < 0
+       || (fp = fopen(file, "rb")) == 0) {
+       returnCode(ERR);
+    } else {
+       delwin(curscr);
+       SP->_curscr = curscr = getwin(fp);
+       (void) fclose(fp);
+       returnCode(OK);
+    }
 }
 
-int scr_set(const char *file)
+NCURSES_EXPORT(int)
+scr_set(const char *file)
 {
     T((T_CALLED("scr_set(%s)"), _nc_visbuf(file)));
 
-    if (scr_init(file) == ERR)
+    if (scr_init(file) == ERR) {
        returnCode(ERR);
-    else
-    {
+    } else {
        delwin(newscr);
-       newscr = dupwin(curscr);
+       SP->_newscr = newscr = dupwin(curscr);
        returnCode(OK);
     }
 }