home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OBJASM.ZIP / ORGRPDEF.C < prev    next >
C/C++ Source or Header  |  1990-10-04  |  4KB  |  133 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "o.h"
  4.  
  5. char grp_operands[100] = {0};
  6.  
  7. #define GRP_SI  0xFF            /* Segment Index */
  8. #define GRP_EI  0xFE            /* External Index */
  9. #define GRP_SCO 0xFD            /* Segment/Class/Overlay Indices */
  10. #define GRP_LTL 0xFB            /* Load Time Locatable */
  11. #define GRP_ABS 0xFA            /* Absolute */
  12.  
  13. extern int name_compare( NAME_T *, NAME_T * );
  14. extern int seg_compare( SEG_T *, SEG_T * );
  15.  
  16. int grp_compare( GRP_T *, GRP_T * );
  17. void grp_insert( int );
  18.  
  19. int grp_compare( rec_1, rec_2 )
  20.     GRP_T  *rec_1;
  21.     GRP_T  *rec_2;
  22. {
  23.     if ( rec_1->index > rec_2->index ) {
  24.         return( LEFT );
  25.     } else {
  26.         if ( rec_1->index < rec_2->index ) {
  27.             return( RIGHT );
  28.         } else {
  29.             return( EQUAL );
  30.         }
  31.     }
  32. }
  33.  
  34. void grp_insert( name_idx )
  35.     int     name_idx;
  36. {
  37.     static  group_count = 0;
  38.     GRP_T   *group_rec;
  39.  
  40.     group_count++;
  41.     group_rec = (GRP_T *)o_malloc( sizeof(GRP_T) );
  42.     group_rec->index = group_count;
  43.     group_rec->name = name_idx;
  44.  
  45.     insert( (char *)group_rec, group_tree, grp_compare );
  46. }
  47.  
  48. void grpdef( length )
  49.     unsigned int    length;
  50. {
  51.     NAME_T  name_search;
  52.     NAME_T  *group;
  53.     NAME_T  *segment;
  54.     SEG_T   seg_search;
  55.     SEG_T   *seg;
  56.     int     gcd;
  57.     int     name_idx;
  58.     char    *group_text;
  59.     char    *group_name;
  60.  
  61.     length -= get_index( &name_search.index );
  62.  
  63.     name_idx = name_search.index;
  64.  
  65.     group = (NAME_T *)find( (char *)&name_search, name_tree, name_compare,
  66.                                                                         NULL );
  67.  
  68.     if ( group == NULL ) {
  69.         fmt_error("Undefined name index");
  70.     }
  71.  
  72.     group_text = "GROUP";
  73.     group_name = group->name;
  74.     grp_operands[0] = '\0';
  75.  
  76.     --length;                  /* To account for check sum at bottom */
  77.     while ( length ) {
  78.         --length;
  79.         gcd = get_byte();
  80.         switch( gcd ) {
  81.             case GRP_SI:  
  82.                 length -= get_index( &seg_search.index );
  83.                 seg = (SEG_T *)find( (char *)&seg_search,
  84.                                              segment_tree, seg_compare, NULL );
  85.                 if ( seg == NULL ) fmt_error("Undefined segment" );
  86.                 name_search.index = seg->name;
  87.                 segment = (NAME_T *)find( (char *)&name_search,
  88.                                          name_tree, name_compare, NULL );
  89.                 if ( strlen(grp_operands) + strlen(segment->name) > 50 ) {
  90.                     strcat( grp_operands, "\\" );
  91.                     if ( strcmp(group_name,"FLAT") != 0 ) {
  92.                         out_line( group_name, group_text, grp_operands, "" );
  93.                     }
  94.                     group_name = "";
  95.                     group_text = "";
  96.                     grp_operands[0] = '\0';
  97.                 }
  98.  
  99.                 strcat( grp_operands, segment->name );
  100.                 if ( length ) {
  101.                     strcat( grp_operands, ", " );
  102.                 }
  103.                 break;
  104.           case GRP_EI:
  105.                 fprintf( stderr, "Group Component: GRP_EI (External Index)\n");
  106.                 fmt_error("Un-implemented GROUP operands");
  107.                 break;
  108.           case GRP_SCO:
  109.                 fprintf( stderr, "Group Component: GRP_SCO (Seg/Class/Ovly Index)\n");
  110.                 fmt_error("Un-implemented GROUP operands");
  111.                 break;
  112.           case GRP_LTL:
  113.                 fprintf( stderr, "Group Component: GRP_LTL (LTL data)\n");
  114.                 fmt_error("Un-implemented GROUP operands");
  115.                 break;
  116.           case GRP_ABS:
  117.                 fprintf( stderr, "Group Component: GRP_ABS (Absolute)\n");
  118.                 fmt_error("Un-implemented GROUP operands");
  119.                 break;
  120.           default:
  121.                 fprintf( stderr, "Group Component: %02X (?)\n", gcd );
  122.                 fmt_error("Un-implemented GROUP operands");
  123.                 break;
  124.         }
  125.     }
  126.     if ( strcmp(group_name,"FLAT") != 0 ) {
  127.         out_line( group_name, group_text, grp_operands, "" );
  128.         out_newline();          /* Leave a blank line after Group directive */
  129.     }
  130.  
  131.     grp_insert( name_idx );
  132. }
  133.