common.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:22k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*1:*/
  2. #line 57 "common.w"
  3. /*5:*/
  4. #line 101 "common.w"
  5. #include <ctype.h>
  6. /*:5*//*8:*/
  7. #line 164 "common.w"
  8. #include <stdio.h>
  9. /*:8*//*22:*/
  10. #line 469 "common.w"
  11. #include <stdlib.h> 
  12. /*:22*/
  13. #line 58 "common.w"
  14. #define ctangle 0
  15. #define cweave 1 
  16. #define and_and 04
  17. #define lt_lt 020
  18. #define gt_gt 021
  19. #define plus_plus 013
  20. #define minus_minus 01
  21. #define minus_gt 031
  22. #define not_eq 032
  23. #define lt_eq 034
  24. #define gt_eq 035
  25. #define eq_eq 036
  26. #define or_or 037
  27. #define dot_dot_dot 016
  28. #define colon_colon 06
  29. #define period_ast 026
  30. #define minus_gt_ast 027 
  31. #define buf_size 100
  32. #define longest_name 1000
  33. #define long_buf_size (buf_size+longest_name) 
  34. #define xisspace(c) (isspace(c) &&((unsigned char) c<0200) ) 
  35. #define xisupper(c) (isupper(c) &&((unsigned char) c<0200) )  
  36. #define max_include_depth 10 
  37. #define max_file_name_length 60
  38. #define cur_file file[include_depth]
  39. #define cur_file_name file_name[include_depth]
  40. #define cur_line line[include_depth]
  41. #define web_file file[0]
  42. #define web_file_name file_name[0] 
  43. #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| 
  44. strncmp(buffer,change_buffer,limit-buffer) )  
  45. #define if_section_start_make_pending(b) {*limit= '!'; 
  46. for(loc= buffer;xisspace(*loc) ;loc++) ; 
  47. *limit= ' '; 
  48. if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; 
  49. #define max_sections 2000 
  50.  
  51. #define too_long() {include_depth--; 
  52. err_print("! Include file name too long") ;goto restart;} 
  53. #define max_bytes 90000 
  54. #define max_names 4000 
  55.  
  56. #define length(c) (c+1) ->byte_start-(c) ->byte_start
  57. #define print_id(c) term_write((c) ->byte_start,length((c) ) )  
  58. #define hash_size 353 
  59. #define llink link
  60. #define rlink dummy.Rlink
  61. #define root name_dir->rlink 
  62.  
  63. #define first_chunk(p) ((p) ->byte_start+2) 
  64. #define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ 
  65. (unsigned char) *((p) ->byte_start+1) ) 
  66. #define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, 
  67. *((p) ->byte_start+1) = (m) %256)  
  68. #define less 0
  69. #define equal 1
  70. #define greater 2
  71. #define prefix 3
  72. #define extension 4 
  73. #define bad_extension 5 
  74. #define spotless 0
  75. #define harmless_message 1
  76. #define error_message 2
  77. #define fatal_message 3
  78. #define mark_harmless {if(history==spotless) history= harmless_message;}
  79. #define mark_error history= error_message 
  80. #define confusion(s) fatal("! This can't happen: ",s)  
  81.  
  82. #define show_banner flags['b']
  83. #define show_progress flags['p']
  84. #define show_stats flags['s']
  85. #define show_happiness flags['h'] 
  86. #define update_terminal fflush(stdout)  
  87. #define new_line putchar('n') 
  88. #define putxchar putchar
  89. #define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
  90. #define C_printf(c,a) fprintf(C_file,c,a) 
  91. #define C_putc(c) putc(c,C_file)  
  92. #line 59 "common.w"
  93. /*2:*/
  94. #line 72 "common.w"
  95. typedef short boolean;
  96. boolean program;
  97. /*:2*//*7:*/
  98. #line 158 "common.w"
  99. char buffer[long_buf_size];
  100. char*buffer_end= buffer+buf_size-2;
  101. char*limit= buffer;
  102. char*loc= buffer;
  103. /*:7*//*10:*/
  104. #line 213 "common.w"
  105. int include_depth;
  106. FILE*file[max_include_depth];
  107. FILE*change_file;
  108. char file_name[max_include_depth][max_file_name_length];
  109. char change_file_name[max_file_name_length];
  110. char alt_web_file_name[max_file_name_length];
  111. int line[max_include_depth];
  112. int change_line;
  113. int change_depth;
  114. boolean input_has_ended;
  115. boolean changing;
  116. boolean web_file_open= 0;
  117. /*:10*//*20:*/
  118. #line 417 "common.w"
  119. typedef unsigned short sixteen_bits;
  120. sixteen_bits section_count;
  121. boolean changed_section[max_sections];
  122. boolean change_pending;
  123. boolean print_where= 0;
  124. /*:20*//*27:*/
  125. #line 587 "common.w"
  126. typedef struct name_info{
  127. char*byte_start;
  128. /*31:*/
  129. #line 624 "common.w"
  130. struct name_info*link;
  131. /*:31*//*40:*/
  132. #line 723 "common.w"
  133. union{
  134. struct name_info*Rlink;
  135. char Ilk;
  136. }dummy;
  137. /*:40*//*55:*/
  138. #line 1055 "common.w"
  139. char*equiv_or_xref;
  140. /*:55*/
  141. #line 590 "common.w"
  142. }name_info;
  143. typedef name_info*name_pointer;
  144. char byte_mem[max_bytes];
  145. char*byte_mem_end= byte_mem+max_bytes-1;
  146. name_info name_dir[max_names];
  147. name_pointer name_dir_end= name_dir+max_names-1;
  148. /*:27*//*29:*/
  149. #line 610 "common.w"
  150. name_pointer name_ptr;
  151. char*byte_ptr;
  152. /*:29*//*32:*/
  153. #line 637 "common.w"
  154. typedef name_pointer*hash_pointer;
  155. name_pointer hash[hash_size];
  156. hash_pointer hash_end= hash+hash_size-1;
  157. hash_pointer h;
  158. /*:32*//*56:*/
  159. #line 1075 "common.w"
  160. int history= spotless;
  161. /*:56*//*67:*/
  162. #line 1213 "common.w"
  163. int argc;
  164. char**argv;
  165. char C_file_name[max_file_name_length];
  166. char tex_file_name[max_file_name_length];
  167. char idx_file_name[max_file_name_length];
  168. char scn_file_name[max_file_name_length];
  169. boolean flags[128];
  170. /*:67*//*77:*/
  171. #line 1367 "common.w"
  172. FILE*C_file;
  173. FILE*tex_file;
  174. FILE*idx_file;
  175. FILE*scn_file;
  176. FILE*active_file;
  177. /*:77*/
  178. #line 60 "common.w"
  179. /*3:*/
  180. #line 82 "common.w"
  181. int phase;
  182. /*:3*//*11:*/
  183. #line 239 "common.w"
  184. char change_buffer[buf_size];
  185. char*change_limit;
  186. /*:11*/
  187. #line 61 "common.w"
  188. /*33:*/
  189. #line 643 "common.w"
  190. extern int names_match();
  191. /*:33*//*38:*/
  192. #line 696 "common.w"
  193. void init_p();
  194. /*:38*//*46:*/
  195. #line 845 "common.w"
  196. extern void init_node();
  197. /*:46*//*53:*/
  198. #line 1010 "common.w"
  199. int section_name_cmp();
  200. /*:53*//*57:*/
  201. #line 1085 "common.w"
  202. void err_print();
  203. /*:57*//*60:*/
  204. #line 1133 "common.w"
  205. int wrap_up();
  206. extern void print_stats();
  207. /*:60*//*63:*/
  208. #line 1166 "common.w"
  209. void fatal(),overflow();
  210. /*:63*//*69:*/
  211. #line 1244 "common.w"
  212. void scan_args();
  213. /*:69*//*81:*/
  214. #line 1408 "common.w"
  215. extern int strlen();
  216. extern int strcmp();
  217. extern char*strcpy();
  218. extern int strncmp();
  219. extern char*strncpy();
  220. /*:81*/
  221. #line 62 "common.w"
  222. /*:1*//*4:*/
  223. #line 88 "common.w"
  224. void
  225. common_init()
  226. {
  227. /*30:*/
  228. #line 614 "common.w"
  229. name_dir->byte_start= byte_ptr= byte_mem;
  230. name_ptr= name_dir+1;
  231. name_ptr->byte_start= byte_mem;
  232. /*:30*//*34:*/
  233. #line 648 "common.w"
  234. for(h= hash;h<=hash_end;*h++= NULL);
  235. /*:34*//*41:*/
  236. #line 730 "common.w"
  237. root= NULL;
  238. /*:41*/
  239. #line 92 "common.w"
  240. ;
  241. /*68:*/
  242. #line 1226 "common.w"
  243. show_banner= show_happiness= show_progress= 1;
  244. /*:68*/
  245. #line 93 "common.w"
  246. ;
  247. /*78:*/
  248. #line 1374 "common.w"
  249. scan_args();
  250. if(program==ctangle){
  251. if((C_file= fopen(C_file_name,"w"))==NULL)
  252. fatal("! Cannot open output file ",C_file_name);
  253. }
  254. else{
  255. if((tex_file= fopen(tex_file_name,"w"))==NULL)
  256. fatal("! Cannot open output file ",tex_file_name);
  257. }
  258. /*:78*/
  259. #line 94 "common.w"
  260. ;
  261. }
  262. /*:4*//*9:*/
  263. #line 171 "common.w"
  264. int input_ln(fp)
  265. FILE*fp;
  266. {
  267. register int c= EOF;
  268. register char*k;
  269. if(feof(fp))return(0);
  270. limit= k= buffer;
  271. while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='n')
  272. if((*(k++)= c)!=' ')limit= k;
  273. if(k>buffer_end)
  274. if((c= getc(fp))!=EOF&&c!='n'){
  275. ungetc(c,fp);loc= buffer;err_print("! Input line too long");
  276. }
  277. if(c==EOF&&limit==buffer)return(0);
  278. return(1);
  279. }
  280. /*:9*//*12:*/
  281. #line 250 "common.w"
  282. void
  283. prime_the_change_buffer()
  284. {
  285. change_limit= change_buffer;
  286. /*13:*/
  287. #line 264 "common.w"
  288. while(1){
  289. change_line++;
  290. if(!input_ln(change_file))return;
  291. if(limit<buffer+2)continue;
  292. if(buffer[0]!='@')continue;
  293. if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  294. if(buffer[1]=='x')break;
  295. if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
  296. loc= buffer+2;
  297. err_print("! Missing @x in change file");
  298. }
  299. }
  300. /*:13*/
  301. #line 255 "common.w"
  302. ;
  303. /*14:*/
  304. #line 281 "common.w"
  305. do{
  306. change_line++;
  307. if(!input_ln(change_file)){
  308. err_print("! Change file ended after @x");
  309. return;
  310. }
  311. }while(limit==buffer);
  312. /*:14*/
  313. #line 256 "common.w"
  314. ;
  315. /*15:*/
  316. #line 291 "common.w"
  317. {
  318. change_limit= change_buffer-buffer+limit;
  319. strncpy(change_buffer,buffer,limit-buffer+1);
  320. }
  321. /*:15*/
  322. #line 257 "common.w"
  323. ;
  324. }
  325. /*:12*//*16:*/
  326. #line 319 "common.w"
  327. void
  328. check_change()
  329. {
  330. int n= 0;
  331. if(lines_dont_match)return;
  332. change_pending= 0;
  333. if(!changed_section[section_count]){
  334. if_section_start_make_pending(1);
  335. if(!change_pending)changed_section[section_count]= 1;
  336. }
  337. while(1){
  338. changing= 1;print_where= 1;change_line++;
  339. if(!input_ln(change_file)){
  340. err_print("! Change file ended before @y");
  341. change_limit= change_buffer;changing= 0;
  342. return;
  343. }
  344. if(limit>buffer+1&&buffer[0]=='@'){
  345. if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  346. /*17:*/
  347. #line 357 "common.w"
  348. if(buffer[1]=='x'||buffer[1]=='z'){
  349. loc= buffer+2;err_print("! Where is the matching @y?");
  350. }
  351. else if(buffer[1]=='y'){
  352. if(n>0){
  353. loc= buffer+2;
  354. printf("n! Hmm... %d ",n);
  355. err_print("of the preceding lines failed to match");
  356. }
  357. change_depth= include_depth;
  358. return;
  359. }
  360. /*:17*/
  361. #line 341 "common.w"
  362. ;
  363. }
  364. /*15:*/
  365. #line 291 "common.w"
  366. {
  367. change_limit= change_buffer-buffer+limit;
  368. strncpy(change_buffer,buffer,limit-buffer+1);
  369. }
  370. /*:15*/
  371. #line 343 "common.w"
  372. ;
  373. changing= 0;cur_line++;
  374. while(!input_ln(cur_file)){
  375. if(include_depth==0){
  376. err_print("! CWEB file ended during a change");
  377. input_has_ended= 1;return;
  378. }
  379. include_depth--;cur_line++;
  380. }
  381. if(lines_dont_match)n++;
  382. }
  383. }
  384. /*:16*//*18:*/
  385. #line 377 "common.w"
  386. void
  387. reset_input()
  388. {
  389. limit= buffer;loc= buffer+1;buffer[0]= ' ';
  390. /*19:*/
  391. #line 392 "common.w"
  392. if((web_file= fopen(web_file_name,"r"))==NULL){
  393. strcpy(web_file_name,alt_web_file_name);
  394. if((web_file= fopen(web_file_name,"r"))==NULL)
  395. fatal("! Cannot open input file ",web_file_name);
  396. }
  397. web_file_open= 1;
  398. if((change_file= fopen(change_file_name,"r"))==NULL)
  399. fatal("! Cannot open change file ",change_file_name);
  400. /*:19*/
  401. #line 382 "common.w"
  402. ;
  403. include_depth= 0;cur_line= 0;change_line= 0;
  404. change_depth= include_depth;
  405. changing= 1;prime_the_change_buffer();changing= !changing;
  406. limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
  407. }
  408. /*:18*//*21:*/
  409. #line 425 "common.w"
  410. int get_line()
  411. {
  412. restart:
  413. if(changing&&include_depth==change_depth)
  414. /*25:*/
  415. #line 530 "common.w"
  416. {
  417. change_line++;
  418. if(!input_ln(change_file)){
  419. err_print("! Change file ended without @z");
  420. buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
  421. }
  422. if(limit>buffer){
  423. if(change_pending){
  424. if_section_start_make_pending(0);
  425. if(change_pending){
  426. changed_section[section_count]= 1;change_pending= 0;
  427. }
  428. }
  429. *limit= ' ';
  430. if(buffer[0]=='@'){
  431. if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
  432. if(buffer[1]=='x'||buffer[1]=='y'){
  433. loc= buffer+2;
  434. err_print("! Where is the matching @z?");
  435. }
  436. else if(buffer[1]=='z'){
  437. prime_the_change_buffer();changing= !changing;print_where= 1;
  438. }
  439. }
  440. }
  441. }
  442. /*:25*/
  443. #line 430 "common.w"
  444. ;
  445. if(!changing||include_depth>change_depth){
  446. /*24:*/
  447. #line 513 "common.w"
  448. {
  449. cur_line++;
  450. while(!input_ln(cur_file)){
  451. print_where= 1;
  452. if(include_depth==0){input_has_ended= 1;break;}
  453. else{
  454. fclose(cur_file);include_depth--;
  455. if(changing&&include_depth==change_depth)break;
  456. cur_line++;
  457. }
  458. }
  459. if(!changing&&!input_has_ended)
  460. if(limit-buffer==change_limit-change_buffer)
  461. if(buffer[0]==change_buffer[0])
  462. if(change_limit>change_buffer)check_change();
  463. }
  464. /*:24*/
  465. #line 432 "common.w"
  466. ;
  467. if(changing&&include_depth==change_depth)goto restart;
  468. }
  469. loc= buffer;*limit= ' ';
  470. if(*buffer=='@'&&(*(buffer+1)=='i'||*(buffer+1)=='I')){
  471. loc= buffer+2;
  472. while(loc<=limit&&(*loc==' '||*loc=='t'||*loc=='"'))loc++;
  473. if(loc>=limit){
  474. err_print("! Include file name not given");
  475. goto restart;
  476. }
  477. if(include_depth>=max_include_depth-1){
  478. err_print("! Too many nested includes");
  479. goto restart;
  480. }
  481. include_depth++;
  482. /*23:*/
  483. #line 472 "common.w"
  484. {
  485. char temp_file_name[max_file_name_length];
  486. char*cur_file_name_end= cur_file_name+max_file_name_length-1;
  487. char*k= cur_file_name,*kk;
  488. int l;
  489. while(*loc!=' '&&*loc!='t'&&*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
  490. if(k>cur_file_name_end)too_long();
  491. *k= '';
  492. if((cur_file= fopen(cur_file_name,"r"))!=NULL){
  493. cur_line= 0;print_where= 1;
  494. goto restart;
  495. }
  496. kk= getenv("CWEBINPUTS");
  497. if(kk!=NULL){
  498. if((l= strlen(kk))>max_file_name_length-2)too_long();
  499. strcpy(temp_file_name,kk);
  500. }
  501. else{
  502. #ifdef CWEBINPUTS
  503. if((l= strlen(CWEBINPUTS))>max_file_name_length-2)too_long();
  504. strcpy(temp_file_name,CWEBINPUTS);
  505. #else
  506. l= 0;
  507. #endif 
  508. }
  509. if(l>0){
  510. if(k+l+2>=cur_file_name_end)too_long();
  511. for(;k>=cur_file_name;k--)*(k+l+1)= *k;
  512. strcpy(cur_file_name,temp_file_name);
  513. cur_file_name[l]= '/';
  514. if((cur_file= fopen(cur_file_name,"r"))!=NULL){
  515. cur_line= 0;print_where= 1;
  516. goto restart;
  517. }
  518. }
  519. include_depth--;err_print("! Cannot open include file");goto restart;
  520. }
  521. /*:23*/
  522. #line 450 "common.w"
  523. ;
  524. }
  525. return(!input_has_ended);
  526. }
  527. /*:21*//*26:*/
  528. #line 562 "common.w"
  529. void
  530. check_complete(){
  531. if(change_limit!=change_buffer){
  532. strncpy(buffer,change_buffer,change_limit-change_buffer+1);
  533. limit= buffer+(int)(change_limit-change_buffer);
  534. changing= 1;change_depth= include_depth;loc= buffer;
  535. err_print("! Change file entry did not match");
  536. }
  537. }
  538. /*:26*//*35:*/
  539. #line 653 "common.w"
  540. name_pointer
  541. id_lookup(first,last,t)
  542. char*first;
  543. char*last;
  544. char t;
  545. {
  546. char*i= first;
  547. int h;
  548. int l;
  549. name_pointer p;
  550. if(last==NULL)for(last= first;*last!='';last++);
  551. l= last-first;
  552. /*36:*/
  553. #line 676 "common.w"
  554. h= (unsigned char)*i;
  555. while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
  556. /*:36*/
  557. #line 666 "common.w"
  558. ;
  559. /*37:*/
  560. #line 684 "common.w"
  561. p= hash[h];
  562. while(p&&!names_match(p,first,l,t))p= p->link;
  563. if(p==NULL){
  564. p= name_ptr;
  565. p->link= hash[h];hash[h]= p;
  566. }
  567. /*:37*/
  568. #line 667 "common.w"
  569. ;
  570. if(p==name_ptr)/*39:*/
  571. #line 699 "common.w"
  572. {
  573. if(byte_ptr+l>byte_mem_end)overflow("byte memory");
  574. if(name_ptr>=name_dir_end)overflow("name");
  575. strncpy(byte_ptr,first,l);
  576. (++name_ptr)->byte_start= byte_ptr+= l;
  577. if(program==cweave)init_p(p,t);
  578. }
  579. /*:39*/
  580. #line 668 "common.w"
  581. ;
  582. return(p);
  583. }
  584. /*:35*//*42:*/
  585. #line 757 "common.w"
  586. void
  587. print_section_name(p)
  588. name_pointer p;
  589. {
  590. char*ss,*s= first_chunk(p);
  591. name_pointer q= p+1;
  592. while(p!=name_dir){
  593. ss= (p+1)->byte_start-1;
  594. if(*ss==' '&&ss>=s){
  595. term_write(s,ss-s);p= q->link;q= p;
  596. }else{
  597. term_write(s,ss+1-s);p= name_dir;q= NULL;
  598. }
  599. s= p->byte_start;
  600. }
  601. if(q)term_write("...",3);
  602. }
  603. /*:42*//*43:*/
  604. #line 776 "common.w"
  605. void
  606. sprint_section_name(dest,p)
  607. char*dest;
  608. name_pointer p;
  609. {
  610. char*ss,*s= first_chunk(p);
  611. name_pointer q= p+1;
  612. while(p!=name_dir){
  613. ss= (p+1)->byte_start-1;
  614. if(*ss==' '&&ss>=s){
  615. p= q->link;q= p;
  616. }else{
  617. ss++;p= name_dir;
  618. }
  619. strncpy(dest,s,ss-s),dest+= ss-s;
  620. s= p->byte_start;
  621. }
  622. *dest= '';
  623. }
  624. /*:43*//*44:*/
  625. #line 797 "common.w"
  626. void
  627. print_prefix_name(p)
  628. name_pointer p;
  629. {
  630. char*s= first_chunk(p);
  631. int l= prefix_length(p);
  632. term_write(s,l);
  633. if(s+l<(p+1)->byte_start)term_write("...",3);
  634. }
  635. /*:44*//*45:*/
  636. #line 818 "common.w"
  637. int web_strcmp(j,j_len,k,k_len)
  638. char*j,*k;
  639. int j_len,k_len;
  640. {
  641. char*j1= j+j_len,*k1= k+k_len;
  642. while(k<k1&&j<j1&&*j==*k)k++,j++;
  643. if(k==k1)if(j==j1)return equal;
  644. else return extension;
  645. else if(j==j1)return prefix;
  646. else if(*j<*k)return less;
  647. else return greater;
  648. }
  649. /*:45*//*47:*/
  650. #line 848 "common.w"
  651. name_pointer
  652. add_section_name(par,c,first,last,ispref)
  653. name_pointer par;
  654. int c;
  655. char*first;
  656. char*last;
  657. int ispref;
  658. {
  659. name_pointer p= name_ptr;
  660. char*s= first_chunk(p);
  661. int name_len= last-first+ispref;
  662. if(s+name_len>byte_mem_end)overflow("byte memory");
  663. if(name_ptr+1>=name_dir_end)overflow("name");
  664. (++name_ptr)->byte_start= byte_ptr= s+name_len;
  665. if(ispref){
  666. *(byte_ptr-1)= ' ';
  667. name_len--;
  668. name_ptr->link= name_dir;
  669. (++name_ptr)->byte_start= byte_ptr;
  670. }
  671. set_prefix_length(p,name_len);
  672. strncpy(s,first,name_len);
  673. p->llink= NULL;
  674. p->rlink= NULL;
  675. init_node(p);
  676. return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
  677. }
  678. /*:47*//*48:*/
  679. #line 877 "common.w"
  680. void
  681. extend_section_name(p,first,last,ispref)
  682. name_pointer p;
  683. char*first;
  684. char*last;
  685. int ispref;
  686. {
  687. char*s;
  688. name_pointer q= p+1;
  689. int name_len= last-first+ispref;
  690. if(name_ptr>=name_dir_end)overflow("name");
  691. while(q->link!=name_dir)q= q->link;
  692. q->link= name_ptr;
  693. s= name_ptr->byte_start;
  694. name_ptr->link= name_dir;
  695. if(s+name_len>byte_mem_end)overflow("byte memory");
  696. (++name_ptr)->byte_start= byte_ptr= s+name_len;
  697. strncpy(s,first,name_len);
  698. if(ispref)*(byte_ptr-1)= ' ';
  699. }
  700. /*:48*//*49:*/
  701. #line 905 "common.w"
  702. name_pointer
  703. section_lookup(first,last,ispref)
  704. char*first,*last;
  705. int ispref;
  706. {
  707. int c= 0;
  708. name_pointer p= root;
  709. name_pointer q= NULL;
  710. name_pointer r= NULL;
  711. name_pointer par= NULL;
  712. int name_len= last-first+1;
  713. /*50:*/
  714. #line 929 "common.w"
  715. while(p){
  716. c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
  717. if(c==less||c==greater){
  718. if(r==NULL)
  719. par= p;
  720. p= (c==less?p->llink:p->rlink);
  721. }else{
  722. if(r!=NULL){
  723. printf("n! Ambiguous prefix: matches <");
  724. print_prefix_name(p);
  725. printf(">n and <");
  726. print_prefix_name(r);
  727. err_print(">");
  728. return name_dir;
  729. }
  730. r= p;
  731. p= p->llink;
  732. q= r->rlink;
  733. }
  734. if(p==NULL)
  735. p= q,q= NULL;
  736. }
  737. /*:50*/
  738. #line 919 "common.w"
  739. ;
  740. /*51:*/
  741. #line 954 "common.w"
  742. if(r==NULL)
  743. return add_section_name(par,c,first,last+1,ispref);
  744. /*:51*/
  745. #line 920 "common.w"
  746. ;
  747. /*52:*/
  748. #line 962 "common.w"
  749. switch(section_name_cmp(&first,name_len,r)){
  750. case prefix:
  751. if(!ispref){
  752. printf("n! New name is a prefix of <");
  753. print_section_name(r);
  754. err_print(">");
  755. }
  756. else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
  757. case equal:return r;
  758. case extension:if(!ispref||first<=last)
  759. extend_section_name(r,first,last+1,ispref);
  760. return r;
  761. case bad_extension:
  762. printf("n! New name extends <");
  763. print_section_name(r);
  764. err_print(">");
  765. return r;
  766. default:
  767. printf("n! Section name incompatible with <");
  768. print_prefix_name(r);
  769. printf(">,n which abbreviates <");
  770. print_section_name(r);
  771. err_print(">");
  772. return r;
  773. }
  774. /*:52*/
  775. #line 921 "common.w"
  776. ;
  777. }
  778. /*:49*//*54:*/
  779. #line 1013 "common.w"
  780. int section_name_cmp(pfirst,len,r)
  781. char**pfirst;
  782. int len;
  783. name_pointer r;
  784. {
  785. char*first= *pfirst;
  786. name_pointer q= r+1;
  787. char*ss,*s= first_chunk(r);
  788. int c;
  789. int ispref;
  790. while(1){
  791. ss= (r+1)->byte_start-1;
  792. if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
  793. else ispref= 0,ss++,q= name_dir;
  794. switch(c= web_strcmp(first,len,s,ss-s)){
  795. case equal:if(q==name_dir)
  796. if(ispref){
  797. *pfirst= first+(ss-s);
  798. return extension;
  799. }else return equal;
  800. else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
  801. case extension:
  802. if(!ispref)return bad_extension;
  803. first+= ss-s;
  804. if(q!=name_dir){len-= ss-s;s= q->byte_start;r= q;continue;}
  805. *pfirst= first;return extension;
  806. default:return c;
  807. }
  808. }
  809. }
  810. /*:54*//*58:*/
  811. #line 1088 "common.w"
  812. void
  813. err_print(s)
  814. char*s;
  815. {
  816. char*k,*l;
  817. printf(*s=='!'?"n%s":"%s",s);
  818. if(web_file_open)/*59:*/
  819. #line 1108 "common.w"
  820. {if(changing&&include_depth==change_depth)
  821. printf(". (l. %d of change file)n",change_line);
  822. else if(include_depth==0)printf(". (l. %d)n",cur_line);
  823. else printf(". (l. %d of include file %s)n",cur_line,cur_file_name);
  824. l= (loc>=limit?limit:loc);
  825. if(l>buffer){
  826. for(k= buffer;k<l;k++)
  827. if(*k=='t')putchar(' ');
  828. else putchar(*k);
  829. putchar('n');
  830. for(k= buffer;k<l;k++)putchar(' ');
  831. }
  832. for(k= l;k<limit;k++)putchar(*k);
  833. if(*limit=='|')putchar('|');
  834. putchar(' ');
  835. }
  836. /*:59*/
  837. #line 1095 "common.w"
  838. ;
  839. update_terminal;mark_error;
  840. }
  841. /*:58*//*61:*/
  842. #line 1143 "common.w"
  843. int wrap_up(){
  844. putchar('n');
  845. if(show_stats)
  846. print_stats();
  847. /*62:*/
  848. #line 1153 "common.w"
  849. switch(history){
  850. case spotless:if(show_happiness)printf("(No errors were found.)n");break;
  851. case harmless_message:
  852. printf("(Did you see the warning message above?)n");break;
  853. case error_message:
  854. printf("(Pardon me, but I think I spotted something wrong.)n");break;
  855. case fatal_message:printf("(That was a fatal error, my friend.)n");
  856. }
  857. /*:62*/
  858. #line 1148 "common.w"
  859. ;
  860. if(history>harmless_message)return(1);
  861. else return(0);
  862. }
  863. /*:61*//*64:*/
  864. #line 1172 "common.w"
  865. void
  866. fatal(s,t)
  867. char*s,*t;
  868. {
  869. if(*s)printf(s);
  870. err_print(t);
  871. history= fatal_message;exit(wrap_up());
  872. }
  873. /*:64*//*65:*/
  874. #line 1183 "common.w"
  875. void
  876. overflow(t)
  877. char*t;
  878. {
  879. printf("n! Sorry, %s capacity exceeded",t);fatal("","");
  880. }
  881. /*:65*//*70:*/
  882. #line 1247 "common.w"
  883. void
  884. scan_args()
  885. {
  886. char*dot_pos;
  887. char*name_pos;
  888. register char*s;
  889. boolean found_web= 0,found_change= 0,found_out= 0;
  890. boolean flag_change;
  891. while(--argc>0){
  892. if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*74:*/
  893. #line 1341 "common.w"
  894. {
  895. if(**argv=='-')flag_change= 0;
  896. else flag_change= 1;
  897. for(dot_pos= *argv+1;*dot_pos>'';dot_pos++)
  898. flags[*dot_pos]= flag_change;
  899. }
  900. /*:74*/
  901. #line 1259 "common.w"
  902. else{
  903. s= name_pos= *argv;dot_pos= NULL;
  904. while(*s){
  905. if(*s=='.')dot_pos= s++;
  906. else if(*s=='/')dot_pos= NULL,name_pos= ++s;
  907. else s++;
  908. }
  909. if(!found_web)/*71:*/
  910. #line 1285 "common.w"
  911. {
  912. if(s-*argv>max_file_name_length-5)
  913. /*76:*/
  914. #line 1361 "common.w"
  915. fatal("! Filename too longn",*argv);
  916. /*:76*/
  917. #line 1288 "common.w"
  918. ;
  919. if(dot_pos==NULL)
  920. sprintf(web_file_name,"%s.w",*argv);
  921. else{
  922. strcpy(web_file_name,*argv);
  923. *dot_pos= 0;
  924. }
  925. sprintf(alt_web_file_name,"%s.web",*argv);
  926. sprintf(tex_file_name,"%s.tex",name_pos);
  927. sprintf(idx_file_name,"%s.idx",name_pos);
  928. sprintf(scn_file_name,"%s.scn",name_pos);
  929. sprintf(C_file_name,"%s.c",name_pos);
  930. found_web= 1;
  931. }
  932. /*:71*/
  933. #line 1268 "common.w"
  934. else if(!found_change)/*72:*/
  935. #line 1303 "common.w"
  936. {
  937. if(strcmp(*argv,"-")==0)found_change= -1;
  938. else{
  939. if(s-*argv>max_file_name_length-4)
  940. /*76:*/
  941. #line 1361 "common.w"
  942. fatal("! Filename too longn",*argv);
  943. /*:76*/
  944. #line 1308 "common.w"
  945. ;
  946. if(dot_pos==NULL)
  947. sprintf(change_file_name,"%s.ch",*argv);
  948. else strcpy(change_file_name,*argv);
  949. found_change= 1;
  950. }
  951. }
  952. /*:72*/
  953. #line 1269 "common.w"
  954. else if(!found_out)/*73:*/
  955. #line 1316 "common.w"
  956. {
  957. if(s-*argv>max_file_name_length-5)
  958. /*76:*/
  959. #line 1361 "common.w"
  960. fatal("! Filename too longn",*argv);
  961. /*:76*/
  962. #line 1319 "common.w"
  963. ;
  964. if(dot_pos==NULL){
  965. sprintf(tex_file_name,"%s.tex",*argv);
  966. sprintf(idx_file_name,"%s.idx",*argv);
  967. sprintf(scn_file_name,"%s.scn",*argv);
  968. sprintf(C_file_name,"%s.c",*argv);
  969. }else{
  970. strcpy(tex_file_name,*argv);
  971. if(flags['x']){
  972. if(program==cweave&&strcmp(*argv+strlen(*argv)-4,".tex")!=0)
  973. fatal("! Output file name should end with .texn",*argv);
  974. strcpy(idx_file_name,*argv);
  975. strcpy(idx_file_name+strlen(*argv)-4,".idx");
  976. strcpy(scn_file_name,*argv);
  977. strcpy(scn_file_name+strlen(*argv)-4,".scn");
  978. }
  979. strcpy(C_file_name,*argv);
  980. }
  981. found_out= 1;
  982. }
  983. /*:73*/
  984. #line 1270 "common.w"
  985. else/*75:*/
  986. #line 1349 "common.w"
  987. {
  988. if(program==ctangle)
  989. fatal(
  990. "! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]n"
  991. ,"");
  992. else fatal(
  993. "! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]n"
  994. ,"");
  995. }
  996. /*:75*/
  997. #line 1271 "common.w"
  998. ;
  999. }
  1000. }
  1001. if(!found_web)/*75:*/
  1002. #line 1349 "common.w"
  1003. {
  1004. if(program==ctangle)
  1005. fatal(
  1006. "! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]n"
  1007. ,"");
  1008. else fatal(
  1009. "! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]n"
  1010. ,"");
  1011. }
  1012. /*:75*/
  1013. #line 1274 "common.w"
  1014. ;
  1015. if(found_change<=0)strcpy(change_file_name,"/dev/null");
  1016. }
  1017. /*:70*/