home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OBJASM.ZIP / ORLEDATA.C < prev    next >
C/C++ Source or Header  |  1990-11-02  |  3KB  |  88 lines

  1. #include <stdio.h>
  2. #include "o.h"
  3.  
  4. extern int seg_compare( SEG_T *, SEG_T * );
  5.  
  6. int dat_compare( DAT_T *, DAT_T * );
  7.  
  8. int data_seg_idx;
  9. unsigned long data_offset;
  10.  
  11. int dat_compare( rec_1, rec_2 )
  12.     DAT_T  *rec_1;
  13.     DAT_T  *rec_2;
  14. {
  15.     if ( rec_1->seg_idx > rec_2->seg_idx ) {
  16.         return( LEFT );
  17.     } else {
  18.         if ( rec_1->seg_idx < rec_2->seg_idx ) {
  19.             return( RIGHT );
  20.         } else {
  21.             if ( rec_1->offset > rec_2->offset ) {
  22.                 return( LEFT );
  23.             } else {
  24.                 if ( rec_1->offset < rec_2->offset ) {
  25.                     return( RIGHT );
  26.                 } else {
  27.                     return( EQUAL );
  28.                 }
  29.             }
  30.         }
  31.     }
  32. }
  33.  
  34. void dat_insert( seg_idx, offset, file_pos, length, extended, type )
  35.     int             seg_idx;
  36.     unsigned long   offset;
  37.     long            file_pos;
  38.     int             length;
  39.     int             extended;
  40.     int             type;
  41. {
  42.     DAT_T           *data_rec;
  43.  
  44.     data_rec = (DAT_T *)o_malloc( sizeof(DAT_T) );
  45.     data_rec->seg_idx   = seg_idx;
  46.     data_rec->offset    = offset;
  47.     data_rec->type      = type;
  48.     data_rec->size      = 1;             /* Default to DB */
  49.     data_rec->file_pos  = file_pos;
  50.     data_rec->length    = length;
  51.     data_rec->extended  = extended;
  52.     data_rec->structure = NULL;
  53.     insert( (char *)data_rec, data_tree, dat_compare );
  54. }
  55.  
  56. void ledata( length, extension )
  57.     unsigned int    length;
  58.     int             extension;
  59. {
  60.     SEG_T           seg_search;
  61.     SEG_T           *seg;
  62.     unsigned long   offset;
  63.     long            position;
  64.  
  65.     position = o_position + length;     /* Position assumed at end of rec */
  66.  
  67.     length -= get_index( &seg_search.index );
  68.     seg = (SEG_T *)find( (char *)&seg_search, segment_tree, seg_compare, NULL );
  69.     if ( seg == NULL ) fmt_error("Undefined segment" );
  70.  
  71.     if ( extension == REGULAR ) {
  72.         offset = (unsigned long)get_word(); /* Spot to begin within segment */
  73.         length -= 2;
  74.     } else {
  75.         offset = get_long();
  76.         length -= 4;
  77.     }
  78.  
  79.     data_seg_idx = seg_search.index;    /* Needed by FIXUPPs */
  80.     data_offset  = offset;              /* Ditto */
  81.  
  82.     position -= length;                 /* Move back remainder of bytes */
  83.     --length;                           /* Ignore checksum in length */
  84.  
  85.     dat_insert( seg_search.index, offset, position, length, 
  86.                                             extension, ENUMERATED );
  87. }
  88.