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
save(n)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
recover(s)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
norec(s)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