cweav-bs.ch
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

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