home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / nasm20b / nasm_src / lload.c < prev    next >
C/C++ Source or Header  |  1993-01-19  |  6KB  |  230 lines

  1. /* ---------------------------------------------------------------------- */
  2. /*                   Copyright (C) 1991 by Natürlich!                     */
  3. /*                      This file is copyrighted!                         */
  4. /*                Refer to the documentation for details.                 */
  5. /* ---------------------------------------------------------------------- */
  6. #define LINKER 1
  7. #include <stdio.h>
  8. #include "defines.h"
  9. #include OSBIND
  10. #include "nasm.h"
  11. #include "debug.h"
  12. #include "ldebug.h"
  13. #include NMALLOC_H
  14. #include "labels.h"
  15. #include "object.h"
  16. #include "code.h"
  17. #include "lib.h"
  18.  
  19.  
  20. #if VERSION
  21. # define the_10seek( x, y)
  22. #endif
  23.  
  24. extern label huge *h_global[SEP];
  25. extern char huge  *space, huge *old_p_space, huge *p_space;
  26. extern char       trc_loss[], header[];
  27. extern int        version;
  28. extern word       diff, head_off, endpc;
  29. extern lword      magic, __lx;
  30. extern obj_h      l;
  31. extern lword      bytes;
  32.  
  33. #if ! VERSION
  34. static int        revision;
  35. #endif
  36. extern void       fix_lversion(), fix_lsizes();
  37. #if BIGENDIAN
  38. extern void       flip_libstructs();
  39. #endif
  40.  
  41. static g_table huge  *globals;
  42. static f_table huge  *files;
  43. word                 gindex, findex;
  44. static lword         gbytes, fbytes, cbytes;
  45. static lword         gsize, fsize;
  46.  
  47. #if ! VERSION
  48. extern char       x1[], x2[], x3[], x4[], x5[], x6[];
  49. static char       y1[] = " _GLOBALS ",
  50.                   y2[] = " _F_INDEX ",
  51.                   y3[] = " _OBJFILE ";
  52. #endif
  53.  
  54.  
  55. check_name( name)
  56. register char  *name;
  57. {
  58.    register char  *s;
  59.    register int   i = gindex, j;
  60.  
  61.    while( i--)
  62.    {
  63.       s = globals[i].name;
  64.       j = 0;
  65.       while( name[j] && *s++ == name[j] && ++j < SIGNIFICANT);
  66.       if( ! (name[j] || *s) || j == SIGNIFICANT)
  67.          return( globals[i].index );
  68.    }
  69.    return( -1);
  70. }
  71.  
  72.  
  73. void  find_undef()
  74. {
  75.    register int         i, r;
  76.    register label huge  *p;
  77.  
  78.    ENTER("find_undef");
  79. restart:
  80.    for( i = 0; i != SEP; i++)
  81.       if( p = h_global[ i])
  82.          do
  83.             if( p->refs)
  84.                if( (r = check_name( p->name)) != -1)
  85.                {
  86.                   xload( files[ r].seek, (long) files[ r].bytes);
  87.                   goto restart;
  88.                }
  89.          while( p = p->next);
  90.    LEAVE();
  91. }
  92.  
  93.  
  94. static int  fd;
  95. static char *bfile;
  96.  
  97. lload( afile)
  98. char  *afile;                     /* 3 'V's: Van Halen, VfL und Veltins! */
  99. {
  100.    static lib_h   l;
  101.    register char  *x;
  102.    register long  foo;
  103.  
  104.    ENTER("lload");
  105. #if LOWERFILE
  106.    downcase( afile);
  107. #endif
  108.    IMESS( "Trying to open \"%s\" ", (lword) afile, 4);
  109.    if( (fd = (int) Fopen( afile, OPEN_R)) < 0)
  110.    {
  111.       MESS("Open failed");
  112.       x = (char *) nmalloc( strlen( afile) + strlen( header) + 5L);
  113.       strcpy( x, header);
  114.       strcat( x, afile);
  115.       complete( x, ".l65", 1);
  116.       afile = x;
  117.       if( (fd = (int) Fopen( afile, OPEN_R)) < 0)
  118.       {
  119.          if( fd == -35)
  120.             nferror("Out of GEMDOS file handles (that's strange..) ?)");
  121.          nferror("Library file not found");
  122.       }
  123.    }
  124.    bfile = afile;
  125.    INTEGRITY_CHECK();
  126.    if( Fread( fd, sizeof( lib_h), &l) != sizeof( lib_h))
  127.       nferror("File is too short to be a library");
  128.    IMESS("Sizeof( lib_h) = %ld", sizeof( lib_h), 4);
  129.  
  130.    magic    = lbeek( &l.magic);
  131.    version  = dbeek( &l.version);
  132. #if ! VERSION
  133.    revision = dbeek( &l.revision);
  134. #endif
  135.    gbytes   = gsize = lbeek( &l.gbytes);
  136.    fbytes   = fsize = lbeek( &l.xbytes);
  137.    cbytes   = lbeek( &l.cbytes);
  138.  
  139.    if( magic != LIBMAGIC)
  140.       nferror("This is not a library");
  141. #if BIGENDIAN
  142.    if( version < DVERSION)
  143. #else
  144.    if( version < LIB_READ_COMP)
  145. #endif
  146.       nferror("Library was created with an obsolete version");
  147.    if( version > DVERSION)
  148.       nferror("Linker is too oldfashioned for these fancy new libraries");
  149. #if ! VERSION
  150.    if( revision != LIBREVISION)
  151.       nferror("Library was created by a different revision");
  152. #endif
  153.    if( version != DVERSION)
  154.       fix_lsizes( version, &gsize, &fsize);
  155.  
  156.    INTEGRITY_CHECK();
  157.    the_10seek( fd, y1);
  158.    globals = (g_table *) nmalloc( gsize);
  159.    if( (foo = Fread( fd, gbytes, globals)) != gbytes)
  160.       ngferror( foo, trc_loss);
  161.  
  162.    INTEGRITY_CHECK();
  163.    the_10seek( fd, y2);
  164.    files = (f_table *) nmalloc( fsize);
  165.    if( fbytes)
  166.       if( (foo = Fread( fd, fbytes, files)) != fbytes)
  167.          ngferror( foo, trc_loss);
  168.  
  169.    INTEGRITY_CHECK();
  170.    the_10seek( fd, y3);
  171.  
  172.    if( version != DVERSION)
  173.       fix_lversion( version, &gbytes, globals, &fbytes, files);
  174.  
  175.    gindex = (word) (gbytes / sizeof( g_table));
  176.    findex = (word) (fbytes / sizeof( f_table));
  177.  
  178. #if BIGENDIAN
  179.    flip_libstructs( gindex, findex, globals, files);
  180. #endif
  181.    INTEGRITY_CHECK();
  182.    find_undef();
  183.    Fclose( fd);
  184.    nfree( globals);
  185.    nfree( files);
  186.    LEAVE();
  187. }
  188.  
  189. #if VERSION
  190. void xload( seek, bckbytes)
  191. long  seek, bckbytes;
  192. {
  193.    extern int  verbose;
  194.  
  195.    ENTER("xload");
  196.  
  197.    if( Fseek( seek, fd, 1) < 0)
  198.       nferror("Library file corrupted");
  199.    if( verbose)
  200.       printf( "%-16s ", bfile);
  201.    do_load( fd);
  202.    if( Fseek( - (bckbytes + seek), fd, 1) < 0)
  203.       nierror("Seek failure");
  204.    LEAVE();
  205. }
  206.  
  207. #else
  208.  
  209. void xload( seek, bckbytes)
  210. long  seek, bckbytes;
  211. {
  212.    extern int  verbose;
  213.    long        pos;
  214.  
  215.    ENTER("xload");
  216.    pos = Fseek( 0, fd, 1);
  217.    if( Fseek( seek, fd, 1) < 0)
  218.       nferror("Library file corrupted");
  219.    if( verbose)
  220.       printf( "%-16s ", bfile);
  221.    do_load( fd);
  222.    if( Fseek( - (bckbytes + seek), fd, 1) < 0)
  223.       nierror("Seek failure");
  224.    if( Fseek( 0, fd, 1) != pos)
  225.       nferror("The seek just didn't work");
  226.    LEAVE();
  227. }
  228.  
  229. #endif
  230.