home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume4 / 68kdisassem / part1 / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  4.1 KB  |  209 lines

  1. /*
  2.  *    SCCS:    @(#)file.c    1.2    11/2/84    14:17:35
  3.  *    Various operations on files.
  4.  *
  5.  ***********************************************************************
  6.  *    This software is copyright of
  7.  *
  8.  *        John M Collins
  9.  *        47 Cedarwood Drive
  10.  *        St Albans
  11.  *        Herts, AL4 0DN
  12.  *        England            +44 727 57267
  13.  *
  14.  *    and is released into the public domain on the following conditions:
  15.  *
  16.  *        1.  No free maintenance will be guaranteed.
  17.  *        2.  Nothing may be based on this software without
  18.  *            acknowledgement, including incorporation of this
  19.  *            notice.
  20.  *
  21.  *    Notwithstanding the above, the author welcomes correspondence and bug
  22.  *    fixes.
  23.  ***********************************************************************
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <a.out.h>
  28. #include "unc.h"
  29.     
  30. long    lseek();
  31. void    unimpl();
  32.  
  33. /*
  34.  *    Validate addr and get text entry corresponding to it from the given
  35.  *    file.
  36.  */
  37.  
  38. void    gette(fid, addr, te)
  39. register  ef_fid  fid;
  40. register  long    addr;
  41. t_entry    *te;
  42. {
  43.     addr -= fid->ef_tbase;
  44.     if  (addr < 0  ||  addr > fid->ef_tsize  || (addr & 1) != 0)  {
  45.         (void) fprintf(stderr, "Invalid text address %lx\n", addr);
  46.         exit(200);
  47.     }
  48.     (void) lseek(fid->ef_t, (long)(addr * sizeof(t_entry)/2), 0);
  49.     if  (read(fid->ef_t, (char *) te, sizeof(t_entry)) != sizeof(t_entry))  {
  50.         (void) fprintf(stderr, "Trouble reading text at %lx\n", addr);
  51.         exit(201);
  52.     }
  53. }
  54.  
  55. /*
  56.  *    Store a text entry.
  57.  */
  58.  
  59. void    putte(fid, addr, te)
  60. register  ef_fid  fid;
  61. register  long    addr;
  62. t_entry    *te;
  63. {
  64.     addr -= fid->ef_tbase;
  65.     if  (addr < 0  ||  addr > fid->ef_tsize  ||  (addr & 1) != 0)  {
  66.         (void) fprintf(stderr, "Invalid text address %lx\n", addr);
  67.         exit(200);
  68.     }
  69.     (void) lseek(fid->ef_t, (long)(addr * sizeof(t_entry)/2), 0);
  70.     (void) write(fid->ef_t, (char *) te, sizeof(t_entry));
  71. }
  72.  
  73. /*
  74.  *    Validate addr and get data entry corresponding to it from the given
  75.  *    file.
  76.  */
  77.  
  78. void    getde(fid, addr, de)
  79. register  ef_fid  fid;
  80. register  long    addr;
  81. d_entry    *de;
  82. {
  83.     if  (addr < fid->ef_dbase  ||  addr > fid->ef_end)  {
  84.         (void) fprintf(stderr, "Invalid data address %lx\n", addr);
  85.         exit(200);
  86.     }
  87.     addr -= fid->ef_dbase;
  88.     (void) lseek(fid->ef_d, (long)(addr * sizeof(d_entry)), 0);
  89.     if  (read(fid->ef_d, (char *) de, sizeof(d_entry)) != sizeof(d_entry))  {
  90.         (void) fprintf(stderr, "Trouble reading data at %lx\n", addr);
  91.         exit(201);
  92.     }
  93. }
  94.  
  95. /*
  96.  *    Store a data entry.
  97.  */
  98.  
  99. void    putde(fid, addr, de)
  100. register  ef_fid  fid;
  101. register  long    addr;
  102. d_entry    *de;
  103. {
  104.     if  (addr < fid->ef_dbase  ||  addr > fid->ef_end)  {
  105.         (void) fprintf(stderr, "Invalid data address %lx\n", addr);
  106.         exit(200);
  107.     }
  108.     addr -= fid->ef_dbase;
  109.     (void) lseek(fid->ef_d, (long)(addr * sizeof(d_entry)), 0);
  110.     (void) write(fid->ef_d, (char *) de, sizeof(d_entry));
  111. }
  112.  
  113. /*
  114.  *    Set type and length of given data entry.
  115.  */
  116.  
  117. void    setde(fid, addr, type, lng)
  118. ef_fid    fid;
  119. long    addr;
  120. unsigned  type;
  121. int    lng;
  122. {
  123.     d_entry    dat;
  124.  
  125.     if  (addr > fid->ef_end)
  126.         return;
  127.     getde(fid, addr, &dat);
  128.     if  (type == D_CONT  &&  dat.d_reloc != R_NONE)  {
  129.         char    obuf[30];
  130.         (void) sprintf(obuf, "overlapped reloc 0x%x", addr);
  131.         unimpl(obuf);
  132.     }
  133.     dat.d_type = type;
  134.     dat.d_lng = lng;
  135.     putde(fid, addr, &dat);
  136. }
  137.     
  138. /*
  139.  *    Get a word of data file, size as requested.
  140.  */
  141.  
  142. long    getdw(fid, pos, size)
  143. register  ef_fid  fid;
  144. long    pos;
  145. int    size;
  146. {
  147.     d_entry    dat;
  148.     register  long    res;
  149.     register  int    i, lt;
  150.     
  151.     getde(fid, pos, &dat);
  152.     
  153.     switch  (size)  {
  154.     case  R_BYTE:
  155.         return    dat.d_contents;
  156.         
  157.     case  R_LONG:
  158.         lt = 4;
  159.         goto  rest;
  160.         
  161.     case  R_WORD:
  162.         lt = 2;
  163.     rest:
  164.         res = dat.d_contents;
  165.         for  (i = 1;  i < lt; i++)  {
  166.             getde(fid, pos+i, &dat);
  167.             res = (res << 8) + dat.d_contents;
  168.         }
  169.         return    res;
  170.         
  171.     default:
  172.         (void) fprintf(stderr, "Data word size error\n");
  173.         exit(20);
  174.     }
  175.     /*NOTREACHED*/
  176. }
  177.  
  178. /*
  179.  *    Get a word of text file.
  180.  */
  181.  
  182. long    gettw(fid, pos, size)
  183. register  ef_fid  fid;
  184. long    pos;
  185. int    size;
  186. {
  187.     t_entry    tex;
  188.     long    res;
  189.     
  190.     gette(fid, pos, &tex);
  191.     
  192.     switch  (size)  {
  193.     case  R_BYTE:
  194.         return    tex.t_contents >> 8;
  195.         
  196.     case  R_WORD:
  197.         return    tex.t_contents;
  198.         
  199.     case  R_LONG:
  200.         res = tex.t_contents;
  201.         gette(fid, pos+2, &tex);
  202.         return    (res << 16) + tex.t_contents;
  203.     default:
  204.         (void) fprintf(stderr, "Text word size error\n");
  205.         exit(20);
  206.     }
  207.     /*NOTREACHED*/
  208. }
  209.