1*6348e3f3Sblymn /* $NetBSD: fileio.c,v 1.10 2024/12/23 02:58:03 blymn Exp $ */ 24c71b79aSjdc 34c71b79aSjdc /*- 44c71b79aSjdc * Copyright (c) 2008 The NetBSD Foundation, Inc. 54c71b79aSjdc * All rights reserved. 64c71b79aSjdc * 74c71b79aSjdc * This code is derived from software contributed to The NetBSD Foundation 84c71b79aSjdc * by Julian Coleman. 94c71b79aSjdc * 104c71b79aSjdc * Redistribution and use in source and binary forms, with or without 114c71b79aSjdc * modification, are permitted provided that the following conditions 124c71b79aSjdc * are met: 134c71b79aSjdc * 1. Redistributions of source code must retain the above copyright 144c71b79aSjdc * notice, this list of conditions and the following disclaimer. 154c71b79aSjdc * 2. Redistributions in binary form must reproduce the above copyright 164c71b79aSjdc * notice, this list of conditions and the following disclaimer in the 174c71b79aSjdc * documentation and/or other materials provided with the distribution. 184c71b79aSjdc * 194c71b79aSjdc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 204c71b79aSjdc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 214c71b79aSjdc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 224c71b79aSjdc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 234c71b79aSjdc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 244c71b79aSjdc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 254c71b79aSjdc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 264c71b79aSjdc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 274c71b79aSjdc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 284c71b79aSjdc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 294c71b79aSjdc * POSSIBILITY OF SUCH DAMAGE. 304c71b79aSjdc */ 314c71b79aSjdc 32a1122fa9Srin #ifndef LIBHACK 334c71b79aSjdc #include <sys/cdefs.h> 344c71b79aSjdc #ifndef lint 35*6348e3f3Sblymn __RCSID("$NetBSD: fileio.c,v 1.10 2024/12/23 02:58:03 blymn Exp $"); 364c71b79aSjdc #endif /* not lint */ 374c71b79aSjdc 384c71b79aSjdc #include "curses.h" 394c71b79aSjdc #include "curses_private.h" 404c71b79aSjdc #include "fileio.h" 414c71b79aSjdc #include <stdio.h> 424c71b79aSjdc #include <stdlib.h> 434c71b79aSjdc 444c71b79aSjdc #ifdef HAVE_WCHAR 454c71b79aSjdc static int __putnsp(nschar_t *, FILE *); 464c71b79aSjdc static int __getnsp(nschar_t *, FILE *); 474c71b79aSjdc #endif /* HAVE_WCHAR */ 484c71b79aSjdc 494c71b79aSjdc #ifdef HAVE_WCHAR 504c71b79aSjdc /* 514c71b79aSjdc * __putnsp -- 524c71b79aSjdc * Write non-spacing character chain to file, consisting of: 534c71b79aSjdc * ((int) 1, (wchar_t) ch) pairs followed by (int) 0. 544c71b79aSjdc */ 554c71b79aSjdc static int 564c71b79aSjdc __putnsp(nschar_t *nsp, FILE *fp) 574c71b79aSjdc { 584c71b79aSjdc int n; 594c71b79aSjdc 604c71b79aSjdc n = 1; 614c71b79aSjdc while (nsp != NULL) { 624c71b79aSjdc if (fwrite(&n, sizeof(int), 1, fp) != 1) 634c71b79aSjdc return ERR; 644c71b79aSjdc if (fwrite(&nsp->ch, sizeof(wchar_t), 1, fp) != 1) 654c71b79aSjdc return ERR; 664c71b79aSjdc } 674c71b79aSjdc n = 0; 684c71b79aSjdc if (fwrite(&n, sizeof(int), 1, fp) != 1) 694c71b79aSjdc return ERR; 704c71b79aSjdc 714c71b79aSjdc return OK; 724c71b79aSjdc } 734c71b79aSjdc #endif /* HAVE_WCHAR */ 744c71b79aSjdc 754c71b79aSjdc /* 764c71b79aSjdc * putwin -- 774c71b79aSjdc * Write window data to file 784c71b79aSjdc */ 794c71b79aSjdc int 804c71b79aSjdc putwin(WINDOW *win, FILE *fp) 814c71b79aSjdc { 824c71b79aSjdc int major = CURSES_LIB_MAJOR; 834c71b79aSjdc int minor = CURSES_LIB_MINOR; 844c71b79aSjdc int y, x; 854c71b79aSjdc __LDATA *sp; 864c71b79aSjdc 874c71b79aSjdc __CTRACE(__CTRACE_FILEIO, "putwin: win %p\n", win); 884c71b79aSjdc 89*6348e3f3Sblymn if (__predict_false(win == NULL)) 904c71b79aSjdc return ERR; 914c71b79aSjdc 924c71b79aSjdc /* win can't be a subwin */ 934c71b79aSjdc if (win->orig != NULL) 944c71b79aSjdc return ERR; 954c71b79aSjdc 964c71b79aSjdc /* Library version */ 974c71b79aSjdc if (fwrite(&major, sizeof(int), 1, fp) != 1) 984c71b79aSjdc return ERR; 994c71b79aSjdc if (fwrite(&minor, sizeof(int), 1, fp) != 1) 1004c71b79aSjdc return ERR; 1014c71b79aSjdc 1024c71b79aSjdc /* Window parameters */ 1034c71b79aSjdc if (fwrite(win, sizeof(WINDOW), 1, fp) != 1) 1044c71b79aSjdc return ERR; 1054c71b79aSjdc #ifdef HAVE_WCHAR 1064c71b79aSjdc /* Background non-spacing character */ 1074c71b79aSjdc if (__putnsp(win->bnsp, fp) == ERR) 1084c71b79aSjdc return ERR; 1094c71b79aSjdc #endif /* HAVE_WCHAR */ 1104c71b79aSjdc 1114c71b79aSjdc /* Lines and line data */ 1124c71b79aSjdc for (y = 0; y < win->maxy; y++) 11343d5eb45Sroy for (sp = win->alines[y]->line, x = 0; x < win->maxx; 1144c71b79aSjdc x++, sp++) { 1154c71b79aSjdc if (fwrite(&sp->ch, sizeof(wchar_t), 1, fp) != 1) 1164c71b79aSjdc return ERR; 1174c71b79aSjdc if (fwrite(&sp->attr, sizeof(attr_t), 1, fp) != 1) 1184c71b79aSjdc return ERR; 1194c71b79aSjdc #ifdef HAVE_WCHAR 1204c71b79aSjdc if (sp->nsp != NULL) { 1214c71b79aSjdc if (__putnsp(win->bnsp, fp) == ERR) 1224c71b79aSjdc return ERR; 1234c71b79aSjdc } 1244c71b79aSjdc #endif /* HAVE_WCHAR */ 1254c71b79aSjdc } 1264c71b79aSjdc 1274c71b79aSjdc return OK; 1284c71b79aSjdc } 1294c71b79aSjdc 1304c71b79aSjdc #ifdef HAVE_WCHAR 1314c71b79aSjdc /* 1324c71b79aSjdc * __getnsp -- 1334c71b79aSjdc * Read non-spacing character chain from file 1344c71b79aSjdc */ 1354c71b79aSjdc static int 1364c71b79aSjdc __getnsp(nschar_t *nsp, FILE *fp) 1374c71b79aSjdc { 1384c71b79aSjdc int n; 1394c71b79aSjdc nschar_t *onsp, *tnsp; 1404c71b79aSjdc 1414c71b79aSjdc if (fread(&n, sizeof(int), 1, fp) != 1) 1424c71b79aSjdc return ERR; 1434c71b79aSjdc onsp = nsp; 1444c71b79aSjdc while (n != 0) { 1458a48cf66Schristos tnsp = malloc(sizeof(nschar_t)); 1464c71b79aSjdc if (tnsp == NULL) { 1474c71b79aSjdc __cursesi_free_nsp(nsp); 1484c71b79aSjdc return OK; 1494c71b79aSjdc } 1504c71b79aSjdc if (fread(&tnsp->ch, sizeof(wchar_t), 1, fp) != 1) { 1514c71b79aSjdc __cursesi_free_nsp(nsp); 1524c71b79aSjdc return OK; 1534c71b79aSjdc } 1544c71b79aSjdc tnsp->next = NULL; 1554c71b79aSjdc onsp->next = tnsp; 1564c71b79aSjdc onsp = onsp->next; 1574c71b79aSjdc if (fread(&n, sizeof(int), 1, fp) != 1) { 1584c71b79aSjdc __cursesi_free_nsp(nsp); 1594c71b79aSjdc return ERR; 1604c71b79aSjdc } 1614c71b79aSjdc } 1624c71b79aSjdc return OK; 1634c71b79aSjdc } 1644c71b79aSjdc #endif /* HAVE_WCHAR */ 1654c71b79aSjdc 1664c71b79aSjdc /* 1674c71b79aSjdc * getwin -- 1684c71b79aSjdc * Read window data from file 1694c71b79aSjdc */ 1704c71b79aSjdc WINDOW * 1714c71b79aSjdc getwin(FILE *fp) 1724c71b79aSjdc { 1734c71b79aSjdc int major, minor; 1744c71b79aSjdc WINDOW *wtmp, *win; 1754c71b79aSjdc int y, x; 1764c71b79aSjdc __LDATA *sp; 1774c71b79aSjdc 1784c71b79aSjdc __CTRACE(__CTRACE_FILEIO, "getwin\n"); 1794c71b79aSjdc 1804c71b79aSjdc /* Check library version */ 1814c71b79aSjdc if (fread(&major, sizeof(int), 1, fp) != 1) 1824c71b79aSjdc return NULL; 1834c71b79aSjdc if (fread(&minor, sizeof(int), 1, fp) != 1) 1844c71b79aSjdc return NULL; 1854c71b79aSjdc if(major != CURSES_LIB_MAJOR || minor != CURSES_LIB_MINOR) 1864c71b79aSjdc return NULL; 1874c71b79aSjdc 1884c71b79aSjdc /* Window parameters */ 1898a48cf66Schristos wtmp = malloc(sizeof(WINDOW)); 1904c71b79aSjdc if (wtmp == NULL) 1914c71b79aSjdc return NULL; 1924c71b79aSjdc if (fread(wtmp, sizeof(WINDOW), 1, fp) != 1) 1934c71b79aSjdc goto error0; 1944c71b79aSjdc win = __newwin(_cursesi_screen, wtmp->maxy, wtmp->maxx, 195d34c5681Sroy wtmp->begy, wtmp->begx, FALSE, FALSE); 1964c71b79aSjdc if (win == NULL) 1974c71b79aSjdc goto error0; 1984c71b79aSjdc win->cury = wtmp->cury; 1994c71b79aSjdc win->curx = wtmp->curx; 2004c71b79aSjdc win->reqy = wtmp->reqy; 2014c71b79aSjdc win->reqx = wtmp->reqx; 2024c71b79aSjdc win->flags = wtmp->flags; 2034c71b79aSjdc win->delay = wtmp->delay; 2044c71b79aSjdc win->wattr = wtmp->wattr; 2054c71b79aSjdc win->bch = wtmp->bch; 2064c71b79aSjdc win->battr = wtmp->battr; 2074c71b79aSjdc win->scr_t = wtmp->scr_t; 2084c71b79aSjdc win->scr_b = wtmp->scr_b; 2094c71b79aSjdc free(wtmp); 210ea988594Schristos wtmp = NULL; 2114c71b79aSjdc __swflags(win); 2124c71b79aSjdc 2134c71b79aSjdc #ifdef HAVE_WCHAR 2144c71b79aSjdc if (__getnsp(win->bnsp, fp) == ERR) 2154c71b79aSjdc goto error1; 2164c71b79aSjdc #endif /* HAVE_WCHAR */ 2174c71b79aSjdc 2184c71b79aSjdc /* Lines and line data */ 2194c71b79aSjdc for (y = 0; y < win->maxy; y++) { 22043d5eb45Sroy for (sp = win->alines[y]->line, x = 0; x < win->maxx; 2214c71b79aSjdc x++, sp++) { 2224c71b79aSjdc if (fread(&sp->ch, sizeof(wchar_t), 1, fp) != 1) 2234c71b79aSjdc goto error1; 2244c71b79aSjdc if (fread(&sp->attr, sizeof(attr_t), 1, fp) != 1) 2254c71b79aSjdc goto error1; 2264c71b79aSjdc #ifdef HAVE_WCHAR 2274c71b79aSjdc if (sp->nsp != NULL) { 2284c71b79aSjdc if (__getnsp(win->bnsp, fp) == ERR) 2294c71b79aSjdc goto error1; 2304c71b79aSjdc } 2314c71b79aSjdc #endif /* HAVE_WCHAR */ 2324c71b79aSjdc } 2334c71b79aSjdc __touchline(win, y, 0, (int) win->maxx - 1); 2344c71b79aSjdc } 2354ecd76e5Srin __CTRACE(__CTRACE_FILEIO, "getwin: win = %p\n", win); 2364c71b79aSjdc return win; 2374c71b79aSjdc 2384c71b79aSjdc error1: 2394c71b79aSjdc delwin(win); 2404c71b79aSjdc error0: 241ea988594Schristos if (wtmp) 2424c71b79aSjdc free(wtmp); 2434c71b79aSjdc return NULL; 2444c71b79aSjdc } 245a1122fa9Srin #endif /* !LIBHACK */ 246