blob: 6727ba36a205310491e74e6e205aae0fb121dc09 [file] [log] [blame]
/* Public Domain Curses */
#include <curspriv.h>
RCSID("$Id: scr_dump.c,v 1.30 2008/07/13 16:08:18 wmcbrine Exp $")
/*man-start**************************************************************
Name: scr_dump
Synopsis:
int putwin(WINDOW *win, FILE *filep);
WINDOW *getwin(FILE *filep);
int scr_dump(const char *filename);
int scr_init(const char *filename);
int scr_restore(const char *filename);
int scr_set(const char *filename);
Description:
getwin() reads window-related data previously stored in a file
by putwin(). It then creates and initialises a new window using
that data.
putwin() writes all data associated with a window into a file,
using an unspecified format. This information can be retrieved
later using getwin().
scr_dump() writes the current contents of the virtual screen to
the file named by filename in an unspecified format.
scr_restore() function sets the virtual screen to the contents
of the file named by filename, which must have been written
using scr_dump(). The next refresh operation restores the screen
to the way it looked in the dump file.
In PDCurses, scr_init() does nothing, and scr_set() is a synonym
for scr_restore(). Also, scr_dump() and scr_restore() save and
load from curscr. This differs from some other implementations,
where scr_init() works with curscr, and scr_restore() works with
newscr; but the effect should be the same. (PDCurses has no
newscr.)
Return Value:
On successful completion, getwin() returns a pointer to the
window it created. Otherwise, it returns a null pointer. Other
functions return OK or ERR.
Portability X/Open BSD SYS V
putwin Y
getwin Y
scr_dump Y
scr_init Y
scr_restore Y
scr_set Y
**man-end****************************************************************/
#include <stdlib.h>
#include <string.h>
#define DUMPVER 1 /* Should be updated whenever the WINDOW struct is
changed */
int putwin(WINDOW *win, FILE *filep)
{
static const char *marker = "PDC";
static const unsigned char version = DUMPVER;
PDC_LOG(("putwin() - called\n"));
/* write the marker and the WINDOW struct */
if (filep && fwrite(marker, strlen(marker), 1, filep)
&& fwrite(&version, 1, 1, filep)
&& fwrite(win, sizeof(WINDOW), 1, filep))
{
int i;
/* write each line */
for (i = 0; i < win->_maxy && win->_y[i]; i++)
if (!fwrite(win->_y[i], win->_maxx * sizeof(chtype), 1, filep))
return ERR;
return OK;
}
return ERR;
}
WINDOW *getwin(FILE *filep)
{
WINDOW *win;
char marker[4];
int i, nlines, ncols;
PDC_LOG(("getwin() - called\n"));
if ( !(win = malloc(sizeof(WINDOW))) )
return (WINDOW *)NULL;
/* check for the marker, and load the WINDOW struct */
if (!filep || !fread(marker, 4, 1, filep) || strncmp(marker, "PDC", 3)
|| marker[3] != DUMPVER || !fread(win, sizeof(WINDOW), 1, filep))
{
free(win);
return (WINDOW *)NULL;
}
nlines = win->_maxy;
ncols = win->_maxx;
/* allocate the line pointer array */
if ( !(win->_y = malloc(nlines * sizeof(chtype *))) )
{
free(win);
return (WINDOW *)NULL;
}
/* allocate the minchng and maxchng arrays */
if ( !(win->_firstch = malloc(nlines * sizeof(int))) )
{
free(win->_y);
free(win);
return (WINDOW *)NULL;
}
if ( !(win->_lastch = malloc(nlines * sizeof(int))) )
{
free(win->_firstch);
free(win->_y);
free(win);
return (WINDOW *)NULL;
}
/* allocate the lines */
if ( !(win = PDC_makelines(win)) )
return (WINDOW *)NULL;
/* read them */
for (i = 0; i < nlines; i++)
{
if (!fread(win->_y[i], ncols * sizeof(chtype), 1, filep))
{
delwin(win);
return (WINDOW *)NULL;
}
}
touchwin(win);
return win;
}
int scr_dump(const char *filename)
{
FILE *filep;
PDC_LOG(("scr_dump() - called: filename %s\n", filename));
if (filename && (filep = fopen(filename, "wb")) != NULL)
{
int result = putwin(curscr, filep);
fclose(filep);
return result;
}
return ERR;
}
int scr_init(const char *filename)
{
PDC_LOG(("scr_init() - called: filename %s\n", filename));
return OK;
}
int scr_restore(const char *filename)
{
FILE *filep;
PDC_LOG(("scr_restore() - called: filename %s\n", filename));
if (filename && (filep = fopen(filename, "rb")) != NULL)
{
WINDOW *replacement = getwin(filep);
fclose(filep);
if (replacement)
{
int result = overwrite(replacement, curscr);
delwin(replacement);
return result;
}
}
return ERR;
}
int scr_set(const char *filename)
{
PDC_LOG(("scr_set() - called: filename %s\n", filename));
return scr_restore(filename);
}