1
Changes for CWEAVE for MSDOS and Borland C++ 3.1 using the following
2
options (and perhaps others):
4
-mc -w-pro -Ff=5000 -Z- -O-p
6
The options -Z- and -O-p explicitly turn off optimizations that break
7
the code. (See makefile.bs.)
9
The main purpose of these changes is to support MSDOS with full-size arrays
10
by using "huge" pointers.
12
This 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.)
20
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
23
@d banner "This is CWEAVE (Version 3.64)\n"
25
The ``banner line'' defined here should be changed whenever \.{CWEAVE}
28
@d banner "This is CWEAVE (Version 3.64pc/big)\n"
36
typedef struct name_info {
37
char *byte_start; /* beginning of the name in |byte_mem| */
38
struct name_info *link;
40
struct name_info *Rlink; /* right link in binary search tree for section
42
char Ilk; /* used by identifiers in \.{CWEAVE} only */
44
char *equiv_or_xref; /* info corresponding to names */
45
} name_info; /* contains information about an identifier or section name */
46
typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
47
typedef name_pointer *hash_pointer;
48
extern char byte_mem[]; /* characters of names */
49
extern char *byte_mem_end; /* end of |byte_mem| */
50
extern name_info name_dir[]; /* information about names */
51
extern name_pointer name_dir_end; /* end of |name_dir| */
52
extern name_pointer name_ptr; /* first unused position in |byte_start| */
53
extern char *byte_ptr; /* first unused position in |byte_mem| */
54
extern name_pointer hash[]; /* heads of hash lists */
55
extern hash_pointer hash_end; /* end of |hash| */
56
extern hash_pointer h; /* index into hash-head array */
57
extern name_pointer id_lookup(); /* looks up a string in the identifier table */
58
extern name_pointer section_lookup(); /* finds section name */
59
extern void print_section_name(), sprint_section_name();
66
typedef struct name_info {
67
char huge* byte_start; /* beginning of the name in |byte_mem| */
68
struct name_info *link;
70
struct name_info *Rlink; /* right link in binary search tree for section
72
char Ilk; /* used by identifiers in \.{CWEAVE} only */
76
char huge* xref_member;
77
} ptr_union; /* info corresponding to names */
78
} name_info; /* contains information about an identifier or section name */
79
typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
80
typedef name_pointer *hash_pointer;
81
extern char huge byte_mem[]; /* characters of names */
82
extern char huge* byte_mem_end; /* end of |byte_mem| */
83
extern name_info name_dir[]; /* information about names */
84
extern name_pointer name_dir_end; /* end of |name_dir| */
85
extern name_pointer name_ptr; /* first unused position in |byte_start| */
86
extern char huge* byte_ptr; /* first unused position in |byte_mem| */
87
extern name_pointer hash[]; /* heads of hash lists */
88
extern hash_pointer hash_end; /* end of |hash| */
89
extern hash_pointer h; /* index into hash-head array */
90
extern name_pointer id_lookup(); /* looks up a string in the identifier table */
91
extern name_pointer section_lookup(); /* finds section name */
92
extern void print_section_name(), sprint_section_name();
97
typedef 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 */
101
typedef xref_info *xref_pointer;
103
typedef 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 */
107
typedef xref_info huge* xref_pointer;
112
xref_info xmem[max_refs]; /* contains cross-reference information */
113
xref_pointer xmem_end = xmem+max_refs-1;
115
xref_info huge xmem[max_refs]; /* contains cross-reference information */
116
xref_pointer xmem_end;
121
@d xref equiv_or_xref
123
@d xref ptr_union.xref_member
128
xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
129
xmem->num=0; /* sentinel value */
131
xmem_end = xmem + max_refs - 1;
132
xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
133
xmem->num=0; /* sentinel value */
138
append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
140
append_xref(m); xref_ptr->xlink=q; p->xref=(char huge*)xref_ptr;
145
if (r==xmem) p->xref=(char*)xref_ptr;
147
if (r==xmem) p->xref=(char huge*)xref_ptr;
152
q=(xref_pointer)p->xref;
153
if (q->num==file_flag) return;
154
append_xref(file_flag);
156
p->xref = (char *)xref_ptr;
158
q=(xref_pointer)p->xref;
159
if (q->num==file_flag) return;
160
append_xref(file_flag);
162
p->xref = (char huge*)xref_ptr;
165
@x Section 25. (to please Borland's C++, version 4.02)
166
token tok_mem[max_toks]; /* tokens */
167
token_pointer tok_mem_end = tok_mem+max_toks-1; /* end of |tok_mem| */
168
token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
169
token_pointer tok_ptr; /* first unused position in |tok_mem| */
170
text_pointer text_ptr; /* first unused position in |tok_start| */
171
text_pointer tok_start_end = tok_start+max_texts-1; /* end of |tok_start| */
172
token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
174
token tok_mem[max_toks]; /* tokens */
175
token_pointer tok_mem_end; /* end of |tok_mem| */
176
token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
177
token_pointer tok_ptr; /* first unused position in |tok_mem| */
178
text_pointer text_ptr; /* first unused position in |tok_start| */
179
text_pointer tok_start_end; /* end of |tok_start| */
180
token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
183
@x Section 26. (goes with the previous change)
184
tok_start[1]=tok_mem+1;
185
max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
187
tok_start[1]=tok_mem+1;
188
tok_mem_end=tok_mem+max_toks-1;
189
tok_start_end=tok_start+max_texts-1;
190
max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
195
p->ilk=t; p->xref=(char*)xmem;
197
p->ilk=t; p->xref=(char huge*)xmem;
204
p->xref=(char huge*)xmem;
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)
213
if (r) r->xlink=q->xlink;
214
else lhs->xref=(char*)q->xlink;
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)
222
if (r) r->xlink=q->xlink;
223
else lhs->xref=(char huge*)q->xlink;
230
char *k, *k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
232
for (k=p->byte_start; k<k_end; k++) {
234
char huge* k, huge* k_end=(p+1)->byte_start; /* pointers into |byte_mem| */
236
for (k=p->byte_start; k<k_end; k++) {
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 */
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 */
256
@ @<Change |pp| to $\max...@>=
258
@ @<Change |pp| to $\max...@>=
260
if (d<0 && pp+d>pp) pp=scrap_base; /* segmented architecture caused wrap */
267
char *p; /* index into |byte_mem| */
269
char huge *p; /* index into |byte_mem| */
274
if (cur_name->xref!=(char*)xmem) {
276
if (cur_name->xref!=(char huge*)xmem) {
281
char *cur_byte; /* index into |byte_mem| */
283
char huge* cur_byte; /* index into |byte_mem| */
288
switch (cur_name->ilk) {
289
case normal: if (is_tiny(cur_name)) out_str("\\|");
292
switch (cur_name->ilk) {
293
case normal: if (is_tiny(cur_name)) out_str("\\|");
299
case custom: case quoted: {char *j; out_str("$\\");
301
case custom: case quoted: {char huge* j; out_str("$\\");