1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
|
/* PDCurses */
#include <curspriv.h>
/*man-start**************************************************************
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 ncurses NetBSD
putwin Y Y Y
getwin Y Y Y
scr_dump Y Y -
scr_init Y Y -
scr_restore Y Y -
scr_set Y 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"));
win = malloc(sizeof(WINDOW));
if (!win)
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 */
win->_y = malloc(nlines * sizeof(chtype *));
if (!win->_y)
{
free(win);
return (WINDOW *)NULL;
}
/* allocate the minchng and maxchng arrays */
win->_firstch = malloc(nlines * sizeof(int));
if (!win->_firstch)
{
free(win->_y);
free(win);
return (WINDOW *)NULL;
}
win->_lastch = malloc(nlines * sizeof(int));
if (!win->_lastch)
{
free(win->_firstch);
free(win->_y);
free(win);
return (WINDOW *)NULL;
}
/* allocate the lines */
win = PDC_makelines(win);
if (!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);
}
|