home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _languages / languages / cweb / c / ctangle < prev   
Text File  |  1994-02-20  |  22KB  |  851 lines

  1. #define banner "This is CTANGLE (Version 3.x)\n"
  2. #define max_tokmem 150000L
  3. #define max_textmem 2500
  4. #define max_files 16
  5. #define stack_size_max 50
  6. #define variant text
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <limits.h>
  12. #include "common.h"
  13. #define max_bytes 50000L
  14. #define max_names 3000
  15. #define max_sections 10000
  16. #define hash_size 353
  17. #define buf_size 100
  18. #define longest_name 400
  19. #define long_buf_size (buf_size+longest_name)
  20. #define local static
  21. #define array_size(a)((int)(sizeof(a)/sizeof(a[0])))
  22. #define false (boolean)0
  23. #define true (boolean)1
  24. #define ctangle 0
  25. #define cweave 1
  26. #define and_and 04
  27. #define lt_lt 020
  28. #define gt_gt 021
  29. #define plus_plus 013
  30. #define minus_minus 01
  31. #define minus_gt 031
  32. #define not_eq 032
  33. #define lt_eq 034
  34. #define gt_eq 035
  35. #define eq_eq 036
  36. #define or_or 037
  37. #define find_char (loc<=limit||get_line())
  38. #define including_header_file (saved_include_depth>0)
  39. #define spotless 0
  40. #define harmless_message 1
  41. #define error_message 2
  42. #define fatal_message 3
  43. #define mark_harmless if(history==spotless)history=harmless_message;else
  44. #define mark_error history=error_message
  45. #define overflow(t)fatal("\n! Sorry, %s capacity exceeded",t)
  46. #define confusion(s)fatal("\n! This can't happen: %s",s)
  47. #define show_banner flags['b']
  48. #define show_progress flags['p']
  49. #define show_stats flags['s']
  50. #define show_happiness flags['h']
  51. #define C_plus_plus flags['+']
  52. #define update_terminal fflush(stdout)
  53. #define new_line putchar('\n')
  54. #define term_write(string,leng)printf("%.*s",(int)(leng),string)
  55. #define tok_begin(p)(p)->tok_start
  56. #define tok_end(p)((p)+1)->tok_start
  57. #define text_info_end (&text_info[max_textmem])
  58. #define tok_mem_end (&tok_mem[max_tokmem])
  59. #define macro_flag text_info_end
  60. #define header_flag (text_info_end+1)
  61. #define next_sec(m)((m)->text_link)
  62. #define equiv equiv_or_xref
  63. #define verb_quote 0x2
  64. #define join 0x3
  65. #define cur_state stack[0]
  66. #define cur_byte cur_state.byte_field
  67. #define cur_end cur_state.end_field
  68. #define cur_repl cur_state.repl_field
  69. #define cur_sec cur_state.sec_nr_field
  70. #define stack_end (&stack[stack_size_max])
  71. #define stack_empty (stack_ptr== &stack[0])
  72. #define identifier 0x80
  73. #define section_start 0x81
  74. #define section_end 0x82
  75. #define line_mark 0x83
  76. #define C_printf(format,x)fprintf(C_file,format,x)
  77. #define C_putc(c)putc(c,C_file)
  78. #define no_space 0
  79. #define num_or_id 1
  80. #define operator 2
  81. #define literal 3
  82. #define comp_op(op) \
  83. C_printf(out_state==operator?" %s":"%s",op); \
  84. out_state=operator;break
  85. #define compress(char2,code) \
  86. if(*loc==char2)return++loc,code
  87. #define app_char(c)if(id_loc<mod_text_end)*id_loc++=c;else
  88. #define macro 0
  89. #define section_body 1
  90. #define store_byte(c) \
  91. if(tok_ptr==tok_mem_end)overflow("token");else*tok_ptr++=c
  92. #define report(k,c,m) \
  93. printf("%lu %ss (out of %lu)\n",(unsigned long)(c),k,(unsigned long)(m))
  94. /*2:*//*10:*/
  95. #line 122 "common.inc"
  96. boolean names_match(name_pointer,char*,int,int);
  97. void init_id_name(name_pointer,int);
  98. void init_module_name(name_pointer);/*:10*//*14:*/
  99. #line 134 "w.ctangle"
  100. typedef struct text
  101. {eight_bits*tok_start;
  102. struct text*text_link;
  103. }text,*text_pointer;/*:14*//*26:*/
  104. #line 396 "w.ctangle"
  105. typedef struct
  106. {eight_bits*byte_field;
  107. eight_bits*end_field;
  108. text_pointer repl_field;
  109. sixteen_bits sec_nr_field;
  110. }output_state,*stack_pointer;/*:26*//*41:*/
  111. #line 791 "w.ctangle"
  112. enum
  113. {ignore=0x80,
  114. id_code,constant,
  115. verbatim,
  116. at_sign_image,
  117. join_code,
  118. ord,
  119. control_text,
  120. format,
  121. definition,
  122. header,
  123. begin_C,
  124. module_name,
  125. new_section
  126. };/*:41*//*21:*/
  127. #line 293 "w.ctangle"
  128. void phase_two(void);
  129. void output(text_pointer);
  130. void C_newline(void);
  131. void out_char(eight_bits);/*:21*//*66:*/
  132. #line 1453 "w.ctangle"
  133. boolean mark_line(void);/*:66*//*76:*/
  134. #line 1621 "w.ctangle"
  135. void phase_one(void);/*:76*//*15:*/
  136. #line 155 "w.ctangle"
  137. text text_info[max_textmem+1];
  138. text_pointer text_ptr= &text_info[0];
  139. eight_bits tok_mem[max_tokmem];
  140. eight_bits*tok_ptr= &tok_mem[0];/*:15*//*17:*/
  141. #line 192 "w.ctangle"
  142. text_pointer text_root=NULL;
  143. text_pointer*last_unnamed= &text_root;/*:17*//*23:*/
  144. #line 334 "w.ctangle"
  145. name_pointer output_file[max_files];
  146. int output_file_count=0;/*:23*//*27:*/
  147. #line 425 "w.ctangle"
  148. output_state stack[stack_size_max];
  149. stack_pointer stack_ptr;/*:27*//*30:*/
  150. #line 488 "w.ctangle"
  151. int cur_val;/*:30*//*35:*/
  152. #line 652 "w.ctangle"
  153. eight_bits out_state;
  154. boolean protect;/*:35*//*42:*/
  155. #line 811 "w.ctangle"
  156. eight_bits ccode[UCHAR_MAX+1];/*:42*//*46:*/
  157. #line 921 "w.ctangle"
  158. name_pointer cur_name;/*:46*//*57:*/
  159. #line 1188 "w.ctangle"
  160. text_pointer cur_text;
  161. eight_bits next_control;/*:57*/
  162. #line 77 "w.ctangle"
  163.  
  164.  
  165. int main(int ac,char* *av)
  166. {argc=ac;argv=av;
  167. program=ctangle;/*16:*/
  168. #line 164 "w.ctangle"
  169. tok_begin(text_ptr)=tok_ptr;/*:16*//*43:*/
  170. #line 819 "w.ctangle"
  171. {unsigned char c=0;
  172. do ccode[c]=ignore;while(c++ !=UCHAR_MAX);
  173. ccode['v']=ccode['V']='|';
  174. ccode['=']=verbatim;
  175. ccode['@']=at_sign_image;
  176. ccode['&']=join_code;
  177. ccode['\'']=ord;
  178. ccode['^']=ccode['?']=ccode['.']=ccode[':']=ccode['#']=
  179. ccode['t']=ccode['T']=control_text;
  180. ccode['f']=ccode['F']=format;
  181. ccode['d']=ccode['D']=definition;
  182. ccode['h']=ccode['H']=header;
  183. ccode['c']=ccode['C']=ccode['p']=ccode['P']=begin_C;
  184. ccode['<']=ccode['(']=module_name;
  185. ccode[' ']=ccode['\t']=ccode['\n']=ccode['\v']=ccode['\r']=ccode['\f']=
  186. ccode['~']=ccode['*']=new_section;
  187. }/*:43*/
  188. #line 83 "w.ctangle"
  189. common_init();
  190. if(show_banner)print(banner);
  191. phase_one();
  192. phase_two();
  193. wrap_up();
  194. return 0;
  195. }/*:2*//*18:*/
  196. #line 207 "w.ctangle"
  197. boolean names_match(name_pointer p,char*first,int l,int dummy)
  198. {return length(p)==l&&strncmp(first,name_begin(p),l)==0;}
  199.  
  200. void init_module_name(name_pointer node)
  201. {node->equiv=NULL;}
  202.  
  203. void init_id_name(name_pointer dummy,int ilk){}/*:18*//*22:*/
  204. #line 305 "w.ctangle"
  205. void phase_two(void)
  206. {phase=2;
  207. if(text_root==NULL&&output_file_count==0)
  208. {print("\n! No program text was specified.");mark_harmless;}
  209.  
  210. else
  211. {if(show_progress)
  212. {print("\nWriting the output file%s"
  213. ,(text_root!=NULL)+output_file_count>1?"s":"");
  214. if(text_root!=NULL)printf(" (%s):",C_file_name);
  215. update_terminal;
  216. }
  217. if(text_root==NULL)C_file=NULL;
  218. else
  219. {open_output_file();cur_line=1;/*33:*/
  220. #line 564 "w.ctangle"
  221. {text_pointer repl,l;
  222. protect=true;
  223. for(repl= &text_info[0];repl<text_ptr;repl++)
  224. if((l=repl->text_link)==macro_flag||l==header_flag)
  225. {cur_byte=tok_begin(repl);cur_end=tok_end(repl);
  226. C_printf("#%se ",l==macro_flag?"defin":"includ");
  227. out_state=no_space;
  228. while(cur_byte<cur_end)
  229. {sixteen_bits a= *cur_byte++;
  230. if(a<0x80)out_char(a);
  231. else if(a>=0xF8)
  232. if(a==0xF8)out_char(*cur_byte++);
  233. else confusion("#line within macro");
  234. else
  235. {a=((a-0x80)<<8)+ *cur_byte++;
  236. if(a<0x2800){cur_val=a;out_char(identifier);}
  237. else confusion("module name within macro");
  238. }
  239. }
  240. C_newline();
  241. }
  242. protect=false;
  243. }/*:33*/
  244. #line 321 "w.ctangle"
  245. output(text_root);
  246. }/*24:*/
  247. #line 21 "ch.ctangle"
  248. {
  249. int i;
  250. char output_file_name[longest_name+1];
  251. for(i=0;i<output_file_count;i++)
  252. {
  253. name_pointer name=output_file[i];
  254. char*dotpos;
  255. strncpy(output_file_name,name_begin(name),length(name));
  256. output_file_name[length(name)]='\0';
  257.  
  258. dotpos=strchr(output_file_name,'.');
  259. if((dotpos!=NULL)&&((tolower(dotpos[1])=='c')||
  260. (tolower(dotpos[1])=='h'))&&(dotpos[2]=='\0')){
  261. char tmp[longest_name+1];
  262. *dotpos='\0';
  263. sprintf(tmp,"%c.%s",dotpos[1],output_file_name);
  264. strcpy(output_file_name,tmp);
  265. }
  266. if(C_file!=NULL)fclose(C_file);
  267. C_file=fopen(output_file_name,"w");
  268. if(C_file==NULL)
  269. fatal("! Cannot open \"%s\" as output file",output_file_name);
  270.  
  271. if(show_progress)print("\n(%s):",output_file_name);
  272. cur_line=1;
  273. output(name->equiv);
  274. }
  275. }/*:24*/
  276. #line 324 "w.ctangle"
  277. print_progress("\nDone.\n");
  278. }
  279. }/*:22*//*28:*/
  280. #line 436 "w.ctangle"
  281. void push_level(name_pointer p)
  282. {if(stack_ptr==stack_end)overflow("output stack");
  283. *stack_ptr++=cur_state;
  284. cur_repl=p->equiv;
  285. cur_byte=tok_begin(cur_repl);cur_end=tok_end(cur_repl);
  286. }/*:28*//*29:*/
  287. #line 454 "w.ctangle"
  288. void continue_or_pop_level(void)
  289. {if(cur_repl->text_link!=NULL)
  290. {cur_repl=next_sec(cur_repl);
  291. cur_byte=tok_begin(cur_repl);cur_end=tok_end(cur_repl);
  292. }
  293. else if(--stack_ptr> &stack[0])cur_state= *stack_ptr;
  294.  
  295. }/*:29*//*31:*/
  296. #line 503 "w.ctangle"
  297. void output(text_pointer repl)
  298. {stack_ptr= &stack[1];
  299. cur_repl=repl;
  300. cur_byte=tok_begin(cur_repl);