home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / nethack-3.1 / sys / amiga / splitter / split.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-10  |  5.6 KB  |  197 lines

  1. /*    SCCS Id: @(#)split.h        3.1   93/01/08
  2. /*    Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993      */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. /*
  6.  * split.h
  7.  * Common definitions for binary file splitting and loading of split files.
  8.  */
  9.  
  10. #define SVER    1    /* Basic file splitting capability */
  11. /*#define SVER    2    /* */
  12. /*#define SVER    3    /* */
  13.  
  14. /* Nothing below this line should need to be modified. */
  15.  
  16. #ifndef SVER
  17.  __SPLIT_H__SVER_MUST_BE_DEFINED
  18. #endif
  19.  
  20. #if SVER >= 2
  21.     /* enable options */
  22. #endif
  23.  
  24. /* internal structures, etc */
  25.  
  26. #include <exec/types.h>
  27. #include <exec/lists.h>
  28. #include <proto/exec.h>
  29. /*#include "ldextern.h"*/
  30.  
  31.         /* one for each file we need something from */
  32. struct file_ {
  33.     struct MinNode    node;        /* linkage */
  34.     struct List    punits;        /* program units we need */
  35.     int        fd;        /* fd (-1 if not open) */
  36.     char *        name;        /* open(2)'able name */
  37. };
  38. typedef struct file_ file;
  39.  
  40.         /* one for each program unit we need to load */
  41. struct punit_ {
  42.     struct MinNode    node;        /* linkage */
  43.     int        libsize;    /* 0 if normal, libsize if library */
  44.     struct block_ *    unit_header;
  45.     struct List    hunks;        /* hunks in this program unit */
  46. };
  47. typedef struct punit_ punit;
  48.  
  49.         /* one for each hunk we need to load */
  50. struct hunk_ {
  51.     struct MinNode    node;        /* linkage */
  52.     struct List    reloc;        /* reloc8,16,32 */
  53.     struct List    dreloc;        /* drelec8,16,32 */
  54.     struct block_ *    rb;        /* ONE relocatable block */
  55.     struct block_ *    name;        /* max ONE name */
  56.     struct List    extsym;        /* external symbol entries */
  57.     struct punit_ * punit;        /* back pointer */
  58.     struct hunk_  * merge;        /* 0 if lone or last section, else next
  59.                      * part in this (merged by name) hunk */
  60.     struct hunk_  * jmptab;        /* alv's live here, if any do. If so,
  61.                      * it's at the end of the chain */
  62.     int    hunkstart:1;    /* lone hunk or start of a chain */
  63.     int    hunkchain:1;    /* allocated to a chain */
  64.     int    hunkgone:1;    /* hunk has been written */
  65.     long    overlay;    /* 0 if root node */
  66.     long     hunknum;    /* in output file */
  67.     long    hunkoffset;    /* 0 unless not at start of chain */
  68. };
  69. typedef struct hunk_ hunk;
  70. #define UNASSIGNED_HUNK    0x7ffffff0
  71.  
  72. struct block_ {
  73.     struct MinNode    node;    /* linkage */
  74.     struct swap_ *sw;    /* if !0, where to reload from disk */
  75.     int id;            /* if used */
  76.     long *b;        /* if !0, block of raw data (else swapped) */
  77.                 /* (this should be replaced with a union) */
  78. };
  79. typedef struct block_ block;
  80.  
  81.         /* This is used to keep memory usage down.  We don't read in
  82.          * the actual data until we are writing the output file. */
  83. struct swap_ {
  84.     file *f;
  85.     long pos;
  86.     long len;            /* in longs */
  87. };
  88. typedef struct swap_ swap;
  89.  
  90.         /* When we need a list of lists. */
  91. struct listlist_ {
  92.     struct MinNode    node;        /* linkage */
  93.     int         id;
  94.     struct List    list;
  95. };
  96. typedef struct listlist_ listlist;
  97.  
  98. typedef char flag;            /* TRUE or FALSE only */
  99.  
  100. /* tracing system */
  101. #define MAXTRACEVAR    7
  102. extern char trace[MAXTRACEVAR];
  103. #define LIST        if(trace[0])        /* -t0=1 */
  104. #define HASHSTAT    if(trace[1])        /* -t1=1 */
  105. #define HASHTBL        if(trace[1]>1)        /* -t1=2 */
  106. #define NAME        if(trace[2])        /* -t2=1 */
  107. #define OUT        if(trace[3])        /* -t3=1 */
  108. #define PROC        if(trace[4])        /* -t4=1 */
  109. #define LIB        if(trace[5])        /* -t5=1 */
  110. #define VLIB        if(trace[5]>1)        /* -t5=2 */
  111. #define OVER        if(trace[6])        /* -t6=1 */
  112.  
  113. /* name_ (symbol table) system */
  114. #define HSIZE    128        /* MUST be power of two */
  115. #define HMASK    (HSIZE-1)
  116.  
  117. struct nentry_ {        /* a name entry */
  118.     struct MinNode    next;    /* next ref or def in bucket */
  119.     struct hunk_ *defh;    /* hunk where defined, else 0 */
  120.     long defo;        /* offset value of definition */
  121.     char *name;        /* name */
  122.     short len;        /* len of name */
  123.     unsigned refflag:1;    /* just for input_check */
  124.     unsigned linkvar:1;    /* linker variable */
  125.     unsigned inroot:1;    /* forced into root node */
  126. };
  127. typedef struct nentry_ nentry;
  128.  
  129. /* hunk numbers in the overlay file start at this value: */
  130. #define OVRHUNK_BASE 0x40000000
  131. #define OVRHUNK_MASK 0x0fffffff
  132.  
  133. /* Lists */
  134. #define LIST_P struct List *
  135. #define NODE_P struct Node *
  136.  
  137. struct Node *Head(struct List *);
  138. struct Node *Tail(struct List *);
  139. struct Node *Next(struct Node *);
  140. struct Node *Prev(struct Node *);
  141.  
  142. extern flag read_any_bss;
  143. extern flag overlaying;
  144.  
  145. extern struct List *_fortemp;
  146. #define foreach(n,lp,t)    _fortemp=(struct List *)(lp);if(_fortemp)    \
  147.             for(n= t Head(_fortemp);n;            \
  148.               n= t Next((struct Node *)(n)))
  149.  
  150. /* privates for splitter */
  151.  
  152. /* structs */
  153. struct hheader {
  154.     int hcount;        /* table size */
  155.     int first;        /* first hunk # */
  156.     int last;        /* last hunk # */
  157.     int (*sizes)[];        /* size of each hunk */
  158. };
  159. struct shunk {
  160.     struct hunk_ *h;        /* linker hunk info */
  161. };
  162.  
  163. /* externs */
  164. extern char *ssubst(char *,const char *);
  165. extern void panic(char *);
  166. extern char *eos(char *);
  167. extern void read_load_file(char *);
  168. extern void write_code_file(void);
  169. extern void write_data_file(void);
  170. extern void write_dir_file(void);
  171. extern int write_split_file(int);
  172. extern void write_lreloc(struct hunk_ *,struct listlist_ *);
  173. extern void wsf_hunk(struct hunk_ *);
  174. extern void renumber(void);
  175. extern int renumber2(int,int);
  176. extern void write_header(void);
  177. extern void owrite(void*,long);
  178. extern void owrite_long(long);
  179. extern void out_start(char *);
  180. extern void out_stop(void);
  181. extern void new_file(void);
  182.  
  183. void print_text_block(char *,struct block_ *);
  184. void print_bin_block(struct block_ *);
  185. struct file_ *NewFile(char *);
  186. struct punit_ *NewPunit(void);
  187. struct hunk_ *NewHunk(void);
  188. struct listlist_ *NewListList(void);
  189. struct block_ *NewBlock(void);
  190. long *NewData(long);
  191. int rderror(void);    /* should be void, but needs return val for ?: */
  192. struct block_ *ReadSimpleBlock(struct file_ *,int);
  193. int TossSimpleBlock(struct file_ *);
  194. struct hunk_ *ReadHunk(struct file_ *);
  195. void ReadReloc(struct file_ *,long,struct List *);
  196. long block_size(struct block_ *);
  197.