home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / xsokoban2 / part02 / save.c < prev    next >
C/C++ Source or Header  |  1992-01-13  |  6KB  |  206 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <signal.h>
  5. #if ! defined(vax)
  6. # include <netinet/in.h>
  7. #endif
  8. #include "sokoban.h"
  9.  
  10. extern char    *malloc();
  11. extern FILE    *fopen();
  12.  
  13. extern char    *username;
  14. extern char     map[MAXROW + 1][MAXCOL + 1];
  15. extern short    level, moves, pushes, packets, savepack, rows, cols;
  16. extern POS      ppos;
  17.  
  18. static long     savedbn;
  19. static char    *sfname;
  20. static FILE    *savefile;
  21. static struct stat sfstat;
  22.  
  23. short
  24. savegame()
  25. {
  26.  
  27.     short           ret = 0;
  28.  
  29.     signal(SIGINT, SIG_IGN);
  30.     sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
  31.     sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
  32. #ifdef __MSDOS__
  33.     if ((savefile = fopen(sfname, "wb")) == NULL)
  34.         ret = E_FOPENSAVE;
  35.     else {
  36.         if (fwrite(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
  37.             ret = E_WRITESAVE;
  38.         else if (fwrite(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
  39.             ret = E_WRITESAVE;
  40.         else if (fwrite(&level, 1, 2, savefile) != 2)
  41.             ret = E_WRITESAVE;
  42.         else if (fwrite(&moves, 1, 2, savefile) != 2)
  43.             ret = E_WRITESAVE;
  44.         else if (fwrite(&pushes, 1, 2, savefile) != 2)
  45.             ret = E_WRITESAVE;
  46.         else if (fwrite(&packets, 1, 2, savefile) != 2)
  47.             ret = E_WRITESAVE;
  48.         else if (fwrite(&savepack, 1, 2, savefile) != 2)
  49.             ret = E_WRITESAVE;
  50.         else if (fwrite(&rows, 1, 2, savefile) != 2)
  51.             ret = E_WRITESAVE;
  52.         else if (fwrite(&cols, 1, 2, savefile) != 2)
  53.             ret = E_WRITESAVE;
  54.         else {
  55.             fclose(savefile);
  56.             if (stat(sfname, &sfstat) != 0)
  57.                 ret = E_STATSAVE;
  58.             else if ((savefile = fopen(sfname, "ab")) == NULL)
  59.                 ret = E_FOPENSAVE;
  60.             else {
  61.                 if (fwrite(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
  62.                     ret = E_WRITESAVE;
  63. #else
  64.     packets = htons(packets);
  65.     pushes = htons(pushes);
  66.     moves = htons(moves);
  67.     level = htons(level);
  68.     cols = htons(cols);
  69.     savepack = htons(savepack);
  70.     rows = htons(rows);
  71.     ppos.x = htons(ppos.x);
  72.     ppos.y = htons(ppos.y);
  73.     if ((savefile = fopen(sfname, "w")) == NULL)
  74.         ret = E_FOPENSAVE;
  75.     else {
  76.         savedbn = fileno(savefile);
  77.         if (write(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
  78.             ret = E_WRITESAVE;
  79.         else if (write(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
  80.             ret = E_WRITESAVE;
  81.         else if (write(savedbn, &level, 2) != 2)
  82.             ret = E_WRITESAVE;
  83.         else if (write(savedbn, &moves, 2) != 2)
  84.             ret = E_WRITESAVE;
  85.         else if (write(savedbn, &pushes, 2) != 2)
  86.             ret = E_WRITESAVE;
  87.         else if (write(savedbn, &packets, 2) != 2)
  88.             ret = E_WRITESAVE;
  89.         else if (write(savedbn, &savepack, 2) != 2)
  90.             ret = E_WRITESAVE;
  91.         else if (write(savedbn, &rows, 2) != 2)
  92.             ret = E_WRITESAVE;
  93.         else if (write(savedbn, &cols, 2) != 2)
  94.             ret = E_WRITESAVE;
  95.         else
  96.             fclose(savefile);
  97.         if (stat(sfname, &sfstat) != 0)
  98.             ret = E_STATSAVE;
  99.         else if ((savefile = fopen(sfname, "a")) == NULL)
  100.             ret = E_FOPENSAVE;
  101.         else if (write(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
  102.             ret = E_WRITESAVE;
  103. #endif
  104.         fclose(savefile);
  105.     }
  106. #ifndef __MSDOS__
  107.     ppos.x = ntohs(ppos.x);
  108.     ppos.y = ntohs(ppos.y);
  109.     pushes = ntohs(pushes);
  110.     moves = ntohs(moves);
  111.     level = ntohs(level);
  112.     packets = ntohs(packets);
  113.     cols = ntohs(cols);
  114.     rows = ntohs(rows);
  115.     savepack = ntohs(savepack);
  116. #endif
  117.  
  118.     if ((ret == E_WRITESAVE) || (ret == E_STATSAVE))
  119.         unlink(sfname);
  120.     signal(SIGINT, SIG_DFL);
  121.  
  122.     return (ret);
  123. }
  124.  
  125. short
  126. restoregame()
  127. {
  128.  
  129.     short           ret = 0;
  130.     struct stat     oldsfstat;
  131.  
  132.     signal(SIGINT, SIG_IGN);
  133.     sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
  134.     sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
  135. #ifdef __MSDOS__
  136.     if (stat(sfname, &oldsfstat) < -1)
  137.         ret = E_NOSAVEFILE;
  138.     else {
  139.         if ((savefile = fopen(sfname, "rb")) == NULL)
  140.             ret = E_FOPENSAVE;
  141.         else {
  142.             if (fread(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
  143.                 ret = E_READSAVE;
  144.             else if (fread(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
  145.                 ret = E_READSAVE;
  146.             else if (fread(&level, 1, 2, savefile) != 2)
  147.                 ret = E_READSAVE;
  148.             else if (fread(&moves, 1, 2, savefile) != 2)
  149.                 ret = E_READSAVE;
  150.             else if (fread(&pushes, 1, 2, savefile) != 2)
  151.                 ret = E_READSAVE;
  152.             else if (fread(&packets, 1, 2, savefile) != 2)
  153.                 ret = E_READSAVE;
  154.             else if (fread(&savepack, 1, 2, savefile) != 2)
  155.                 ret = E_READSAVE;
  156.             else if (fread(&rows, 1, 2, savefile) != 2)
  157.                 ret = E_READSAVE;
  158.             else if (fread(&cols, 1, 2, savefile) != 2)
  159.                 ret = E_READSAVE;
  160.             else if (fread(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
  161. #else
  162.     if (stat(sfname, &oldsfstat) < -1)
  163.         ret = E_NOSAVEFILE;
  164.     else {
  165.         if ((savefile = fopen(sfname, "r")) == NULL)
  166.             ret = E_FOPENSAVE;
  167.         else {
  168.             savedbn = fileno(savefile);
  169.             if (read(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
  170.                 ret = E_READSAVE;
  171.             else if (read(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
  172.                 ret = E_READSAVE;
  173.             else if (read(savedbn, &level, 2) != 2)
  174.                 ret = E_READSAVE;
  175.             else if (read(savedbn, &moves, 2) != 2)
  176.                 ret = E_READSAVE;
  177.             else if (read(savedbn, &pushes, 2) != 2)
  178.                 ret = E_READSAVE;
  179.             else if (read(savedbn, &packets, 2) != 2)
  180.                 ret = E_READSAVE;
  181.             else if (read(savedbn, &savepack, 2) != 2)
  182.                 ret = E_READSAVE;
  183.             else if (read(savedbn, &rows, 2) != 2)
  184.                 ret = E_READSAVE;
  185.             else if (read(savedbn, &cols, 2) != 2)
  186.                 ret = E_READSAVE;
  187.             else if (read(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
  188. #endif
  189.                 ret = E_READSAVE;
  190.         }
  191.         ppos.x = ntohs(ppos.x);
  192.         ppos.y = ntohs(ppos.y);
  193.         level = ntohs(level);
  194.         moves = ntohs(moves);
  195.         pushes = ntohs(pushes);
  196.         packets = ntohs(packets);
  197.         savepack = ntohs(savepack);
  198.         rows = ntohs(rows);
  199.         cols = ntohs(cols);
  200.  
  201.         unlink(sfname);
  202.     }
  203.     signal(SIGINT, SIG_DFL);
  204.     return (ret);
  205. }
  206.