Major kernel build infrastructure changes, part 1/2 (sys).
[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.4 2006/08/08 16:36:11 pavalos Exp $
36  */
37
38 #include <fcntl.h>
39 #include <errno.h>
40 #include "back.h"
41
42 static void     norec(const char *);
43
44 static const char       confirm[] = "Are you sure you want to leave now?";
45 static const char       prompt[] = "Enter a file name:  ";
46 static const char       exist1[] = "The file '";
47 static const char       exist2[] =
48         "' already exists.\nAre you sure you want to use this file?";
49 static const char       cantuse[] = "\nCan't use ";
50 static const char       saved[] = "This game has been saved on the file '";
51 static const char       type[] = "'.\nType \"backgammon ";
52 static const char       rec[] = "\" to recover your game.\n\n";
53 static const char       cantrec[] = "Can't recover file:  ";
54
55 void
56 save(int n)
57 {
58         int     fdesc;
59         char    *fs;
60         char            fname[50];
61
62         if (n)  {
63                 if (tflag)  {
64                         curmove (20,0);
65                         clend();
66                 } else
67                         writec ('\n');
68                 writel (confirm);
69                 if (! yorn(0))
70                         return;
71         }
72         cflag = 1;
73         for (;;)  {
74                 writel (prompt);
75                 fs = fname;
76                 while ((*fs = readc()) != '\n')  {
77                         if (*fs == tty.sg_erase)  {
78                                 if (fs > fname)  {
79                                         fs--;
80                                         if (tflag)
81                                                 curmove (curr,curc-1);
82                                         else
83                                                 writec (*fs);
84                                 } else
85                                         writec ('\007');
86                                 continue;
87                         }
88                         writec (*fs++);
89                 }
90                 *fs = '\0';
91                 if ((fdesc = open(fname,O_RDWR)) == -1 && errno == ENOENT)  {
92                         if ((fdesc = creat (fname,0600)) != -1)
93                         break;
94                 }
95                 if (fdesc != -1)  {
96                         if (tflag)  {
97                                 curmove (18,0);
98                                 clend();
99                         } else
100                                 writec ('\n');
101                         writel (exist1);
102                         writel (fname);
103                         writel (exist2);
104                         cflag = 0;
105                         close (fdesc);
106                         if (yorn (0))  {
107                                 unlink (fname);
108                                 fdesc = creat (fname,0700);
109                                 break;
110                         } else  {
111                                 cflag = 1;
112                                 continue;
113                         }
114                 }
115                 writel (cantuse);
116                 writel (fname);
117                 writel (".\n");
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
144 void
145 recover(const char *s)
146 {
147         int             fdesc;
148
149         if ((fdesc = open (s,O_RDONLY)) == -1)
150                 norec (s);
151         read (fdesc,board,sizeof board);
152         read (fdesc,off,sizeof off);
153         read (fdesc,in,sizeof in);
154         read (fdesc,dice,sizeof dice);
155         read (fdesc,&cturn,sizeof cturn);
156         read (fdesc,&dlast,sizeof dlast);
157         read (fdesc,&pnum,sizeof pnum);
158         read (fdesc,&rscore,sizeof rscore);
159         read (fdesc,&wscore,sizeof wscore);
160         read (fdesc,&gvalue,sizeof gvalue);
161         read (fdesc,&raflag,sizeof raflag);
162         close (fdesc);
163         rflag = 1;
164 }
165
166 static void
167 norec(const char *s)
168 {
169         const char      *c;
170
171         tflag = 0;
172         writel (cantrec);
173         c = s;
174         while (*c != '\0')
175                 writec (*c++);
176         getout ();
177 }