1 1.16 tron /* $NetBSD: save.c,v 1.16 2011/08/26 09:01:07 tron Exp $ */ 2 1.4 cgd 3 1.1 cgd /* 4 1.3 jtc * Copyright (c) 1983, 1993 5 1.3 jtc * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.11 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.6 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.4 cgd #if 0 35 1.4 cgd static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 5/31/93"; 36 1.4 cgd #else 37 1.16 tron __RCSID("$NetBSD: save.c,v 1.16 2011/08/26 09:01:07 tron Exp $"); 38 1.4 cgd #endif 39 1.1 cgd #endif /* not lint */ 40 1.10 jsm 41 1.10 jsm #include <time.h> 42 1.1 cgd 43 1.3 jtc #include "mille.h" 44 1.3 jtc 45 1.1 cgd #ifndef unctrl 46 1.3 jtc #include "unctrl.h" 47 1.1 cgd #endif 48 1.1 cgd 49 1.1 cgd /* 50 1.1 cgd * @(#)save.c 1.2 (Berkeley) 3/28/83 51 1.1 cgd */ 52 1.1 cgd 53 1.1 cgd typedef struct stat STAT; 54 1.1 cgd 55 1.1 cgd /* 56 1.1 cgd * This routine saves the current game for use at a later date 57 1.6 lukem * Returns FALSE if it couldn't be done. 58 1.1 cgd */ 59 1.6 lukem bool 60 1.14 dholland save(void) 61 1.6 lukem { 62 1.6 lukem char *sp; 63 1.12 dholland int outfd; 64 1.6 lukem time_t *tp; 65 1.6 lukem char buf[80]; 66 1.6 lukem time_t tme; 67 1.6 lukem STAT junk; 68 1.6 lukem bool rv; 69 1.1 cgd 70 1.6 lukem sp = NULL; 71 1.1 cgd tp = &tme; 72 1.1 cgd if (Fromfile && getyn(SAMEFILEPROMPT)) 73 1.1 cgd strcpy(buf, Fromfile); 74 1.1 cgd else { 75 1.1 cgd over: 76 1.1 cgd prompt(FILEPROMPT); 77 1.1 cgd leaveok(Board, FALSE); 78 1.1 cgd refresh(); 79 1.1 cgd sp = buf; 80 1.1 cgd while ((*sp = readch()) != '\n') { 81 1.1 cgd if (*sp == killchar()) 82 1.1 cgd goto over; 83 1.1 cgd else if (*sp == erasechar()) { 84 1.1 cgd if (--sp < buf) 85 1.1 cgd sp = buf; 86 1.1 cgd else { 87 1.1 cgd addch('\b'); 88 1.1 cgd /* 89 1.1 cgd * if the previous char was a control 90 1.1 cgd * char, cover up two characters. 91 1.1 cgd */ 92 1.1 cgd if (*sp < ' ') 93 1.1 cgd addch('\b'); 94 1.1 cgd clrtoeol(); 95 1.1 cgd } 96 1.1 cgd } 97 1.1 cgd else { 98 1.1 cgd addstr(unctrl(*sp)); 99 1.1 cgd ++sp; 100 1.1 cgd } 101 1.1 cgd refresh(); 102 1.1 cgd } 103 1.1 cgd *sp = '\0'; 104 1.1 cgd leaveok(Board, TRUE); 105 1.1 cgd } 106 1.1 cgd 107 1.1 cgd /* 108 1.1 cgd * check for existing files, and confirm overwrite if needed 109 1.1 cgd */ 110 1.1 cgd 111 1.1 cgd if (sp == buf || (!Fromfile && stat(buf, &junk) > -1 112 1.1 cgd && getyn(OVERWRITEFILEPROMPT) == FALSE)) 113 1.1 cgd return FALSE; 114 1.1 cgd 115 1.12 dholland if ((outfd = creat(buf, 0644)) < 0) { 116 1.16 tron error("%s", strerror(errno)); 117 1.1 cgd return FALSE; 118 1.1 cgd } 119 1.1 cgd mvwaddstr(Score, ERR_Y, ERR_X, buf); 120 1.1 cgd wrefresh(Score); 121 1.1 cgd time(tp); /* get current time */ 122 1.12 dholland rv = varpush(outfd, writev); 123 1.12 dholland close(outfd); 124 1.6 lukem if (rv == FALSE) { 125 1.6 lukem unlink(buf); 126 1.6 lukem } else { 127 1.15 christos char *p; 128 1.15 christos if ((p = ctime(tp)) == NULL) 129 1.15 christos strcpy(buf, "?"); 130 1.15 christos else 131 1.15 christos strcpy(buf, p); 132 1.6 lukem for (sp = buf; *sp != '\n'; sp++) 133 1.6 lukem continue; 134 1.6 lukem *sp = '\0'; 135 1.6 lukem wprintw(Score, " [%s]", buf); 136 1.6 lukem } 137 1.1 cgd wclrtoeol(Score); 138 1.1 cgd wrefresh(Score); 139 1.6 lukem return rv; 140 1.1 cgd } 141 1.1 cgd 142 1.1 cgd /* 143 1.1 cgd * This does the actual restoring. It returns TRUE if the 144 1.1 cgd * backup was made on exiting, in which case certain things must 145 1.1 cgd * be cleaned up before the game starts. 146 1.1 cgd */ 147 1.6 lukem bool 148 1.14 dholland rest_f(const char *file) 149 1.5 jtc { 150 1.1 cgd 151 1.15 christos char *sp, *p; 152 1.6 lukem int inf; 153 1.6 lukem char buf[80]; 154 1.6 lukem STAT sbuf; 155 1.1 cgd 156 1.9 jsm if ((inf = open(file, O_RDONLY)) < 0) { 157 1.6 lukem warn("%s", file); 158 1.1 cgd exit(1); 159 1.1 cgd } 160 1.1 cgd if (fstat(inf, &sbuf) < 0) { /* get file stats */ 161 1.6 lukem warn("%s", file); 162 1.1 cgd exit(1); 163 1.1 cgd } 164 1.6 lukem varpush(inf, readv); 165 1.1 cgd close(inf); 166 1.15 christos if ((p = ctime(&sbuf.st_mtime)) == NULL) 167 1.15 christos strcpy(buf, "?"); 168 1.15 christos else 169 1.15 christos strcpy(buf, p); 170 1.1 cgd for (sp = buf; *sp != '\n'; sp++) 171 1.1 cgd continue; 172 1.1 cgd *sp = '\0'; 173 1.1 cgd /* 174 1.1 cgd * initialize some necessary values 175 1.1 cgd */ 176 1.13 dholland (void)snprintf(Initstr, INITSTR_SIZE, "%s [%s]\n", file, buf); 177 1.1 cgd Fromfile = file; 178 1.1 cgd return !On_exit; 179 1.1 cgd } 180