Commit | Line | Data |
---|---|---|
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 | 9 | static 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 | ||
31 | typedef struct stat STAT; | |
32 | ||
33 | char *ctime(); | |
34 | ||
35 | int read(), write(); | |
36 | ||
37 | /* | |
38 | * This routine saves the current game for use at a later date | |
39 | */ | |
f823d190 KB |
40 | |
41 | save() { | |
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 { | |
55 | over: | |
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 | */ | |
119 | rest_f(file) | |
120 | reg 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 |