| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /* 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);
- }
|