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