games: Massive style(9) cleanup commit. Reduces differences to NetBSD.
[dragonfly.git] / games / backgammon / common_source / save.c
1 /*-
2  * Copyright (c) 1980, 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/backgammon/common_source/save.c,v 1.8 1999/11/30 03:48:27 billf Exp $
31  * $DragonFly: src/games/backgammon/common_source/save.c,v 1.4 2006/08/08 16:36:11 pavalos Exp $
32  */
33
34 #include <fcntl.h>
35 #include <errno.h>
36 #include "back.h"
37
38 static void     norec(const char *);
39
40 static const char       confirm[] = "Are you sure you want to leave now?";
41 static const char       prompt[] = "Enter a file name:  ";
42 static const char       exist1[] = "The file '";
43 static const char       exist2[] =
44         "' already exists.\nAre you sure you want to use this file?";
45 static const char       cantuse[] = "\nCan't use ";
46 static const char       saved[] = "This game has been saved on the file '";
47 static const char       type[] = "'.\nType \"backgammon ";
48 static const char       rec[] = "\" to recover your game.\n\n";
49 static const char       cantrec[] = "Can't recover file:  ";
50
51 void
52 save(int n)
53 {
54         int fdesc;
55         char *fs;
56         char fname[50];
57
58         if (n) {
59                 if (tflag) {
60                         curmove(20, 0);
61                         clend();
62                 } else
63                         writec('\n');
64                 writel(confirm);
65                 if (!yorn(0))
66                         return;
67         }
68         cflag = 1;
69         for (;;) {
70                 writel(prompt);
71                 fs = fname;
72                 while ((*fs = readc()) != '\n') {
73                         if (*fs == tty.c_cc[VERASE]) {
74                                 if (fs > fname) {
75                                         fs--;
76                                         if (tflag)
77                                                 curmove(curr, curc - 1);
78                                         else
79                                                 writec(*fs);
80                                 } else
81                                         writec('\007');
82                                 continue;
83                         }
84                         writec(*fs++);
85                 }
86                 *fs = '\0';
87                 if ((fdesc = open(fname, O_RDWR)) == -1 && errno == ENOENT) {
88                         if ((fdesc = creat(fname, 0600)) != -1)
89                                 break;
90                 }
91                 if (fdesc != -1) {
92                         if (tflag) {
93                                 curmove(18, 0);
94                                 clend();
95                         } else
96                                 writec('\n');
97                         writel(exist1);
98                         writel(fname);
99                         writel(exist2);
100                         cflag = 0;
101                         close(fdesc);
102                         if (yorn(0)) {
103                                 unlink(fname);
104                                 fdesc = creat(fname, 0700);
105                                 break;
106                         } else {
107                                 cflag = 1;
108                                 continue;
109                         }
110                 }
111                 writel(cantuse);
112                 writel(fname);
113                 writel(".\n");
114                 cflag = 1;
115         }
116         write(fdesc, board, sizeof board);
117         write(fdesc, off, sizeof off);
118         write(fdesc, in, sizeof in);
119         write(fdesc, dice, sizeof dice);
120         write(fdesc, &cturn, sizeof cturn);
121         write(fdesc, &dlast, sizeof dlast);
122         write(fdesc, &pnum, sizeof pnum);
123         write(fdesc, &rscore, sizeof rscore);
124         write(fdesc, &wscore, sizeof wscore);
125         write(fdesc, &gvalue, sizeof gvalue);
126         write(fdesc, &raflag, sizeof raflag);
127         close(fdesc);
128         if (tflag)
129                 curmove(18, 0);
130         writel(saved);
131         writel(fname);
132         writel(type);
133         writel(fname);
134         writel(rec);
135         if (tflag)
136                 clend();
137         getout();
138 }
139
140 void
141 recover(const char *s)
142 {
143         int fdesc;
144
145         if ((fdesc = open(s, O_RDONLY)) == -1)
146                 norec(s);
147         read(fdesc, board, sizeof board);
148         read(fdesc, off, sizeof off);
149         read(fdesc, in, sizeof in);
150         read(fdesc, dice, sizeof dice);
151         read(fdesc, &cturn, sizeof cturn);
152         read(fdesc, &dlast, sizeof dlast);
153         read(fdesc, &pnum, sizeof pnum);
154         read(fdesc, &rscore, sizeof rscore);
155         read(fdesc, &wscore, sizeof wscore);
156         read(fdesc, &gvalue, sizeof gvalue);
157         read(fdesc, &raflag, sizeof raflag);
158         close(fdesc);
159         rflag = 1;
160 }
161
162 static void
163 norec(const char *s)
164 {
165         const char *c;
166
167         tflag = 0;
168         writel(cantrec);
169         c = s;
170         while (*c != '\0')
171                 writec(*c++);
172         getout();
173 }