home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / backgammon / common_source / save.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-08  |  4.6 KB  |  181 lines

  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, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)save.c    5.4 (Berkeley) 6/1/90";
  36. #endif /* not lint */
  37.  
  38. #include "back.h"
  39.  
  40. extern int    errno;
  41.  
  42. static char    confirm[] = "Are you sure you want to leave now?";
  43. static char    prompt[] = "Enter a file name:  ";
  44. static char    exist1[] = "The file '";
  45. static char    exist2[] =
  46.     "' already exists.\nAre you sure you want to use this file?";
  47. static char    cantuse[] = "\nCan't use ";
  48. static char    saved[] = "This game has been saved on the file '";
  49. static char    type[] = "'.\nType \"backgammon ";
  50. static char    rec[] = "\" to recover your game.\n\n";
  51. static char    cantrec[] = "Can't recover file:  ";
  52.  
  53. save (n)
  54. register int    n;
  55.  
  56. {
  57.     register int    fdesc;
  58.     register char    *fs;
  59.     char        fname[50];
  60.  
  61.     if (n)  {
  62.         if (tflag)  {
  63.             curmove (20,0);
  64.             clend();
  65.         } else
  66.             writec ('\n');
  67.         writel (confirm);
  68.         if (! yorn(0))
  69.             return;
  70.     }
  71.     cflag = 1;
  72.     for (;;)  {
  73.         writel (prompt);
  74.         fs = fname;
  75.         while ((*fs = readc()) != '\n')  {
  76.             if (*fs == tty.sg_erase)  {
  77.                 if (fs > fname)  {
  78.                     fs--;
  79.                     if (tflag)
  80.                         curmove (curr,curc-1);
  81.                     else
  82.                         writec (*fs);
  83.                 } else
  84.                     writec ('\007');
  85.                 continue;
  86.             }
  87.             writec (*fs++);
  88.         }
  89.         *fs = '\0';
  90.         if ((fdesc = open(fname,2)) == -1 && errno == 2)  {
  91.             if ((fdesc = creat (fname,0700)) != -1)
  92.             break;
  93.         }
  94.         if (fdesc != -1)  {
  95.             if (tflag)  {
  96.                 curmove (18,0);
  97.                 clend();
  98.             } else
  99.                 writec ('\n');
  100.             writel (exist1);
  101.             writel (fname);
  102.             writel (exist2);
  103.             cflag = 0;
  104.             close (fdesc);
  105.             if (yorn (0))  {
  106.                 unlink (fname);
  107.                 fdesc = creat (fname,0700);
  108.                 break;
  109.             } else  {
  110.                 cflag = 1;
  111.                 continue;
  112.             }
  113.         }
  114.         writel (cantuse);
  115.         writel (fname);
  116.         writel (".\n");
  117.         close (fdesc);
  118.         cflag = 1;
  119.     }
  120.     write (fdesc,board,sizeof board);
  121.     write (fdesc,off,sizeof off);
  122.     write (fdesc,in,sizeof in);
  123.     write (fdesc,dice,sizeof dice);
  124.     write (fdesc,&cturn,sizeof cturn);
  125.     write (fdesc,&dlast,sizeof dlast);
  126.     write (fdesc,&pnum,sizeof pnum);
  127.     write (fdesc,&rscore,sizeof rscore);
  128.     write (fdesc,&wscore,sizeof wscore);
  129.     write (fdesc,&gvalue,sizeof gvalue);
  130.     write (fdesc,&raflag,sizeof raflag);
  131.     close (fdesc);
  132.     if (tflag)
  133.         curmove (18,0);
  134.     writel (saved);
  135.     writel (fname);
  136.     writel (type);
  137.     writel (fname);
  138.     writel (rec);
  139.     if (tflag)
  140.         clend();
  141.     getout ();
  142. }
  143.  
  144. recover (s)
  145. char    *s;
  146.  
  147. {
  148.     register int    i;
  149.     int        fdesc;
  150.  
  151.     if ((fdesc = open (s,0)) == -1)
  152.         norec (s);
  153.     read (fdesc,board,sizeof board);
  154.     read (fdesc,off,sizeof off);
  155.     read (fdesc,in,sizeof in);
  156.     read (fdesc,dice,sizeof dice);
  157.     read (fdesc,&cturn,sizeof cturn);
  158.     read (fdesc,&dlast,sizeof dlast);
  159.     read (fdesc,&pnum,sizeof pnum);
  160.     read (fdesc,&rscore,sizeof rscore);
  161.     read (fdesc,&wscore,sizeof wscore);
  162.     read (fdesc,&gvalue,sizeof gvalue);
  163.     read (fdesc,&raflag,sizeof raflag);
  164.     close (fdesc);
  165.     rflag = 1;
  166. }
  167.  
  168. norec (s)
  169. register char    *s;
  170.  
  171. {
  172.     register char    *c;
  173.  
  174.     tflag = 0;
  175.     writel (cantrec);
  176.     c = s;
  177.     while (*c != '\0')
  178.         writec (*c++);
  179.     getout ();
  180. }
  181.