home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 286_01 / blkldsv.c < prev    next >
Text File  |  1989-05-25  |  4KB  |  133 lines

  1. #include <stdio.h>
  2. #include <gds.h>
  3. #include <prtfont.h>
  4. #include <fcntl.h>
  5. #include <sys\types.h>
  6. #include <io.h>
  7. #include <sys\stat.h>
  8.  
  9. #define ERROR (-1)
  10. #define OK 0
  11. #define VOIDBLOCK 1
  12.  
  13. int far *phyaddr();
  14.  
  15. /*==============================================================*
  16.  *  This file contains the following routines:                  *
  17.  *                                                              *
  18.  *==============================================================*/
  19.  
  20. BlockSave(sx,sy,filename,length,height)
  21. int sx,sy,length,height;
  22. char *filename;
  23. {
  24.     int ret, far *sptr, byte_len, outfile, cfrmsave;
  25.  
  26.     if ((length<=0) || (height <= 0)) return; /* height must be positive */
  27.     sx += ORGX;              /* get absolute position */
  28.     sy += ORGY;
  29.  
  30.     if (blockclip(&sx,&sy,&length,&height) == VOIDBLOCK) {
  31.         return;
  32.     }
  33.  
  34.     if ((outfile=open(filename,O_CREAT | O_BINARY| O_TRUNC | O_WRONLY,
  35.                         S_IREAD | S_IWRITE)) == ERROR) {
  36.         graderror(2,4);
  37.         return;
  38.     }
  39.  
  40.     byte_len=(((sx & 0x000f) + length + 15) >> 4) << 1; 
  41.     ret=((0x20 + (sx & 0x0f)) << 8) + 101; 
  42.     write(outfile, (char *) &ret, 2);
  43.     write(outfile, (char *) &length, 2);
  44.     write(outfile, (char *) &height, 2);
  45.     write(outfile, (char *) &byte_len, 2);
  46.     ret=CUR_PLOT; 
  47.     cfrmsave=CUR_FRAME;
  48.     writetype();
  49.     do { 
  50.         sptr=phyaddr(sx,sy++);
  51.         CUR_FRAME=0;    /* force it to use physical address */
  52.         hlcopy(sptr,(int far *) CFBUF,sx,length);
  53.         CUR_FRAME=cfrmsave;
  54.         if (write(outfile,CFBUF,byte_len) < byte_len) {
  55.             close(outfile);
  56.             PlotType(ret);
  57.             graderror(2,4);
  58.             return;
  59.         }
  60.     } while (--height);
  61.     PlotType(ret); 
  62.     if (close(outfile)==ERROR) { 
  63.         graderror(2,4);
  64.         return;
  65.     }
  66.  
  67. BlockLoad(dx,dy, filename)
  68. int dx,dy;
  69. char *filename;
  70. {
  71.     int ret, far *dptr, byte_len, infile, sx, length, height, cfrmsave;
  72.     int right, down;
  73.  
  74.     dx += ORGX;              /* get absolute position */
  75.     dy += ORGY;
  76.  
  77.     if ((infile=open(filename,O_RDONLY | O_BINARY)) == ERROR) {
  78.         graderror(2,6,filename);
  79.         return(ERROR);
  80.     }
  81.  
  82.     read(infile, (char *) &ret, 2);
  83.     if ((ret & 0xff) != 101) {
  84.         close(infile);
  85.         graderror(2,5,filename);
  86.         return(ERROR);
  87.     }
  88.     read(infile, (char *) &length, 2);
  89.     read(infile, (char *) &height, 2);
  90.     ret >>= 8;
  91.     sx=ret & 0x0f;
  92.     ret >>= 4;
  93.     if ((ret=(ret<<2)-6) < 0) {
  94.         close(infile);
  95.         graderror(2,5,filename);
  96.         return(ERROR);
  97.     }
  98.     if (ret) {
  99.         read(infile, CFBUF, ret);
  100.     }
  101.     byte_len=((sx + length + 15) >> 4) << 1;
  102.     dx = (dx & 0xfff0) | sx;
  103.     right=dx;
  104.     down=dy;
  105.     if (blockclip(&dx,&dy,&length,&height) == VOIDBLOCK) {
  106.         close(infile);
  107.         return(OK);
  108.     }
  109.  
  110.     right=dx-right;
  111.     down=dy-down;
  112.     sx+=right;
  113.     right=(sx >> 3) & 0xfffe;
  114.     sx &= 0x0f;
  115.     cfrmsave=CUR_FRAME;
  116.     do { 
  117.         if (read(infile, CFBUF, byte_len) < byte_len) {
  118.             close(infile);
  119.             graderror(2,5,filename);
  120.         }
  121.         if (down-- > 0) continue;
  122.         dptr=phyaddr(dx,dy++);
  123.         CUR_FRAME=0;
  124.         hlcopy((int far *) (CFBUF+right), dptr, sx, length);
  125.         CUR_FRAME=cfrmsave;
  126.         height--;
  127.     } while (height);
  128.     close(infile);
  129.     return(OK);
  130. }
  131.  
  132.