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