home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume6 / sokoban / save.c < prev    next >
C/C++ Source or Header  |  1989-01-03  |  3KB  |  98 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <signal.h>
  5. #include "sokoban.h"
  6.  
  7. extern char *username;
  8. extern char map[MAXROW+1][MAXCOL+1];
  9. extern short level, moves, pushes, packets, savepack, rows, cols;
  10. extern POS ppos;
  11.  
  12. long  savedbn;
  13. char *sfname;
  14. FILE *savefile;
  15. struct stat sfstat;
  16.  
  17. short savegame() {
  18.  
  19.    short ret = 0;
  20.  
  21.    signal( SIGINT, SIG_IGN);
  22.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  23.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  24.    if( (savefile = fopen( sfname, "w")) == NULL)
  25.       ret = E_FOPENSAVE;
  26.    else {
  27.       savedbn = fileno( savefile);
  28.       if( write( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  29.      ret = E_WRITESAVE;
  30.       else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  31.      ret = E_WRITESAVE;
  32.       else if( write( savedbn, &level, 2) != 2)    ret = E_WRITESAVE;
  33.       else if( write( savedbn, &moves, 2) != 2)    ret = E_WRITESAVE;
  34.       else if( write( savedbn, &pushes, 2) != 2)   ret = E_WRITESAVE;
  35.       else if( write( savedbn, &packets, 2) != 2)  ret = E_WRITESAVE;
  36.       else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE;
  37.       else if( write( savedbn, &rows, 2) != 2)     ret = E_WRITESAVE;
  38.       else if( write( savedbn, &cols, 2) != 2)     ret = E_WRITESAVE;
  39.       else {
  40.      fclose( savefile);
  41.      if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE;
  42.      else if( (savefile = fopen( sfname, "a")) == NULL)
  43.             ret = E_FOPENSAVE;
  44.          else {
  45.         if( write( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  46.            ret = E_WRITESAVE;
  47.         fclose( savefile);
  48.      }
  49.       }
  50.    }
  51.    if( (ret == E_WRITESAVE) || (ret == E_STATSAVE)) unlink( sfname);
  52.    signal( SIGINT, SIG_DFL);
  53.  
  54.    return( ret);
  55. }
  56.  
  57. short restoregame() {
  58.  
  59.    short ret = 0;
  60.    struct stat oldsfstat;
  61.  
  62.    signal( SIGINT, SIG_IGN);
  63.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  64.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  65.    if( stat( sfname, &oldsfstat) < -1) 
  66.       ret = E_NOSAVEFILE;
  67.    else {
  68.       if( (savefile = fopen( sfname, "r")) == NULL)
  69.      ret = E_FOPENSAVE;
  70.       else {
  71.          savedbn = fileno( savefile);
  72.          if( read( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  73.         ret = E_READSAVE;
  74.          else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  75.         ret = E_READSAVE;
  76.          else if( read( savedbn, &level, 2) != 2)    ret = E_READSAVE;
  77.          else if( read( savedbn, &moves, 2) != 2)    ret = E_READSAVE;
  78.          else if( read( savedbn, &pushes, 2) != 2)   ret = E_READSAVE;
  79.          else if( read( savedbn, &packets, 2) != 2)  ret = E_READSAVE;
  80.          else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE;
  81.          else if( read( savedbn, &rows, 2) != 2)     ret = E_READSAVE;
  82.          else if( read( savedbn, &cols, 2) != 2)     ret = E_READSAVE;
  83.      else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  84.         ret = E_READSAVE;
  85.      else if( (sfstat.st_dev != oldsfstat.st_dev) ||
  86.                   (sfstat.st_ino != oldsfstat.st_ino) ||
  87.                   (sfstat.st_nlink != oldsfstat.st_nlink) ||
  88.                   (sfstat.st_uid != oldsfstat.st_uid) ||
  89.                   (sfstat.st_gid != oldsfstat.st_gid) ||
  90.                   (sfstat.st_mtime != oldsfstat.st_mtime))
  91.             ret = E_ALTERSAVE;
  92.       }
  93.       unlink( sfname);
  94.    }
  95.    signal( SIGINT, SIG_DFL);
  96.    return( ret);
  97. }
  98.