121216Sdist /*
2*60746Sbostic * Copyright (c) 1980, 1993
3*60746Sbostic * The Regents of the University of California. All rights reserved.
433487Sbostic *
542565Sbostic * %sccs.include.redist.c%
621216Sdist */
76765Srrh
821216Sdist #ifndef lint
9*60746Sbostic static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 05/31/93";
1033487Sbostic #endif /* not lint */
1121216Sdist
126765Srrh #include "back.h"
136765Srrh
146765Srrh extern int errno;
156765Srrh
166765Srrh static char confirm[] = "Are you sure you want to leave now?";
176765Srrh static char prompt[] = "Enter a file name: ";
186765Srrh static char exist1[] = "The file '";
196765Srrh static char exist2[] =
206765Srrh "' already exists.\nAre you sure you want to use this file?";
216765Srrh static char cantuse[] = "\nCan't use ";
229359Smckusick static char saved[] = "This game has been saved on the file '";
239359Smckusick static char type[] = "'.\nType \"backgammon ";
249359Smckusick static char rec[] = "\" to recover your game.\n\n";
256765Srrh static char cantrec[] = "Can't recover file: ";
266765Srrh
save(n)276765Srrh save (n)
286765Srrh register int n;
296765Srrh
306765Srrh {
316765Srrh register int fdesc;
326765Srrh register char *fs;
336765Srrh char fname[50];
346765Srrh
356765Srrh if (n) {
366765Srrh if (tflag) {
376765Srrh curmove (20,0);
386765Srrh clend();
396765Srrh } else
406765Srrh writec ('\n');
416765Srrh writel (confirm);
426765Srrh if (! yorn(0))
436765Srrh return;
446765Srrh }
456765Srrh cflag = 1;
466765Srrh for (;;) {
476765Srrh writel (prompt);
486765Srrh fs = fname;
496765Srrh while ((*fs = readc()) != '\n') {
506765Srrh if (*fs == tty.sg_erase) {
516765Srrh if (fs > fname) {
526765Srrh fs--;
536765Srrh if (tflag)
546765Srrh curmove (curr,curc-1);
556765Srrh else
566765Srrh writec (*fs);
576765Srrh } else
586765Srrh writec ('\007');
596765Srrh continue;
606765Srrh }
616765Srrh writec (*fs++);
626765Srrh }
636765Srrh *fs = '\0';
646765Srrh if ((fdesc = open(fname,2)) == -1 && errno == 2) {
656765Srrh if ((fdesc = creat (fname,0700)) != -1)
666765Srrh break;
676765Srrh }
686765Srrh if (fdesc != -1) {
696765Srrh if (tflag) {
706765Srrh curmove (18,0);
716765Srrh clend();
726765Srrh } else
736765Srrh writec ('\n');
746765Srrh writel (exist1);
756765Srrh writel (fname);
766765Srrh writel (exist2);
776765Srrh cflag = 0;
786765Srrh close (fdesc);
796765Srrh if (yorn (0)) {
806765Srrh unlink (fname);
816765Srrh fdesc = creat (fname,0700);
826765Srrh break;
836765Srrh } else {
846765Srrh cflag = 1;
856765Srrh continue;
866765Srrh }
876765Srrh }
886765Srrh writel (cantuse);
896765Srrh writel (fname);
906765Srrh writel (".\n");
916765Srrh close (fdesc);
926765Srrh cflag = 1;
936765Srrh }
949359Smckusick write (fdesc,board,sizeof board);
959359Smckusick write (fdesc,off,sizeof off);
969359Smckusick write (fdesc,in,sizeof in);
979359Smckusick write (fdesc,dice,sizeof dice);
989359Smckusick write (fdesc,&cturn,sizeof cturn);
999359Smckusick write (fdesc,&dlast,sizeof dlast);
1009359Smckusick write (fdesc,&pnum,sizeof pnum);
1019359Smckusick write (fdesc,&rscore,sizeof rscore);
1029359Smckusick write (fdesc,&wscore,sizeof wscore);
1039359Smckusick write (fdesc,&gvalue,sizeof gvalue);
1049359Smckusick write (fdesc,&raflag,sizeof raflag);
1056765Srrh close (fdesc);
1066765Srrh if (tflag)
1076765Srrh curmove (18,0);
1086765Srrh writel (saved);
1096765Srrh writel (fname);
1106765Srrh writel (type);
1116765Srrh writel (fname);
1126765Srrh writel (rec);
1136765Srrh if (tflag)
1146765Srrh clend();
1156765Srrh getout ();
1166765Srrh }
1176765Srrh
recover(s)1186765Srrh recover (s)
1196765Srrh char *s;
1206765Srrh
1216765Srrh {
1226765Srrh register int i;
1236765Srrh int fdesc;
1246765Srrh
1256765Srrh if ((fdesc = open (s,0)) == -1)
1266765Srrh norec (s);
1279359Smckusick read (fdesc,board,sizeof board);
1289359Smckusick read (fdesc,off,sizeof off);
1299359Smckusick read (fdesc,in,sizeof in);
1309359Smckusick read (fdesc,dice,sizeof dice);
1319359Smckusick read (fdesc,&cturn,sizeof cturn);
1329359Smckusick read (fdesc,&dlast,sizeof dlast);
1339359Smckusick read (fdesc,&pnum,sizeof pnum);
1349359Smckusick read (fdesc,&rscore,sizeof rscore);
1359359Smckusick read (fdesc,&wscore,sizeof wscore);
1369359Smckusick read (fdesc,&gvalue,sizeof gvalue);
1379359Smckusick read (fdesc,&raflag,sizeof raflag);
1386765Srrh close (fdesc);
1396765Srrh rflag = 1;
1406765Srrh }
1416765Srrh
norec(s)1426765Srrh norec (s)
1436765Srrh register char *s;
1446765Srrh
1456765Srrh {
1466765Srrh register char *c;
1476765Srrh
1486765Srrh tflag = 0;
1496765Srrh writel (cantrec);
1506765Srrh c = s;
1516765Srrh while (*c != '\0')
1526765Srrh writec (*c++);
1536765Srrh getout ();
1546765Srrh }
155