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

  1. /*1:*/
  2. #line 57 "common.w"
  3.  
  4. #line 140 "common-p.ch"
  5. /*5:*/
  6. #line 101 "common.w"
  7.  
  8. #include <ctype.h>
  9.  
  10. /*:5*//*8:*/
  11. #line 161 "common.w"
  12.  
  13. #include <stdio.h>
  14.  
  15. /*:8*//*22:*/
  16. #line 466 "common.w"
  17.  
  18. #include <stdlib.h> 
  19.  
  20. /*:22*//*81:*/
  21. #line 808 "common-p.ch"
  22.  
  23. #line 809 "common-p.ch"
  24. #include <string.h>
  25.  
  26. /*:81*//*86:*/
  27. #line 874 "common-p.ch"
  28.  
  29. #ifdef __TURBOC__
  30. #include <alloc.h> 
  31. #include <io.h> 
  32. #endif
  33.  
  34.  
  35. /*:86*//*90:*/
  36. #line 925 "common-p.ch"
  37.  
  38. #include <stdlib.h>
  39.  
  40. /*:90*/
  41. #line 140 "common-p.ch"
  42.  
  43. /*87:*/
  44. #line 881 "common-p.ch"
  45.  
  46. #ifdef __TURBOC__
  47. #define HUGE huge
  48. #else
  49. #define HUGE
  50. #endif
  51.  
  52.  
  53. /*:87*/
  54. #line 141 "common-p.ch"
  55.  
  56. #line 59 "common.w"
  57. #define ctangle 0
  58. #define cweave 1 \
  59.  
  60. #define and_and 04
  61. #define lt_lt 020
  62. #define gt_gt 021
  63. #define plus_plus 013
  64. #define minus_minus 01
  65. #define minus_gt 031
  66. #define not_eq 032
  67. #define lt_eq 034
  68. #define gt_eq 035
  69. #define eq_eq 036
  70. #define or_or 037
  71. #define dot_dot_dot 016
  72. #define colon_colon 06
  73. #define period_ast 026
  74. #define minus_gt_ast 027 \
  75.  
  76. #define buf_size 100
  77. #define long_buf_size 500 \
  78.  
  79. #define max_include_depth 10 \
  80.  \
  81.  
  82. #define max_file_name_length 256 \
  83.  
  84. #define cur_file file[include_depth]
  85. #define cur_file_name file_name[include_depth]
  86. #define cur_line line[include_depth]
  87. #define web_file file[0]
  88. #define web_file_name file_name[0] \
  89.  
  90. #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
  91. strncmp(buffer,change_buffer,limit-buffer) )  \
  92.  
  93. #define if_section_start_make_pending(b) {*limit= '!'; \
  94. for(loc= buffer;isspace(*loc) ;loc++) ; \
  95. *limit= ' '; \
  96. if(*loc=='@'&&(isspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
  97. } \
  98.  
  99. #define max_sections 2000 \
  100.  \
  101.  
  102. #define PATH_SEPARATOR ','
  103. #define DIR_SEPARATOR '/'
  104. #define DEVICE_SEPARATOR ':' \
  105.  
  106. #define too_long() {include_depth--; \
  107. err_print("! Include file name too long") ;goto restart;} \
  108.  
  109. #define max_bytes 90000 \
  110.  
  111. #define max_names 4000 \
  112.  \
  113.  
  114. #define length(c) (c+1) ->byte_start-(c) ->byte_start
  115. #define print_id(c) term_write((c) ->byte_start,length((c) ) )  \
  116.  
  117. #define hash_size 353 \
  118.  
  119. #define llink link
  120. #define rlink dummy.Rlink
  121. #define root name_dir->rlink \
  122.  \
  123.  
  124. #define first_chunk(p) ((p) ->byte_start+2) 
  125. #define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ \
  126. (unsigned char) *((p) ->byte_start+1) ) 
  127. #define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, \
  128. *((p) ->byte_start+1) = (m) %256)  \
  129.  
  130. #define less 0
  131. #define equal 1
  132. #define greater 2
  133. #define prefix 3
  134. #define extension 4 \
  135.  
  136. #define bad_extension 5 \
  137.  \
  138.  
  139. #define spotless 0
  140. #define harmless_message 1
  141. #define error_message 2
  142. #define fatal_message 3
  143. #define mark_harmless {if(history==spotless) history= harmless_message;}
  144. #define mark_error history= error_message \
  145.  
  146. #define RETURN_OK 0
  147. #define RETURN_WARN 5
  148. #define RETURN_ERROR 10
  149. #define RETURN_FAIL 20 \
  150.  
  151. #define confusion(s) fatal("! This can't happen: ",s)  \
  152.  \
  153.  
  154. #define show_banner flags['b']
  155. #define show_progress flags['p']
  156. #define show_stats flags['s']
  157. #define show_happiness flags['h']
  158. #define use_amiga_keywords flags['a']
  159. #define use_german_macros flags['g']
  160. #define indent_param_decl flags['i'] \
  161.  
  162. #define update_terminal fflush(stdout)  \
  163.  
  164. #define new_line putchar('\n') 
  165. #define putxchar putchar
  166. #define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
  167. #define C_printf(c,a) fprintf(C_file,c,a) 
  168. #define C_putc(c) putc(c,C_file)  \
  169.  
  170. #define MAXPATHLENGTH 4095
  171. #define CWEBINPUTS ",CWeb:,CWeb:include,CWeb:inputs" \
  172.  
  173.  
  174. #line 59 "common.w"
  175.  
  176. /*2:*/
  177. #line 72 "common.w"
  178.  
  179. typedef short boolean;
  180. boolean program;
  181.  
  182. /*:2*//*7:*/
  183. #line 155 "common.w"
  184.  
  185. char buffer[long_buf_size];
  186. char*buffer_end= buffer+buf_size-2;
  187. char*limit= buffer;
  188. char*loc= buffer;
  189.  
  190. /*:7*//*10:*/
  191. #line 210 "common.w"
  192.  
  193. int include_depth;
  194. FILE*file[max_include_depth];
  195. FILE*change_file;
  196. char file_name[max_include_depth][max_file_name_length];
  197.  
  198. char change_file_name[max_file_name_length];
  199. char alt_web_file_name[max_file_name_length];
  200. int line[max_include_depth];
  201. int change_line;
  202. int change_depth;
  203. boolean input_has_ended;
  204. boolean changing;
  205. boolean web_file_open= 0;
  206.  
  207. #line 177 "common-p.ch"
  208. /*:10*//*20:*/
  209. #line 414 "common.w"
  210.  
  211. typedef unsigned short sixteen_bits;
  212. sixteen_bits section_count;
  213. boolean changed_section[max_sections];
  214. boolean change_pending;
  215.  
  216. boolean print_where= 0;
  217.  
  218. /*:20*//*27:*/
  219. #line 584 "common.w"
  220.  
  221. typedef struct name_info{
  222. #line 298 "common-p.ch"
  223. char HUGE*byte_start;
  224. #line 587 "common.w"
  225. /*31:*/
  226. #line 621 "common.w"
  227.  
  228. #line 343 "common-p.ch"
  229. struct name_info HUGE*link;
  230. #line 623 "common.w"
  231.  
  232. /*:31*//*40:*/
  233. #line 720 "common.w"
  234.  
  235. union{
  236. #line 381 "common-p.ch"
  237. struct name_info HUGE*Rlink;
  238.  
  239. #line 724 "common.w"
  240. char Ilk;
  241. }dummy;
  242.  
  243. /*:40*//*55:*/
  244. #line 1052 "common.w"
  245.  
  246. #line 550 "common-p.ch"
  247. char HUGE*equiv_or_xref;
  248. #line 1054 "common.w"
  249.  
  250. /*:55*/
  251. #line 587 "common.w"
  252.  
  253. }name_info;
  254. #line 308 "common-p.ch"
  255. typedef name_info HUGE*name_pointer;
  256. #ifdef __TURBOC__
  257. char HUGE*byte_mem;
  258. char HUGE*byte_mem_end;
  259. name_info HUGE*name_dir;
  260. name_pointer name_dir_end;
  261. #else
  262. char byte_mem[max_bytes];
  263. char*byte_mem_end= byte_mem+max_bytes-1;
  264. name_info name_dir[max_names];
  265. name_pointer name_dir_end= name_dir+max_names-1;
  266. #endif
  267. #line 594 "common.w"
  268.  
  269. /*:27*//*29:*/
  270. #line 607 "common.w"
  271.  
  272. name_pointer name_ptr;
  273. #line 325 "common-p.ch"
  274. char HUGE*byte_ptr;
  275. #line 610 "common.w"
  276.  
  277. /*:29*//*32:*/
  278. #line 634 "common.w"
  279.  
  280. typedef name_pointer*hash_pointer;
  281. name_pointer hash[hash_size];
  282. hash_pointer hash_end= hash+hash_size-1;
  283. hash_pointer h;
  284.  
  285. #line 350 "common-p.ch"
  286. /*:32*//*56:*/
  287. #line 1072 "common.w"
  288.  
  289. int history= spotless;
  290.  
  291. /*:56*//*67:*/
  292. #line 1210 "common.w"
  293.  
  294. int argc;
  295. char**argv;
  296. char C_file_name[max_file_name_length];
  297. char tex_file_name[max_file_name_length];
  298. char idx_file_name[max_file_name_length];
  299. char scn_file_name[max_file_name_length];
  300. #line 678 "common-p.ch"
  301. boolean flags[256];
  302. #line 1218 "common.w"
  303.  
  304. /*:67*//*77:*/
  305. #line 1361 "common.w"
  306.  
  307. FILE*C_file;
  308. FILE*tex_file;
  309. FILE*idx_file;
  310. FILE*scn_file;
  311. FILE*active_file;
  312.  
  313. /*:77*/
  314. #line 60 "common.w"
  315.  
  316. /*3:*/
  317. #line 82 "common.w"
  318. int phase;
  319.  
  320. /*:3*//*11:*/
  321. #line 236 "common.w"
  322.  
  323. char change_buffer[buf_size];
  324. char*change_limit;
  325.  
  326. /*:11*//*83:*/
  327. #line 840 "common-p.ch"
  328.  
  329. char include_path[MAXPATHLENGTH+1]= CWEBINPUTS;
  330. char*p,*path_prefix,*next_path_prefix;
  331.  
  332. /*:83*//*88:*/
  333. #line 893 "common-p.ch"
  334.  
  335. #ifdef _AMIGA 
  336. typedef unsigned char eight_bits;
  337. #else
  338. typedef char unsigned eight_bits;
  339. #endif
  340. void common_init(void);
  341. void reset_input(void);
  342. int get_line(void);
  343. void check_complete(void);
  344. name_pointer id_lookup(char*first,char*last,char t);
  345. void print_section_name(name_pointer);
  346. void sprint_section_name(char*,name_pointer);
  347. void print_prefix_name(name_pointer);
  348. name_pointer add_section_name(name_pointer par,int c,
  349. char*first,char*last,int ispref);
  350. void extend_section_name(name_pointer p,char*first,char*last,int ispref);
  351. name_pointer section_lookup(char*first,char*last,int ispref);
  352.  
  353. /*:88*//*89:*/
  354. #line 914 "common-p.ch"
  355.  
  356. static int input_ln(FILE*fp);
  357. static void prime_the_change_buffer(void);
  358. static void check_change(void);
  359. static int web_strcmp(char HUGE*j,int j_len,char HUGE*k,int k_len);
  360. static boolean set_path(char*ptr,char*override);
  361.  
  362. /*:89*/
  363. #line 61 "common.w"
  364.  
  365. /*33:*/
  366. #line 350 "common-p.ch"
  367.  
  368. extern int names_match(name_pointer,char*,int,eight_bits);
  369. #line 642 "common.w"
  370.  
  371. /*:33*//*38:*/
  372. #line 374 "common-p.ch"
  373.  
  374. #line 375 "common-p.ch"
  375. extern void init_p(name_pointer,eight_bits);
  376. #line 695 "common.w"
  377.  
  378. /*:38*//*46:*/
  379. #line 451 "common-p.ch"
  380.  
  381. #line 452 "common-p.ch"
  382. extern void init_node(name_pointer);
  383. #line 844 "common.w"
  384.  
  385. /*:46*//*53:*/
  386. #line 524 "common-p.ch"
  387.  
  388. static int section_name_cmp(char**,int,name_pointer);
  389. #line 1009 "common.w"
  390.  
  391. /*:53*//*57:*/
  392. #line 564 "common-p.ch"
  393.  
  394. #line 565 "common-p.ch"
  395. extern void err_print(char*);
  396. #line 1084 "common.w"
  397.  
  398. /*:57*//*60:*/
  399. #line 581 "common-p.ch"
  400.  
  401. #line 582 "common-p.ch"
  402. int wrap_up(void);
  403. extern void print_stats(void);
  404. #line 1133 "common.w"
  405.  
  406. #line 606 "common-p.ch"
  407. /*:60*//*63:*/
  408. #line 638 "common-p.ch"
  409.  
  410. #line 639 "common-p.ch"
  411. extern void fatal(char*,char*);
  412. extern void overflow(char*);
  413. #line 1165 "common.w"
  414.  
  415. /*:63*//*69:*/
  416. #line 706 "common-p.ch"
  417.  
  418. #line 707 "common-p.ch"
  419. static void scan_args(void);
  420. #line 1243 "common.w"
  421.  
  422. /*:69*//*84:*/
  423. #line 858