home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / utility / unittool / turbo5 / intrfac5 / hash.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-12-06  |  3.3 KB  |  127 lines

  1. unit hash;
  2.  
  3. interface
  4.  
  5.   uses util,globals;
  6.  
  7.   procedure build_list(var obj_list:list_ptr;
  8.                          buffer:byte_array_ptr;
  9.                          hash_table:hash_ptr);
  10.  
  11.   procedure add_unit(obj:obj_ptr; info:unit_ptr);
  12.   function  get_unit(unit_ofs:word):unit_list_ptr;
  13.  
  14. implementation
  15.  
  16.   procedure build_list(var obj_list:list_ptr;
  17.                          buffer:byte_array_ptr;
  18.                          hash_table:hash_ptr);
  19.   var
  20.     i,j,t:word;
  21.     current,new_entry : list_ptr;
  22.     obj : obj_ptr;
  23.   begin
  24.     new(obj_list);
  25.     with obj_list^ do
  26.     begin
  27.       offset := $ffff;     { set up a sentinel record }
  28.       next := nil;
  29.     end;
  30.  
  31.     with hash_table^ do
  32.       for i := 0 to byte_len div 2 do
  33.         if table[i] <> 0 then
  34.         begin
  35.           t := table[i];
  36.           repeat
  37.             current := obj_list;
  38.             while t > current^.offset do
  39.               current := current^.next;
  40.             new(new_entry);
  41.             new_entry^ := current^;
  42.             current^.offset := t;
  43.             current^.hash := i;
  44.             current^.next := new_entry;
  45.              obj := add_offset(buffer,t);
  46.              { get the next object... }
  47.             t := obj^.next_obj;
  48.           until t = 0;
  49.         end;
  50.   end;
  51.  
  52.   const
  53.     num_known : word = 0;
  54.  
  55.   procedure add_unit(obj:obj_ptr; info:unit_ptr);
  56.   var
  57.     i,size,total:word;
  58.     header:^header_rec;
  59.     unit_obj:obj_ptr;
  60.  
  61.   procedure load_buffer;
  62.   begin
  63.     with unit_list[i]^ do
  64.     begin
  65.       size := read_file(obj^.name+'.tpu',pointer(buffer));
  66.       if buffer <> nil then
  67.         exit;
  68.       size := read_file(uses_path+obj^.name+'.tpu',pointer(buffer));
  69.       if buffer <> nil then
  70.         exit;
  71.       if got_tpl then
  72.       begin
  73.         header := pointer(tpl_buffer);
  74.         total := 0;
  75.         repeat
  76.           unit_obj := add_offset(header,header^.ofs_this_unit);
  77.           if unit_obj^.name = obj^.name then
  78.           begin
  79.             buffer := pointer(header);
  80.             exit;
  81.           end;
  82.           size := roundup(header^.sym_size,16)
  83.                  +roundup(header^.code_size,16)
  84.                  +roundup(header^.reloc_size,16)
  85.                  +roundup(header^.const_size,16);
  86.           total := total+size;
  87.           header := add_offset(header,size);
  88.         until total >= tpl_size + 16;
  89.       end;
  90.       writeln('Warning:  Can''t find unit ',obj^.name);
  91.     end;
  92.   end;
  93.  
  94.   begin
  95.     for i:=1 to num_known do
  96.       if unit_list[i]^.name = obj^.name then
  97.         exit;
  98.  
  99.     inc(num_known);
  100.     i := num_known;
  101.     if info^.target <> 0 then
  102.       writeln('Warning!!  unit ',obj^.name,' has non-zero target=',info^.target);
  103.     info^.target := i;    {  Save our ID there, so references can find the information  }
  104.     new(unit_list[i]);
  105.     with unit_list[i]^ do
  106.     begin
  107.       name := obj^.name;
  108.       obj_list := nil;
  109.       if i > 1 then
  110.         load_buffer
  111.       else
  112.         buffer := globals.buffer;
  113.       if buffer <> nil then
  114.       begin
  115.         own_record := header_ptr(buffer)^.ofs_this_unit;
  116.         inc(own_record,
  117.             4+length(obj_rec(add_offset(buffer,own_record)^).name));
  118.       end;
  119.     end;
  120.   end;
  121.  
  122.   function get_unit(unit_ofs:word):unit_list_ptr;
  123.   begin
  124.     get_unit := unit_list[word(add_offset(buffer,unit_ofs)^)];
  125.   end;
  126.  
  127. end.