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