home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _languages / languages / cweb / common / inc
Text File  |  1993-08-24  |  9KB  |  169 lines

  1. @ This is is the beginning of material included (by means of `\.{@@i}') from
  2. the file \.{common.inc}, so that it appears in an identical way in the
  3. programs for \.{CTANGLE}, \.{CWEAVE}, and in the code shared between them
  4. (from the file \.{common.w}). There will therefore be no code producing
  5. material. The major part of the declarative information that is shared
  6. between all the compilation units however is contained in the file
  7. \.{common.h} that is written as an auxiliary output file when \.{CTANGLE}
  8. processes \.{common.w}; in particular that file contains all the typedefs,
  9. |extern| variable declarations an function prototype declarations relating
  10. to code shared by \.{CTANGLE} and \.{CWEAVE}. Therefore this file is almost
  11. exclusively devoted to some macro definitions of general utility and a few
  12. function prototype declarations for functions that are {\it used\/} by the
  13. shared code but defined separately in \.{CTANGLE} and \.{CWEAVE}.
  14.  
  15. @h <stdlib.h>
  16. @h <stdio.h>
  17. @h <string.h>
  18. @h <ctype.h>
  19. @h <limits.h>
  20. @h "common.h"
  21.  
  22. @ We start with some dimensioning parameters that are used both in
  23. \.{CTANGLE} and \.{CWEAVE}. Some of them have been decreased with respect
  24. to their earlier values which were sufficient in the original \.{WEB} to
  25. handle \TeX. Nevertheless they should be sufficient for most applications
  26. of \.{CWEB}, since in \Cee\ there is no need to generate large programs
  27. entirely as a single file (and \TeX\ is not written in \.{CWEB}!).
  28. The smaller values allow \.{CWEB} to run on rather moderate sized
  29. computers.
  30.  
  31. @d max_bytes 50000L
  32.    /* the number of bytes in identifier and module names */
  33. @d max_names 3000
  34.    /* number of identifiers, and module names; must be $<10240$ */
  35. @d max_sections 10000
  36.    /* greater than the total number of sections, and less than $10240$ */
  37. @d hash_size 353 /* should be prime */
  38. @d buf_size 100 /* maximum length of input line, plus two */
  39. @d longest_name 400
  40.    /* module names and strings shouldn't be longer than this */
  41. @d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
  42.  
  43. @ Here are some macros of general utility. We use |local| in place of
  44. |static| for functions and variables when we want to stress the property
  45. of file-scope rather than static initialisation and permanence of value.
  46. The macro |array_size| can be used to compute the number of elements in a
  47. statically initialised array. For truth values we use the type |boolean|
  48. and the values |true| and |false|. We also make the general convention that
  49. whenever we mention a pointer to the ``end'' of a subsequence of a linear
  50. array, we mean the address of first entry beyond the subsequence itself.
  51. This is in keeping with general practice in~\Cee, which in fact guarantees
  52. the existence of the address even if the subsequence should contain the last
  53. entry of the array, and avoids repeated use of turgid phrases such as
  54. ``points one place beyond the last entry of~\dots''.
  55.  
  56. @d local static
  57. @f local static
  58. @d array_size(a) ((int)(sizeof(a)/sizeof(a[0])))
  59. @d false (boolean) 0
  60. @d true (boolean) 1
  61. @d ctangle 0
  62. @d cweave 1
  63.  
  64. @ Although \.{CWEB} uses the conventions of \Cee\ programs found in
  65. the standard \.{<ctype.h>} header file, it does assume that the character set
  66. is the \caps{ASCII} code. This dependency is mild however, and limited to
  67. the assumption that certain character codes below |040| are not occupied by
  68. ordinary characters. To be able to use such vacant spots in a character
  69. code independent way is possible (as is done in \TeX) by mapping all
  70. characters on input to their \caps{ASCII} positions (thereby ensuring that
  71. certain positions remain unused) and unmapping them on output; such an
  72. approach was deemed too tedious for the \.{CWEB} system however. Rather,
  73. the few places that have to be modified for non-\caps{ASCII} codes can be
  74. located by looking up the entry named ``\caps{ASCII} code dependencies''
  75. in the index of each of the programs.
  76.  
  77. @ A few character pairs are encoded internally as single characters, using
  78. the definitions below. These definitions are consistent with an extension of
  79. \caps{ASCII} code originally developed at \caps{MIT} and explained in
  80. Appendix~C of {\sl The \TeX book\/}. Thus, users who have such a character
  81. set can type things like `\.{\char'32}' and `\.{\char'4}' instead of
  82. `\.{!=}' and `\.{\&\&}'; however, their files will not be too portable until
  83. more people adopt the extended code. To be precise, when moved to other
  84. installations their files can still be processed by \.{CTANGLE} and
  85. \.{CWEAVE}, producing the required output, but users will have problems
  86. reading the source files. Therefore it is advised to use the two-character
  87. form in the \.{CWEB} files, which will be converted to single characters on
  88. input.
  89.  
  90. @^ASCII code dependencies@> @^system dependencies@>
  91.  
  92. @d and_and 04 /* `\.{\&\&}'; this corresponds to \caps{MIT}'s \.{\char'4} */
  93. @d lt_lt 020 /* `\.{<<}'; this corresponds to \caps{MIT}'s \.{\char'20} */
  94. @d gt_gt 021 /* `\.{>>}'; this corresponds to \caps{MIT}'s \.{\char'21} */
  95. @d plus_plus 013 /* `\.{++}'; this corresponds to \caps{MIT}'s \.{\char'13} */
  96. @d minus_minus 01 /* `\.{--}'; this corresponds to \caps{MIT}'s \.{\char'1} */
  97. @d minus_gt 031 /* `\.{->}'; this corresponds to \caps{MIT}'s \.{\char'31} */
  98. @d not_eq 032 /* `\.{!=}'; this corresponds to \caps{MIT}'s \.{\char'32} */
  99. @d lt_eq 034 /* `\.{<=}'; this corresponds to \caps{MIT}'s \.{\char'34} */
  100. @d gt_eq 035 /* `\.{>=}'; this corresponds to \caps{MIT}'s \.{\char'35} */
  101. @d eq_eq 036 /* `\.{==}'; this corresponds to \caps{MIT}'s \.{\char'36} */
  102. @d or_or 037 /* `\.{\v\v}'; this corresponds to \caps{MIT}'s \.{\char'37} */
  103.  
  104. @ Here are two macros that are useful when reading input. Invoking
  105. |find_char| will fetch a new line if the current one has been completely
  106. read, and it will either return |false| to indicate that there is no input
  107. left, or otherwise ensure that it is safe to inspect |*loc| (although it
  108. might be the line-ending space). In Phase~I of \.{CWEAVE} header files
  109. following `\.{@@h}' are swiftly scanned for typedef declarations; certain
  110. functions operate differently at such times, which they sense by testing
  111. the macro |including_header_file|.
  112.  
  113. @d find_char (loc<=limit || get_line())
  114. @d including_header_file (saved_include_depth>0)
  115.  
  116. @ The following declarations give the interface to the searching algorithms.
  117. They are defined separately in \.{CTANGLE} and \.{CWEAVE} and used by the
  118. common code, rather than the other way around.
  119.  
  120. @< Function prototypes used but not defined in the shared code @>=
  121.  
  122. boolean names_match (name_pointer,char*,int,int);
  123. void init_id_name (name_pointer,int);
  124. void init_module_name (name_pointer);
  125.  
  126.  
  127. @ Three levels of error severity are distinguished: informative, serious and
  128. fatal. An overflow stop occurs if \.{CWEB}'s tables aren't large enough.
  129. Sometimes the program will detect a violation of one of its supposed
  130. invariants (at least this could happen if the program still contains some
  131. errors), and \.{CWEB} then prints an error message that is really for the
  132. \.{CWEB} maintenance person, not the user. In such cases the program says
  133. |confusion("indication of where we are")|.
  134.  
  135.  
  136. @d spotless 0 /* |history| value for normal jobs */
  137. @d harmless_message 1 /* |history| value when non-serious info was printed */
  138. @d error_message 2 /* |history| value when an error was noted */
  139. @d fatal_message 3 /* |history| value when we had to stop prematurely */
  140. @d mark_harmless @+ if (history==spotless) history=harmless_message; @+ else @;
  141. @d mark_error history=error_message
  142. @d overflow(t) fatal("\n! Sorry, %s capacity exceeded",t)
  143.             @.Sorry,... capacity exceeded@>
  144. @d confusion(s) fatal("\n! This can't happen: %s",s) @.This can't happen@>
  145.  
  146.  
  147.  
  148. @ Command line flag settings are stored in an array |flags|. For some of
  149. them we use symbolic names.
  150.  
  151. @d show_banner flags['b'] /* should the banner line be printed? */
  152. @d show_progress flags['p'] /* should progress reports be printed? */
  153. @d show_stats flags['s'] /* should statistics be printed at end of run? */
  154. @d show_happiness flags['h'] /* should lack of errors be announced? */
  155. @d C_plus_plus flags['+'] /* is the language `\Cpp' rather than `\Cee'? */
  156.  
  157.  
  158. @ Here are some macros for terminal output. Note that th