Fixed up so all targets are made at once.
[unix-history] / usr / src / games / mille / save.c
CommitLineData
f823d190
KB
1/*
2 * Copyright (c) 1983 Regents of the University of California.
6892174b
KB
3 * All rights reserved.
4 *
7c5ab767 5 * %sccs.include.redist.c%
f823d190
KB
6 */
7
8#ifndef lint
28a87267 9static char sccsid[] = "@(#)save.c 5.7 (Berkeley) %G%";
6892174b
KB
10#endif /* not lint */
11
28a87267
EA
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <string.h>
15#include <termios.h>
16#include "mille.h"
17
f823d190 18#ifndef unctrl
28a87267 19#include "unctrl.h"
f823d190
KB
20#endif
21
22# ifdef attron
23# include <term.h>
24# define _tty cur_term->Nttyb
25# endif attron
26
27/*
28 * @(#)save.c 1.2 (Berkeley) 3/28/83
29 */
30
31typedef struct stat STAT;
32
33char *ctime();
34
35int read(), write();
36
37/*
38 * This routine saves the current game for use at a later date
39 */
f823d190
KB
40
41save() {
42
65a21971 43 extern int errno;
f823d190
KB
44 reg char *sp;
45 reg int outf;
46 reg time_t *tp;
47 char buf[80];
48 time_t tme;
49 STAT junk;
50
51 tp = &tme;
52 if (Fromfile && getyn(SAMEFILEPROMPT))
53 strcpy(buf, Fromfile);
54 else {
55over:
56 prompt(FILEPROMPT);
57 leaveok(Board, FALSE);
58 refresh();
59 sp = buf;
60 while ((*sp = readch()) != '\n') {
61 if (*sp == killchar())
62 goto over;
63 else if (*sp == erasechar()) {
64 if (--sp < buf)
65 sp = buf;
66 else {
67 addch('\b');
68 /*
69 * if the previous char was a control
70 * char, cover up two characters.
71 */
72 if (*sp < ' ')
73 addch('\b');
74 clrtoeol();
75 }
76 }
6892174b
KB
77 else {
78 addstr(unctrl(*sp));
79 ++sp;
80 }
f823d190
KB
81 refresh();
82 }
83 *sp = '\0';
84 leaveok(Board, TRUE);
85 }
86
87 /*
88 * check for existing files, and confirm overwrite if needed
89 */
90
91 if (sp == buf || (!Fromfile && stat(buf, &junk) > -1
92 && getyn(OVERWRITEFILEPROMPT) == FALSE))
93 return FALSE;
94
95 if ((outf = creat(buf, 0644)) < 0) {
65a21971 96 error(strerror(errno));
f823d190
KB
97 return FALSE;
98 }
99 mvwaddstr(Score, ERR_Y, ERR_X, buf);
100 wrefresh(Score);
101 time(tp); /* get current time */
102 strcpy(buf, ctime(tp));
103 for (sp = buf; *sp != '\n'; sp++)
104 continue;
105 *sp = '\0';
106 varpush(outf, write);
107 close(outf);
108 wprintw(Score, " [%s]", buf);
109 wclrtoeol(Score);
110 wrefresh(Score);
111 return TRUE;
112}
113
114/*
115 * This does the actual restoring. It returns TRUE if the
116 * backup was made on exiting, in which case certain things must
117 * be cleaned up before the game starts.
118 */
119rest_f(file)
120reg char *file; {
121
122 reg char *sp;
123 reg int inf;
124 char buf[80];
125 STAT sbuf;
126
127 if ((inf = open(file, 0)) < 0) {
128 perror(file);
129 exit(1);
130 }
131 if (fstat(inf, &sbuf) < 0) { /* get file stats */
132 perror(file);
133 exit(1);
134 }
135 varpush(inf, read);
136 close(inf);
137 strcpy(buf, ctime(&sbuf.st_mtime));
138 for (sp = buf; *sp != '\n'; sp++)
139 continue;
140 *sp = '\0';
141 /*
142 * initialize some necessary values
143 */
6f979f4f 144 (void)sprintf(Initstr, "%s [%s]\n", file, buf);
f823d190
KB
145 Fromfile = file;
146 return !On_exit;
147}
148