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