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

  1. #include "vmem.h"
  2.  
  3. /************************************************/
  4. /* Speichern einer Datei in den virt. Speicher: */
  5. /************************************************/
  6.  
  7. long vm_read (handle, count, destination)
  8.     int        handle;
  9.     V_ADR    destination;
  10.     long    count;
  11. {
  12.     BYTE    *page_ptr;
  13.     VPAGE    vmempage;
  14.     WORD    start_offset;
  15.     long    entry_size, fullsize, rsize, size;
  16.  
  17.     vmempage = GET_PAGE (destination);
  18.     start_offset = GET_OFFSET (destination);
  19.  
  20. #ifdef DEBUG
  21.     printf ("VM_READ: 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_WRITE) + start_offset;
  44.         if (count <= size)
  45.             return (Fread (handle, count, page_ptr));
  46.         else
  47.         {
  48.             if ((rsize = Fread (handle, size, page_ptr)) != size)
  49.                 return (rsize);
  50.             fullsize = rsize;
  51.             entry_size -= size;
  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.             if ((rsize = Fread (handle, size, cache)) != size)
  68.             {
  69.                 if (rsize < 0)
  70.                     return (rsize);
  71.                 else
  72.                 {
  73.                     fullsize += rsize;
  74.                     wcount = GET_PAGE (rsize);
  75.                     rsize = GET_OFFSET (rsize);
  76.                     if (wcount > 0)
  77.                         write_sequence (0, wcount, vmempage);
  78.                     vmempage += wcount;
  79.                     if (rsize > 0)
  80.                     {
  81.                         BYTE    *page_ptr;
  82.  
  83.                         memcpy (buffer, CACHE_ADDRESS (wcount), rsize);
  84.                         page_ptr = load_page (vmempage, CACHE_WRITE);
  85.                         memcpy (page_ptr, buffer, rsize);
  86.                     }
  87.  
  88.                     return (fullsize);
  89.                 }
  90.             }
  91.  
  92.             write_sequence (0, wcount, vmempage);
  93.             vmempage += wcount;
  94.             start_offset -= wcount;
  95.             fullsize += rsize;
  96.         }
  97.     }
  98.  
  99.     if ((size = GET_OFFSET (entry_size)) > 0)
  100.     {
  101.         BYTE    *page_ptr;
  102.  
  103.         if ((rsize = Fread (handle, size, buffer)) != size)
  104.         {
  105.             if (rsize < 0)
  106.                 return (rsize);
  107.         }
  108.  
  109.         fullsize += rsize;
  110.         page_ptr = load_page (vmempage, CACHE_WRITE);
  111.         memcpy (page_ptr, buffer, rsize);
  112.     }
  113.  
  114.     return (fullsize);
  115. }
  116.