1Changes for CWEAVE for MSDOS and Borland C++ 3.1 using the following
2options (and perhaps others):
3
4    -mc -w-pro -Ff=5000 -Z- -O-p
5
6The options -Z- and -O-p explicitly turn off optimizations that break
7the code.  (See makefile.bs.)
8
9The main purpose of these changes is to support MSDOS with full-size arrays
10by using "huge" pointers.
11
12This file contributed by Barry Schwartz, trashman@crud.mn.org, 28 Jun 94.
13(Includes workaround for compiler bug [pointers wrapping around at
14 segment boundaries], November 1993, contributed by Jorge Fernandez Arnaiz
15 -- arnaiz@redvax1.dgsca.unam.mx)
16(Last revised 5 Dec 94 with help of bob@microprograms.com.)
17
18
19@x Section 1.
20The ``banner line'' defined here should be changed whenever \.{CWEAVE}
21is modified.
22
23@d banner "This is CWEAVE (Version 3.64)\n"
24@y
25The ``banner line'' defined here should be changed whenever \.{CWEAVE}
26is modified.
27
28@d banner "This is CWEAVE (Version 3.64pc/big)\n"
29@z
30
31
32@x Section 9.
33@d chunk_marker 0
34
35@<Common code...@>=
36typedef struct name_info {
37  char *byte_start; /* beginning of the name in |byte_mem| */
38  struct name_info *link;
39  union {
40    struct name_info *Rlink; /* right link in binary search tree for section
41      names */
42    char Ilk; /* used by identifiers in \.{CWEAVE} only */
43  } dummy;
44  char *equiv_or_xref; /* info corresponding to names */
45} name_info; /* contains information about an identifier or section name */
46typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
47typedef name_pointer *hash_pointer;
48extern char byte_mem[]; /* characters of names */
49extern char *byte_mem_end; /* end of |byte_mem| */
50extern name_info name_dir[]; /* information about names */
51extern name_pointer name_dir_end; /* end of |name_dir| */
52extern name_pointer name_ptr; /* first unused position in |byte_start| */
53extern char *byte_ptr; /* first unused position in |byte_mem| */
54extern name_pointer hash[]; /* heads of hash lists */
55extern hash_pointer hash_end; /* end of |hash| */
56extern hash_pointer h; /* index into hash-head array */
57extern name_pointer id_lookup(); /* looks up a string in the identifier table */
58extern name_pointer section_lookup(); /* finds section name */
59extern void print_section_name(), sprint_section_name();
60@y
61@d chunk_marker 0
62
63@f huge extern
64
65@<Common code...@>=
66typedef struct name_info {
67  char huge* byte_start; /* beginning of the name in |byte_mem| */
68  struct name_info *link;
69  union {
70    struct name_info *Rlink; /* right link in binary search tree for section
71      names */
72    char Ilk; /* used by identifiers in \.{CWEAVE} only */
73  } dummy;
74  union {
75    char *equiv_member;
76    char huge* xref_member;
77  } ptr_union; /* info corresponding to names */
78} name_info; /* contains information about an identifier or section name */
79typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
80typedef name_pointer *hash_pointer;
81extern char huge byte_mem[]; /* characters of names */
82extern char huge* byte_mem_end; /* end of |byte_mem| */
83extern name_info name_dir[]; /* information about names */
84extern name_pointer name_dir_end; /* end of |name_dir| */
85extern name_pointer name_ptr; /* first unused position in |byte_start| */
86extern char huge* byte_ptr; /* first unused position in |byte_mem| */
87extern name_pointer hash[]; /* heads of hash lists */
88extern hash_pointer hash_end; /* end of |hash| */
89extern hash_pointer h; /* index into hash-head array */
90extern name_pointer id_lookup(); /* looks up a string in the identifier table */
91extern name_pointer section_lookup(); /* finds section name */
92extern void print_section_name(), sprint_section_name();
93@z
94
95
96@x Section 18.
97typedef struct xref_info {
98  sixteen_bits num; /* section number plus zero or |def_flag| */
99  struct xref_info *xlink; /* pointer to the previous cross-reference */
100} xref_info;
101typedef xref_info *xref_pointer;
102@y
103typedef struct xref_info {
104  sixteen_bits num; /* section number plus zero or |def_flag| */
105  struct xref_info huge* xlink; /* pointer to the previous cross-reference */
106} xref_info;
107typedef xref_info huge* xref_pointer;
108@z
109
110
111@x Section 19.
112xref_info xmem[max_refs]; /* contains cross-reference information */
113xref_pointer xmem_end = xmem+max_refs-1;
114@y
115xref_info huge xmem[max_refs]; /* contains cross-reference information */
116xref_pointer xmem_end;
117@z
118
119
120@x Section 20.
121@d xref equiv_or_xref
122@y
123@d xref ptr_union.xref_member
124@z
125
126
127@x Section 20.
128xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
129xmem->num=0; /* sentinel value */
130@y
131xmem_end = xmem + max_refs - 1;
132xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
133xmem->num=0; /* sentinel value */
134@z
135
136
137@x Section 21.
138  append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
139@y
140  append_xref(m); xref_ptr->xlink=q; p->xref=(char huge*)xref_ptr;
141@z
142
143
144@x Section 22.
145  if (r==xmem) p->xref=(char*)xref_ptr;
146@y
147  if (r==xmem) p->xref=(char huge*)xref_ptr;
148@z
149
150
151@x Section 23.
152  q=(xref_pointer)p->xref;
153  if (q->num==file_flag) return;
154  append_xref(file_flag);
155  xref_ptr->xlink = q;
156  p->xref = (char *)xref_ptr;
157@y
158  q=(xref_pointer)p->xref;
159  if (q->num==file_flag) return;
160  append_xref(file_flag);
161  xref_ptr->xlink = q;
162  p->xref = (char huge*)xref_ptr;
163@z
164
165@x Section 25. (to please Borland's C++, version 4.02)
166token tok_mem[max_toks]; /* tokens */
167token_pointer tok_mem_end = tok_mem+max_toks-1; /* end of |tok_mem| */
168token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
169token_pointer tok_ptr; /* first unused position in |tok_mem| */
170text_pointer text_ptr; /* first unused position in |tok_start| */
171text_pointer tok_start_end = tok_start+max_texts-1; /* end of |tok_start| */
172token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
173@y
174token tok_mem[max_toks]; /* tokens */
175token_pointer tok_mem_end; /* end of |tok_mem| */
176token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
177token_pointer tok_ptr; /* first unused position in |tok_mem| */
178text_pointer text_ptr; /* first unused position in |tok_start| */
179text_pointer tok_start_end; /* end of |tok_start| */
180token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
181@z
182
183@x Section 26. (goes with the previous change)
184tok_start[1]=tok_mem+1;
185max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
186@y
187tok_start[1]=tok_mem+1;
188tok_mem_end=tok_mem+max_toks-1;
189tok_start_end=tok_start+max_texts-1;
190max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
191@z
192
193
194@x Section 27.
195  p->ilk=t; p->xref=(char*)xmem;
196@y
197  p->ilk=t; p->xref=(char huge*)xmem;
198@z
199
200
201@x Section 27.
202  p->xref=(char*)xmem;
203@y
204  p->xref=(char huge*)xmem;
205@z
206
207
208@x Section 70.
209      if (unindexed(lhs)) { /* retain only underlined entries */
210        xref_pointer q,r=NULL;
211        for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
212          if (q->num<def_flag)
213            if (r) r->xlink=q->xlink;
214            else lhs->xref=(char*)q->xlink;
215          else r=q;
216      }
217@y
218      if (unindexed(lhs)) { /* retain only underlined entries */
219        xref_pointer q,r=NULL;
220        for (q=(xref_pointer)lhs->xref;q>xmem;q=q->xlink)
221          if (q->num<def_flag)
222            if (r) r->xlink=q->xlink;
223            else lhs->xref=(char huge*)q->xlink;
224          else r=q;
225      }
226@z
227
228
229@x Section 87.
230  char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
231  out('{');
232  for (k=p->byte_start; k<k_end; k++) {
233@y
234  char huge* k, huge* k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
235  out('{');
236  for (k=p->byte_start; k<k_end; k++) {
237@z
238
239
240@x Section 116.
241  append_xref(0); /* this number doesn't matter */
242  xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
243  p->xref=(char*)xref_ptr;
244  while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
245  r->num=m; /* everything from |q| on is left undisturbed */
246@y
247  append_xref(0); /* this number doesn't matter */
248  xref_ptr->xlink=(xref_pointer)p->xref; r=xref_ptr;
249  p->xref=(char huge*)xref_ptr;
250  while (r->xlink!=q) {r->num=r->xlink->num; r=r->xlink;}
251  r->num=m; /* everything from |q| on is left undisturbed */
252@z
253
254
255@x Section 163.
256@ @<Change |pp| to $\max...@>=
257@y
258@ @<Change |pp| to $\max...@>=
259#ifdef __MSDOS__
260if (d<0 && pp+d>pp) pp=scrap_base; /* segmented architecture caused wrap */
261else
262#endif
263@z
264
265
266@x Section 194.
267  char *p; /* index into |byte_mem| */
268@y
269  char huge *p; /* index into |byte_mem| */
270@z
271
272
273@x Section 229.
274    if (cur_name->xref!=(char*)xmem) {
275@y
276    if (cur_name->xref!=(char huge*)xmem) {
277@z
278
279
280@x Section 232.
281char *cur_byte; /* index into |byte_mem| */
282@y
283char huge* cur_byte; /* index into |byte_mem| */
284@z
285
286
287@x Section 241.
288switch (cur_name->ilk) {
289  case normal: if (is_tiny(cur_name)) out_str("\\|");
290    else {char *j;
291@y
292switch (cur_name->ilk) {
293  case normal: if (is_tiny(cur_name)) out_str("\\|");
294    else {char huge* j;
295@z
296
297
298@x Section 241.
299  case custom: case quoted: {char *j; out_str("$\\");
300@y
301  case custom: case quoted: {char huge* j; out_str("$\\");
302@z
303