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