Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[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. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * @(#)save.c   8.1 (Berkeley) 5/31/93
34  * $FreeBSD: src/games/backgammon/common_source/save.c,v 1.8 1999/11/30 03:48:27 billf Exp $
35  * $DragonFly: src/games/backgammon/common_source/save.c,v 1.2 2003/06/17 04:25:22 dillon Exp $
36  */
37
38 #include <fcntl.h>
39 #include <errno.h>
40 #include "back.h"
41
42 static const char       confirm[] = "Are you sure you want to leave now?";
43 static const char       prompt[] = "Enter a file name:  ";
44 static const char       exist1[] = "The file '";
45 static const char       exist2[] =
46         "' already exists.\nAre you sure you want to use this file?";
47 static const char       cantuse[] = "\nCan't use ";
48 static const char       saved[] = "This game has been saved on the file '";
49 static const char       type[] = "'.\nType \"backgammon ";
50 static const char       rec[] = "\" to recover your game.\n\n";
51 static const char       cantrec[] = "Can't recover file:  ";
52
53 save (n)
54 int     n;
55
56 {
57         int     fdesc;
58         char    *fs;
59         char            fname[50];
60
61         if (n)  {
62                 if (tflag)  {
63                         curmove (20,0);
64                         clend();
65                 } else
66                         writec ('\n');
67                 writel (confirm);
68                 if (! yorn(0))
69                         return;
70         }
71         cflag = 1;
72         for (;;)  {
73                 writel (prompt);
74                 fs = fname;
75                 while ((*fs = readc()) != '\n')  {
76                         if (*fs == tty.sg_erase)  {
77                                 if (fs > fname)  {
78                                         fs--;
79                                         if (tflag)
80                                                 curmove (curr,curc-1);
81                                         else
82                                                 writec (*fs);
83                                 } else
84                                         writec ('\007');
85                                 continue;
86                         }
87                         writec (*fs++);
88                 }
89                 *fs = '\0';
90                 if ((fdesc = open(fname,O_RDWR)) == -1 && errno == ENOENT)  {
91                         if ((fdesc = creat (fname,0600)) != -1)
92                         break;
93                 }
94                 if (fdesc != -1)  {
95                         if (tflag)  {
96                                 curmove (18,0);
97                                 clend();
98                         } else
99                                 writec ('\n');
100                         writel (exist1);
101                         writel (fname);
102                         writel (exist2);
103                         cflag = 0;
104                         close (fdesc);
105                         if (yorn (0))  {
106                                 unlink (fname);
107                                 fdesc = creat (fname,0700);
108                                 break;
109                         } else  {
110                                 cflag = 1;
111                                 continue;
112                         }
113                 }
114                 writel (cantuse);
115                 writel (fname);
116                 writel (".\n");
117                 close (fdesc);
118                 cflag = 1;
119         }
120         write (fdesc,board,sizeof board);
121         write (fdesc,off,sizeof off);
122         write (fdesc,in,sizeof in);
123         write (fdesc,dice,sizeof dice);
124         write (fdesc,&cturn,sizeof cturn);
125         write (fdesc,&dlast,sizeof dlast);
126         write (fdesc,&pnum,sizeof pnum);
127         write (fdesc,&rscore,sizeof rscore);
128         write (fdesc,&wscore,sizeof wscore);
129         write (fdesc,&gvalue,sizeof gvalue);
130         write (fdesc,&raflag,sizeof raflag);
131         close (fdesc);
132         if (tflag)
133                 curmove (18,0);
134         writel (saved);
135         writel (fname);
136         writel (type);
137         writel (fname);
138         writel (rec);
139         if (tflag)
140                 clend();
141         getout ();
142 }
143 \f
144 int
145 recover (s)
146 const char      *s;
147
148 {
149         int     i;
150         int             fdesc;
151
152         if ((fdesc = open (s,O_RDONLY)) == -1)
153                 norec (s);
154         read (fdesc,board,sizeof board);
155         read (fdesc,off,sizeof off);
156         read (fdesc,in,sizeof in);
157         read (fdesc,dice,sizeof dice);
158         read (fdesc,&cturn,sizeof cturn);
159         read (fdesc,&dlast,sizeof dlast);
160         read (fdesc,&pnum,sizeof pnum);
161         read (fdesc,&rscore,sizeof rscore);
162         read (fdesc,&wscore,sizeof wscore);
163         read (fdesc,&gvalue,sizeof gvalue);
164         read (fdesc,&raflag,sizeof raflag);
165         close (fdesc);
166         rflag = 1;
167 }
168
169 int
170 norec (s)
171 const char      *s;
172
173 {
174         const char      *c;
175
176         tflag = 0;
177         writel (cantrec);
178         c = s;
179         while (*c != '\0')
180                 writec (*c++);
181         getout ();
182 }