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