tentative fix for issue 3 (ex 53)
[mplib] / src / texk / web2c / cwebdir / cwebman.tex
1 % This file generates the user manual; TeX it, don't read it!
2
3 \def\tangref{3} % where the main explanation of CTANGLing is given
4 \input cwebmac
5 \acrofalse\pdffalse\pdftexfalse
6 \def\page{\box255 } \normalbottom
7 \parskip 0pt plus 1pt
8 \def\RA{\char'31 } % right arrow
9 \def\hang{\hangindent 4em\ignorespaces}
10 \font\eightrm=cmr8
11 \font\ninerm=cmr9
12 \font\ninett=cmtt9
13 \font\eighttt=cmtt8
14 \font\twelvett=cmtt12
15 \font\quoterm=cmssq8
16 \font\quoteit=cmssqi8
17 \font\authorfont=cmr12
18 \font\sectionfont=cmbx12
19
20 \def\pb{\.{|...|}}
21 \def\v{\.{\char'174}} % vertical (|) in typewriter font
22 \def\lpile{\def\cr{\hfill\endline}\matrix} % I only use \lpile by itself
23 \abovedisplayskip=.5\abovedisplayskip
24 \belowdisplayskip=.5\belowdisplayskip
25 \abovedisplayshortskip=.5\abovedisplayshortskip
26 \belowdisplayshortskip=.5\belowdisplayshortskip
27 \advance\baselineskip by -.5pt
28 \advance\pageheight by \baselineskip % the manual just got a bit longer
29 \advance\fullpageheight by \baselineskip
30 \setpage
31
32 \outer\def\section #1.{\penalty-500\bigskip
33         \centerline{\sectionfont\def\.##1{{\twelvett##1}} #1}\nobreak\vskip 6pt
34         \everypar{\hskip-\parindent\everypar{}}}
35
36 \def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill}
37 \def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno}
38 \def\runninghead{{\tentt CWEB} USER MANUAL (VERSION 3.64)}
39
40 % This verbatim mode assumes that ! marks are !! in the text being copied.
41 \def\verbatim{\begingroup
42   \def\do##1{\catcode`##1=12 } \dospecials
43   \parskip 0pt \parindent 0pt \let\!=!
44   \catcode`\ =13 \catcode`\^^M=13
45   \tt \catcode`\!=0 \verbatimdefs \verbatimgobble}
46 {\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} %
47   \gdef\verbatimgobble#1^^M{}}
48
49 \null\vfill
50 \centerline{\titlefont The {\ttitlefont CWEB} System of
51     Structured Documentation}
52 \vskip 18pt\centerline{(Version 3.64 --- February 2002)}
53 \vskip 24pt
54 \centerline{\authorfont Donald E. Knuth and Silvio Levy}
55 \vfill
56
57 \noindent
58 \TeX\ is a trademark of the American Mathematical Society.
59
60 \noindent
61 Acrobat Reader is a trademark of Adobe Systems Incorporated.
62
63 \bigskip\noindent
64 The printed form of this manual is copyright \copyright\ 1994
65   by Addison-Wesley Publishing Company, Inc.  All rights reserved.
66 \smallskip\noindent
67 The electronic form is copyright \copyright\ 1987, 1990, 1993, 2000
68   by Silvio Levy and Donald E. Knuth.
69
70 \bigskip\noindent
71 Permission is granted to make and distribute verbatim copies of the
72 electronic form of this document provided that the electronic copyright
73 notice and this permission notice are preserved on all copies.
74
75 \smallskip\noindent
76 Permission is granted to copy and distribute modified versions of the
77 electronic form of this document under the conditions for verbatim copying,
78 provided that the entire resulting derived work is distributed under the terms
79 of a permission notice identical to this one.
80
81 \smallskip\noindent
82 Individuals may make copies of the documentation from the electronic files
83 for their own personal use.
84
85 \smallskip\noindent
86 Internet page \.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}
87 contains current info about \.{CWEB} and related topics.
88
89 \pageno=0 \titletrue\eject
90
91 \titletrue
92 \centerline{\titlefont The {\ttitlefont CWEB} System of
93     Structured Documentation}
94
95 \vskip 15pt plus 3pt minus 3pt
96 \centerline{\authorfont Donald E. Knuth and Silvio Levy}
97
98 \vskip 24pt plus 3pt minus 3pt
99 \noindent
100 This document describes a version of Don Knuth's \.{WEB} system,
101 adapted to \CEE/ by Silvio Levy.  Since its creation in 1987, \.{CWEB}
102 has been revised and enhanced in various ways, by both Knuth and Levy.
103 We now believe that its evolution is near an end; however, bug
104 reports, suggestions and comments are still welcome, and
105 should be sent to Levy (\.{levy@math.berkeley.edu}).
106
107 Readers who are familiar with Knuth's memo ``The \.{WEB} System of Structured
108 Documentation'' will be able
109 to skim this material rapidly, because \.{CWEB} and \.{WEB} share
110 the same philosophy and (essentially) the same syntax.  In some respects
111 \.{CWEB} is a simplification
112 of \.{WEB}: for example, \.{CWEB} does not need \.{WEB}'s features
113 for macro definition and string handling, because \CEE/ and its
114 preprocessor already take care of macros and strings. Similarly, the \.{WEB}
115 conventions of denoting octal and hexadecimal constants by \.{@'77}
116 and \.{@"3f} are replaced by \CEE/'s conventions \.{077} and
117 \.{0x3f}. All other features of \.{WEB} have been
118 retained, and new features have been added.
119
120 We thank all who contributed suggestions and criticism to
121 the development of \.{CWEB}. We are especially grateful to Steve
122 Avery, Nelson Beebe, Hans-Hermann Bode, Klaus Guntermann, Norman Ramsey,
123 Joachim Schnitter, and Saroj Mahapatra,
124 who contributed code, and to Cameron Smith, who
125 made many suggestions improving the manual.  Ramsey has made
126 literate programming accessible to users of yet other languages by means of
127 his \.{SPIDER} system [see {\sl Communications of the ACM\/ \bf32} (1989),
128 1051--1055]. The book {\sl Literate Programming\/} by Knuth (1992) contains
129 a comprehensive bibliography of related early work.
130 Bode, Schnitter, and Mahapatra adapted \.{CWEB} so that it works
131 for \CPLUSPLUS/ as well; therefore in the text below you can read \CPLUSPLUS/
132 for \CEE/ if you so desire.
133
134 \section Introduction.
135 The philosophy behind \.{CWEB} is
136 that programmers who want to provide the best
137 possible documentation for their programs need two things
138 simultaneously:  a language like \TEX/ for formatting, and a language like
139 \CEE/ for programming. Neither type of language can provide the
140 best documentation by itself. But when both are appropriately combined, we
141 obtain a system that is much more useful than either language separately.
142
143 The structure of a software program may be thought of as a ``web'' that is
144 made up of many interconnected pieces. To document such a program, we want
145 to explain each individual part of the web and how it relates to its
146 neighbors. The typographic tools provided by \TEX/ give us an opportunity
147 to explain the local structure of each part by making that structure
148 visible, and the programming tools provided by \CEE/ make it possible
149 for us to specify the algorithms formally and unambiguously. By combining
150 the two, we can develop a style of programming that maximizes our ability
151 to perceive the structure of a complex piece of software, and at the same
152 time the documented programs can be mechanically translated into a working
153 software system that matches the documentation.
154
155 The \.{CWEB} system consists of two programs named \.{CWEAVE} and \.{CTANGLE}.
156 When writing a \.{CWEB} program the user keeps the
157 \CEE/ code and the documentation in the same file, called the \.{CWEB}
158 file and generally named \.{something.w}.  The command
159 `\.{cweave} \.{something}' creates an output file \.{something.tex}, which
160 can then be fed to \TEX/, yielding a ``pretty printed'' version of
161 \.{something.w} that correctly handles
162 typographic details like page layout and the use of indentation,
163 italics, boldface, and mathematical symbols. The typeset output also
164 includes extensive cross-index
165 information that is gathered automatically.  Similarly, if you run the
166 command `\.{ctangle} \.{something}' you will get a \CEE/ file \.{something.c},
167 which can then be compiled to yield executable code.
168
169 Besides providing a documentation tool, \.{CWEB} enhances the \CEE/
170 language by providing the
171 ability to permute pieces of the program text, so that a large system can
172 be understood entirely in terms of small sections and their local
173 interrelationships.  The \.{CTANGLE} program is so named because it takes a
174 given web and moves the sections from their web structure into the order
175 required by \CEE/; the advantage of programming in \.{CWEB} is that the
176 algorithms can be expressed in ``untangled'' form, with each section
177 explained separately.  The \.{CWEAVE} program is so named because it takes
178 a given web and intertwines the \TEX/ and \CEE/ portions contained in
179 each section, then it knits the whole fabric into a structured document.
180 (Get it? Wow.)  Perhaps there is some deep connection here with the fact
181 that the German word for ``weave'' is ``{\it webe\/}'', and the
182 corresponding Latin imperative is ``{\it texe\/}''!
183
184 A user of \.{CWEB} should be fairly familiar with the \CEE/
185 programming language.  A minimal amount of acquaintance with \TEX/ is also
186 desirable, but in fact it can be acquired as one uses \.{CWEB}, since
187 straight text can be typeset in \TEX/ with virtually no knowledge of
188 that language.  To someone familiar with both \CEE/ and \TEX/ the amount of
189 effort necessary to learn the commands of \.{CWEB} is small.
190
191 \section Overview.
192 Two kinds of material go into \.{CWEB} files: \TEX/ text and \CEE/ text.
193 A programmer writing in \.{CWEB} should be thinking both of the
194 documentation and of the \CEE/ program being created;
195 i.e., the programmer should be instinctively aware of the different
196 actions that \.{CWEAVE} and \.{CTANGLE} will perform on the \.{CWEB} file.
197 \TEX/ text is essentially copied without change by \.{CWEAVE}, and it is
198 entirely deleted by \.{CTANGLE}; the \TEX/ text is ``pure
199 documentation.'' \CEE/ text, on the other hand, is formatted by
200 \.{CWEAVE} and it is shuffled around by \.{CTANGLE}, according to rules that
201 will become clear later. For now the important point to keep in mind is
202 that there are two kinds of text. Writing \.{CWEB} programs is something
203 like writing \TEX/ documents, but with an additional ``\CEE/ mode''
204 that is added to \TEX/'s horizontal mode, vertical mode, and math mode.
205
206 A \.{CWEB} file is built up from units called {\sl sections\/} that are more
207 or less self-contained.  Each section has three parts:
208
209 \yskip\item{$\bullet$} A \TEX/ part, containing explanatory material about what
210 is going on in the section.
211
212 \item{$\bullet$} A middle part, containing macro definitions that serve as
213 abbreviations for \CEE/ constructions that would be less comprehensible
214 if written out in full each time. They are turned by \.{CTANGLE} into
215 preprocessor macro definitions.
216
217 \item{$\bullet$} A \CEE/ part, containing a piece of the program that
218 \.{CTANGLE} will produce. This \CEE/ code should ideally be about a
219 dozen lines long, so that it is easily comprehensible as a unit and so
220 that its structure is readily perceived.
221
222 \yskip\noindent The three parts of each section must appear in this order;
223 i.e., the \TEX/ commentary must come first, then the middle part, and
224 finally the \CEE/ code. Any of the parts may be empty.
225
226 A section begins with either of the symbols `\.{@\ }' or `\.{@*}', where
227 `\.{\ }' denotes a blank space. A section ends
228 at the beginning of the next section (i.e., at the next
229 `\.{@\ }' or `\.{@*}'), or at the end of the file, whichever comes first.
230 The \.{CWEB} file may also contain material that is not part of any section
231 at all, namely the text (if any) that occurs before the first section.
232 Such text is said to be ``in limbo''; it is ignored by \.{CTANGLE}
233 and copied essentially verbatim by \.{CWEAVE}, so its function is to
234 provide any additional formatting instructions that may be desired in the
235 \TEX/ output. Indeed, it is customary to begin a \.{CWEB} file with
236 \TEX/ code in limbo that loads special fonts, defines special macros,
237 changes the page sizes, and/or produces a title page.
238
239 Sections are numbered consecutively, starting with 1. These numbers appear
240 at the beginning of each section of the \TEX/ documentation output by
241 \.{CWEAVE}, and they appear
242 as bracketed comments at the beginning and end of the code generated by that
243 section in the \CEE/ program output by \.{CTANGLE}.
244
245 \section Section Names.
246 Fortunately, you never mention these numbers yourself when you are writing
247 in \.{CWEB}. You just say `\.{@\ }' or `\.{@*}' at the beginning of each
248 new section, and the numbers are supplied automatically by \.{CWEAVE} and
249 \.{CTANGLE}. As far as you are concerned, a section has a
250 {\sl name\/} instead of a number; its name is specified by writing
251 `\.{@<}' followed by \TEX/ text followed by `\.{@>}'. When \.{CWEAVE}
252 outputs a section name, it replaces the `\.{@<}' and `\.{@>}' by
253 angle brackets and inserts the section number in small type. Thus, when you
254 read the output of \.{CWEAVE} it is easy to locate any section that is
255 referred to in another section.
256
257 For expository purposes, a section name should be a good description of the
258 contents of that section; i.e., it should stand for the abstraction
259 represented by the section. Then the section can be ``plugged into'' one or
260 more other sections in such a way
261 that unimportant details of its inner workings
262 are suppressed.  A section name therefore ought to be long enough to convey
263 the necessary meaning.
264
265 Unfortunately, it is laborious to type
266 such long names over and over again, and it is also difficult to specify a
267 long name twice in exactly the same way so that \.{CWEAVE} and \.{CTANGLE}
268 will be able to match the names to the sections. To ameliorate this situation,
269 \.{CWEAVE} and \.{CTANGLE} let you abbreviate a section name, so long as
270 the full name appears somewhere in the \.{CWEB} file; you can type simply
271 `\.{@<$\alpha$...@>}', where $\alpha$ is any string that is a prefix of
272 exactly one section name appearing in the file. For example, `\.{@<Clear
273 the arrays@>}' can be abbreviated to `\.{@<Clear...@>}' if no other section
274 name begins with the five letters `\.{Clear}'.  Elsewhere
275 you might use the abbreviation `\.{@<Clear t...@>}', and so on.
276
277 Section names must otherwise match character for character, except
278 that consecutive characters of white space (spaces, tab marks, newlines, and/or
279 form feeds) are treated as equivalent to a single space, and such spaces are
280 deleted at the beginning and end of the name. Thus, `\.{@< Clear { }the
281 arrays @>}' will also match the name in the previous example.
282 Spaces following the ellipsis in abbreviations are ignored as well, but
283 not those before, so that `\.{@<Clear t ...@>}' would not match
284 `\.{@<Clear the arrays@>}'.
285
286 \section What \.{CTANGLE} Does.
287 We have said that a section begins with `\.{@\ }' or `\.{@*}', but we
288 didn't say how it gets divided up into a \TEX/ part, a middle part,
289 and a \CEE/ part. The middle part begins with the first appearance of
290 `\.{@d}' or `\.{@f}' in the section, and the \CEE/ part begins with
291 the first appearance of `\.{@c}' or `\.{@<section name@>=}'.  In the
292 latter case you are saying, in effect, that the section name stands
293 for the \CEE/ text that follows. Alternatively, if the \CEE/ part
294 begins with `\.{@c}' instead of a section name, the current section is
295 said to be {\sl unnamed}.
296
297 The construct `\.{@<section name@>}' can appear
298 any number of times in the \CEE/ part of a section:
299 Subsequent appearances indicate that a named section is being
300 ``used'' rather than ``defined.'' In other words, the
301 \CEE/ code for the named section, presumably defined elsewhere, should be
302 spliced in at this point in the \CEE/ program.  Indeed,
303 the main idea of \.{CTANGLE} is to make a \CEE/ program out of
304 individual sections, named and unnamed.  The exact way in which this is done
305 is this: First all the macro definitions
306 indicated by `\.{@d}' are turned into \CEE/ preprocessor macro definitions
307 and copied at the beginning.
308 Then the \CEE/ parts of unnamed sections are copied down,
309 in order; this constitutes the first-order
310 approximation to the text of the program. (There should be at least
311 one unnamed section, otherwise there will be no program.) Then all section
312 names that appear in the first-order approximation are replaced by the \CEE/
313 parts of the corresponding sections, and this substitution process
314 continues until no section names remain. All comments are removed, because
315 the \CEE/ program is intended only for the eyes of the \CEE/ compiler.
316
317 If the same name has been given to more than one section, the \CEE/ text
318 for that name is obtained by putting together all of the \CEE/ parts in
319 the corresponding sections. This feature is useful, for example, in a
320 section named `Global variables', since one can then
321 declare global variables in whatever sections those variables are
322 introduced. When several sections have the same name, \.{CWEAVE} assigns the
323 first section number as the number corresponding to that name, and it
324 inserts a note at the bottom of that section telling the reader to `See
325 also sections so-and-so'; this footnote gives the numbers of all the other
326 sections having the same name as the present one. The \CEE/ text
327 corresponding to a section is usually formatted by \.{CWEAVE} so that the
328 output has an equivalence sign in place of the equals sign in the \.{CWEB}
329 file; i.e., the output says `$\langle\,$section
330 name$\,\rangle\equiv\null$\CEE/ text'. However, in the case of the second
331 and subsequent appearances of a section with the same name, this `$\equiv$'
332 sign is replaced by `$\mathrel+\equiv$', as an indication that the
333 following \CEE/ text is being appended to the \CEE/ text of another section.
334
335 As \.{CTANGLE} enters and leaves sections, it inserts preprocessor
336 \.{\#line} commands into the \CEE/ output file.  This means that
337 when the compiler gives you error messages, or when you debug your program,
338 the messages refer to line numbers in the \.{CWEB} file, and not in the
339 \CEE/ file.  In most cases you can therefore
340 forget about the \CEE/ file altogether.
341
342 \section What \.{CWEAVE} Does.
343 The general idea of \.{CWEAVE} is to make a \.{.tex} file from the \.{CWEB}
344 file in the following way: The first line of the \.{.tex} file
345 tells \TEX/ to input a file with macros that
346 define \.{CWEB}'s documentation conventions. The next lines of the file
347 will be copied from whatever \TEX/ text is in limbo before the first
348 section.  Then comes the output for each section in turn, possibly
349 interspersed with end-of-page marks.  Finally, \.{CWEAVE} will generate a
350 cross-reference index that lists each section number in which each \CEE/
351 identifier appears, and it will also generate an alphabetized list
352 of the section names, as well as a table of contents that
353 shows the page and section numbers for each ``starred'' section.
354
355 What is a ``starred'' section, you ask? A section that begins with `\.{@*}'
356 instead of `\.{@\ }' is slightly special in that it denotes a new major
357 group of sections. The `\.{@*}' should be followed by the title of this
358 group, followed by a period. Such sections will always start on a new page
359 in the \TEX/ output, and the group title will appear as a running headline
360 on all subsequent pages until the next starred section. The title will also
361 appear in the table of contents, and in boldface type at the beginning of
362 its section. Caution:  Do not use \TEX/ control sequences in such titles,
363 unless you know that the \.{cwebmac} macros will do the right thing with
364 them. The reason is that these titles are converted to uppercase when
365 they appear as running heads, and they are converted to boldface when they
366 appear at the beginning of their sections, and they are also written out to
367 a table-of-contents file used for temporary storage while \TEX/ is
368 working; whatever control sequences you use must be meaningful in all
369 three of these modes.
370
371 The \TEX/ output produced by \.{CWEAVE} for each section consists of
372 the following: First comes the section number (e.g., `\.{\\M123.}'
373 at the beginning of section 123, except that `\.{\\N}' appears in place of
374 `\.{\\M}' at the beginning of a starred section). Then comes the
375 \TEX/ part of the section, copied almost verbatim except as noted
376 below. Then comes the middle part and the \CEE/ part, formatted
377 so that there will be a little extra space between them if both are
378 nonempty. The middle and \CEE/ parts are obtained by inserting
379 a bunch of funny-looking \TEX/ macros into the \CEE/ program; these
380 macros handle typographic details about fonts and proper math spacing,
381 as well as line breaks and indentation.
382
383 \section C Code in \TEX/ Text and Vice Versa.
384 When you are typing \TEX/ text, you will probably want to make frequent
385 reference to variables and other quantities in your \CEE/ code, and you
386 will want those variables to have the same typographic treatment
387 when they appear in your text as when they appear in your
388 program.  Therefore the \.{CWEB} language allows you to get the effect of
389 \CEE/ editing within \TEX/ text, if you place `\.|' marks before and
390 after the \CEE/ material. For example, suppose you want to say something
391 like this:
392 $$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
393 the assignment $\\{pa}\K{\AND}\|a[\T{0}]$ makes \\{pa}
394 point to the zeroth element of \|a.}$$
395 The \TEX/ text would look like this in your \.{CWEB} file:
396 $$\lpile{\.{If |pa| is declared as `|int *pa|', the}\cr
397 \.{assignment |pa=\&a[0]| makes |pa| point
398 to the zeroth element of |a|.}\cr}$$
399 And \.{CWEAVE} translates this into something you are glad you didn't have
400 to type:
401 $$\lpile{\.{If \\\\\{pa\} is declared as
402   `\\\&\{int\} \$\{\}\{*\}\\\\\{pa\}\$',}\cr
403 \.{the assignment \$\\\\\{pa\}\\K\{\\AND\}\\|a[\\T\{0\}]\$}\cr
404 \.{makes \\\\\{pa\} point to the zeroth element of \\|a.}\cr}$$
405 Incidentally, the cross-reference index that \.{CWEAVE} would make, in
406 the presence of a comment like this, would include
407 the current section number as one of the index entries for \\{pa},
408 even though \\{pa} might not appear in the \CEE/ part of
409 this section. Thus, the index covers references to identifiers in
410 the explanatory comments as well as in the program itself; you will
411 soon learn to appreciate this feature. However, the identifiers
412 \&{int} and \|a\ would not be indexed,
413 because \.{CWEAVE} does not make index entries for reserved words or
414 single-letter identifiers. Such identifiers are felt to be so ubiquitous
415 that it would be pointless to mention every place where they occur.
416
417 Although a section begins with \TEX/ text and ends with \CEE/ text, we
418 have noted that the dividing line isn't sharp, since \CEE/ text can be
419 included in \TEX/ text if it is enclosed in `\pb'.  Conversely, \TEX/ text
420 appears frequently within \CEE/ text, because everything in
421 comments (i.e., between \.{/*} and \.{*/}, or following \.{//})
422 is treated as \TEX/ text.
423 Likewise, the text of a section name consists of \TEX/ text, but
424 the construct \.{@<section name@>} as a whole is expected to be found
425 in \CEE/ text; thus, one typically goes back and forth
426 between the \CEE/ and \TEX/ environments in a natural way, as in these
427 examples:
428 $$
429 \displaylines{
430 \hbox{\.{if} \.{(x==0)} \.{@<Empty} \.{the} \.{|buffer|} \.{array@>}} \cr
431 \hbox{\.{...} \.{using}  \.{the} \.{algorithm}
432 \.{in} \.{|@<Empty} \.{the} \.{|buffer|} \.{array@>|.}} }
433 $$
434 The first of these excerpts
435 would be found in the \CEE/ part of a section, into which the code
436 from the section
437 named ``Empty the \\{buffer} array'' is being spliced. The second excerpt
438 would be found in the \TEX/ part of the section, and the named section
439 is being ``cited'', rather than defined or used.
440 (Note the `\pb' surrounding the section name in this case.)
441
442 \section Macros.
443 The control code \.{@d} followed by
444 $$\\{identifier}\.{ }\hbox{\CEE/ text}\qquad\hbox{or by}\qquad
445 \\{identifier}\.(\\{par}_1,\ldots,\\{par}_n\.{) }\hbox{\CEE/ text}$$
446 (where there is no blank between the
447 \\{identifier} and the parentheses in the second case) is
448 transformed by \.{CTANGLE} into a preprocessor command, starting with
449 \.{\#define}, which is printed at the top of the \CEE/ output file
450 as explained earlier.
451
452 A `\.{@d}' macro definition can go on for several lines, and the
453 newlines don't have to be protected by backslashes, since \.{CTANGLE}
454 itself inserts the backslashes.   If
455 for any reason you need a \.{\#define} command at a specific spot in
456 your \CEE/ file, you can treat it as \CEE/ code, instead of as a
457 \.{CWEB} macro; but then you do have to protect newlines yourself.
458
459 \section Strings and constants.
460 If you want a string to appear in the \CEE/ file, delimited by pairs of
461 \.' or \." marks as usual, you can type it exactly so in the \.{CWEB} file,
462 except that the character `\.@' should be typed `\.{@@}' (it becomes a
463 control code, the only one that can appear in strings; see below).
464 Strings should end on the same line as they begin, unless there's a
465 backslash at the end of lines within them.
466
467 \TEX/ and \CEE/ have different ways to refer to octal and hex constants,
468 because \TEX/ is oriented to technical writing while \CEE/ is oriented to
469 computer processing.  In \TEX/ you
470 make a constant octal or hexadecimal by prepending \.' or \.",
471 respectively, to it; in \CEE/ the constant should be preceded by \.0
472 or \.{0x}.  In \.{CWEB} it seems reasonable to let each convention hold
473 in its respective realm; so in \CEE/ text you get $40_8$ by typing
474 `\.{040}', which \.{CTANGLE} faithfully copies into the \CEE/ file (for
475 the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40}$.
476 Similarly, \.{CWEAVE} prints the hexadecimal \CEE/ constant `\.{0x20}'
477 as \T{\^20}. The use of italic font for octal digits and typewriter font
478 for hexadecimal digits makes the meaning of such constants clearer in
479 a document. For consistency, then, you
480 should type `\.{|040|}'  or `\.{|0x20|}'
481 in the \TEX/ part of the section.
482
483 \section Control codes.
484 A \.{CWEB} {\sl control code\/}
485 is a two-character combination of which the first is `\.@'.
486 We've already seen the meaning of several control codes; it's time to
487 list them more methodically.
488
489 In the following list,
490 the letters in brackets after a control code indicate in what contexts that
491 code is allowed.  $L$ indicates that the code is allowed in limbo; $T$
492 (for \TEX/), $M$ (for middle), and $C$ (for \CEE/) mean that the code is
493 allowed in each of the three parts of a section, at top level---that
494 is, outside such constructs as `\pb' and section names.  An arrow $\to$
495 means that the control code terminates the present part of the \.{CWEB}
496 file, and inaugurates the part indicated by the letter following the
497 arrow.  Thus $[LTMC\to T]$ next to \.{@\ } indicates that this control
498 code can occur in limbo, or in any of the three parts of a section, and
499 that it starts the (possibly empty) \TEX/ part of the following section.
500
501 Two other abbreviations can occur in these brackets: The letter $r$ stands for
502 {\it restricted context}, that is, material inside \CEE/ comments, section
503 names, \CEE/ strings and control texts (defined below); the letter
504 $c$ stands for {\it inner \CEE/ context}, that is, \CEE/ material
505 inside `\pb' (including `\pb's inside comments, but not those
506 occurring in other restricted contexts).  An asterisk $*$ following
507 the brackets means
508 that the context from this control code to the matching \.{@>} is
509 restricted.
510
511 Control codes involving letters are case-insensitive; thus \.{@d} and
512 \.{@D} are equivalent. Only the lowercase versions are mentioned
513 specifically below.
514
515 \gdef\@#1[#2] {\penalty-50\yskip\hangindent 2em\noindent\.{@#1\unskip
516   \spacefactor1000{ }}$[#2]$\quad}
517 \def\more{\hangindent 2em \hangafter0}
518 \def\subsec{\penalty-300\medskip\noindent}
519
520 \@@ [LTMCrc] A double \.@ denotes the single character `\.@'. This is
521 the only control code that is legal everywhere.
522 Note that you must use this convention if you are giving an internet
523 email address in a \.{CWEB} file (e.g., \.{levy@@math.berkeley.edu}).
524
525 \subsec
526 Here are the codes that introduce the \TEX/ part of a section.
527
528 \@\ [LTMC\to T] This denotes the beginning of a new (unstarred)
529 section. A tab mark or form feed or
530 end-of-line character is equivalent to a space when it follows an \.@
531 sign (and in most other cases).
532
533 \@* [LTMC\to T] This denotes the beginning of a new starred
534 section, i.e., a section that begins a new major group. The title of the new
535 group should appear after the \.{@*}, followed by a period. As explained
536 above, \TEX/ control sequences should be avoided in such titles unless
537 they are quite simple. When \.{CWEAVE} and \.{CTANGLE} read a \.{@*}, they
538 print an asterisk on the terminal
539 followed by the current section number, so that the user
540 can see some indication of progress. The very first section should be starred.
541
542 \more You can specify the ``depth'' of a starred section by typing \.* or a
543 decimal number after the \.{@*}; this indicates the relative ranking
544 of the current group of sections in the program hierarchy. Top-level
545 portions of the program, introduced by \.{@**}, get their names typeset
546 in boldface type in the table of contents; they are said to have
547 depth~$-1$. Otherwise the depth is a nonnegative number, which governs
548 the amount of indentation on the contents page. Such indentation helps
549 clarify the structure of a long program. The depth is assumed to be 0
550 if it is not specified explicitly; when your program is short, you
551 might as well leave all depths zero.  A starred section always begins
552 a new page in the output, unless the depth is greater than~1.
553
554 \subsec
555 The middle part of each section consists of any number of
556 macro definitions (beginning with \.{@d}) and format definitions (beginning
557 with \.{@f} or \.{@s}), intermixed in any order.
558
559 \@d [TM\to M] Macro definitions begin with \.{@d}, followed by
560 an identifier and optional parameters and \CEE/ text as explained earlier.
561
562 \@f [TM\to M] Format definitions begin with \.{@f}; they cause
563 \.{CWEAVE} to treat identifiers in a special way when they appear in
564 \CEE/ text. The general form of a format definition is `\.{@f} \|l
565 \|r', followed by an optional comment enclosed between
566 \.{/*} and \.{*/}, where \|l and \|r
567 are identifiers; \.{CWEAVE} will subsequently treat identifier \|l as it
568 currently treats \|r. This feature allows a \.{CWEB} programmer to invent
569 new reserved words and/or to unreserve some of \CEE/'s reserved
570 identifiers. For example, the common words `error' and `line'
571 have been given a special meaning in the \CEE/ preprocessor,
572 so \.{CWEAVE} is set up to format them specially; if you want a variable
573 named \\{error} or \\{line}, you should say
574 $$\.{@f error normal}\qquad\qquad\.{@f line normal}$$
575 somewhere in your program.
576
577 \more If \|r is the special identifier `\\{TeX}', identifier \|l
578 will be formatted as a \TEX/ control sequence; for example,
579 `\.{@f foo TeX}' in the \.{CWEB} file will cause identifier \\{foo} to
580 be output as \.{\\foo} by \.{CWEAVE}. The programmer should define
581 \.{\\foo} to have whatever custom format is desired, assuming \TEX/
582 math mode. (Each underline
583 character is converted to \.{x} when making the \TEX/ control sequence,
584 and each dollar sign is converted to~\.X;
585 thus \\{foo\_bar} becomes \.{\\fooxbar}. Other characters, including digits,
586 are left untranslated, so \TEX/ will consider them as macro parameters,
587 not as part of the control sequence itself. For example,
588 $$\.{\\def\\x\#1\{x\_\{\#1\}\} @f x1 TeX @f x2 TeX}$$
589 will format \.{x1} and \.{x2} not as \\{x1} and \\{x2} but as $x_1$ and $x_2$.)
590
591 \more If \|r is the special identifier `\\{make\_pair}', identifier \|l will
592 be treated as a \CPLUSPLUS/ function template. For example, after
593 \.{@f}~\.{convert}~\.{make\_pair} one can say `\.{convert<int>(2.5)}' without
594 having \.< and \.> misunderstood as less-than and greater-than signs.
595
596 \more \.{CWEAVE} knows that identifiers being
597 defined with a \&{typedef} should become reserved words; thus you
598 don't need format definitions very often.
599
600 \@s [TM\to M;\;L] Same as \.{@f}, but \.{CWEAVE} does not show the format
601 definition in the output, and the optional \CEE/ comment is not
602 allowed. This is used mostly in \.{@i} files.
603
604 \subsec
605 Next come the codes that govern the \CEE/ part of a section.
606
607 \@{c @p} [TM\to C] The \CEE/ part of an unnamed section begins with \.{@c}
608 (or with \.{@p} for ``program''; both control codes do the same thing).
609 This causes \.{CTANGLE} to append the following \CEE/ code
610 to the first-order program text, as explained on page~\tangref.
611 Note that \.{CWEAVE} does not print a `\.{@c}' in the \TEX/
612 output, so if you are creating a \.{CWEB} file based on a \TEX/-printed
613 \.{CWEB} documentation you have to remember to insert \.{@c} in the
614 appropriate places of the unnamed sections.
615
616 \@< [TM\to C;\; C;\; c] $*$ This control code introduces a
617 section name (or unambiguous prefix, as discussed above), which
618 consists of \TEX/ text and extends to the matching \.{@>}.
619 The whole construct \.{@<...@>} is conceptually a \CEE/ element.
620 The behavior is different depending on the context:
621
622 \more A \.{@<} appearing in contexts $T$ and $M$ attaches the
623 following section name to the current section, and inaugurates the
624 \CEE/ part of the section.  The closing \.{@>} should be followed by
625 \.{=} or \.{+=}.
626
627 \more
628 In context $C$, \.{@<} indicates that the named
629 section is being used---its \CEE/ definition is spliced in by
630 \.{CTANGLE}, as explained on page~\tangref.
631 As an error-detection measure,
632 \.{CTANGLE} and \.{CWEAVE} complain if such a section name is followed
633 by \.=, because most likely this is meant as the definition of a new
634 section, and so should be preceded by \.{@\ }.  If you really want to
635 say $\langle\,$foo$\,\rangle=\\{bar}$, where $\langle\,$foo$\,\rangle$
636 is being used and not defined, put a newline before the \.=.
637
638 \more
639 Finally, in inner \CEE/ context (that is, within `\pb' in the \TEX/ part
640 of a section or in a comment), \.{@<...@>}
641 means that the named section is being
642 cited.  Such an occurrence is ignored by \.{CTANGLE}. Note that
643 even here we think of the section name as being a \CEE/ element, hence the \pb.
644
645 \@( [TM\to C;\;C;\;c] $*$ A section name can begin with \.{@(}.
646 Everything works just as for \.{@<}, except that the \CEE/ code
647 of the section named \.{@(foo@>} is written by \.{CTANGLE}
648 to file \.{foo}. In this way you can get multiple-file output from
649 a single \.{CWEB} file. (The \.{@d} definitions are not output
650 to such files, only to the master \.{.c} file.) One use of this feature
651 is to produce header files for other program modules that will be loaded
652 with the present one. Another use is to produce a test routine that
653 goes with your program. By keeping the sources for a program and its
654 header and test routine together, you are more likely to keep
655 all three consistent with each other. Notice that the output of a named
656 section can be incorporated in several different output files, because
657 you can mention \.{@<foo@>} in both \.{@(bar1@>} and \.{@(bar2@>}.
658
659 \@h [Cc] Causes \.{CTANGLE}
660 to insert at the current spot the \.{\#define} statements
661 from the middle parts of all sections,
662 and {\it not\/} to write them at the beginning of the \CEE/ file.
663 Useful when you want the macro definitions to come after the include files,
664 say. (Ignored by \.{CTANGLE} inside `\pb'.)
665
666 \subsec
667 The next several control codes introduce ``control
668 texts,'' which end with the next `\.{@>}'.  The closing `\.{@>}' must be on
669 the same line of the \.{CWEB} file as the line where the control text began.
670 The context from each of these control codes to the matching \.{@>} is
671 restricted.
672
673 \@\^ [TMCc] $*$ The control text that follows, up to the next
674 `\.{@>}', will be entered into the index together with the identifiers of
675 the \CEE/ program; this text will appear in roman type. For example, to
676 put the phrase ``system dependencies'' into the index that is output by
677 \.{CWEAVE}, type
678 `\.{@\^system dependencies@>}' in each section
679 that you want to index as system dependent.
680
681 \@. [TMCc] $*$ The control text that follows will be entered into the index
682 in \.{typewriter} \.{type}.
683
684 \@: [TMCc] $*$ The control text that follows will be entered into the index
685 in a format controlled by the \TEX/ macro `\.{\\9}', which you
686 should define as desired.
687
688 \@t [MCc] $*$ The control text that follows will
689 be put into a \TEX/ \.{\\hbox} and formatted along with the neighboring
690 \CEE/ program. This text is ignored by \.{CTANGLE}, but it can be used
691 for various purposes within \.{CWEAVE}. For example, you can make comments
692 that mix \CEE/ and classical mathematics, as in `$\\{size}<2^{15}$', by
693 typing `\.{|size < 2@t\$\^\{15\}\$@>|}'.
694
695 \@= [MCc] $*$ The control text that follows will
696 be passed verbatim to the \CEE/ program.
697
698 \@q [LTMCc] $*$ The control text that follows will
699 be totally ignored---it's a comment for readers of the \.{CWEB} file only.
700 A file intended to be included in
701 limbo, with \.{@i}, can identify itself with \.{@q} comments.
702 Another use is to balance unbalanced parentheses in \CEE/ strings,
703 so that your text editor's parenthesis matcher doesn't go into a tailspin.
704
705 \@! [TMCc] $*$
706 The section number in an index entry will be underlined if `\.{@!}'
707 immediately precedes the identifier or control text being indexed. This
708 convention is used to distinguish the sections where an identifier is
709 defined, or where it is explained in some special way, from the sections
710 where it is used. A~reserved word or an identifier of length one will not
711 be indexed except for underlined entries. An `\.{@!}' is implicitly inserted
712 by \.{CWEAVE} when an identifier is being defined or declared in \CEE/
713 code; for example, the definition
714 $$\hbox{\&{int} \\{array}[\\{max\_dim}], \\{count}${}=\\{old\_count};$}$$
715 makes the names \\{array} and \\{count} get an underlined entry in the
716 index.  Statement labels, function definitions like
717 \\{main}(\&{int}~\\{argc},\,\&{char}~$*$\\{argv}[\,]),
718 and \&{typedef} definitions also
719 imply underlining. An old-style
720 function definition (without prototyping) doesn't define its arguments;
721 the arguments will, however, be considered to be defined
722 (i.e., their index entries will be underlined) if their types are
723 declared before the body of the function in the usual way
724 (e.g., `\&{int}~\\{argc}; \&{char}~${*}\\{argv}[\,]$; $\{\,\ldots\,\}$').
725 Thus \.{@!} is not needed very often, except in unusual constructions
726 or in cases like
727 $$\.{enum boolean \{@!false, @!true\};}$$
728 here \.{@!} gives the best results because individual constants enumerated
729 by \.{enum} are not automatically underlined in the index at their
730 point of definition.
731
732 \subsec
733 We now turn to control codes that affect only the operation of
734 \.{CTANGLE}.
735
736 \@' [MCc] This control code is dangerous because it has quite different
737 meanings in \.{CWEB} and the original \.{WEB}. In \.{CWEB} it produces the
738 decimal constant corresponding to the ASCII code for a string of length~1
739 (e.g., \.{@'a'} is \.{CTANGLE}d into \.{97} and \.{@'\\t'} into
740 \.9). You might want to use this if you need to work in ASCII on a
741 non-ASCII machine; but in most cases the \CEE/ conventions of
742 \.{<ctype.h>} are adequate for character-set-independent programming.
743
744 \@\& [MCc] The \.{@\&} operation causes whatever is on its left to be
745 adjacent to whatever is on its right, in the \CEE/ output. No spaces or
746 line breaks will separate these two items.
747
748 \@l [L] \.{CWEB} programmers have the option of using any 8-bit character
749 code from the often-forbidden range 128--255 within \TEX/ text; such
750 characters are also permitted in strings and even in identifiers of the
751 \CEE/ program.
752 Under various extensions of the basic
753 ASCII standard, the higher 8-bit codes correspond
754 to accented letters, letters from non-Latin alphabets,
755 and so on. When such characters occur in identifiers, \.{CTANGLE} must replace
756 them by standard ASCII alphanumeric characters or
757 \.{\_}, in order to generate legal \CEE/ code.  It does this by means
758 of a transliteration table, which by default associates the string
759 \.{Xab} to the character with ASCII code \T{\^}$ab$ (where $a$ and $b$ are
760 hexadecimal digits, and $a\ge8$).  By placing the
761 construction \.{@l\ ab\ newstring} in limbo, you are telling
762 \.{CTANGLE} to replace this character by \.{newstring} instead.
763 For example, the ISO Latin-1 code for the letter `\"u' is \T{\^FC}
764 (or \.{'\char`\\374'}),
765 and \.{CTANGLE} will normally change this code to the
766 three-character sequence \.{XFC} if it
767 appears in an identifier. If you say \.{@l} \.{fc} \.{ue}, the code will
768 be transliterated into \.{ue} instead.
769
770 \more
771 \.{CWEAVE} passes 8-bit characters straight through to \TEX/ without
772 transliteration; therefore \TEX/ must be prepared to receive them.
773 If you are formatting all your nonstandard identifiers as ``custom''
774 control sequences, you should
775 make \TEX/ treat all their characters as letters. Otherwise you should either
776 make your 8-bit codes ``active'' in \TEX/, or load fonts that
777 contain the special characters you need in the correct positions.
778 (The font selected by \TEX/ control sequence \.{\\it} is used for
779 identifiers.)
780 Look for special macro packages designed for \.{CWEB} users in your language;
781 or, if you are brave, write one yourself.
782
783 \subsec
784 The next eight control codes (namely `\.{@,}', `\.{@/}', `\.{@|}', `\.{@\#}',
785 `\.{@+}', `\.{@;}', `\.{@[}', and `\.{@]}') have no effect on the \CEE/
786 program output by \.{CTANGLE}; they merely help to improve the readability
787 of the \TEX/-formatted \CEE/ that is output by \.{CWEAVE}, in unusual
788 circumstances. \.{CWEAVE}'s built-in formatting method is fairly good
789 when dealing with syntactically correct \CEE/ text, but
790 it is incapable of handling all possible cases, because it must deal with
791 fragments of text involving macros and section names; these fragments do
792 not necessarily obey \CEE/'s syntax. Although \.{CWEB} allows you to
793 override the automatic formatting, your best strategy is not to worry
794 about such things until you have seen what \.{CWEAVE} produces automatically,
795 since you will probably need to make only a few corrections when you are
796 touching up your documentation.
797
798 \@, [MCc] This control code inserts a thin space in \.{CWEAVE}'s output.
799 Sometimes you need this extra space if you are using
800 macros in an unusual way, e.g., if two identifiers are adjacent.
801
802 \@/ [MC] This control code causes a line break to occur within a \CEE/
803 program formatted by \.{CWEAVE}. Line breaks
804 are chosen automatically by \TEX/ according to a scheme that works 99\%\
805 of the time, but sometimes you will prefer to force a line break so that
806 the program is segmented according to logical rather than visual
807 criteria. If a comment follows, say `\.{@/@,}' to break the line
808 before the comment.
809
810 \@| [MC] This control code specifies an optional line break in the midst of
811 an expression. For example, if you have
812 a long expression on the right-hand side of an assignment
813 statement, you can use `\.{@|}' to specify breakpoints more logical than
814 the ones that \TEX/ might choose on visual grounds.
815
816 \@\# [MC] This control code forces a line break, like \.{@/} does,
817 and it also causes a little extra white space to appear between the lines at
818 this break. You might use it, for example,
819 between groups of macro definitions that are logically separate but within
820 the same section. \.{CWEB} automatically inserts this extra space
821 between functions, between external declarations and functions, and
822 between declarations and statements within a function.
823
824 \@+ [MC] This control code cancels a line break that might otherwise be
825 inserted by \.{CWEAVE}, e.g., before the word `\&{else}', if you want to
826 put a short if--else construction on a single line.
827 If you say `\.{\{@+}' at the beginning of a compound statement
828 that is the body of a function, the first declaration or
829 statement of the function will appear on the same line as the
830 left brace, and it will be indented by the same amount as the
831 second declaration or statement on the next line.
832
833 \@; [MC] This control code is treated like a semicolon, for formatting
834 purposes, except that it is invisible. You can use it, for example, after
835 a section name or macro when the \CEE/ text represented by that section or macro
836 is a compound statement or ends
837 with a semicolon. Consider constructions like
838 $$\lpile{\.{if (condition) macro @;}\cr
839 \.{else break;}\cr}$$
840 where \\{macro} is defined to be a compound statement (enclosed in braces).
841 This is a well-known infelicity of \CEE/ syntax.
842
843 \@{[} [MC] See \.{@]}.
844
845 \@] [MC] Place \.{@[...@]} brackets around program text that \.{CWEAVE} is
846 supposed to format as an expression, if it doesn't already do so. (This
847 occasionally applies to unusual macro arguments.) Also
848 insert `\.{@[@]}' between a simple type name and a left parenthesis
849 when declaring a pointer to a function, as in
850 $$\.{int @[@] (*f)();}$$
851 otherwise \.{CWEAVE} will confuse the first part of that declaration with
852 the \CPLUSPLUS/ expression `\&{int}($*f$)'. Another example, for people
853 who want to use low-level \.{\#define} commands in the midst of \CEE/ code
854 and the definition begins with a cast:
855 $$\.{\#define foo @[(int)(bar)@]}$$
856
857 \subsec
858 The remaining control codes govern the input that \.{CWEB} sees.
859
860 \@{x @y @z}[\\{change\_file}]
861 \.{CWEAVE} and \.{CTANGLE} are designed to work with two input files,
862 called \\{web\_file} and \\{change\_file}, where \\{change\_file} contains
863 data that overrides selected portions of \\{web\_file}. The resulting merged
864 text is actually what has been called the \.{CWEB} file elsewhere in this
865 report.
866
867 \more Here's how it works: The change file consists of zero or more ``changes,''
868 where a change has the form `\.{@x}$\langle$old lines$\rangle$\.{@y}$\langle$%
869 new lines$\rangle$\.{@z}'. The special control codes \.{@x}, \.{@y}, \.{@z},
870 which are allowed only in change files, must appear at the beginning of a line;
871 the remainder of such a line is ignored.
872 The $\langle$old lines$\rangle$ represent material that exactly matches
873 consecutive lines of the \\{web\_file}; the $\langle$new lines$\rangle$
874 represent zero or more lines that are supposed to replace the old. Whenever
875 the first ``old line'' of a change is found to match a line in the
876 \\{web\_file}, all the other lines in that change must match too.
877
878 \more Between changes, before the first change, and after the last change,
879 the change file can have any number of lines that do not begin with
880 `\.{@x}', `\.{@y}', or~`\.{@z}'. Such lines are bypassed and not used for
881 matching purposes.
882
883 \more This dual-input feature is useful when working with a master \.{CWEB}
884 file that has been received from elsewhere (e.g., \.{tangle.w} or
885 \.{weave.w} or \.{tex.web}), when changes are desirable to customize the
886 program for your local computer system. You will be able to debug your
887 system-dependent changes without clobbering the master web file; and once
888 your changes are working, you will be able to incorporate them readily
889 into new releases of the master web file that you might receive from time
890 to time.
891
892 \@i [\\{web\_file}]
893 Furthermore the \\{web\_file} itself can be a combination of
894 several files.  When either \.{CWEAVE} or \.{CTANGLE} is reading a file and
895 encounters the control code \.{@i} at the beginning of a line, it
896 interrupts normal reading and starts looking at the file named after the
897 \.{@i}, much as the \CEE/ preprocessor does when it encounters an \.{\#include}
898 line.  After the included file has been entirely read, the program
899 goes back to the next line
900 of the original file.  The file name following \.{@i} can be
901 surrounded by \." characters, but such delimiters are
902 optional. Include files can nest.
903
904 \more
905 Change files can have lines starting with \.{@i}. In this way
906 you can replace one included file with another. Conceptually, the
907 replacement mechanism described above does its work first, and
908 its output is then checked for \.{@i} lines. If \.{@i} \.{foo}
909 occurs between \.{@y} and \.{@z} in a change file, individual lines
910 of file \.{foo} and files it includes are not changeable; but changes
911 can be made to lines from files that were included by unchanged input.
912
913 \more On \UNIX/ systems (and others that support environment variables),
914 if the environment variable \.{CWEBINPUTS} is set, or if the compiler flag
915 of the same name was defined at compile time,
916 \.{CWEB} will look for include files in the directory thus named, if
917 it cannot find them in the current directory.
918
919 \section Additional features and caveats.
920
921 1. In certain installations of \.{CWEB} that
922 {\def\\#1#2{`{\tentex\char'#1#2}'}%
923 have an extended character set, the characters
924 \\13, \\01, \\31, \\32, \\34, \\35,
925 \\36, \\37, \\04, \\20, and \\21}
926 can be typed as abbreviations for `\.{++}', `\.{--}', `\.{->}',
927 `\.{!=}', `\.{<=}', `\.{>=}', `\.{==}', `\.{\v\v}', `\.{\&\&}',
928 `\.{<<}', and `\.{>>}',
929 respectively.
930
931 2. If you have an extended character set, you can use it with only minimal
932 restrictions, as discussed under the rules for \.{@l} above. But you should
933 stick to standard ASCII characters if you want to write programs that will
934 be useful to all the poor souls out there who don't have extended
935 character sets.
936
937 3. The \TEX/ file output by \.{CWEAVE} is broken into lines having at most
938 80 characters each. When
939 \TEX/ text is being copied, the existing line breaks are copied as well.
940 If you aren't doing anything too tricky, \.{CWEAVE} will recognize when
941 a \TEX/ comment is being split across two or more lines, and it will
942 append `\.\%' to the beginning of such continued comments.
943
944 4. \CEE/ text is translated by a ``bottom up'' procedure that
945 identifies each token as a ``part of speech'' and combines parts of speech
946 into larger and larger phrases as much as possible according to a special
947 grammar that is explained in the documentation of \.{CWEAVE}. It is easy to
948 learn the translation scheme for simple constructions like single
949 identifiers and short expressions, just by looking at a few examples of
950 what \.{CWEAVE} does, but the general mechanism is somewhat complex because
951 it must handle much more than \CEE/ itself. Furthermore the output
952 contains embedded codes that cause \TEX/ to indent and break lines as
953 necessary, depending on the fonts used and the desired page width. For
954 best results it is wise to avoid enclosing long \CEE/ texts in \pb, since the
955 indentation and line breaking codes are omitted when the \pb\ text is
956 translated from \CEE/ to \TEX/. Stick to simple expressions or
957 statements.  If a \CEE/ preprocessor command is enclosed in \pb,
958 the \.\# that introduces it must be at the beginning of a line,
959 or \.{CWEAVE} won't print it correctly.
960
961 5. Comments are not permitted in \pb\ text. After a `\.|'
962 signals the change from \TEX/ text to \CEE/ text, the next `\.|' that is
963 not part of a string or control text or section name ends the \CEE/ text.
964
965 6. A comment must have properly nested occurrences of left and right
966 braces, otherwise \.{CWEAVE} will complain. But it
967 does try to balance the braces, so that \TEX/ won't foul up too much.
968
969 7. When you're debugging a program and decide to omit some of your
970 \CEE/ code, do NOT simply ``comment it out.'' Such comments are not
971 in the spirit of \.{CWEB} documentation; they will appear to readers
972 as if they were explanations of the uncommented-out instructions.
973 Furthermore, comments of a program must be valid \TEX/ text; hence
974 \.{CWEAVE} will get confused if you enclose \CEE/ statements in
975 \.{/*...*/} instead of in \.{/*|...|*/}.  If you must comment out
976 \CEE/ code, you can surround it with preprocessor commands
977 like \.{\#if 0==1} and \.{\#endif}.
978
979 8. The \.{@f} feature allows you to define one identifier to act like
980 another, and these format definitions are carried out sequentially.
981 In general, a given identifier has only one printed format
982 throughout the entire document, and this format is used even before
983 the \.{@f} that defines it. The reason is that \.{CWEAVE} operates in two
984 passes; it processes \.{@f}'s and cross-references on the first pass and
985 it does the output on the second.  (However, identifiers that
986 implicitly get a boldface format, thanks to a \.{typedef} declaration,
987 don't obey this rule; they are printed differently before and after
988 the relevant \.{typedef}.  This is unfortunate, but hard to fix. You can
989 get around the restriction by saying, say, `\.{@s} \.{foo} \.{int}',
990 before or after the \.{typedef}.)
991
992 9. Sometimes it is desirable to insert spacing into formatted \CEE/ code that
993 is more general than the thin space provided by `\.{@,}'. The \.{@t} feature
994 can be used for this purpose; e.g., `\.{@t\\hskip 1in@>}' will
995 leave one inch of blank space. Furthermore, `\.{@t\\4@>}' can be
996 used to backspace by one unit of indentation, since the control sequence
997 \.{\\4} is defined in \.{cwebmac} to be such a backspace. (This
998 control sequence is used, for example, at the beginning of lines that
999 contain labeled statements, so that the label will stick out a little at
1000 the left.) You can also use `\.{@t\}\\3\{-5@>}' to force a break
1001 in the middle of an expression.
1002
1003 10. Each identifier in \.{CWEB} has a single formatting convention. Therefore
1004 you shouldn't use the same identifier to denote, say, both a type name and
1005 part of a \.{struct}, even though \CEE/ does allow this.
1006
1007 \section Running the programs.
1008 The \UNIX/ command line for \.{CTANGLE} is
1009 $$\.{ctangle [options] web\_file[.w] [\{change\_file[.ch]|-\} [out\_file]]}$$
1010 and the same conventions apply to \.{CWEAVE}. If `\.-' or no change file is
1011 specified, the change file is null. The extensions \.{.w} and \.{.ch}
1012 are appended only if the given file names contain no dot. If the
1013 web file defined in this way cannot be found, the extension \.{.web}
1014 will be tried. For example, `\.{cweave} \.{cob}' will try to read
1015 \.{cob.w}; failing that, it will try \.{cob.web} before giving up.
1016 If no output file name is specified, the name of the \CEE/ file output by
1017 \.{CTANGLE} is obtained by appending the extension \.{.c};
1018 the name of the \TEX/ file output by \.{CWEAVE} gets the extension \.{.tex}.
1019 Index files output by \.{CWEAVE} replace \.{.tex} by \.{.idx} and \.{.scn}.
1020
1021 Programmers who like terseness might choose to set up their
1022  operating shell so that `\.{wv}' expands to
1023 `\.{cweave -bhp}'; this will suppress most terminal output from \.{CWEAVE}
1024 except for error messages.
1025
1026 Options are introduced either by a \.- sign, to turn an option off,
1027 or by a \.+ sign to turn one on. For example, `\.{-fb}' turns off
1028 options \.f and \.b; `\.{+s}' turns on option \.s. Options can be
1029 specified before the file names, after the file names, or both. The following
1030 options are currently implemented:
1031
1032 \yskip
1033 \def\option#1 {\textindent{\.#1}\hangindent2\parindent}
1034
1035 \option b Print a banner line at the beginning of execution. (On
1036 by default.)
1037
1038 \option e Enclose \CEE/ material formatted by \.{CWEAVE} in
1039 brackets \.{\\PB\{...\}}, so that special hooks can be used.
1040 (Off by default; has no effect on \.{CTANGLE}.)
1041
1042 \option f Force line breaks after each \CEE/ statement formatted
1043 by \.{CWEAVE}. (On by default; \.{-f} saves paper but looks less \CEE/-like
1044 to some people.) (Has no effect on \.{CTANGLE}.)
1045
1046 \option h Print a happy message at the conclusion of a successful
1047 run. (On by default.)
1048
1049 \option p Give progress reports as the program runs. (On by default.)
1050
1051 \option s Show statistics about memory usage after the program
1052 runs to completion. (Off by default.)
1053 If you
1054 have large \.{CWEB} files or sections, you may need to see
1055 how close you come to exceeding the capacity of \.{CTANGLE} and/or \.{CWEAVE}.
1056
1057 \option x Include indexes and a table of contents in the \TEX/ file
1058 output by \.{CWEAVE}. (On by default.) (Has no effect on \.{CTANGLE}.)
1059
1060 \section Further details about formatting.
1061 You may not like the way \.{CWEAVE} handles certain
1062 situations. If you're desperate, you can customize \.{CWEAVE}
1063 by changing its grammar.  This means changing the source code,
1064 a task that you might find amusing. A table of grammar rules
1065 appears in the \.{CWEAVE} source listing, and you can make a separate
1066 copy of that table by copying the file \.{prod.w} found in the \.{CWEB}
1067 sources and saying `\.{cweave}~\.{-x}~\.{prod}', followed by
1068 `\.{tex}~\.{prod}'.
1069
1070 You can see exactly
1071 how \.{CWEAVE} is parsing your \CEE/ code by preceding
1072 it with the line `\.{@ @c @2}'. (The control code `\.{@2}'
1073 turns on a ``peeping'' mode, and `\.{@0}' turns it off.)
1074 For example, if you run \.{CWEAVE} on the file
1075 \medskip
1076 \begingroup
1077 \verbatim
1078 @ @c @2
1079 main (argc,argv)
1080 char **argv;
1081 { for (;argc>0;argc--) printf("%s\n",argv[argc-1]); }
1082 !endgroup
1083 \endgroup
1084 \medskip\noindent
1085 you get the following gibberish on your screen:
1086 \medskip
1087 \begingroup
1088 \verbatim
1089 [...]
1090 4:*exp ( +exp+ )...
1091 11:*exp +exp+ int...
1092 5:*+exp+ int +unorbinop+...
1093 [...]
1094 60: +fn_decl+*+{+ -stmt- +}-
1095 55:*+fn_decl+ -stmt-
1096 52:*+function-
1097 [...]
1098 !endgroup
1099 \endgroup
1100 \medskip
1101 The first line says that grammar rule 4 has just been applied, and \.{CWEAVE}
1102 currently has in its memory a sequence of chunks of \TEX/ code (called
1103 ``scraps'') that are respectively
1104 of type \\{exp} (for expression), open-parenthesis,
1105 \\{exp} again, close-parenthesis, and further scraps that haven't yet
1106 been considered by the parser.  (The \.+ and \.- signs stipulate that
1107 \TEX/ should be in or out of math mode at the scrap boundaries. The \.* shows
1108 the parser's current position.)
1109 Then rule 11 is applied, and
1110 the sequence $(\,exp\,)$ becomes an \\{exp} and so on.  In the
1111 end the whole \CEE/ text has become one big scrap of type \\{function}.
1112
1113 Sometimes things don't work as smoothly, and you get a bunch of
1114 lines lumped together.  This means that \.{CWEAVE} could not
1115 digest something in your \CEE/ code.  For instance, suppose
1116 `\.{@<Argument definitions@>}' had appeared instead of
1117 `\.{char **argv;}' in the program above. Then \.{CWEAVE} would have
1118 been somewhat mystified, since it thinks that section names
1119 are just \\{exp}s.  Thus it would tell \TEX/ to format
1120 `\X2:Argument declarations\X' on the same line as
1121 `$\\{main}(\\{argc},\39\\{argv}{}$)'.
1122 In this case you should help \.{CWEAVE} by putting `\.{@/}' after
1123 `\.{main(argc,argv)}'.
1124
1125 \.{CWEAVE} automatically inserts a bit of extra space between declarations
1126 and the first apparent statement of a block. One way to defeat this
1127 spacing locally is
1128 $$\vbox{\halign{#\hfil\cr
1129 \.{int x;@+@t\}\\6\{@>}\cr
1130 \.{@<Other locals@>@;@\#}\cr}}$$
1131 the `\.{@\#}' will put extra space after `$\langle\,$Other locals$\,\rangle$'.
1132
1133 \section Hypertext and hyperdocumentation.
1134
1135 Many people have of course noticed analogies between \.{CWEB} and the
1136 World Wide Web. The \.{CWEB} macros are in fact set up so that the output of
1137 \.{CWEAVE} can be converted easily into Portable Document Format,
1138 with clickable hyperlinks that can be read with Adobe's Acrobat Reader,
1139 using a widely available open-source program called \.{dvipdfm} developed
1140 by Mark~A. Wicks. After using \.{CWEAVE} to convert \.{cob.w} into
1141 \.{cob.tex}, you can prepare and view a hypertext version of the program
1142 by giving the commands
1143 $$\vbox{\halign{\.{#}\hfil\cr
1144 tex "\\let\\pdf+ \\input cob"\cr
1145 dvipdfm cob\cr
1146 acroread cob.pdf\cr}}$$
1147 instead of invoking \TeX\ in the normal way. (Thanks to Hans Hagen,
1148 C\'esar Augusto Rorato Crusius, and Julian Gilbey
1149 for the macros that make this work.)
1150 Alternatively, thanks to H\`an Th\^e\kern-.3em\raise.3ex\hbox{\'{}} Th\`anh
1151 and Andreas Scherer, you can generate \.{cob.pdf} in one step by simply
1152 saying `\.{pdftex}~\.{cob}'.
1153
1154 A more elaborate system called \.{CTWILL}, which extends the usual cross
1155 references of \.{CWEAVE} by preparing links from the uses of identifiers
1156 to their definitions, is also available---provided that you are willing
1157 to work a bit harder in cases where an identifier is multiply defined.
1158 \.{CTWILL} is intended primarily for hardcopy output, but its principles
1159 could be used for hypertext as well.
1160 See Chapter 11 of {\sl Digital Typography\/} by D.~E. Knuth (1999), and
1161 the program sources at \.{ftp://ftp.cs.stanford.edu/pub/ctwill}.
1162
1163 \section Appendices.
1164
1165 As an example of a real program written in \.{CWEB}, Appendix~A
1166 contains an excerpt from the \.{CWEB} program itself.  The reader who
1167 examines the listings in this appendix carefully will get a good
1168 feeling for the basic ideas of \.{CWEB}.
1169
1170 Appendix B is the file that sets \TEX/ up to accept
1171 the output of \.{CWEAVE}, and Appendix~C discusses how to use some of those
1172 macros to vary the output formats.
1173
1174 A ``long'' version of this manual, which can be produced from the \.{CWEB}
1175 sources via the \UNIX/ command \.{make} \.{fullmanual}, also contains
1176 appendices D, E, and~F, which exhibit the complete source code for
1177 \.{CTANGLE} and \.{CWEAVE}.
1178
1179 \vfil\eject\titletrue
1180
1181 \def\runninghead{APPENDIX A --- {\tentt CWEB} FILE FORMAT}
1182 \section Appendix A: Excerpts from a \.{CWEB} Program.
1183
1184 This appendix consists
1185 of four listings.  The first shows the \.{CWEB} input that
1186 generated sections 12--15 of the file \.{common.w}, which contains
1187 routines common to \.{CWEAVE} and \.{CTANGLE}.
1188 Note that some of the lines are indented to show the program structure;
1189 the indentation is ignored by \.{CWEAVE} and \.{CTANGLE}, but users find
1190 that \.{CWEB} files are quite readable if they have some such indentation.
1191
1192 The second and third listings
1193 show corresponding parts
1194 of the \CEE/ code output by \.{CTANGLE} and of
1195 the corresponding \TEX/ code output by \.{CWEAVE}, when run on \.{common.w}.
1196 The fourth listing shows how that output looks when printed out.
1197
1198 \vskip 6pt
1199 \begingroup \def\tt{\eighttt} \baselineskip9pt
1200 \verbatim
1201 @ Procedure |prime_the_change_buffer|
1202 sets |change_buffer| in preparation for the next matching operation.
1203 Since blank lines in the change file are not used for matching, we have
1204 |(change_limit==change_buffer && !!changing)| if and only if
1205 the change file is exhausted. This procedure is called only when
1206 |changing| is 1; hence error messages will be reported correctly.
1207
1208 @c
1209 void
1210 prime_the_change_buffer()
1211 {
1212   change_limit=change_buffer; /* this value is used if the change file ends */
1213   @<Skip over comment lines in the change file; |return| if end of file@>;
1214   @<Skip to the next nonblank line; |return| if end of file@>;
1215   @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>;
1216 }
1217
1218 @ While looking for a line that begins with \.{@@x} in the change file, we
1219 allow lines that begin with \.{@@}, as long as they don't begin with \.{@@y},
1220 \.{@@z}, or \.{@@i} (which would probably mean that the change file is fouled up).
1221
1222 @<Skip over comment lines in the change file...@>=
1223 while(1) {
1224   change_line++;
1225   if (!!input_ln(change_file)) return;
1226   if (limit<buffer+2) continue;
1227   if (buffer[0]!!='@@') continue;
1228   if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
1229   if (buffer[1]=='x') break;
1230   if (buffer[1]=='y' || buffer[1]=='z' || buffer[1]=='i') {
1231     loc=buffer+2;
1232     err_print("!! Missing @@x in change file");
1233 @.Missing @@x...@>
1234   }
1235 }
1236
1237 @ Here we are looking at lines following the \.{@@x}.
1238
1239 @<Skip to the next nonblank line...@>=
1240 do {
1241   change_line++;
1242   if (!!input_ln(change_file)) {
1243     err_print("!! Change file ended after @@x");
1244 @.Change file ended...@>
1245     return;
1246   }
1247 } while (limit==buffer);
1248
1249 @ @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>=
1250 {
1251   change_limit=change_buffer-buffer+limit;
1252   strncpy(change_buffer,buffer,limit-buffer+1);
1253 }
1254
1255 !endgroup
1256 \endgroup
1257 \vfill\eject
1258
1259 \def\runninghead{APPENDIX A  --- TRANSLATION BY {\tentt CTANGLE}}
1260
1261 Here's the portion of the \CEE/ code generated by \.{CTANGLE} that corresponds
1262 to the source on the preceding page.  Notice that sections~13, 14 and~15
1263 have been tangled into section~12.
1264
1265 \vskip6pt
1266 \begingroup \def\tt{\eighttt} \baselineskip9pt
1267 \verbatim
1268 /*:9*//*12:*/
1269 #line 247 "common.w"
1270
1271 void
1272 prime_the_change_buffer()
1273 {
1274 change_limit= change_buffer;
1275 /*13:*/
1276 #line 261 "common.w"
1277
1278 while(1){
1279 change_line++;
1280 if(!!input_ln(change_file))return;
1281 if(limit<buffer+2)continue;
1282 if(buffer[0]!!='@')continue;
1283 if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
1284 if(buffer[1]=='x')break;
1285 if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
1286 loc= buffer+2;
1287 err_print("!! Missing @x in change file");
1288
1289 }
1290 }
1291
1292 /*:13*/
1293 #line 252 "common.w"
1294 ;
1295 /*14:*/
1296 #line 278 "common.w"
1297
1298 do{
1299 change_line++;
1300 if(!!input_ln(change_file)){
1301 err_print("!! Change file ended after @x");
1302
1303 return;
1304 }
1305 }while(limit==buffer);
1306
1307 /*:14*/
1308 #line 253 "common.w"
1309 ;
1310 /*15:*/
1311 #line 288 "common.w"
1312
1313 {
1314 change_limit= change_buffer-buffer+limit;
1315 strncpy(change_buffer,buffer,limit-buffer+1);
1316 }
1317
1318 /*:15*/
1319 #line 254 "common.w"
1320 ;
1321 }
1322
1323 /*:12*//*16:*/
1324 !endgroup
1325 \endgroup
1326 \vfill\eject
1327
1328 \def\runninghead{APPENDIX A --- TRANSLATION BY {\tentt CWEAVE}}
1329
1330 Here is the corresponding excerpt from \.{common.tex}.
1331
1332 \vskip6pt
1333 \begingroup \def\tt{\eighttt} \baselineskip9pt
1334 \verbatim
1335 \M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
1336 sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
1337 Since blank lines in the change file are not used for matching, we have
1338 \PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
1339 the change file is exhausted. This procedure is called only when
1340 \PB{\\{changing}} is 1; hence error messages will be reported correctly.
1341 !vskip-.5!baselineskip
1342 \Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
1343 ${}\{{}$\1\6
1344 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
1345 change file ends }\6
1346 \X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
1347 \X;\6
1348 \X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
1349 \X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
1350 \PB{\\{change\_limit}}\X;\6
1351 \4${}\}{}$\2\par
1352 \fi
1353 !vskip-.5!baselineskip
1354 \M{13}While looking for a line that begins with \.{@x} in the change file, we
1355 allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
1356 \.{@z}, or \.{@i} (which would probably mean that the change file is fouled
1357 up).
1358 !vskip-.5!baselineskip
1359 \Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
1360 of file\X${}\E{}$\6
1361 \&{while} (\T{1})\5
1362 ${}\{{}$\1\6
1363 ${}\\{change\_line}\PP;{}$\6
1364 \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\1\5
1365 \&{return};\2\6
1366 \&{if} ${}(\\{limit}<\\{buffer}+\T{2}){}$\1\5
1367 \&{continue};\2\6
1368 \&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
1369 \&{continue};\2\6
1370 \&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
1371 ${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
1372 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
1373 \&{break};\2\6
1374 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
1375 \T{1}]\E\.{'i'}){}$\5
1376 ${}\{{}$\1\6
1377 ${}\\{loc}\K\\{buffer}+\T{2};{}$\6
1378 \\{err\_print}(\.{"!!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
1379 \4${}\}{}$\2\6
1380 \4${}\}{}$\2\par
1381 \U12.\fi
1382 !vskip-.5!baselineskip
1383 \M{14}Here we are looking at lines following the \.{@x}.
1384 !vskip-.5!baselineskip
1385 \Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
1386 \E{}$\6
1387 \&{do}\5
1388 ${}\{{}$\1\6
1389 ${}\\{change\_line}\PP;{}$\6
1390 \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
1391 ${}\{{}$\1\6
1392 \\{err\_print}(\.{"!!\ Change\ file\ ended}\)\.{\ after\ @x"});\6
1393 \&{return};\6
1394 \4${}\}{}$\2\6
1395 \4${}\}{}$\2\5
1396 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
1397 \U12.\fi
1398 !vskip-.5!baselineskip
1399 \M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
1400 and \PB{\\{change\_limit}}\X${}\E{}$\6
1401 ${}\{{}$\1\6
1402 ${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
1403 ${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
1404 \T{1});{}$\6
1405 \4${}\}{}$\2\par
1406 \Us12\ET16.\fi
1407 !endgroup
1408 \endgroup
1409 \vfil\eject
1410
1411 \def\runninghead{APPENDIX A --- FINAL DOCUMENT}
1412
1413 And here's what the same excerpt looks like when typeset.
1414
1415 \M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
1416 sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
1417 Since blank lines in the change file are not used for matching, we have
1418 \PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
1419 the change file is exhausted. This procedure is called only when
1420 \PB{\\{changing}} is 1; hence error messages will be reported correctly.
1421
1422 \Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
1423 ${}\{{}$\1\6
1424 ${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
1425 change file ends }\6
1426 \X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
1427 \X;\6
1428 \X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
1429 \X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
1430 \PB{\\{change\_limit}}\X;\6
1431 \4${}\}{}$\2\par
1432 \fi
1433
1434 \M{13}While looking for a line that begins with \.{@x} in the change file, we
1435 allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
1436 \.{@z}, or \.{@i} (which would probably mean that the change file is fouled up).
1437
1438 \Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
1439 of file\X${}\E{}$\6
1440 \&{while} (\T{1})\5
1441 ${}\{{}$\1\6
1442 ${}\\{change\_line}\PP;{}$\6
1443 \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\1\5
1444 \&{return};\2\6
1445 \&{if} ${}(\\{limit}<\\{buffer}+\T{2}){}$\1\5
1446 \&{continue};\2\6
1447 \&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
1448 \&{continue};\2\6
1449 \&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
1450 ${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
1451 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
1452 \&{break};\2\6
1453 \&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
1454 \T{1}]\E\.{'i'}){}$\5
1455 ${}\{{}$\1\6
1456 ${}\\{loc}\K\\{buffer}+\T{2};{}$\6
1457 \\{err\_print}(\.{"!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
1458 \4${}\}{}$\2\6
1459 \4${}\}{}$\2\par
1460 \U12.\fi
1461
1462 \M{14}Here we are looking at lines following the \.{@x}.
1463
1464 \Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
1465 \E{}$\6
1466 \&{do}\5
1467 ${}\{{}$\1\6
1468 ${}\\{change\_line}\PP;{}$\6
1469 \&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
1470 ${}\{{}$\1\6
1471 \\{err\_print}(\.{"!\ Change\ file\ ended}\)\.{\ after\ @x"});\6
1472 \&{return};\6
1473 \4${}\}{}$\2\6
1474 \4${}\}{}$\2\5
1475 \&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
1476 \U12.\fi
1477
1478 \M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
1479 and \PB{\\{change\_limit}}\X${}\E{}$\6
1480 ${}\{{}$\1\6
1481 ${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
1482 ${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
1483 \T{1});{}$\6
1484 \4${}\}{}$\2\par
1485 \Us12\ET16.\fi
1486
1487 \vfil\eject\titletrue
1488 \rightskip=0pt % get out of C mode (cf. \B)
1489 \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
1490
1491 \def\runninghead{APPENDIX B --- MACROS FOR FORMATTING}
1492 \section Appendix B: The \.{cwebmac.tex} file.
1493 This is the file that extends ``plain \TEX/'' format in order to support the
1494 features needed by the output of \.{CWEAVE}.
1495
1496 \vskip6pt
1497 \begingroup \def\tt{\eighttt} \baselineskip9pt
1498 \def\printmacs{\begingroup
1499   \def\do##1{\catcode`##1=12 } \dospecials
1500   \parskip 0pt \parindent 0pt
1501   \catcode`\ =13 \catcode`\^^M=13
1502   \tt \verbatimdefs \input cwebmac \endgroup}
1503 \printmacs
1504 \endgroup
1505 \vfill\eject
1506
1507 \def\runninghead{APPENDIX C --- NOTES ON FORMATTING}
1508 \section Appendix C: How to use \.{CWEB} macros.
1509 The macros in \.{cwebmac} make it possible to produce a variety of formats
1510 without editing the output of \.{CWEAVE}, and the purpose of this appendix
1511 is to explain some of the possibilities.
1512
1513 \def\point#1.{\yskip\indent#1.\quad\ignorespaces}
1514
1515 \point 1. Four fonts have been declared in addition to the standard fonts of
1516 \.{PLAIN} format: You can say `\.{\{\\mc UNIX\}}' to get {\mc UNIX} in
1517 xmedium-size caps; you can say `\.{\{\\sc STUFF\}}' to get {\sc STUFF}
1518 in small caps; and you can select the largish fonts \.{\\titlefont}
1519 and \.{\\ttitlefont} in the title of your document, where \.{\\ttitlefont}
1520 is a typewriter style of type. There are macros \.{\\UNIX/} and \.{\\CEE/}
1521 to refer to \UNIX/ and \CEE/ with medium-size caps.
1522
1523 \point 2. When you mention an identifier in \TEX/ text, you normally call
1524 it `\.{|identifier|}'. But you can also say `\.{\\\\\{identifier\}}'. The
1525 output will look the same in both cases, but the second alternative
1526 doesn't put \\{identifier} into the index, since
1527 it bypasses \.{CWEAVE}'s translation from \CEE/ mode. In the second
1528 case you must put a backslash before each underline character
1529 in the identifier.
1530
1531 \point 3. To get typewriter-like type, as when referring to `\.{CWEB}', you
1532 can use the `\.{\\.}' macro (e.g., `\.{\\.\{CWEB\}}'). In the argument to
1533 this macro you should insert an additional backslash before the symbols
1534 listed as `special string characters' in the index to \.{CWEAVE}, i.e.,
1535 before backslashes and dollar signs and the like.
1536 A `\.{\\\ }' here will result in the visible space symbol; to get an
1537 invisible space following a control sequence you can say `\.{\{\ \}}'.
1538 If the string is long, you can break it up into substrings that
1539 are separated by `\.{\\)}'\,; the latter gives a discretionary backslash
1540 if \TEX/ has to break a line here.
1541
1542 \point 4. The three control sequences \.{\\pagewidth}, \.{\\pageheight},
1543 and \.{\\fullpageheight} can be redefined in the limbo section at the
1544 beginning of your \.{CWEB} file, to change the dimensions of each page.
1545 The default settings
1546 $$\lpile{\.{\\pagewidth=6.5in}\cr
1547   \.{\\pageheight=8.7in}\cr
1548   \.{\\fullpageheight=9in}\cr}$$
1549 were used to prepare this manual; \.{\\fullpageheight} is
1550 \.{\\pageheight} plus room for the additional heading and page numbers at
1551 the top of each page. If you change any of these quantities, you should
1552 call the macro \.{\\setpage} immediately after making the change.
1553
1554 \point 5. The \.{\\pageshift} macro defines an amount by which right-hand
1555 pages (i.e., odd-numbered pages) are shifted right with respect to
1556 left-hand (even-numbered) ones. By adjusting this amount you may be
1557 able to get two-sided output in which the page numbers line up on
1558 opposite sides of each sheet.
1559
1560 \point 6. The \.{\\title} macro will appear at the top of each page
1561 in small caps; it is the job name unless redefined.
1562
1563 \point 7. The first page usually is assigned page
1564 number 1. To start on page 16, with contents
1565 on page 15, say this: `\.{\\def\\contentspagenumber\{15\}}
1566 \.{\\pageno=\\contentspagenumber} \.{\\advance\\pageno by 1}'.
1567
1568 \point 8. The macro \.{\\iftitle} will suppress the header line if it is
1569 defined by `\.{\\titletrue}'. The normal value is \.{\\titlefalse}
1570 except for the table of contents; thus, the contents
1571 page is usually unnumbered.
1572
1573 Two macros are provided to give flexibility to the table of
1574 contents: \.{\\topofcontents} is invoked just before the contents
1575 info is read, and \.{\\botofcontents} is invoked just after.
1576 Here's a typical definition:
1577 $$\lpile{\.{\\def\\topofcontents\{\\null\\vfill}\cr
1578   \.{ { }\\titlefalse \% include headline on the contents page}\cr
1579   \.{ { }\\def\\rheader\{\\mainfont The \{\\tt CWEAVE\}{ }processor\\hfil\}}\cr
1580   \.{ { }\\centerline\{\\titlefont The \{\\ttitlefont CWEAVE\}{ }processor\}}\cr
1581   \.{ { }\\vskip 15pt \\centerline\{(Version 3.64)\}{ }\\vfill\}}\cr}$$
1582 Redefining \.{\\rheader}, which is the headline for right-hand pages,
1583 suffices in this case to put the desired information at the top of the
1584 contents page.
1585
1586 \point 9. Data for the table of contents is written to a file that
1587 is read after the indexes have been \TEX/ed; there's one line of data
1588 for every starred section. The file \.{common.toc} might look like this:
1589 $$\lpile{\.{\\ZZ \{Introduction\}\{0\}\{1\}\{28\}\{\}}\cr
1590   \.{\\ZZ \{The character set\}\{2\}\{5\}\{29\}\{\}}\cr}$$
1591 and so on. The \.{\\topofcontents} macro could
1592 redefine \.{\\ZZ} so that the information appears in any desired format.
1593 (See also point~19 below.)
1594
1595 \point 10. Sometimes it is necessary or desirable to divide the output of
1596 \.{CWEAVE} into subfiles that can be processed separately. For example,
1597 the listing of \TEX/ runs to more than 500 pages, and that is enough to
1598 exceed the capacity of many printing devices and/or their software.
1599 When an extremely large job isn't cut into smaller pieces, the entire
1600 process might be spoiled by a single error of some sort, making it
1601 necessary to start everything over.
1602
1603 Here's a safe way to break a woven file into three parts:
1604 Say the pieces are $\alpha$,
1605 $\beta$, and $\gamma$, where each piece begins with a starred section.
1606 All macros should be defined in the opening limbo section of $\alpha$,
1607 and copies of this \TEX/ code should be placed at the
1608 beginning of $\beta$ and of $\gamma$. In order to process the parts
1609 separately, we need to take care of two things: The starting page
1610 numbers of $\beta$ and $\gamma$ need to be set up properly, and
1611 the table of contents data from all three runs needs to be
1612 accumulated.
1613
1614 The \.{cwebmac} macros include two control sequences \.{\\contentsfile} and
1615 \.{\\readcontents} that facilitate the necessary processing.  We include
1616 `\.{\\def\\contentsfile\{cont1\}}' in the limbo section of $\alpha$, and
1617 we include `\.{\\def\\contentsfile\{cont2\}}' in the limbo section of
1618 $\beta$; this causes \TEX/ to write the contents data for $\alpha$ and $\beta$
1619 into \.{cont1.tex} and \.{cont2.tex}. Now in $\gamma$ we say
1620 $$\.{\\def\\readcontents\{\\input cont1 \\input cont2
1621   \\input \\contentsfile\}}\,;$$
1622 this brings in the data from all three pieces, in the proper order.
1623
1624 However, we still need to solve the page-numbering problem. One way to
1625 do it is to include the following in the limbo material for $\beta$:
1626 $$\lpile{\.{\\message\{Please type the last page number of part 1: \}}\cr
1627   \.{\\read -1 to \\temp \\pageno=\\temp \\advance\\pageno by 1}\cr}$$
1628 Then you simply provide the necessary data when \TEX/ requests
1629 it; a similar construction is used at the beginning of $\gamma$.
1630
1631 This method can, of course, be used to divide a woven file into
1632 any number of pieces.
1633
1634 \point 11. Sometimes it is nice to include things in the index that are
1635 typeset in a special way. For example, we might want to have an
1636 index entry for `\TeX'. \.{CWEAVE} provides two simple ways to
1637 typeset an index entry (unless the entry is an identifier or a reserved word):
1638 `\.{@\^}' gives roman type, and `\.{@.}' gives typewriter type.
1639 But if we try to typeset `\TeX' in roman type by saying, e.g.,
1640 `\.{@\^\\TeX@>}', the backslash character gets in the way,
1641 and this entry wouldn't appear in the index with the T's.
1642
1643 The solution is to use the `\.{@:}' feature, declaring a macro that
1644 simply removes a sort key as follows:
1645 $$\.{\\def\\9\#1\{\}}$$
1646 Now you can say, e.g., `\.{@:TeX\}\{\\TeX@>}' in your \.{CWEB} file; \.{CWEAVE}
1647 puts it into the index alphabetically, based on the sort key, and
1648 produces the macro call `\.{\\9\{TeX\}\{\\TeX\}}' which will ensure that
1649 the sort key isn't printed.
1650
1651 A similar idea can be used to insert hidden material into section
1652 names so that they are alphabetized in whatever way you might wish.
1653 Some people call these tricks ``special refinements''; others call
1654 them ``kludges.''
1655
1656 \point 12. The control sequence \.{\\secno} is set to the number of the
1657 section being typeset.
1658
1659 \point 13. If you want to list only the sections that have changed,
1660 together with the index, put the command `\.{\\let\\maybe=\\iffalse}' in
1661 the limbo section before the first section of your \.{CWEB} file. It's
1662 customary to make this the first change in your change file.
1663
1664 This feature has a \TeX nical limitation, however: You cannot use it
1665 together with control sequences like \.{\\proclaim} or \.{\\+} or
1666 \.{\\newcount} that plain \TeX\ has declared to be `\.{\\outer}',
1667 because \TeX\ refuses to skip silently over such control sequences.
1668 One way to work around this limitation is to say
1669 $$\.{\\fi \\let\\proclaim\\relax \\def\\proclaim\{...\} \\ifon}$$
1670 where \.{\\proclaim} is redefined to be the same as usual but without
1671 an \.{\\outer} qualification. (The \.{\\fi} here stops the conditional
1672 skipping, and the \.{\\ifon} turns it back on again.) Similarly,
1673 $$\.{\\fi \\newcount\\n \\ifon}$$
1674 is a safe way to use \.{\\newcount}. Plain \TeX\ already provides a
1675 non-outer macro \.{\\tabalign} that does the work of \.{\\+}; you can say
1676 $$\postdisplaypenalty=10000
1677 \.{\\fi \\let\\+\\tabalign \\ifon}$$
1678 if you prefer the shorter notation \.{\\+}.
1679
1680 \point 14. To get output in languages other than English, redefine the
1681 macros \.{\\A}, \.{\\As}, \.{\\ATH},
1682 \.{\\ET}, \.{\\ETs}, \.{\\Q}, \.{\\Qs}, \.{\\U},
1683 \.{\\Us}, \.{\\ch}, \.{\\fin}, \.{\\con}, \.{\\today}, \.{\\datethis}, and
1684 \.{\\datecontentspage}. \.{CWEAVE} itself need not be changed.
1685
1686 \point 15. Some output can be selectively suppressed with the macros
1687 \.{\\noatl}, \.{\\noinx}, \.{\\nosecs}, \.{\\nocon}.
1688
1689 \point 16. All accents and special text symbols of plain \TEX/ format
1690 will work in \.{CWEB} documents just as they are described in
1691 Chapter~9 of {\sl The \TEX/book}, with one exception.
1692 The dot accent (normally \.{\\.}) must be typed \.{\\:} instead.
1693
1694 \point 17. Several commented-out lines in \.{cwebmac.tex} are suggestions
1695 that users may wish to adopt. For example, one such line inserts a blank page
1696 if you have a duplex printer. Appendices D, E, and F of the complete
1697 version of this manual are printed using a commented-out option that
1698 substitutes `$\gets$' for `$=$' in the program listings. Looking at those
1699 appendices might help you decide which format you like better.
1700
1701 \point 18. Andreas Scherer has contributed a macro called \.{\\pdfURL}
1702 with which one can say things like the following, anywhere in the \TeX\ parts
1703 or the \CEE/ comments of a \.{CWEB} file:
1704 $$\vbox{\halign{\.{#}\hfil\cr
1705 You can send email to
1706  \\pdfURL\{the author\}\{mailto:andreas.scherer@@pobox.com\}\cr
1707 or visit \\pdfURL\{his home page\}\{http://www.pobox.com/%
1708        \\TILDE/scherer\}.\cr}}$$
1709 In a {\mc PDF} document, the first argument will appear in blue as
1710 clickable text; the Acrobat reader, if correctly configured, will then
1711 redirect those links to the user's browser and open either the
1712 email client or the HTML viewer. In a hardcopy document, both arguments
1713 will be printed ({\tt the second in parentheses and typewriter type}).
1714 Certain special characters in an Internet address need to be handled
1715 in a somewhat awkward way, so that \.{CWEAVE} and/or \TeX\
1716 will not confuse them with formatting controls: Use \.{@@} for \.@
1717 and \.{\\TILDE/} for \.\~ and \.{\\UNDER/} for \.\_.
1718
1719 \point 19. {\mc PDF} documents contain bookmarks that list all the major group
1720 titles in the table of contents, some of which will be subsidiary to
1721 others if the depth feature of \.{@*} has been used.
1722 Such bookmark entries are also known as ``outlines.''
1723 Moreover, the final group title, `Names of the sections',
1724 can be opened up to list every section name; Acrobat users can therefore
1725 navigate easily to any desired section.
1726
1727 The macros of \.{cwebmac.tex} are careful to ``sanitize'' all the names
1728 that appear as bookmarks, by removing special characters and
1729 formatting codes that are inappropriate for the limited typographic
1730 capabilities of {\mc PDF} outlines. For example, one section of \.{CWEAVE}
1731 is named `Cases for \\{case\_like}', which is represented by the \TeX\ code
1732 `\.{Cases} \.{for} \.{\\PB\{\\\\\{case\\\_like\}\}}' in \.{cweave.tex}; its
1733 sanitized name is simply `\.{Cases} \.{for} \.{case\_like}'.
1734 (When \.{.pdf} files are produced, the fifth parameter of every \.{\\ZZ} in
1735 the \.{.toc} file is set to the sanitized form of the first parameter;
1736 see point~9 above and point~20 below.)
1737
1738 In general, sanitization removes \TeX\ control sequences and braces,
1739 except for control sequences defined by \.{CWEB} itself. Such a translation
1740 works most of the time, but you can override the defaults and obtain any
1741 translation that you want by using \TeX nical tricks. For example, after
1742 $$\.{\\sanitizecommand\\foo\{bar\}}$$
1743 the control sequence \.{\\foo} will sanitize to `\.{bar}'. And after
1744 $$\.{\\def\\kluj\#1\\\\\{foo\}}$$
1745 the \TeX\ code `\.{\\kluj bar\\\\}' will print as `foo' but sanitize
1746 to `\.{bar}', because the control sequences \.{\\kluj} and
1747 \.{\\\\} are removed by sanitization.
1748
1749 \point 20. Furthermore, group titles can be converted to an arbitrary
1750 sanitized text while also changing their form in running headlines, by
1751 using \.{\\ifheader}. Consider, for example, a \.{CWEB} source file that
1752 begins with the two lines
1753 $$\lpile{\.{\\def\\klujj\#1\\\\\{\\ifheader FOO\\else foo\\fi\}}\cr
1754 \.{@*Chinese \\klujj bar\\.}\cr}$$
1755 This coding introduces a major group entitled `{\bf Chinese foo}', with
1756 running headline `{\eightrm CHINESE FOO}' and table-of-contents entry
1757 `Chinese foo'. The corresponding bookmark is, however, `\.{Chinese} \.{bar}'.
1758 And the corresponding \.{.toc} file entry is
1759 `\.{\\ZZ \{Chinese \\klujj bar\\\\\}\{1\}\{1\}\{1\}\{Chinese bar\}}'.
1760
1761 \vfill\end
1762