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) 6 7 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth 8 9 % Permission is granted to make and distribute verbatim copies of this 10 % document provided that the copyright notice and this permission notice 11 % are preserved on all copies. 12 13 % Permission is granted to copy and distribute modified versions of this 14 % document under the conditions for verbatim copying, provided that the 15 % entire resulting derived work is distributed under the terms of a 16 % permission notice identical to this one. 17 18 % Please send comments, suggestions, etc. to levy@@math.berkeley.edu. 19 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. 23 24 First comes general stuff: 25 26 @d ctangle 0 27 @d cweave 1 28 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? */ 34 35 @ @<Include files@>= 36 #include <stdio.h> 37 38 @ Code related to the character set: 39 @^ASCII code dependencies@> 40 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} */ 56 57 @<Common code...@>= 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 */ 62 63 @ Code related to input routines: 64 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)) 71 72 @<Common code...@>= 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 */ 77 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 84 for section names */ 85 @d chunk_marker 0 86 87 @<Common code...@>= 88 typedef struct name_info { 89 char *byte_start; /* beginning of the name in |byte_mem| */ 90 struct name_info *link; 91 union { 92 struct name_info *Rlink; /* right link in binary search tree for section 93 names */ 94 char Ilk; /* used by identifiers in \.{CWEAVE} only */ 95 } dummy; 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(); 112 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) 121 122 @<Common...@>= 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 */ 128 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 */ 136 137 @<Common code...@>= 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 */ 156 157 @ Code related to section numbers: 158 @<Common code...@>= 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 */ 164 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? */ 169 170 @<Common code...@>= 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 */ 174 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) 181 182 @<Common code...@>= 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 */ 188 189 @ The procedure that gets everything rolling: 190 191 @<Common code...@>= 192 extern void common_init(); 193