diff options
Diffstat (limited to 'rdoff/ldsegs.h')
-rw-r--r-- | rdoff/ldsegs.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/rdoff/ldsegs.h b/rdoff/ldsegs.h new file mode 100644 index 0000000..fcecdf6 --- /dev/null +++ b/rdoff/ldsegs.h @@ -0,0 +1,60 @@ +/* + * ldsegs.h Data for 'ldrdf' to determine what to do with different + * types of segment. This may be useful in other contexts also. + */ + +#ifndef RDOFF_LDSEGS_H +#define RDOFF_LDSEGS_H 1 + +#include <inttypes.h> + +struct segconfig { + uint16_t typelow, typehi; /* range of seg nos for which this is valid */ + char *typedesc; /* a description of the segment type */ + uint16_t dowhat; /* one of the SEG_xxxx values below */ + uint16_t mergetype; /* if SEG_MERGE what type segment do we merge + with? + 0 -> same type of segment. This type is also + used with SEG_NEWSEG. */ +}; + +#define SEG_IGNORE 0 +#define SEG_NEWSEG 1 +#define SEG_MERGE 2 + +#define SEGCONFIGMAX 11 + +struct segconfig sconft[SEGCONFIGMAX] = { + {0x0000, 0x0000, "NULL segment", 0, 0}, + {0x0001, 0x0001, "text", 2, 0}, + {0x0002, 0x0002, "data", 2, 0}, + {0x0003, 0x0003, "comment(ignored)", 0, 0}, + {0x0004, 0x0005, "comment(kept)", 2, 0}, + {0x0006, 0x0007, "debug information", 2, 0}, + {0x0008, 0x001F, "reserved(general extensions)", 1, 0}, + {0x0020, 0x0FFF, "reserved(MOSCOW)", 1, 0}, + {0x1000, 0x7FFF, "reserved(system dependant)", 1, 0}, + {0x8000, 0xFFFE, "reserved(other)", 1, 0}, + {0xFFFF, 0xFFFF, "invalid segment", 0, 0} +}; + +#define getsegconfig(target,number) \ + { \ + int _i; \ + int _t = number; \ + for (_i = 0; _i < SEGCONFIGMAX; _i++) \ + if (_t >= sconft[_i].typelow && _t <= sconft[_i].typehi) \ + { \ + target = sconft[_i]; \ + if (target.mergetype == 0) target.mergetype = _t; \ + break; \ + } \ + if (_i == SEGCONFIGMAX) \ + { \ + fprintf(stderr, "PANIC: can't find segment %04X in segconfig\n",\ + _t); \ + exit(1); \ + } \ + } + +#endif |