home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / a2ixlibrary-1.0-bin.lha / share / a2ixlibrary / setvars.c < prev    next >
C/C++ Source or Header  |  1996-10-12  |  2KB  |  100 lines

  1. void *ixemulbase;
  2. int *ixemul_errno;
  3. char *_ctype_;
  4. void **__sF;
  5.  
  6. typedef unsigned long ulong;
  7.  
  8. extern void  __link_data_hashes();
  9. extern ulong __link_data_offsets[];
  10. extern void  __link_text_hashes();
  11. extern void  __link_text_offsets();
  12.  
  13. static int relocate(char *base, ulong *f, ulong *hashes, ulong *offsets)
  14. {
  15.   int cnt = (f ? *f++ : 0), ind = 0, i;
  16.  
  17.   while (cnt--)
  18.   {
  19.     ulong hash = *f++;
  20.     short relocs = *((short *)f)++;
  21.  
  22.     while (offsets[ind] != -1 && hashes[ind] != hash)
  23.       ind++;
  24.  
  25.     if (offsets[ind] == -1)
  26.       return 0;
  27.     i = relocs;
  28.     if (*((long *)(base + f[0])) == offsets[ind] + f[relocs])
  29.       return 1;
  30.     while (i--)
  31.     {
  32.       *((long *)(base + f[0])) = offsets[ind] + f[relocs];
  33.       f++;
  34.     }
  35.     f += relocs;
  36.     ind++;
  37.   }
  38.   return 1;
  39. }
  40.  
  41. int __LibSetVarsInstance(char *stext, ulong *tf, ulong *td,
  42.              char *sdata, ulong *df, ulong *dd,
  43.              ulong *libdata, int argc, void *ixbase,
  44.              int *errnoptr, char *ctype, void **sf)
  45. {
  46.   int cnt;
  47.   int ind = 0;
  48.   ulong *hashes, *offsets;
  49.  
  50.   switch (argc)
  51.   {
  52.     default:
  53.     case 4:
  54.       if (sf) __sF = sf;
  55.     case 3:
  56.       if (ctype) _ctype_ = ctype;
  57.     case 2:
  58.       if (errnoptr) ixemul_errno = errnoptr;
  59.     case 1:
  60.       if (ixbase) ixemulbase = ixbase;
  61.     case 0:
  62.   }
  63.  
  64.   /* ixemulbase *must* be set */
  65.   if (ixemulbase == NULL)
  66.     return 0;
  67.  
  68.   if (!relocate(stext, tf, (ulong *)__link_text_hashes,
  69.                            (ulong *)__link_text_offsets))
  70.     return 0;
  71.  
  72.   if (!relocate(sdata, df, (ulong *)__link_text_hashes,
  73.                            (ulong *)__link_text_offsets))
  74.     return 0;
  75.  
  76.   if (!relocate(stext, td, (ulong *)__link_data_hashes,
  77.                            (ulong *)__link_data_offsets))
  78.     return 0;
  79.  
  80.   if (!relocate(sdata, dd, (ulong *)__link_data_hashes,
  81.                            (ulong *)__link_data_offsets))
  82.     return 0;
  83.  
  84.   hashes = (ulong *)__link_data_hashes;
  85.   offsets = __link_data_offsets;
  86.   cnt = (libdata ? *libdata++ : 0);
  87.   ind = 0;
  88.   while (cnt--)
  89.   {
  90.     ulong hash = *libdata;
  91.     
  92.     while (offsets[ind] != -1 && hashes[ind] != hash)
  93.       ind++;
  94.     if (offsets[ind] == -1)
  95.       return 0;
  96.     *libdata++ = offsets[ind++];
  97.   }
  98.   return 1;
  99. }
  100.