home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d848 / cweb.lha / CWeb / CWeb27.lha / common-p.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  9.7 KB  |  227 lines

  1. % This file is part of CWEB.
  2. % This program by Silvio Levy is based on a program by D. E. Knuth.
  3. % ANSI-C conforming changes and Turbo-C++ implementation are made by
  4. % Hans-Hermann Bode.
  5. % The program is distributed WITHOUT ANY WARRANTY, express or implied.
  6. % Version 2.1 -- Don Knuth, January 1992
  7. % Version 2.1 [p5] --- Hans-Hermann Bode, July 1992
  8. % Version 2.1 [p5a] --- Klaus Guntermann, July 1992
  9. % Version 2.1 [p5b] --- Hans-Hermann Bode, July 1992
  10. % Version 2.1 [p6] --- Hans-Hermann Bode, September 1992
  11. % Version 2.1 [p6a] --- Andreas Scherer, March 1993
  12.  
  13. % Copyright (C) 1987,1990 Silvio Levy and Donald E. Knuth
  14.  
  15. % Changes conforming to ANSI C and Turbo C++ are
  16. % Copyright (C) 1991, 1992 Hans-Hermann Bode
  17. % Changes conforming to SAS/C 6.0 are
  18. % Copyright (C) 1991 Carsten Steger
  19. % Copyright (C) 1993 Andreas Scherer
  20. % See the changefile COMMON.HCH for more information.
  21.  
  22. % Permission is granted to make and distribute verbatim copies of this
  23. % document provided that the copyright notice and this permission notice
  24. % are preserved on all copies.
  25.  
  26. % Permission is granted to copy and distribute modified versions of this
  27. % document under the conditions for verbatim copying, provided that the
  28. % entire resulting derived work is distributed under the terms of a
  29. % permission notice identical to this one.
  30.  
  31. % Please send comments, suggestions, etc. to levy@@math.berkeley.edu.
  32.  
  33. % The next few sections contain stuff from the file |"common.w"| that has
  34. % to be included in both |"tangle.w"| and |"weave.w"|. It appears in this
  35. % file |"common.h"|, which needs to be updated when |"common.w"| changes.
  36.  
  37. First comes general stuff.
  38. In {\mc Turbo~C}, we use |huge| pointers instead of large arrays.
  39.  
  40. @d tangle 0
  41. @d weave 1
  42. @#
  43. @f far int
  44. @f huge int
  45. @f HUGE int
  46. @^system dependencies@>
  47.  
  48. @<Common code for \.{WEAVE} and \.{TANGLE}@>=
  49. typedef short boolean;
  50. typedef char unsigned eight_bits;
  51. extern boolean program; /* \.{WEAVE} or \.{TANGLE}? */
  52. extern int phase; /* which phase are we in? */
  53. extern void common_init(void);
  54. extern void print_stats(void);
  55. #ifdef __TURBOC__
  56. #define HUGE huge
  57. #else
  58. #define HUGE
  59. #endif
  60.  
  61. @ @<Include files@>=
  62. #include <stdio.h>
  63. #ifdef __TURBOC__
  64. #include <io.h>
  65. #endif
  66.  
  67. @ Code related to the character set:
  68. @^ASCII code dependencies@>
  69.  
  70. @d and_and 04 /* `\.{\&\&}'; this corresponds to MIT's {\tentex\char'4} */
  71. @d lt_lt 020 /* `\.{<<}';  this corresponds to MIT's {\tentex\char'20} */
  72. @d gt_gt 021 /* `\.{>>}';  this corresponds to MIT's {\tentex\char'21} */
  73. @d plus_plus 013 /* `\.{++}';  this corresponds to MIT's {\tentex\char'13} */
  74. @d minus_minus 01 /* `\.{--}';  this corresponds to MIT's {\tentex\char'1} */
  75. @d minus_gt 031 /* `\.{->}';  this corresponds to MIT's {\tentex\char'31} */
  76. @d not_eq 032 /* `\.{!=}';  this corresponds to MIT's {\tentex\char'32} */
  77. @d lt_eq 034 /* `\.{<=}';  this corresponds to MIT's {\tentex\char'34} */
  78. @d gt_eq 035 /* `\.{>=}';  this corresponds to MIT's {\tentex\char'35} */
  79. @d eq_eq 036 /* `\.{==}';  this corresponds to MIT's {\tentex\char'36} */
  80. @d or_or 037 /* `\.{\v\v}';  this corresponds to MIT's {\tentex\char'37} */
  81. @d colon_colon 06 /* `\.{::}';  this corresponds to MIT's {\tentex\char'6} */
  82. @d period_ast 026 /* `\.{.*}';  this corresponds to MIT's {\tentex\char'26} */
  83. @d minus_gt_ast 027 /* `\.{->*}';  this corresponds to MIT's {\tentex\char'27}
  84.     */
  85. @d dot_dot_dot 016 /* `\.{...}';  this corresponds to MIT's {\tentex\char'16}
  86.     */
  87.  
  88. @<Common code...@>=
  89. char mod_text[longest_name+1]; /* name being sought for */
  90. char *mod_text_end = mod_text+longest_name; /* end of |mod_text| */
  91. char *id_first; /* where the current identifier begins in the buffer */
  92. char *id_loc; /* just after the current identifier in the buffer */
  93.  
  94. @ Code related to input routines:
  95.  
  96. @<Common code...@>=
  97. extern char buffer[]; /* where each line of input goes */
  98. extern char *buffer_end; /* end of |buffer| */
  99. extern char *loc; /* points to the next character to be read from the buffer*/
  100. extern char *limit; /* points to the last character in the buffer */
  101.  
  102. @ Code related to identifier and module name storage:
  103. @d length(c) (c+1)->byte_start-(c)->byte_start /* the length of a name */
  104. @d print_id(c) term_write((c)->byte_start,length((c)))
  105.   /* print identifier or module name */
  106. @d llink link /* left link in binary search tree for module names */
  107. @d rlink dummy.Rlink /* right link in binary search tree for module names */
  108. @d root name_dir->rlink /* the root of the binary search tree
  109.   for module names */
  110.  
  111. @<Common code...@>=
  112. typedef struct name_info {
  113.   char HUGE *byte_start; /* beginning of the name in |byte_mem| */
  114.   struct name_info HUGE *link;
  115.   union {
  116.     struct name_info HUGE *Rlink; /* right link in binary search tree for module
  117.       names */
  118.     char Ilk; /* used by identifiers in \.{WEAVE} only */
  119.   } dummy;
  120.   char HUGE *equiv_or_xref; /* info corresponding to names */
  121. } name_info; /* contains information about an identifier or module name */
  122. typedef name_info HUGE *name_pointer; /* pointer into array of |name_info|s */
  123. typedef name_pointer *hash_pointer;
  124. #ifdef __TURBOC__
  125. extern char HUGE *byte_mem; /* characters of names */
  126. extern name_info HUGE *name_dir; /* information about names */
  127. #else
  128. extern char byte_mem[]; /* characters of names */
  129. extern name_info name_dir[]; /* information about names */
  130. #endif
  131. extern char HUGE *byte_mem_end; /* end of |byte_mem| */
  132. extern name_pointer name_dir_end; /* end of |name_dir| */
  133. extern name_pointer name_ptr; /* first unused position in |byte_start| */
  134. extern char HUGE *byte_ptr; /* first unused position in |byte_mem| */
  135. #ifdef __TURBOC__
  136. void far *allocsafe(unsigned long nunits,unsigned long unitsz);
  137. #endif
  138. extern name_pointer hash[]; /* heads of hash lists */
  139. extern hash_pointer hash_end; /* end of |hash| */
  140. extern hash_pointer h; /* index into hash-head array */
  141. extern name_pointer id_lookup(char *first,char *last,char t);
  142.     /* looks up a string in the identifier table */
  143. extern name_pointer mod_lookup(char *k,char *l); /* finds module name */
  144. extern name_pointer prefix_lookup(char *k,char *l); /* finds module name given a prefix */
  145. extern boolean names_match(name_pointer p, char *first, int l, eight_bits t);
  146. extern void init_p(name_pointer p, eight_bits t);
  147. extern void init_node(name_pointer p);
  148.  
  149. @ Code related to error handling:
  150. @d spotless 0 /* |history| value for normal jobs */
  151. @d harmless_message 1 /* |history| value when non-serious info was printed */
  152. @d error_message 2 /* |history| value when an error was noted */
  153. @d fatal_message 3 /* |history| value when we had to stop prematurely */
  154. @d mark_harmless {if (history==spotless) history=harmless_message;}
  155. @d mark_error history=error_message
  156. @d confusion(s) fatal("! This can't happen: ",s)
  157. @d fatal(s,t) {
  158.   printf(s); err_print(t);
  159.   history=fatal_message; wrap_up();
  160. }
  161. @d overflow(t) {
  162.   printf("\n! Sorry, %s capacity exceeded",t); fatal("","");
  163. }
  164.  
  165. @<Common...@>=
  166. extern history; /* indicates how bad this run was */
  167. extern void err_print(char *s); /* prints error message and context */
  168. extern void wrap_up(void); /* indicate |history| and exit */
  169.  
  170. @ Code related to file handling:
  171. @f line x /* make |line| an unreserved word */
  172. @d max_file_name_length 60
  173. @d cur_file file[include_depth] /* current file */
  174. @d cur_file_name file_name[include_depth] /* current file name */
  175. @d web_file_name file_name[0] /* main source file name */
  176. @d cur_line line[include_depth] /* number of current line in current file */
  177.  
  178. @<Common code...@>=
  179. extern include_depth; /* current level of nesting */
  180. extern FILE *file[]; /* stack of non-change files */
  181. extern FILE *change_file; /* change file */
  182. extern char C_file_name[]; /* name of |C_file| */
  183. extern char tex_file_name[]; /* name of |tex_file| */
  184. extern char file_name[][max_file_name_length];
  185.   /* stack of non-change file names */
  186. extern char change_file_name[]; /* name of change file */
  187. extern line[]; /* number of current line in the stacked files */
  188. extern change_line; /* number of current line in change file */
  189. extern boolean input_has_ended; /* if there is no more input */
  190. extern boolean changing; /* if the current line is from |change_file| */
  191. extern boolean web_file_open; /* if the web file is being read */
  192. extern void reset_input(void); /* initialize to read the web file and change file */
  193. extern boolean get_line(void); /* inputs the next line */
  194. extern void check_complete(void); /* checks that all changes were picked up */
  195.  
  196. @ Code related to module numbers:
  197. @<Common code...@>=
  198. typedef unsigned short sixteen_bits;
  199. extern sixteen_bits module_count; /* the current module number */
  200. extern boolean changed_module[]; /* is the module changed? */
  201. extern boolean change_pending; /* is a decision about change still unclear? */
  202. extern boolean print_where; /* tells \.{TANGLE} to print line and file info */
  203.  
  204. @ Code related to command line arguments:
  205. @d show_banner flags['b'] /* should the banner line be printed? */
  206. @d show_progress flags['p'] /* should progress reports be printed? */
  207. @d show_happiness flags['h'] /* should lack of errors be announced? */
  208. @d use_amiga_keywords flags['a'] /* should Amiga/SAS C keywords be used? */
  209. @d use_german_macros flags['g'] /* should the output be German? */
  210.  
  211. @<Common code...@>=
  212. extern int argc; /* copy of |ac| parameter to |main| */
  213. extern char **argv; /* copy of |av| parameter to |main| */
  214. extern boolean flags[]; /* an option for each 8-bit code */
  215.  
  216. @ Code relating to output:
  217. @d update_terminal fflush(stdout) /* empty the terminal output buffer */
  218. @d new_line putchar('\n') @d putxchar putchar
  219. @d term_write(a,b) fflush(stdout), write(1,a,b) /* write on the standard output */
  220. @d line_write(c) write(fileno(C_file),c) /* write on the C output file */
  221. @d C_printf(c,a) fprintf(C_file,c,a)
  222. @d C_putc(c) putc(c,C_file)
  223.  
  224. @<Common code...@>=
  225. extern FILE *C_file; /* where output of \.{TANGLE} goes */
  226. extern FILE *tex_file; /* where output of \.{WEAVE} goes */
  227.