1 /*
2  * Copyright (c) 1980, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)save.c	8.1 (Berkeley) 05/31/93";
10 #endif /* not lint */
11 
12 #include "back.h"
13 
14 extern int	errno;
15 
16 static char	confirm[] = "Are you sure you want to leave now?";
17 static char	prompt[] = "Enter a file name:  ";
18 static char	exist1[] = "The file '";
19 static char	exist2[] =
20 	"' already exists.\nAre you sure you want to use this file?";
21 static char	cantuse[] = "\nCan't use ";
22 static char	saved[] = "This game has been saved on the file '";
23 static char	type[] = "'.\nType \"backgammon ";
24 static char	rec[] = "\" to recover your game.\n\n";
25 static char	cantrec[] = "Can't recover file:  ";
26 
27 save (n)
28 register int	n;
29 
30 {
31 	register int	fdesc;
32 	register char	*fs;
33 	char		fname[50];
34 
35 	if (n)  {
36 		if (tflag)  {
37 			curmove (20,0);
38 			clend();
39 		} else
40 			writec ('\n');
41 		writel (confirm);
42 		if (! yorn(0))
43 			return;
44 	}
45 	cflag = 1;
46 	for (;;)  {
47 		writel (prompt);
48 		fs = fname;
49 		while ((*fs = readc()) != '\n')  {
50 			if (*fs == tty.sg_erase)  {
51 				if (fs > fname)  {
52 					fs--;
53 					if (tflag)
54 						curmove (curr,curc-1);
55 					else
56 						writec (*fs);
57 				} else
58 					writec ('\007');
59 				continue;
60 			}
61 			writec (*fs++);
62 		}
63 		*fs = '\0';
64 		if ((fdesc = open(fname,2)) == -1 && errno == 2)  {
65 			if ((fdesc = creat (fname,0700)) != -1)
66 			break;
67 		}
68 		if (fdesc != -1)  {
69 			if (tflag)  {
70 				curmove (18,0);
71 				clend();
72 			} else
73 				writec ('\n');
74 			writel (exist1);
75 			writel (fname);
76 			writel (exist2);
77 			cflag = 0;
78 			close (fdesc);
79 			if (yorn (0))  {
80 				unlink (fname);
81 				fdesc = creat (fname,0700);
82 				break;
83 			} else  {
84 				cflag = 1;
85 				continue;
86 			}
87 		}
88 		writel (cantuse);
89 		writel (fname);
90 		writel (".\n");
91 		close (fdesc);
92 		cflag = 1;
93 	}
94 	write (fdesc,board,sizeof board);
95 	write (fdesc,off,sizeof off);
96 	write (fdesc,in,sizeof in);
97 	write (fdesc,dice,sizeof dice);
98 	write (fdesc,&cturn,sizeof cturn);
99 	write (fdesc,&dlast,sizeof dlast);
100 	write (fdesc,&pnum,sizeof pnum);
101 	write (fdesc,&rscore,sizeof rscore);
102 	write (fdesc,&wscore,sizeof wscore);
103 	write (fdesc,&gvalue,sizeof gvalue);
104 	write (fdesc,&raflag,sizeof raflag);
105 	close (fdesc);
106 	if (tflag)
107 		curmove (18,0);
108 	writel (saved);
109 	writel (fname);
110 	writel (type);
111 	writel (fname);
112 	writel (rec);
113 	if (tflag)
114 		clend();
115 	getout ();
116 }
117 
118 recover (s)
119 char	*s;
120 
121 {
122 	register int	i;
123 	int		fdesc;
124 
125 	if ((fdesc = open (s,0)) == -1)
126 		norec (s);
127 	read (fdesc,board,sizeof board);
128 	read (fdesc,off,sizeof off);
129 	read (fdesc,in,sizeof in);
130 	read (fdesc,dice,sizeof dice);
131 	read (fdesc,&cturn,sizeof cturn);
132 	read (fdesc,&dlast,sizeof dlast);
133 	read (fdesc,&pnum,sizeof pnum);
134 	read (fdesc,&rscore,sizeof rscore);
135 	read (fdesc,&wscore,sizeof wscore);
136 	read (fdesc,&gvalue,sizeof gvalue);
137 	read (fdesc,&raflag,sizeof raflag);
138 	close (fdesc);
139 	rflag = 1;
140 }
141 
142 norec (s)
143 register char	*s;
144 
145 {
146 	register char	*c;
147 
148 	tflag = 0;
149 	writel (cantrec);
150 	c = s;
151 	while (*c != '\0')
152 		writec (*c++);
153 	getout ();
154 }
155