home *** CD-ROM | disk | FTP | other *** search
/ ISV Strong Games / ISV_STRONG_GAMES.iso / desktop / polysaw / !PolySaw / source / c / filing < prev    next >
Text File  |  1992-03-04  |  4KB  |  281 lines

  1. /* herein are functions to read and write PolyBoard files, converting 
  2. between the file format and working data structures */
  3.  
  4. /* 
  5.  
  6. file format:
  7.     list of holes
  8.     list of Poly defns
  9.  
  10.      holes:
  11.        nofholes    (2 bytes)
  12.        (for each hole)
  13.        row, col
  14.  
  15.  
  16.      Poly defns:
  17.          nofpieces
  18.          (for each piece)
  19.               cogx
  20.               cogy
  21.               nofunits
  22.               (for each unit) 
  23.                    x
  24.                    y
  25.       
  26.        notes: 
  27.              all parts are byte size
  28.              all coordinates are in units of HS
  29.              cogx, cogy are in work area coords ( / HS)
  30.              they are unsigned, cogx always >=0, cogy always <=0
  31.              x,y are signed, relative to cogx,cogy for piece.
  32.  
  33.  
  34. */
  35.  
  36. #include "werr.h"
  37. #include "wimp.h"
  38. #include "win.h"
  39. #include "wimpt.h"
  40. #include "xferrecv.h"
  41.  
  42. #include <string.h>
  43. #include <stdlib.h>
  44. #include <stdio.h>
  45.  
  46. #include "polysaw.h"
  47.  
  48.  
  49.  
  50.  
  51. static FILE *outfp;
  52. static FILE *infp;
  53.  
  54.  
  55.  
  56. static void write_out_poly_board(FILE *f);
  57. static void read_in_poly_board(FILE *f);
  58. static void read_in_holes(void);
  59. static void read_in_pieces(void);
  60. static void write_holes(void);
  61. static void write_pieces(void);
  62. static void writechar(int c);
  63. static int  nextchar(void);
  64.  
  65.  
  66.  
  67. BOOL save_poly_board(char *filename, void *handle)
  68. {
  69. FILE *outfp;
  70. os_filestr fileinfo;
  71.  
  72. handle = handle;
  73. strcpy(filepath, filename);
  74.  
  75. outfp = fopen(filename, "w");
  76. if (outfp == 0)
  77.      {
  78.      werr(FALSE, "Can't Save. Silly name? Locked file? Protected Disc?\n");
  79.      return FALSE;
  80.      }
  81.  
  82. write_out_poly_board(outfp);
  83.   
  84. if (fclose(outfp) == 0)
  85.    {
  86.    fileinfo.action = 18;
  87.    fileinfo.name = filename;
  88.    fileinfo.loadaddr = boardfiletype;
  89.    wimpt_noerr(os_file(&fileinfo));  
  90.    win_settitle(board_wh, filepath); 
  91.    return TRUE;
  92.    }
  93. else
  94.     {
  95.     werr(TRUE, "can't close file");
  96.     return FALSE;
  97.     }
  98.  
  99.  
  100.  
  101. void load_file(void)
  102. {
  103. wimp_redrawstr r;
  104. FILE *infp;
  105. char *filename;
  106. int filetype;
  107. int p;
  108.  
  109. filetype = xferrecv_checkinsert(&filename);
  110.  
  111. if (filetype != boardfiletype)
  112.     {
  113.     werr(FALSE, "wrong filetype");
  114.     return;      
  115.     }
  116.  
  117. infp = fopen(filename, "r");
  118. if (infp==0)
  119.   {
  120.   werr(FALSE, "Can't open file");
  121.   return;
  122.   }
  123. read_in_poly_board(infp);
  124. fclose(infp);
  125. strcpy(filepath, filename);
  126. for (p=0; p<nofpieces; p++)
  127.   fill_out_polydefn(p);       
  128.  
  129. xferrecv_insertfileok();
  130.  
  131. r.w = board_wh;
  132. r.box = board_windefn->ex;
  133. wimpt_noerr(wimp_force_redraw(&r));
  134.  
  135. win_settitle(board_wh, filepath);
  136.  
  137. }     
  138.  
  139.  
  140.  
  141.  
  142. void read_in_poly_board(FILE *f)
  143. {
  144. infp = f;
  145. read_in_holes();
  146. read_in_pieces();
  147. }
  148.  
  149. void write_out_poly_board(FILE *f)
  150. {
  151. outfp = f;
  152. write_holes();
  153. write_pieces();
  154. }
  155.  
  156. void write_holes(void)
  157. {
  158. int nofh = 0;
  159. int row, col;
  160.  
  161. for (row=0; row<MAX_BOARD; row++)
  162.   {
  163.   for (col=0; col<MAX_BOARD; col++)
  164.     {
  165.     if (grid[row][col] & HOLE_BIT)
  166.         {
  167.         nofh += 1;
  168.         }
  169.     }
  170.   }
  171.    
  172. writechar(nofh & 255);
  173. writechar(nofh >> 8);
  174.  
  175.  
  176. for (row=0; row<MAX_BOARD; row++)
  177.   {
  178.   for (col=0; col<MAX_BOARD; col++)
  179.     {
  180.     if (grid[row][col] & HOLE_BIT)
  181.         {
  182.         writechar(row);
  183.         writechar(col);
  184.         }
  185.     }
  186.   }
  187.  
  188. }
  189.  
  190.  
  191.  
  192.  
  193. void read_in_holes(void)
  194. {
  195. int nofh, i, row, col;
  196.  
  197. nofh = nextchar();
  198. nofh += 256*nextchar();
  199.  
  200. for (row=0; row < MAX_BOARD; row++)
  201.   {
  202.   for (col=0; col<MAX_BOARD; col++)
  203.     {
  204.     grid[row][col] = 0;
  205.     }
  206.   }
  207.  
  208.  
  209.  
  210. for (i=0; i<nofh; i++)
  211.   {
  212.   row = nextchar();
  213.   col = nextchar();
  214.   grid[row][col] = HOLE_BIT;
  215.   }
  216.  
  217. }
  218.  
  219.  
  220.  
  221.  
  222. void write_pieces(void)
  223. {
  224. int i, p;
  225. writechar(nofpieces);
  226. for (p=0; p<nofpieces; p++)
  227.   {
  228.   writechar(   piece[p].cog.x/HS );
  229.   writechar( -(piece[p].cog.y/HS) );
  230.   writechar( piece[p].nofunits );
  231.   for (i=0; i<piece[p].nofunits; i++)
  232.     {
  233.     writechar( 128 + (piece[p].units[i].x/HS) );
  234.     writechar( 128 + (piece[p].units[i].y/HS) );
  235.     }
  236.   }
  237. }
  238.  
  239.  
  240.  
  241. void read_in_pieces(void)
  242. {
  243. int i, p;
  244.  
  245. nofpieces = nextchar();
  246. for (p=0; p<nofpieces; p++)
  247.   {
  248.   piece[p].cog.x = HS*nextchar();
  249.   piece[p].cog.y = -HS*nextchar();
  250.   piece[p].nofunits = nextchar();
  251.   for (i=0; i<piece[p].nofunits; i++)
  252.     {
  253.     piece[p].units[i].x = HS*( nextchar()-128 );
  254.     piece[p].units[i].y = HS*( nextchar()-128 );
  255.     }
  256.   }
  257. }
  258.  
  259.  
  260. int nextchar(void)
  261. {
  262. int c;
  263. c = fgetc(infp);
  264. if (c == EOF)  werr(FALSE, "failed to read file\n");
  265. return c;
  266. }
  267.  
  268. void writechar(int c)
  269. {
  270. if (fputc(c, outfp) == c) return;
  271.  
  272. werr(FALSE, "failed to write to file");
  273. return;
  274. }
  275.  
  276.  
  277.  
  278.  
  279.  
  280.