home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / unc.lzh / UNC / robj.c < prev    next >
Text File  |  1991-07-01  |  4KB  |  159 lines

  1. /*
  2.  *   Read object file
  3.  *
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "a.out.h"
  8. #include "unc.h"
  9.  
  10. void   gette(), getde(), setde(), putte(), putde();
  11. long   gettw(), getdw();
  12. void   reallst(), lclash(), nomem(), unimpl();
  13. void   addit();
  14. char   *malloc();
  15. long   lseek();
  16.  
  17. int   par_entry, par_round, nmods, donedrel, donebrel;
  18. struct   commit   abstab, comtab, dreltab;
  19. long   trelpos, drelpos, brelpos;
  20.  
  21.  
  22. symbol   lookup(), inventsymb(), getnsymb();
  23.  
  24. #define   DBSIZE   100
  25. #define   STINIT   20
  26.  
  27. /*
  28.  *   Read psect.  Return ISFEHLER if not ok.
  29.  */
  30.  
  31. int   rtext(inf, outf)
  32. int   inf;      /*  input pathno */
  33. ef_fid   outf;      /*  Output file descriptor  */
  34. {
  35.    t_entry      tstr;
  36.    register  long   size;
  37.    register  int   i, l;
  38.    unsigned  short   inbuf[DBSIZE/2];
  39.  
  40.    /*
  41.     *   Initialise fields in structure.
  42.     */
  43.    
  44.    tstr.t_type = T_UNKNOWN;
  45.    tstr.t_vins = 1;      /*  For the moment  */
  46.    tstr.t_bdest = 0;
  47.    tstr.t_gbdest = 0;
  48.    tstr.t_lng = 1;
  49.    tstr.t_amap = 0;
  50.    tstr.t_dref = 0;
  51.    tstr.t_relsymb = NULL;
  52.    tstr.t_lab = NULL;
  53.    tstr.t_refhi = 0;
  54.    tstr.t_reflo = 0x7fffffff;
  55.    
  56.    /*   Read module header: */
  57.    (void) lseek(inf, 0, 0);
  58.    if  (read(inf, (char *)&hdr, sizeof(hdr)) != sizeof(hdr))
  59.       clean(_errmsg(errno, "Can't read input file"));
  60.    if  (hdr.fmagic != FMAGIC || ropt != 0)
  61.    {
  62.       if (hdr.fmagic != FMAGIC)
  63.          fprintf(stderr, "No module header found.. raw mode selected\n");
  64.       ismodule = 0;
  65.       a6offset=0;
  66.       hdr._mh._msize=_gs_size(inf);
  67.       hdr._mh._mname=hdr._mh._medit=0;
  68.       hdr._mh._maccess=0x555;
  69.       hdr._mh._mtylan=0x101;
  70.       hdr._mh._mattrev=0x8001;
  71.       hdr._mexec=hdr._mexcpt=0;
  72.       hdr._mdata=0x1000;
  73.       hdr._midata=0;
  74.       hdr._midref=0;
  75.       endp = hdr._mh._msize;
  76.    }
  77.    else
  78.    {
  79.       ismodule = 1;
  80.       a6offset = hdr._mh._mtylan & 0x200 != 0 ? 0x8000 : 0;
  81.       endp = hdr._midata != 0 ? hdr._midata : hdr._mh._msize;
  82.    }
  83.    (void) lseek(inf, hdr._mexec, 0);
  84.    size = endp - hdr._mexec;
  85.    
  86.    while  (size > 1)  {
  87.       l = size > DBSIZE? DBSIZE: size;
  88.       if  (read(inf, (char *)inbuf, l) != l)
  89.          return (ISFEHLER);
  90.       l /= 2;
  91.       for  (i = 0;  i < l;  i++)  {
  92.          tstr.t_contents = inbuf[i];
  93.          (void) write(outf->ef_t, (char *)&tstr, sizeof(tstr));
  94.       }
  95.       size -= l + l;
  96.    }
  97.    
  98.    /*
  99.     *   Extra one to cope with "etext".
  100.     */
  101.    (void) write(outf->ef_t, (char *)&tstr, sizeof(tstr));
  102.    
  103.    return (ISOK);
  104. }
  105.  
  106. /*
  107.  *   Same sort of thing for the data segment.
  108.  */
  109.  
  110. int   rdata(inf, outf)
  111. int inf;
  112. ef_fid   outf;      /*  Output file descriptor  */
  113. {
  114.    d_entry      dstr;
  115.    register  long   size;
  116.    unsigned long addr, len;
  117.  
  118.    /*
  119.     *   Initialise fields in structure.
  120.     */
  121.    
  122.    dstr.d_type = D_BYTE;
  123.    dstr.d_reloc = R_NONE;
  124.    dstr.d_lng = 1;
  125.    dstr.d_relsymb = NULL;
  126.    dstr.d_reldisp = 0;
  127.    dstr.d_lab = NULL;
  128.    dstr.d_initialized = 0;   
  129.    
  130.    for(size = 0; size < hdr._mdata; size++)
  131.    {
  132.          (void) write(outf->ef_d, (char *)&dstr, sizeof(dstr));
  133.    }
  134.    if (hdr._midata == 0)
  135.       return(ISOK);
  136.    (void) lseek(inf, hdr._midata, 0);
  137.    if (hdr._mdata != 0 && hdr._midata != 0)
  138.    while (1)
  139.    {
  140.       if (read(inf, (char *) &addr, sizeof(addr)) != sizeof(addr))
  141.             clean(_errmsg(errno, "Can't read input file"));
  142.       if (read(inf, (char *) &len, sizeof(len)) != sizeof(len))
  143.             clean(_errmsg(errno, "Can't read input file"));
  144.       if (addr == 0 || len == 0)
  145.          break;
  146.       addr += a6offset;   
  147.       while(len--)
  148.       {
  149.          getde(addr, &dstr);
  150.          if (read(inf, (char *) &dstr.d_contents, 1) != 1)
  151.                clean(_errmsg(errno, "Can't read input file"));
  152.          dstr.d_initialized = 1;
  153.          putde(addr++, &dstr);
  154.       }
  155.    }
  156.    return(ISOK);
  157. }
  158.  
  159.