home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / dev / misc / cweb / ctangle.c < prev    next >
C/C++ Source or Header  |  1993-12-21  |  33KB  |  1,659 lines

  1. /*1:*/
  2. #line 61 "ctangle.w"
  3.  
  4. /*2:*/
  5. #line 159 "ctangle-p.ch"
  6.  
  7. #line 160 "ctangle-p.ch"
  8. #include <string.h>
  9. #line 80 "ctangle.w"
  10.  
  11. /*:2*//*6:*/
  12. #line 195 "ctangle-p.ch"
  13.  
  14. #include <stdio.h>
  15. #ifdef __TURBOC__
  16. #include <io.h>
  17. #endif
  18.  
  19. /*:6*//*62:*/
  20. #line 873 "ctangle.w"
  21.  
  22. #include <ctype.h> 
  23. #include <stdlib.h> 
  24.  
  25. /*:62*/
  26. #line 62 "ctangle.w"
  27.  
  28. #define banner "This is CTANGLE (Version 3.0 [p8d])\n" \
  29.  
  30. #define max_bytes 90000 \
  31.  
  32. #define max_toks 270000
  33. #define max_names 4000 \
  34.  
  35. #define max_texts 2500
  36. #define hash_size 353
  37. #define longest_name 1000
  38. #define stack_size 50
  39. #define buf_size 100 \
  40.  
  41. #define ctangle 0
  42. #define cweave 1 \
  43.  
  44. #define and_and 04
  45. #define lt_lt 020
  46. #define gt_gt 021
  47. #define plus_plus 013
  48. #define minus_minus 01
  49. #define minus_gt 031
  50. #define not_eq 032
  51. #define lt_eq 034
  52. #define gt_eq 035
  53. #define eq_eq 036
  54. #define or_or 037
  55. #define dot_dot_dot 016
  56. #define colon_colon 06
  57. #define period_ast 026
  58. #define minus_gt_ast 027 \
  59.  
  60. #define length(c) (c+1) ->byte_start-(c) ->byte_start
  61. #define print_id(c) term_write((c) ->byte_start,length((c) ) ) 
  62. #define llink link
  63. #define rlink dummy.Rlink
  64. #define root name_dir->rlink \
  65.  
  66. #define chunk_marker 0 \
  67.  
  68. #define spotless 0
  69. #define harmless_message 1
  70. #define error_message 2
  71. #define fatal_message 3
  72. #define mark_harmless {if(history==spotless) history= harmless_message;}
  73. #define mark_error history= error_message
  74. #define confusion(s) fatal("! This can't happen: ",s)  \
  75.  
  76. #define max_file_name_length 256
  77. #define cur_file file[include_depth]
  78. #define cur_file_name file_name[include_depth]
  79. #define web_file_name file_name[0]
  80. #define cur_line line[include_depth] \
  81.  
  82. #define show_banner flags['b']
  83. #define show_happiness flags['h']
  84. #define show_progress flags['p']
  85. #define use_amiga_keywords flags['a']
  86. #define use_german_macros flags['g']
  87. #define indent_param_decl flags['i'] \
  88.  
  89. #define update_terminal fflush(stdout) 
  90. #define new_line putchar('\n') 
  91. #define putxchar putchar
  92. #define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
  93. #define C_printf(c,a) fprintf(C_file,c,a) 
  94. #define C_putc(c) putc(c,C_file)  \
  95.  
  96. #define equiv equiv_or_xref \
  97.  
  98. #define section_flag max_texts \
  99.  
  100. #define string 02
  101. #define join 0177
  102. #define output_defs_flag (2*024000-1)  \
  103.  
  104. #define cur_end cur_state.end_field
  105. #define cur_byte cur_state.byte_field
  106. #define cur_name cur_state.name_field
  107. #define cur_repl cur_state.repl_field
  108. #define cur_section cur_state.section_field \
  109.  
  110. #define section_number 0201
  111. #define identifier 0202 \
  112.  
  113. #define normal 0
  114. #define num_or_id 1
  115. #define unbreakable 3
  116. #define verbatim 4 \
  117.  
  118. #define max_files 256
  119. #define translit_length 10 \
  120.  
  121. #define ignore 0
  122. #define ord 0302
  123. #define control_text 0303
  124. #define translit_code 0304
  125. #define output_defs_code 0305
  126. #define format_code 0306
  127. #define definition 0307
  128. #define begin_C 0310
  129. #define section_name 0311
  130. #define new_section 0312 \
  131.  
  132. #define constant 03 \
  133.  
  134. #define isxalpha(c) ((c) =='_') 
  135. #define ishigh(c) ((unsigned char) (c) >0177)  \
  136.  \
  137.  
  138. #define compress(c) if(loc++<=limit) return(c)  \
  139.  
  140. #define macro 0
  141. #define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
  142.  
  143.  
  144. #line 63 "ctangle.w"
  145.  
  146. /*5:*/
  147. #line 195 "ctangle-p.ch"
  148.  
  149. typedef short boolean;
  150. #ifdef _AMIGA
  151. typedef unsigned char eight_bits;
  152. #else
  153. typedef char unsigned eight_bits;
  154. #endif
  155. extern boolean program;
  156. extern int phase;
  157. #ifdef __TURBOC__
  158. #define HUGE huge
  159. #else
  160. #define HUGE
  161. #endif
  162.  
  163. /*:5*//*7:*/
  164. #line 195 "ctangle-p.ch"
  165.  
  166. char section_text[longest_name+1];
  167. char*section_text_end= section_text+longest_name;
  168. char*id_first;
  169. char*id_loc;
  170.  
  171. /*:7*//*8:*/
  172. #line 195 "ctangle-p.ch"
  173.  
  174. extern char buffer[];
  175. extern char*buffer_end;
  176. extern char*loc;
  177. extern char*limit;
  178.  
  179. /*:8*//*9:*/
  180. #line 195 "ctangle-p.ch"
  181.  
  182. typedef struct name_info{
  183. char HUGE*byte_start;
  184. struct name_info HUGE*link;
  185. union{
  186. struct name_info HUGE*Rlink;
  187.  
  188. char Ilk;
  189. }dummy;
  190. char HUGE*equiv_or_xref;
  191. }name_info;
  192. typedef name_info HUGE*name_pointer;
  193. typedef name_pointer*hash_pointer;
  194. #ifdef __TURBOC__
  195. extern char HUGE*byte_mem;
  196. extern name_info HUGE*name_dir;
  197. #else
  198. extern char byte_mem[];
  199. extern name_info name_dir[];
  200. #endif
  201. extern char HUGE*byte_mem_end;
  202. extern name_pointer name_dir_end;
  203. extern name_pointer name_ptr;
  204. extern char HUGE*byte_ptr;
  205. #ifdef __TURBOC__
  206. void far*allocsafe(unsigned long nunits,unsigned long unitsz);
  207. #endif
  208. extern name_pointer hash[];
  209. extern hash_pointer hash_end;
  210. extern hash_pointer h;
  211. extern name_pointer id_lookup(char*,char*,char);
  212.  
  213. extern void print_section_name(name_pointer);
  214. extern void sprint_section_name(char*,name_pointer);
  215. extern void print_prefix_name(name_pointer);
  216. extern name_pointer section_lookup(char*,char*,int);
  217. extern name_pointer prefix_lookup(char*,char*);
  218. extern int names_match(name_pointer,char*,int,eight_bits);
  219. extern void init_p(name_pointer,eight_bits);
  220. extern void init_node(name_pointer);
  221.  
  222. /*:9*//*10:*/
  223. #line 195 "ctangle-p.ch"
  224.  
  225. extern history;
  226. extern void err_print(char*);
  227. extern void wrap_up(void);
  228. extern void fatal(char*,char*);
  229. extern void overflow(char*);
  230.  
  231. /*:10*//*11:*/
  232. #line 195 "ctangle-p.ch"
  233.  
  234. extern include_depth;
  235. extern FILE*file[];
  236. extern FILE*change_file;
  237. extern char C_file_name[];
  238. extern char tex_file_name[];
  239. extern char idx_file_name[];
  240. extern char scn_file_name[];
  241. extern char file_name[][max_file_name_length];
  242.  
  243. extern char change_file_name[];
  244. extern line[];
  245. extern change_line;
  246. extern boolean input_has_ended;
  247. extern boolean changing;
  248. extern boolean web_file_open;
  249. extern void reset_input(void);
  250. extern boolean get_line(void);
  251. extern void check_complete(void);
  252.  
  253. /*:11*//*12:*/
  254. #line 195 "ctangle-p.ch"
  255.  
  256. typedef unsigned short sixteen_bits;
  257. extern sixteen_bits section_count;
  258. extern boolean changed_section[];
  259. extern boolean change_pending;
  260. extern boolean print_where;
  261.  
  262. /*:12*//*13:*/
  263. #line 195 "ctangle-p.ch"
  264.  
  265. extern int argc;
  266. extern char**argv;
  267. extern boolean flags[];
  268.  
  269. /*:13*//*14:*/
  270. #line 195 "ctangle-p.ch"
  271.  
  272. extern FILE*C_file;
  273. extern FILE*tex_file;
  274. extern FILE*idx_file;
  275. extern FILE*scn_file;
  276. extern FILE*active_file;
  277.  
  278. /*:14*//*15:*/
  279. #line 195 "ctangle-p.ch"
  280.  
  281. extern void common_init(void);
  282. extern void print_stats(void);
  283. #line 125 "ctangle.w"
  284.  
  285. /*:15*/
  286. #line 64 "ctangle.w"
  287.  
  288. /*16:*/
  289. #line 149 "ctangle.w"
  290.  
  291. typedef struct{
  292. #line 201 "ctangle-p.ch"
  293. eight_bits HUGE*tok_start;
  294. #line 152 "ctangle.w"
  295. sixteen_bits text_link;
  296. }text;
  297. typedef text*text_pointer;
  298.  
  299. /*:16*//*27:*/
  300. #line 293 "ctangle.w"
  301.  
  302. typedef struct{
  303. #line 290 "ctangle-p.ch"
  304. eight_bits HUGE*end_field;
  305. eight_bits HUGE*byte_field;
  306. #line 297 "ctangle.w"
  307. name_pointer name_field;
  308. text_pointer repl_field;
  309. sixteen_bits section_field;
  310. }output_state;
  311. typedef output_state*stack_pointer;
  312.  
  313. /*:27*/
  314. #line 65 "ctangle.w"
  315.  
  316. /*17:*/
  317. #line 156 "ctangle.w"
  318.  
  319. text text_info[max_texts];
  320. text_pointer text_info_end= text_info+max_texts-1;
  321. text_pointer text_ptr;
  322. #line 209 "ctangle-p.ch"
  323. #ifdef __TURBOC__
  324. eight_bits HUGE*tok_mem;
  325. eight_bits HUGE*tok_mem_end;
  326. #else
  327. eight_bits tok_mem[max_toks];
  328. eight_bits*tok_mem_end= tok_mem+max_toks-1;
  329. #endif
  330. eight_bits HUGE*tok_ptr;
  331. #line 163 "ctangle.w"
  332.  
  333. /*:17*//*23:*/
  334. #line 224 "ctangle.w"
  335.  
  336. text_pointer last_unnamed;
  337.  
  338. /*:23*//*28:*/
  339. #line 309 "ctangle.w"
  340.  
  341. output_state cur_state;
  342.  
  343. output_state stack[stack_size+1];
  344. stack_pointer stack_ptr;
  345. stack_pointer stack_end= stack+stack_size;
  346.  
  347. /*:28*//*32:*/
  348. #line 381 "ctangle.w"
  349.  
  350. int cur_val;
  351.  
  352. /*:32*//*36:*/
  353. #line 467 "ctangle.w"
  354.  
  355. eight_bits out_state;
  356. boolean protect;
  357.  
  358. /*:36*//*38:*/
  359. #line 496 "ctangle.w"
  360.  
  361. name_pointer output_files[max_files];
  362. name_pointer*cur_out_file,*end_output_files,*an_output_file;
  363. char cur_section_name_char;
  364. char output_file_name[longest_name];
  365.  
  366. /*:38*//*45:*/
  367. #line 592 "ctangle.w"
  368.  
  369. boolean output_defs_seen= 0;
  370.  
  371. #line 353 "ctangle-p.ch"
  372. /*:45*//*51:*/
  373. #line 699 "ctangle.w"
  374.  
  375. char translit[128][translit_length];
  376.  
  377. /*:51*//*56:*/
  378. #line 775 "ctangle.w"
  379.  
  380. eight_bits ccode[128];
  381.  
  382. /*:56*//*59:*/
  383. #line 831 "ctangle.w"
  384.  
  385. boolean comment_continues= 0;
  386.  
  387. /*:59*//*61:*/
  388. #line 870 "ctangle.w"
  389.  
  390. name_pointer cur_section_name;
  391.  
  392. /*:61*//*75:*/
  393. #line 1180 "ctangle.w"
  394.  
  395. text_pointer cur_text;
  396. eight_bits next_control;
  397.  
  398. /*:75*//*82:*/
  399. #line 1327 "ctangle.w"
  400.  
  401. extern sixteen_bits section_count;
  402.  
  403. /*:82*/
  404. #line 66 "ctangle.w"
  405.  
  406. /*41:*/
  407. #line 338 "ctangle-p.ch"
  408.  
  409. #line 339 "ctangle-p.ch"
  410. static void phas