home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _languages / languages / cweb / c / common next >
Text File  |  1994-02-20  |  17KB  |  677 lines

  1. #include <stdarg.h>
  2. #define variant empty
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include <limits.h>
  8. #include "common.h"
  9. #define max_bytes 50000L
  10. #define max_names 3000
  11. #define max_sections 10000
  12. #define hash_size 353
  13. #define buf_size 100
  14. #define longest_name 400
  15. #define long_buf_size (buf_size+longest_name)
  16. #define local static
  17. #define array_size(a)((int)(sizeof(a)/sizeof(a[0])))
  18. #define false (boolean)0
  19. #define true (boolean)1
  20. #define ctangle 0
  21. #define cweave 1
  22. #define and_and 04
  23. #define lt_lt 020
  24. #define gt_gt 021
  25. #define plus_plus 013
  26. #define minus_minus 01
  27. #define minus_gt 031
  28. #define not_eq 032
  29. #define lt_eq 034
  30. #define gt_eq 035
  31. #define eq_eq 036
  32. #define or_or 037
  33. #define find_char (loc<=limit||get_line())
  34. #define including_header_file (saved_include_depth>0)
  35. #define spotless 0
  36. #define harmless_message 1
  37. #define error_message 2
  38. #define fatal_message 3
  39. #define mark_harmless if(history==spotless)history=harmless_message;else
  40. #define mark_error history=error_message
  41. #define overflow(t)fatal("\n! Sorry, %s capacity exceeded",t)
  42. #define confusion(s)fatal("\n! This can't happen: %s",s)
  43. #define show_banner flags['b']
  44. #define show_progress flags['p']
  45. #define show_stats flags['s']
  46. #define show_happiness flags['h']
  47. #define C_plus_plus flags['+']
  48. #define update_terminal fflush(stdout)
  49. #define new_line putchar('\n')
  50. #define term_write(string,leng)printf("%.*s",(int)(leng),string)
  51. #define buffer_end (&buffer[buf_size-2])
  52. #define max_include_depth 10
  53. #define lines_match  \
  54. (change_limit-change_buffer==limit-buffer \
  55. &&strncmp(buffer,change_buffer,limit-buffer)==0)
  56. #define byte_mem_end (&byte_mem[max_bytes])
  57. #define name_dir_end (&name_dir[max_names])
  58. #define update_terminal fflush(stdout)
  59. /*12:*//*8:*/
  60. #line 122 "common.inc"
  61. boolean names_match(name_pointer,char*,int,int);
  62. void init_id_name(name_pointer,int);
  63. void init_module_name(name_pointer);/*:8*//*16:*/
  64. #line 102 "w.common"
  65. int program,phase;/*:16*//*20:*/
  66. #line 144 "w.common"
  67. char buffer[long_buf_size];
  68. char*loc=buffer;
  69.  
  70. char*limit=buffer;/*:20*//*23:*/
  71. #line 220 "w.common"
  72. int include_depth;
  73. int saved_include_depth=0;
  74. struct f file[max_include_depth];
  75. struct f change;
  76. local char alt_web_file_name[max_file_name_length];
  77. boolean input_has_ended;
  78. boolean changing;
  79. boolean web_file_open=false;
  80. boolean print_where=false;/*:23*//*26:*/
  81. #line 295 "w.common"
  82. local boolean saved_changing;
  83. local char*saved_change_limit;/*:26*//*29:*/
  84. #line 348 "w.common"
  85. local char change_buffer[buf_size];
  86. local char*change_limit;/*:29*//*41:*/
  87. #line 532 "w.common"
  88. sixteen_bits section_count;
  89. eight_bits changed_section[(max_sections+7)/8];/*:41*//*49:*/
  90. #line 688 "w.common"
  91. char byte_mem[max_bytes];
  92. char*byte_ptr= &byte_mem[0];
  93. name_info name_dir[max_names];
  94. name_pointer name_ptr= &name_dir[0];/*:49*//*53:*/
  95. #line 747 "w.common"
  96. struct empty{char comforter;};/*:53*//*55:*/
  97. #line 770 "w.common"
  98. name_pointer hash[hash_size];/*:55*//*62:*/
  99. #line 860 "w.common"
  100. name_pointer root=NULL;/*:62*//*69:*/
  101. #line 1004 "w.common"
  102. char mod_text[longest_name+1];
  103. char*id_first;
  104. char*id_loc;/*:69*//*75:*/
  105. #line 1098 "w.common"
  106. int history=spotless;/*:75*//*82:*/
  107. #line 1198 "w.common"
  108. int argc;
  109. char* *argv;
  110. boolean flags[UCHAR_MAX+1];
  111. char C_file_name[max_file_name_length];
  112. local char tex_file_name[max_file_name_length];
  113. local boolean change_file_explicit;/*:82*//*93:*/
  114. #line 1322 "w.common"
  115. FILE*C_file;
  116. FILE*tex_file;/*:93*//*97:*/
  117. #line 1359 "w.common"
  118. local boolean term_line_empty=true;/*:97*//*63:*/
  119. #line 868 "w.common"
  120. local enum mod_comparison
  121. {less,
  122.  
  123. equal,
  124. greater,
  125.  
  126. prefix,
  127. extension
  128. }web_strcmp(char*,char*,char*,char*);
  129. local name_pointer make_mod_node(char*,int);/*:63*//*85:*/
  130. #line 1226 "w.common"
  131. local void scan_args(void);/*:85*//*:12*//*18:*/
  132. #line 112 "w.common"
  133. void common_init(void)
  134. {/*50:*/
  135. #line 696 "w.common"
  136. name_begin(name_ptr)=byte_ptr;/*:50*//*56:*/
  137. #line 778 "w.common"
  138. {int i=hash_size;do hash[--i]=NULL;while(i>0);}/*:56*//*71:*/
  139. #line 1033 "w.common"
  140. mod_text[0]=' ';/*:71*//*83:*/
  141. #line 1209 "w.common"
  142. show_banner=show_happiness=show_progress=true;/*:83*/
  143. #line 115 "w.common"
  144. scan_args();
  145. }/*:18*//*21:*/
  146. #line 157 "w.common"
  147. local boolean input_ln(FILE*f)
  148.  
  149. {register int c;
  150. register char*k=limit=buffer;
  151. while((c=getc(f))!='\n'&&c!=EOF)
  152. if(k<=buffer_end){*k++=c;if(!isspace(c))limit=k;}
  153. if(k>buffer_end)
  154. {loc=buffer;
  155. err_print("! Input line too long");
  156. if(limit>buffer_end)limit=buffer_end;
  157. }
  158. return c!=EOF||limit>buffer;
  159. }/*:21*//*24:*/
  160. #line 245 "w.common"
  161. void push_input_file(boolean at_h)
  162. {char delim=' ';
  163. while(loc<limit&&(isspace(*loc)))++loc;
  164. if(*loc!='<')
  165. {if(*loc=='"')delim= *loc++;
  166. if(loc>=limit)err_print("! Include file name not given");
  167.  
  168. else if(++include_depth>=max_include_depth)
  169. {--include_depth;
  170. err_print("! Too many nested includes");
  171. }
  172. else
  173. {/*25:*/
  174. #line 37 "ch.common"
  175. {
  176. char*k=cur_file_name,*dot_pos,*colon_pos;
  177. while(!(*loc==delim||(delim==' '?isspace(*loc):loc==limit)))
  178. if(k== &cur_file_name[max_file_name_length-1])
  179. {
  180. err_print("! Include file name truncated");break;}
  181.  
  182. else
  183. *k++= *loc++;
  184. *k='\0';
  185.  
  186.  
  187.  
  188.  
  189. dot_pos=strrchr(cur_file_name,'.');
  190. colon_pos=strrchr(cur_file_name,':');
  191. if((dot_pos[2]=='\0')||(dot_pos[3]=='\0')){
  192. char temp[max_file_name_length];
  193. *dot_pos='\0';
  194. if(colon_pos==NULL)
  195. sprintf(temp,"%s.%s",dot_pos+1,cur_file_name);
  196. else{
  197. *colon_pos='\0';
  198. sprintf(temp,"%s:%s.%s",cur_file_name,dot_pos+1,
  199. colon_pos+1);
  200. }
  201. strcpy(cur_file_name,temp);
  202. }
  203. }/*:25*/
  204. #line 8 "ch.common"
  205. if((cur_file=fopen(cur_file_name,"r"))==NULL)
  206. {char temp[max_file_name_length+3];
  207.  
  208.  
  209.  
  210. if(strchr(cur_file_name,':')==NULL){
  211. sprintf(temp,"C:%s",cur_file_name);
  212. cur_file=fopen(temp,"r");
  213. }
  214. if(cur_file==NULL){
  215. --include_depth;
  216. err_print("! Cannot open include file");
  217.  
  218. }
  219. }
  220. #line 263 "w.common"
  221. else
  222. {cur_line=0;print_where=true;/*27:*/
  223. #line 299 "w.common"
  224. if(at_h)
  225. {saved_changing=changing;changing=false;
  226. saved_change_limit=change_limit;change_limit=change_buffer;
  227. saved_include_depth=include_depth;
  228. }/*:27*/
  229. #line 266 "w.common"
  230. }
  231. }
  232. }
  233. loc= &limit[1];
  234. }/*:24*//*28:*/
  235. #line 315 "w.common"
  236. local boolean get_web_line(void)
  237. {do
  238. if(++cur_line,input_ln(cur_file))
  239. {loc=buffer;*limit=' ';
  240. if(*buffer!='@'||tolower(buffer[1])!='i')return true;
  241. loc+=2;print_where=true;push_input_file(false);
  242. }
  243. else if(include_depth==0)
  244. {input_has_ended=true;web_file_open=false;return false;}
  245. else
  246. {fclose(cur_file);print_where=true;
  247. if(include_depth-- ==saved_include_depth)
  248. {changing=saved_changing;change_limit=saved_change_limit;
  249. saved_include_depth=0;
  250. if(changing)return false;
  251. }
  252. }
  253. while(true);
  254. }/*:28*//*30:*/
  255. #line 361 "w.common"
  256. local void prime_the_change_buffer(void)
  257. {change_limit=change_buffer;/*31:*/
  258. #line 377 "w.common"
  259. while(true)
  260. {if(++change_line,!input_ln(change_file))return;
  261. if(limit<buffer+2||buffer[0]!='@')continue;
  262. buffer[1]=tolower(buffer[1]);/*32:*/
  263. #line 394 "w.common"
  264. {if(buffer[1]=='i')
  265. {loc=buffer+2;err_print("! No includes allowed in change file");}
  266. }/*:32*/
  267. #line 382 "w.common"
  268. if(buffer[1]=='x')break;
  269. if(buffer[1]=='y'||buffer[1]=='z')
  270. {loc=buffer+2;
  271. err_print("! Where is the matching @x?");
  272. }
  273. }/*:31*//*33:*/
  274. #line 405 "w.common"
  275. do
  276. if(++change_line,!input_ln(change_file))
  277. {err_print("! Change file ended after @x");return;}
  278. while(limit==buffer);/*:33*//*34:*/
  279. #line 411 "w.common"
  280. {change_limit=change_buffer-buffer+limit;
  281. strncpy(change_buffer,buffer,limit-buffer);
  282. }/*:34*/
  283. #line 367 "w.common"
  284. }/*:30*//*35:*/
  285. #line 429 "w.common"
  286. local void check_change(void)
  287.  
  288. {int n=0;
  289. if(!lines_match)return;
  290. print_where=true;
  291. do
  292. {changing=true;
  293. if(++change_line,!input_ln(change_file))
  294. {err_print("! Change file ended before @y");
  295.  
  296. change_limit=change_buffer;changing=false;
  297. return;
  298. }
  299. if(limit>buffer+1&&buffer[0]=='@')
  300. {buffer[1]=tolower(buffer[1]);/*32:*/
  301. #line 394 "w.common"
  302. {if(buffer[1]=='i')
  303. {loc=buffer+2;err_print("! No includes allowed in change file");}
  304. }/*:32*//*36:*/
  305. #line 461 "w.common"
  306. if(buffer[1]=='x'||buffer[1]=='z')
  307. {loc=buffer+2;err_print("! Where is the matching @y?");}
  308.  
  309. else if(buffer[1]=='y')
  310. {if(n>0)
  311. {loc=buffer+2;
  312. print("\n! Hmm... %d of the preceding lines failed to match",n);
  313.  
  314. err_print("");
  315. }
  316. return;
  317. }/*:36*/
  318. #line 447 "w.common"
  319. }/*34:*/
  320. #line 411 "w.common"
  321. {change_limit=change_buffer-buff