home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / tt / vmem11 / vmem_prg / vm_write.c < prev    next >
C/C++ Source or Header  |  1990-10-03  |  2KB  |  98 lines

  1. #include "vmem.h"
  2.  
  3. /********************************************/
  4. /* Speichern eines Bereiches in eine Datei: */
  5. /********************************************/
  6.  
  7. long vm_write (handle, count, source)
  8.     int        handle;
  9.     V_ADR    source;
  10.     long    count;
  11. {
  12.     BYTE    *page_ptr;
  13.     VPAGE    vmempage;
  14.     WORD    start_offset;
  15.     long    entry_size, fullsize, wsize, size;
  16.  
  17.     vmempage = GET_PAGE (source);
  18.     start_offset = GET_OFFSET (source);
  19.  
  20. #ifdef DEBUG
  21.     printf ("VM_WRITE: page: %x  offset: %x\n", vmempage, start_offset);
  22. #endif
  23.  
  24.     if ((vmempage >= info.count_page) || (flags [vmempage] == FREE))
  25.         return (ILLEGAL_ADDRESS);
  26.  
  27.     if ((count == 0) || (count < -1))
  28.         return (ILLEGAL_COUNT);
  29.  
  30.     entry_size = PAGE_TO_ADDR (MD_COUNT (md_find (vmempage)));
  31.  
  32.     if (count == -1)
  33.         count = entry_size - start_offset;
  34.     else
  35.         entry_size = count = MIN (count, (entry_size - start_offset));
  36.  
  37.     fullsize = 0;
  38.  
  39.     if (start_offset > 0)
  40.     {
  41.         long    size = info.page_size - start_offset;
  42.         
  43.         page_ptr = load_page (vmempage++, CACHE_READ) + start_offset;
  44.         if (count <= size)
  45.             return (Fwrite (handle, count, page_ptr));
  46.         else
  47.         {
  48.             if ((wsize = Fwrite (handle, size, page_ptr)) != size)
  49.                 return (wsize);
  50.             fullsize = wsize;
  51.             entry_size -= wsize;
  52.         }
  53.     }
  54.  
  55.     start_offset = GET_PAGE (entry_size);
  56.  
  57.     if (start_offset > 0)
  58.     {
  59.         WORD    wcount;
  60.  
  61.         cache_clr (0, MIN (start_offset, info.cache_count));
  62.  
  63.         while (start_offset > 0)
  64.         {
  65.             wcount = MIN (start_offset, info.cache_count);
  66.             size = PAGE_TO_ADDR (wcount);
  67.             read_sequence (0, wcount, vmempage);
  68.             if ((wsize = Fwrite (handle, size, cache)) != size)
  69.             {
  70.                 if (wsize < 0)
  71.                     return (wsize);
  72.                 else
  73.                     return (fullsize + wsize);
  74.             }
  75.  
  76.             fullsize += wsize;
  77.             vmempage += wcount;
  78.             start_offset -= wcount;
  79.         }
  80.     }
  81.  
  82.     if ((size = GET_OFFSET (entry_size)) > 0)
  83.     {
  84.         BYTE    *page_ptr;
  85.  
  86.         page_ptr = load_page (vmempage, CACHE_READ);
  87.         if ((wsize = Fwrite (handle, size, page_ptr)) != size)
  88.         {
  89.             if (wsize < 0)
  90.                 return (wsize);
  91.         }
  92.         
  93.         fullsize += wsize;
  94.     }
  95.  
  96.     return (fullsize);
  97. }
  98.