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 (works also with later versions
)
7 % Copyright (C
) 1987,1990,1993 Silvio Levy
and Donald E
. Knuth
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
.
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
.
18 % Please send comments
, suggestions
, etc
. to levy@@math
.berkeley
.edu
.
20 % The next few sections contain stuff from the file
|"common.w"| that has
21 % to be included in both
|"ctangle.w"| and |"cweave.w"|. It appears in
this
22 % file
|"common.h"|, which needs to be updated when
|"common.w"| changes
.
24 First comes general stuff
:
29 @
<Common code
for \
.{CWEAVE
} and \
.{CTANGLE
}@
>=
30 typedef short boolean
;
31 typedef char unsigned eight_bits
;
32 extern boolean program
; /* \.{CWEAVE} or \.{CTANGLE}? */
33 extern int phase
; /* which phase are we in? */
38 @ Code related to the character set
:
39 @
^ASCII code dependencies@
>
41 @d and_and
04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
42 @d lt_lt
020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
43 @d gt_gt
021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
44 @d plus_plus
013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
45 @d minus_minus
01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
46 @d minus_gt
031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
47 @d
not_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
48 @d lt_eq
034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
49 @d gt_eq
035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
50 @d eq_eq
036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
51 @d or_or
037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
52 @d dot_dot_dot
016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
53 @d colon_colon
06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
54 @d period_ast
026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
55 @d minus_gt_ast
027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
58 char section_text
[longest_name
+1]; /* name being sought for */
59 char *section_text_end
= section_text
+longest_name
; /* end of |section_text| */
60 char *id_first
; /* where the current identifier begins in the buffer */
61 char *id_loc
; /* just after the current identifier in the buffer */
63 @ Code related to input routines
:
65 @d
xisalpha(c
) (isalpha(c
)&&((eight_bits
)c
<0200))
66 @d
xisdigit(c
) (isdigit(c
)&&((eight_bits
)c
<0200))
67 @d
xisspace(c
) (isspace(c
)&&((eight_bits
)c
<0200))
68 @d
xislower(c
) (islower(c
)&&((eight_bits
)c
<0200))
69 @d
xisupper(c
) (isupper(c
)&&((eight_bits
)c
<0200))
70 @d
xisxdigit(c
) (isxdigit(c
)&&((eight_bits
)c
<0200))
73 extern char buffer
[]; /* where each line of input goes */
74 extern char *buffer_end
; /* end of |buffer| */
75 extern char *loc
; /* points to the next character to be read from the buffer*/
76 extern char *limit
; /* points to the last character in the buffer */
78 @ Code related to identifier
and section name storage
:
79 @d
length(c
) (c
+1)->byte_start
-(c
)->byte_start
/* the length of a name */
80 @d
print_id(c
) term_write((c
)->byte_start
,length((c
))) /* print identifier */
81 @d llink link
/* left link in binary search tree for section names */
82 @d rlink dummy
.Rlink
/* right link in binary search tree for section names */
83 @d root name_dir
->rlink
/* the root of the binary search tree
88 typedef struct name_info
{
89 char *byte_start
; /* beginning of the name in |byte_mem| */
90 struct name_info
*link
;
92 struct name_info
*Rlink
; /* right link in binary search tree for section
94 char Ilk
; /* used by identifiers in \.{CWEAVE} only */
96 char *equiv_or_xref
; /* info corresponding to names */
97 } name_info
; /* contains information about an identifier or section name */
98 typedef name_info
*name_pointer
; /* pointer into array of \&{name\_info}s */
99 typedef name_pointer
*hash_pointer
;
100 extern char byte_mem
[]; /* characters of names */
101 extern char *byte_mem_end
; /* end of |byte_mem| */
102 extern name_info name_dir
[]; /* information about names */
103 extern name_pointer name_dir_end
; /* end of |name_dir| */
104 extern name_pointer name_ptr
; /* first unused position in |byte_start| */
105 extern char *byte_ptr
; /* first unused position in |byte_mem| */
106 extern name_pointer hash
[]; /* heads of hash lists */
107 extern hash_pointer hash_end
; /* end of |hash| */
108 extern hash_pointer h
; /* index into hash-head array */
109 extern name_pointer
id_lookup(); /* looks up a string in the identifier table */
110 extern name_pointer
section_lookup(); /* finds section name */
111 extern void print_section_name(), sprint_section_name();
113 @ Code related to error handling
:
114 @d spotless
0 /* |history| value for normal jobs */
115 @d harmless_message
1 /* |history| value when non-serious info was printed */
116 @d error_message
2 /* |history| value when an error was noted */
117 @d fatal_message
3 /* |history| value when we had to stop prematurely */
118 @d mark_harmless
{if (history
==spotless
) history
=harmless_message
;}
119 @d mark_error history
=error_message
120 @d
confusion(s
) fatal("! This can't happen: ",s
)
123 extern history
; /* indicates how bad this run was */
124 extern err_print(); /* print error message and context */
125 extern wrap_up(); /* indicate |history| and exit */
126 extern void fatal(); /* issue error message and die */
127 extern void overflow(); /* succumb because a table has overflowed */
129 @ Code related to file handling
:
130 @f line x
/* make |line| an unreserved word */
131 @d max_file_name_length
60
132 @d cur_file file
[include_depth
] /* current file */
133 @d cur_file_name file_name
[include_depth
] /* current file name */
134 @d web_file_name file_name
[0] /* main source file name */
135 @d cur_line line
[include_depth
] /* number of current line in current file */
138 extern include_depth
; /* current level of nesting */
139 extern FILE *file
[]; /* stack of non-change files */
140 extern FILE *change_file
; /* change file */
141 extern char C_file_name
[]; /* name of |C_file| */
142 extern char tex_file_name
[]; /* name of |tex_file| */
143 extern char idx_file_name
[]; /* name of |idx_file| */
144 extern char scn_file_name
[]; /* name of |scn_file| */
145 extern char file_name
[][max_file_name_length
];
146 /* stack of non-change file names */
147 extern char change_file_name
[]; /* name of change file */
148 extern line
[]; /* number of current line in the stacked files */
149 extern change_line
; /* number of current line in change file */
150 extern boolean input_has_ended
; /* if there is no more input */
151 extern boolean changing
; /* if the current line is from |change_file| */
152 extern boolean web_file_open
; /* if the web file is being read */
153 extern reset_input(); /* initialize to read the web file and change file */
154 extern get_line(); /* inputs the next line */
155 extern check_complete(); /* checks that all changes were picked up */
157 @ Code related to section numbers
:
159 typedef unsigned short sixteen_bits
;
160 extern sixteen_bits section_count
; /* the current section number */
161 extern boolean changed_section
[]; /* is the section changed? */
162 extern boolean change_pending
; /* is a decision about change still unclear? */
163 extern boolean print_where
; /* tells \.{CTANGLE} to print line and file info */
165 @ Code related to command line arguments
:
166 @d show_banner flags
['b'] /* should the banner line be printed? */
167 @d show_progress flags
['p'] /* should progress reports be printed? */
168 @d show_happiness flags
['h'] /* should lack of errors be announced? */
171 extern int argc
; /* copy of |ac| parameter to |main| */
172 extern char **argv
; /* copy of |av| parameter to |main| */
173 extern boolean flags
[]; /* an option for each 7-bit code */
175 @ Code relating to output
:
176 @d update_terminal
fflush(stdout
) /* empty the terminal output buffer */
177 @d new_line
putchar('\n') @d putxchar putchar
178 @d
term_write(a
,b
) fflush(stdout
),fwrite(a
,sizeof(char),b
,stdout
)
179 @d
C_printf(c
,a
) fprintf(C_file
,c
,a
)
180 @d
C_putc(c
) putc(c
,C_file
)
183 extern FILE *C_file
; /* where output of \.{CTANGLE} goes */
184 extern FILE *tex_file
; /* where output of \.{CWEAVE} goes */
185 extern FILE *idx_file
; /* where index from \.{CWEAVE} goes */
186 extern FILE *scn_file
; /* where list of sections from \.{CWEAVE} goes */
187 extern FILE *active_file
; /* currently active file for \.{CWEAVE} output */
189 @ The procedure that gets everything rolling
:
192 extern void common_init();