common.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

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