/* Public Domain Curses */ #include 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 #include #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); }