home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / dev / misc / cweb / common.w < prev    next >
Text File  |  1993-12-21  |  52KB  |  1,410 lines

  1. % This file is part of CWEB.
  2. % This program by Silvio Levy and Donald E. Knuth
  3. % is based on a program by Knuth.
  4. % It is distributed WITHOUT ANY WARRANTY, express or implied.
  5. % Version 3.0 --- June 1993
  6.  
  7. % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
  8.  
  9. % Permission is granted to make and distribute verbatim copies of this
  10. % document provided that the copyright notice and this permission notice
  11. % are preserved on all copies.
  12.  
  13. % Permission is granted to copy and distribute modified versions of this
  14. % document under the conditions for verbatim copying, provided that the
  15. % entire resulting derived work is distributed under the terms of a
  16. % permission notice identical to this one.
  17.  
  18. \def\v{\char'174} % vertical (|) in typewriter font
  19.  
  20. \def\title{Common code for CTANGLE and CWEAVE (Version 3.0)}
  21. \def\topofcontents{\null\vfill
  22.   \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
  23.     {\ttitlefont CWEAVE}}
  24.   \vskip 15pt
  25.   \centerline{(Version 3.0)}
  26.   \vfill}
  27. \def\botofcontents{\vfill
  28. \noindent
  29. Copyright \copyright\ 1987, 1990, 1993 Silvio Levy and Donald E. Knuth
  30. \bigskip\noindent
  31. Permission is granted to make and distribute verbatim copies of this
  32. document provided that the copyright notice and this permission notice
  33. are preserved on all copies.
  34.  
  35. \smallskip\noindent
  36. Permission is granted to copy and distribute modified versions of this
  37. document under the conditions for verbatim copying, provided that the
  38. entire resulting derived work is distributed under the terms of a
  39. permission notice identical to this one.
  40. }
  41.  
  42. \pageno=\contentspagenumber \advance\pageno by 1
  43. \let\maybe=\iftrue
  44.  
  45. @** Introduction.  This file contains code common
  46. to both \.{CTANGLE} and \.{CWEAVE}, which roughly concerns the following
  47. problems: character uniformity, input routines, error handling and
  48. parsing of command line.  We have tried to concentrate in this file
  49. all the system dependencies, so as to maximize portability.
  50.  
  51. In the texts below we will
  52. sometimes use \.{CWEB} to refer to either of the two component
  53. programs, if no confusion can arise.
  54.  
  55. The file begins with a few basic definitions.
  56.  
  57. @c
  58. @<Include files@>@/
  59. @h
  60. @<Definitions that should agree with \.{CTANGLE} and \.{CWEAVE}@>@/
  61. @<Other definitions@>@/
  62. @<Predeclaration of procedures@>@/
  63.  
  64. @ In certain cases \.{CTANGLE} and \.{CWEAVE} should do almost, but not
  65. quite, the same thing.  In these cases we've written common code for
  66. both, differentiating between the two by means of the global variable
  67. |program|.
  68.  
  69. @d ctangle 0
  70. @d cweave 1
  71.  
  72. @<Definitions...@>=
  73. typedef short boolean;
  74. boolean program; /* \.{CWEAVE} or \.{CTANGLE}? */
  75.  
  76. @ \.{CWEAVE} operates in three phases: first it inputs the source
  77. file and stores cross-reference data, then it inputs the source once again and
  78. produces the \TEX/ output file, and finally it sorts and outputs the index.
  79. Similarly, \.{CTANGLE} operates in two phases.
  80. The global variable |phase| tells which phase we are in.
  81.  
  82. @<Other...@>= int phase; /* which phase are we in? */
  83.  
  84. @ There's an initialization procedure that gets both \.{CTANGLE} and
  85. \.{CWEAVE} off to a good start. We will fill in the details of this
  86. procedure later.
  87.  
  88. @c
  89. void
  90. common_init()
  91. {
  92.   @<Initialize pointers@>;
  93.   @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>;
  94.   @<Scan arguments and open output files@>;
  95. }
  96.  
  97. @*1 The character set.
  98. \.{CWEB} uses the conventions of \CEE/ programs found in the standard
  99. \.{ctype.h} header file.
  100.  
  101. @<Include files@>=
  102. #include <ctype.h>
  103.  
  104. @ A few character pairs are encoded internally as single characters,
  105. using the definitions below. These definitions are consistent with
  106. an extension of ASCII code originally developed at MIT and explained in
  107. Appendix~C of {\sl The \TEX/book\/}; thus, users who have such a
  108. character set can type things like \.{\char'32} and \.{char'4} instead
  109. of \.{!=} and \.{\&\&}. (However, their files will not be too portable
  110. until more people adopt the extended code.)
  111.  
  112. If the character set is not ASCII, the definitions given here may conflict
  113. with existing characters; in such cases, other arbitrary codes should be
  114. substituted. The indexes to \.{CTANGLE} and \.{CWEAVE} mention every
  115. case where similar codes may have to be changed in order to
  116. avoid character conflicts. Look for the entry ``ASCII code dependencies''
  117. in those indexes.
  118.  
  119. @^ASCII code dependencies@>
  120. @^system dependencies@>
  121.  
  122. @d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
  123. @d lt_lt 020 /* `\.{<<}'\,;  corresponds to MIT's {\tentex\char'20} */
  124. @d gt_gt 021 /* `\.{>>}'\,;  corresponds to MIT's {\tentex\char'21} */
  125. @d plus_plus 013 /* `\.{++}'\,;  corresponds to MIT's {\tentex\char'13} */
  126. @d minus_minus 01 /* `\.{--}'\,;  corresponds to MIT's {\tentex\char'1} */
  127. @d minus_gt 031 /* `\.{->}'\,;  corresponds to MIT's {\tentex\char'31} */
  128. @d not_eq 032 /* `\.{!=}'\,;  corresponds to MIT's {\tentex\char'32} */
  129. @d lt_eq 034 /* `\.{<=}'\,;  corresponds to MIT's {\tentex\char'34} */
  130. @d gt_eq 035 /* `\.{>=}'\,;  corresponds to MIT's {\tentex\char'35} */
  131. @d eq_eq 036 /* `\.{==}'\,;  corresponds to MIT's {\tentex\char'36} */
  132. @d or_or 037 /* `\.{\v\v}'\,;  corresponds to MIT's {\tentex\char'37} */
  133. @d dot_dot_dot 016 /* `\.{...}'\,;  corresponds to MIT's {\tentex\char'16} */
  134. @d colon_colon 06 /* `\.{::}'\,;  corresponds to MIT's {\tentex\char'6} */
  135. @d period_ast 026 /* `\.{.*}'\,;  corresponds to MIT's {\tentex\char'26} */
  136. @d minus_gt_ast 027 /* `\.{->*}'\,;  corresponds to MIT's {\tentex\char'27} */
  137.  
  138. @** Input routines.  The lowest level of input to the \.{CWEB} programs
  139. is performed by |input_ln|, which must be told which file to read from.
  140. The return value of |input_ln| is 1 if the read is successful and 0 if
  141. not (generally this means the file has ended). The conventions
  142. of \TEX/ are followed; i.e., the characters of the next line of the file
  143. are copied into the |buffer| array,
  144. and the global variable |limit| is set to the first unoccupied position.
  145. Trailing blanks are ignored. The value of |limit| must be strictly less
  146. than |buf_size|, so that |buffer[buf_size-1]| is never filled.
  147.  
  148. Since |buf_size| is strictly less than |long_buf_size|,
  149. some of \.{CWEB}'s routines use the fact that it is safe to refer to
  150. |*(limit+2)| without overstepping the bounds of the array.
  151.  
  152. @d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
  153. @d long_buf_size 500 /* for \.{CWEAVE} */
  154.  
  155. @<Definitions...@>=
  156. char buffer[long_buf_size]; /* where each line of input goes */
  157. char *buffer_end=buffer+buf_size-2; /* end of |buffer| */
  158. char *limit=buffer; /* points to the last character in the buffer */
  159. char *loc=buffer; /* points to the next character to be read from the buffer */
  160.  
  161. @ @<Include files@>=
  162. #include <stdio.h>
  163.  
  164. @ In the unlikely event that your standard I/O library does not
  165. support |feof|, |getc| and |ungetc| you may have to change things here.
  166. @^system dependencies@>
  167.  
  168. @c
  169. int input_ln(fp) /* copies a line into |buffer| or returns 0 */
  170. FILE *fp; /* what file to read from */
  171. {
  172.   register int  c=EOF; /* character read; initialized so some compilers won't complain */
  173.   register char *k;  /* where next character goes */
  174.   if (feof(fp)) return(0);  /* we have hit end-of-file */
  175.   limit = k = buffer;  /* beginning of buffer */
  176.   while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n')
  177.     if ((*(k++) = c) != ' ') limit = k;
  178.   if (k>buffer_end)
  179.     if ((c=getc(fp))!=EOF && c!='\n') {
  180.       ungetc(c,fp); loc=buffer; err_print("! Input line too long");
  181. @.Input line too long@>
  182.   }
  183.   if (c==EOF && limit==buffer) return(0);  /* there was nothing after
  184.     the last newline */
  185.   return(1);
  186. }
  187.  
  188. @ Now comes the problem of deciding which file to read from next.
  189. Recall that the actual text that \.{CWEB} should process comes from two
  190. streams: a |web_file|, which can contain possibly nested include
  191. commands \.{@@i}, and a |change_file|, which might also contain
  192. includes.  The |web_file| together with the currently open include
  193. files form a stack |file|, whose names are stored in a parallel stack
  194. |file_name|.  The boolean |changing| tells whether or not we're reading
  195. from the |change_file|.
  196.  
  197. The line number of each open file is also kept for error reporting and
  198. for the benefit of \.{CTANGLE}.
  199.  
  200. @f line x /* make |line| an