Merge branch 'vendor/LESS'
[dragonfly.git] / games / mille / save.c
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 }