beta-0.89.2
[luatex.git] / source / texk / web2c / cwebboot.cin
blob3f6232421a3a3717776ef1daaa91b6be1c158453
1 /*1:*/
2 #line 58 "cwebdir/common.w"
4 /*5:*/
5 #line 102 "cwebdir/common.w"
7 #line 74 "cwebdir/comm-w2c.ch"
8 #define CWEB
9 #include "cpascal.h"
10 #include <ctype.h> 
11 #line 104 "cwebdir/common.w"
13 /*:5*//*8:*/
14 #line 165 "cwebdir/common.w"
16 #include <stdio.h> 
18 /*:8*//*22:*/
19 #line 471 "cwebdir/common.w"
21 #line 213 "cwebdir/comm-w2c.ch"
22 #include <kpathsea/kpathsea.h>  
23 #include <stdlib.h>  
24 #include "help.h"
26 /*:22*/
27 #line 59 "cwebdir/common.w"
29 #define ctangle 0
30 #define cweave 1 \
32 #define and_and 04
33 #define lt_lt 020
34 #define gt_gt 021
35 #define plus_plus 013
36 #define minus_minus 01
37 #define minus_gt 031
38 #define not_eq 032
39 #define lt_eq 034
40 #define gt_eq 035
41 #define eq_eq 036
42 #define or_or 037
43 #define dot_dot_dot 016
44 #define colon_colon 06
45 #define period_ast 026
46 #define minus_gt_ast 027 \
48 #define buf_size 1000
49 #define longest_name 1000
50 #define long_buf_size (buf_size+longest_name) 
51 #define xisspace(c) (isspace((unsigned char) c) &&((unsigned char) c<0200) ) 
52 #define xisupper(c) (isupper((unsigned char) c) &&((unsigned char) c<0200) )  \
54 #define max_include_depth 10 \
56 #define max_file_name_length 1024
57 #define cur_file file[include_depth]
58 #define cur_file_name file_name[include_depth]
59 #define cur_line line[include_depth]
60 #define web_file file[0]
61 #define web_file_name file_name[0] \
63 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
64 strncmp(buffer,change_buffer,limit-buffer) )  \
66 #define if_section_start_make_pending(b) {*limit= '!'; \
67 for(loc= buffer;xisspace(*loc) ;loc++) ; \
68 *limit= ' '; \
69 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
70 } \
72 #define max_sections 10239 \
73  \
75 #define too_long() {include_depth--; \
76 err_print("! Include file name too long") ;goto restart;} \
78 #define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true)  \
80 #define max_bytes 1000000 \
82 #define max_names 10239 \
83  \
85 #define length(c) (c+1) ->byte_start-(c) ->byte_start
86 #define print_id(c) term_write((c) ->byte_start,length((c) ) )  \
88 #define hash_size 8501 \
90 #define llink link
91 #define rlink dummy.Rlink
92 #define root name_dir->rlink \
93  \
95 #define first_chunk(p) ((p) ->byte_start+2) 
96 #define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ \
97 (unsigned char) *((p) ->byte_start+1) ) 
98 #define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, \
99 *((p) ->byte_start+1) = (m) %256)  \
101 #define less 0
102 #define equal 1
103 #define greater 2
104 #define prefix 3
105 #define extension 4 \
107 #define bad_extension 5 \
109 #define spotless 0
110 #define harmless_message 1
111 #define error_message 2
112 #define fatal_message 3
113 #define mark_harmless {if(history==spotless) history= harmless_message;}
114 #define mark_error history= error_message \
116 #define confusion(s) fatal("! This can't happen: ",s)  \
119 #define show_banner flags['b']
120 #define show_progress flags['p']
121 #define show_stats flags['s']
122 #define show_happiness flags['h']
123 #define show_kpathsea_debug flags['d'] \
126 #define update_terminal fflush(stdout)  \
128 #define new_line putchar('\n') 
129 #define putxchar putchar
130 #define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout) 
131 #define C_printf(c,a) fprintf(C_file,c,a) 
132 #define C_putc(c) putc(c,C_file)  \
134 #define ctangle_banner "This is CTANGLE, Version 3.64"
135 #define cweave_banner "This is CWEAVE, Version 3.64" \
138 #line 60 "cwebdir/common.w"
140 /*2:*/
141 #line 73 "cwebdir/common.w"
143 #line 75 "cwebdir/common.w"
144 boolean program;
146 /*:2*//*7:*/
147 #line 159 "cwebdir/common.w"
149 char buffer[long_buf_size];
150 char*buffer_end= buffer+buf_size-2;
151 char*limit= buffer;
152 char*loc= buffer;
154 /*:7*//*10:*/
155 #line 214 "cwebdir/common.w"
157 int include_depth;
158 FILE*file[max_include_depth];
159 FILE*change_file;
160 char file_name[max_include_depth][max_file_name_length];
162 char change_file_name[max_file_name_length];
163 #line 222 "cwebdir/common.w"
164 int line[max_include_depth];
165 int change_line;
166 int change_depth;
167 boolean input_has_ended;
168 boolean changing;
169 boolean web_file_open= 0;
171 /*:10*//*20:*/
172 #line 418 "cwebdir/common.w"
174 typedef unsigned short sixteen_bits;
175 sixteen_bits section_count;
176 boolean changed_section[max_sections];
177 boolean change_pending;
179 boolean print_where= 0;
181 /*:20*//*29:*/
182 #line 594 "cwebdir/common.w"
184 typedef struct name_info{
185 char*byte_start;
186 /*33:*/
187 #line 631 "cwebdir/common.w"
189 struct name_info*link;
191 /*:33*//*42:*/
192 #line 730 "cwebdir/common.w"
194 union{
195 struct name_info*Rlink;
197 char Ilk;
198 }dummy;
200 /*:42*//*57:*/
201 #line 1062 "cwebdir/common.w"
203 char*equiv_or_xref;
205 /*:57*/
206 #line 597 "cwebdir/common.w"
208 }name_info;
209 typedef name_info*name_pointer;
210 char byte_mem[max_bytes];
211 char*byte_mem_end= byte_mem+max_bytes-1;
212 name_info name_dir[max_names];
213 name_pointer name_dir_end= name_dir+max_names-1;
215 /*:29*//*31:*/
216 #line 617 "cwebdir/common.w"
218 name_pointer name_ptr;
219 char*byte_ptr;
221 /*:31*//*34:*/
222 #line 644 "cwebdir/common.w"
224 typedef name_pointer*hash_pointer;
225 name_pointer hash[hash_size];
226 hash_pointer hash_end= hash+hash_size-1;
227 hash_pointer h;
229 #line 345 "cwebdir/comm-w2c.ch"
230 /*:34*//*58:*/
231 #line 1082 "cwebdir/common.w"
233 int history= spotless;
235 /*:58*//*69:*/
236 #line 1220 "cwebdir/common.w"
238 int argc;
239 char**argv;
240 char C_file_name[max_file_name_length];
241 char tex_file_name[max_file_name_length];
242 char idx_file_name[max_file_name_length];
243 char scn_file_name[max_file_name_length];
244 boolean flags[128];
246 /*:69*//*79:*/
247 #line 1370 "cwebdir/common.w"
249 FILE*C_file;
250 FILE*tex_file;
251 FILE*idx_file;
252 FILE*scn_file;
253 #line 731 "cwebdir/comm-w2c.ch"
254 FILE*active_file;
255 char*found_filename;
256 #line 1376 "cwebdir/common.w"
258 /*:79*/
259 #line 61 "cwebdir/common.w"
261 /*3:*/
262 #line 83 "cwebdir/common.w"
263 int phase;
265 /*:3*//*11:*/
266 #line 240 "cwebdir/common.w"
268 char change_buffer[buf_size];
269 char*change_limit;
271 /*:11*/
272 #line 62 "cwebdir/common.w"
274 #line 38 "cwebdir/comm-w2c.ch"
275 #include "cwebboot.h"
276 /*55:*/
277 #line 1017 "cwebdir/common.w"
279 #line 519 "cwebdir/comm-w2c.ch"
280 static int section_name_cmp(char**,int,name_pointer);
281 #line 1019 "cwebdir/common.w"
283 /*:55*//*71:*/
284 #line 1251 "cwebdir/common.w"
286 #line 648 "cwebdir/comm-w2c.ch"
287 static void scan_args(void);
288 #line 1253 "cwebdir/common.w"
290 /*:71*/
291 #line 39 "cwebdir/comm-w2c.ch"
293 #line 64 "cwebdir/common.w"
295 /*:1*//*4:*/
296 #line 89 "cwebdir/common.w"
298 void
299 #line 59 "cwebdir/comm-w2c.ch"
300  common_init(void)
301 #line 92 "cwebdir/common.w"
303 #line 65 "cwebdir/comm-w2c.ch"
304 /*32:*/
305 #line 621 "cwebdir/common.w"
307 name_dir->byte_start= byte_ptr= byte_mem;
308 name_ptr= name_dir+1;
309 name_ptr->byte_start= byte_mem;
311 /*:32*//*36:*/
312 #line 655 "cwebdir/common.w"
314 for(h= hash;h<=hash_end;*h++= NULL);
316 /*:36*//*43:*/
317 #line 737 "cwebdir/common.w"
319 root= NULL;
321 /*:43*/
322 #line 65 "cwebdir/comm-w2c.ch"
324 /*24:*/
325 #line 248 "cwebdir/comm-w2c.ch"
327 kpse_set_program_name(argv[0],"cweb");
328 #line 473 "cwebdir/common.w"
330 /*:24*/
331 #line 66 "cwebdir/comm-w2c.ch"
333 #line 94 "cwebdir/common.w"
334 /*70:*/
335 #line 1233 "cwebdir/common.w"
337 #line 640 "cwebdir/comm-w2c.ch"
338 show_banner= show_happiness= show_progress= 1;
339 #line 1235 "cwebdir/common.w"
341 /*:70*/
342 #line 94 "cwebdir/common.w"
344 /*80:*/
345 #line 1377 "cwebdir/common.w"
347 scan_args();
348 if(program==ctangle){
349 #line 740 "cwebdir/comm-w2c.ch"
350 if((C_file= fopen(C_file_name,"wb"))==NULL)
351 #line 1381 "cwebdir/common.w"
352 fatal("! Cannot open output file ",C_file_name);
355 else{
356 #line 746 "cwebdir/comm-w2c.ch"
357 if((tex_file= fopen(tex_file_name,"wb"))==NULL)
358 #line 1386 "cwebdir/common.w"
359 fatal("! Cannot open output file ",tex_file_name);
362 /*:80*/
363 #line 95 "cwebdir/common.w"
367 /*:4*//*9:*/
368 #line 172 "cwebdir/common.w"
370 #line 101 "cwebdir/comm-w2c.ch"
371 int input_ln(FILE*fp)
372 #line 175 "cwebdir/common.w"
374 register int c= EOF;
375 register char*k;
376 if(feof(fp))return(0);
377 limit= k= buffer;
378 while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
379 #line 107 "cwebdir/comm-w2c.ch"
380 if((*(k++)= c)!=' '&&c!='\r')limit= k;
381 #line 182 "cwebdir/common.w"
382 if(k> buffer_end)
383 if((c= getc(fp))!=EOF&&c!='\n'){
384 ungetc(c,fp);loc= buffer;err_print("! Input line too long");
387 if(c==EOF&&limit==buffer)return(0);
389 return(1);
392 /*:9*//*12:*/
393 #line 251 "cwebdir/common.w"
395 #line 129 "cwebdir/comm-w2c.ch"
396 static void
397 prime_the_change_buffer(void)
398 #line 254 "cwebdir/common.w"
400 change_limit= change_buffer;
401 /*13:*/
402 #line 265 "cwebdir/common.w"
404 while(1){
405 change_line++;
406 if(!input_ln(change_file))return;
407 if(limit<buffer+2)continue;
408 if(buffer[0]!='@')continue;
409 #line 136 "cwebdir/comm-w2c.ch"
410 if(xisupper(buffer[1]))buffer[1]= tolower((unsigned char)buffer[1]);
411 #line 272 "cwebdir/common.w"
412 if(buffer[1]=='x')break;
413 if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
414 loc= buffer+2;
415 err_print("! Missing @x in change file");
420 /*:13*/
421 #line 256 "cwebdir/common.w"
423 /*14:*/
424 #line 282 "cwebdir/common.w"
427 change_line++;
428 if(!input_ln(change_file)){
429 err_print("! Change file ended after @x");
431 return;
433 }while(limit==buffer);
435 /*:14*/
436 #line 257 "cwebdir/common.w"
438 /*15:*/
439 #line 292 "cwebdir/common.w"
442 change_limit= change_buffer+(limit-buffer);
443 strncpy(change_buffer,buffer,limit-buffer+1);
446 /*:15*/
447 #line 258 "cwebdir/common.w"
451 /*:12*//*16:*/
452 #line 320 "cwebdir/common.w"
454 #line 145 "cwebdir/comm-w2c.ch"
455 static void
456 check_change(void)
457 #line 323 "cwebdir/common.w"
459 int n= 0;
460 if(lines_dont_match)return;
461 change_pending= 0;
462 if(!changed_section[section_count]){
463 if_section_start_make_pending(1);
464 if(!change_pending)changed_section[section_count]= 1;
466 while(1){
467 changing= 1;print_where= 1;change_line++;
468 if(!input_ln(change_file)){
469 err_print("! Change file ended before @y");
471 change_limit= change_buffer;changing= 0;
472 return;
474 if(limit> buffer+1&&buffer[0]=='@'){
475 #line 152 "cwebdir/comm-w2c.ch"
476 char xyz_code= xisupper(buffer[1])?tolower((unsigned char)buffer[1]):buffer[1];
477 #line 341 "cwebdir/common.w"
478 /*17:*/
479 #line 358 "cwebdir/common.w"
481 if(xyz_code=='x'||xyz_code=='z'){
482 loc= buffer+2;err_print("! Where is the matching @y?");
485 else if(xyz_code=='y'){
486 if(n> 0){
487 loc= buffer+2;
488 printf("\n! Hmm... %d ",n);
489 err_print("of the preceding lines failed to match");
492 change_depth= include_depth;
493 return;
496 /*:17*/
497 #line 342 "cwebdir/common.w"
500 /*15:*/
501 #line 292 "cwebdir/common.w"
504 change_limit= change_buffer+(limit-buffer);
505 strncpy(change_buffer,buffer,limit-buffer+1);
508 /*:15*/
509 #line 344 "cwebdir/common.w"
511 changing= 0;cur_line++;
512 while(!input_ln(cur_file)){
513 if(include_depth==0){
514 err_print("! CWEB file ended during a change");
516 input_has_ended= 1;return;
518 include_depth--;cur_line++;
520 if(lines_dont_match)n++;
524 /*:16*//*18:*/
525 #line 378 "cwebdir/common.w"
527 void
528 #line 160 "cwebdir/comm-w2c.ch"
529  reset_input(void)
530 #line 381 "cwebdir/common.w"
532 limit= buffer;loc= buffer+1;buffer[0]= ' ';
533 /*19:*/
534 #line 393 "cwebdir/common.w"
536 #line 172 "cwebdir/comm-w2c.ch"
537 if((found_filename= kpse_find_cweb(web_file_name))==NULL||
538 (web_file= fopen(found_filename,"r"))==NULL){
539 fatal("! Cannot open input file ",web_file_name);
540 }else if(strlen(found_filename)<max_file_name_length){
541 strcpy(web_file_name,found_filename);
542 free(found_filename);
544 #line 399 "cwebdir/common.w"
547 web_file_open= 1;
548 #line 185 "cwebdir/comm-w2c.ch"
549 if((found_filename= kpse_find_cweb(change_file_name))==NULL||
550 (change_file= fopen(found_filename,"r"))==NULL){
551 fatal("! Cannot open change file ",change_file_name);
552 }else if(strlen(found_filename)<max_file_name_length){
553 strcpy(change_file_name,found_filename);
554 free(found_filename);
556 #line 404 "cwebdir/common.w"
558 /*:19*/
559 #line 383 "cwebdir/common.w"
561 include_depth= 0;cur_line= 0;change_line= 0;
562 change_depth= include_depth;
563 changing= 1;prime_the_change_buffer();changing= !changing;
564 limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
567 /*:18*//*21:*/
568 #line 426 "cwebdir/common.w"
570 #line 205 "cwebdir/comm-w2c.ch"
571 int get_line(void)
572 #line 428 "cwebdir/common.w"
574 restart:
575 if(changing&&include_depth==change_depth)
576 /*27:*/
577 #line 537 "cwebdir/common.w"
579 change_line++;
580 if(!input_ln(change_file)){
581 err_print("! Change file ended without @z");
583 buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
585 if(limit> buffer){
586 if(change_pending){
587 if_section_start_make_pending(0);
588 if(change_pending){
589 changed_section[section_count]= 1;change_pending= 0;
592 *limit= ' ';
593 if(buffer[0]=='@'){
594 #line 312 "cwebdir/comm-w2c.ch"
595 if(xisupper(buffer[1]))buffer[1]= tolower((unsigned char)buffer[1]);
596 #line 554 "cwebdir/common.w"
597 if(buffer[1]=='x'||buffer[1]=='y'){
598 loc= buffer+2;
599 err_print("! Where is the matching @z?");
602 else if(buffer[1]=='z'){
603 prime_the_change_buffer();changing= !changing;print_where= 1;
609 /*:27*/
610 #line 431 "cwebdir/common.w"
612 if(!changing||include_depth> change_depth){
613 /*26:*/
614 #line 520 "cwebdir/common.w"
616 cur_line++;
617 while(!input_ln(cur_file)){
618 print_where= 1;
619 if(include_depth==0){input_has_ended= 1;break;}
620 else{
621 fclose(cur_file);include_depth--;
622 if(changing&&include_depth==change_depth)break;
623 cur_line++;
626 if(!changing&&!input_has_ended)
627 if(limit-buffer==change_limit-change_buffer)
628 if(buffer[0]==change_buffer[0])
629 if(change_limit> change_buffer)check_change();
632 /*:26*/
633 #line 433 "cwebdir/common.w"
635 if(changing&&include_depth==change_depth)goto restart;
637 if(input_has_ended)return 0;
638 loc= buffer;*limit= ' ';
639 if(buffer[0]=='@'&&(buffer[1]=='i'||buffer[1]=='I')){
640 loc= buffer+2;*limit= '"';
641 while(*loc==' '||*loc=='\t')loc++;
642 if(loc>=limit){
643 err_print("! Include file name not given");
645 goto restart;
647 if(include_depth>=max_include_depth-1){
648 err_print("! Too many nested includes");
650 goto restart;
652 include_depth++;
653 /*25:*/
654 #line 474 "cwebdir/common.w"
656 #line 261 "cwebdir/comm-w2c.ch"
657 char*cur_file_name_end= cur_file_name+max_file_name_length-1;
658 char*k= cur_file_name;
659 #line 479 "cwebdir/common.w"
661 if(*loc=='"'){
662 loc++;
663 while(*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
664 if(loc==limit)k= cur_file_name_end+1;
665 }else
666 while(*loc!=' '&&*loc!='\t'&&*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
667 if(k> cur_file_name_end)too_long();
669 *k= '\0';
670 #line 268 "cwebdir/comm-w2c.ch"
671 if((found_filename= kpse_find_cweb(cur_file_name))!=NULL&&
672 (cur_file= fopen(found_filename,"r"))!=NULL){
674 if(strlen(found_filename)<max_file_name_length){
675 strcpy(cur_file_name,found_filename);
676 free(found_filename);
678 #line 490 "cwebdir/common.w"
679 cur_line= 0;print_where= 1;
680 goto restart;
682 #line 517 "cwebdir/common.w"
683 include_depth--;err_print("! Cannot open include file");goto restart;
686 /*:25*/
687 #line 452 "cwebdir/common.w"
690 return 1;
693 /*:21*//*28:*/
694 #line 569 "cwebdir/common.w"
696 void
697 #line 318 "cwebdir/comm-w2c.ch"
698  check_complete(void){
699 #line 572 "cwebdir/common.w"
700 if(change_limit!=change_buffer){
701 strncpy(buffer,change_buffer,change_limit-change_buffer+1);
702 limit= buffer+(int)(change_limit-change_buffer);
703 changing= 1;change_depth= include_depth;loc= buffer;
704 err_print("! Change file entry did not match");
709 /*:28*//*37:*/
710 #line 660 "cwebdir/common.w"
712 name_pointer
713 #line 357 "cwebdir/comm-w2c.ch"
715 id_lookup(const char*first,const char*last,char t)
716 #line 666 "cwebdir/common.w"
718 #line 364 "cwebdir/comm-w2c.ch"
719 const char*i= first;
720 #line 370 "cwebdir/comm-w2c.ch"
721 int h;
722 #line 669 "cwebdir/common.w"
723 int l;
724 name_pointer p;
725 if(last==NULL)for(last= first;*last!='\0';last++);
726 l= last-first;
727 /*38:*/
728 #line 683 "cwebdir/common.w"
730 #line 379 "cwebdir/comm-w2c.ch"
731 h= (unsigned char)*i;
732 while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
733 #line 686 "cwebdir/common.w"
736 /*:38*/
737 #line 673 "cwebdir/common.w"
739 /*39:*/
740 #line 691 "cwebdir/common.w"
742 #line 388 "cwebdir/comm-w2c.ch"
743 p= hash[h];
744 #line 693 "cwebdir/common.w"
745 while(p&&!names_match(p,first,l,t))p= p->link;
746 if(p==NULL){
747 p= name_ptr;
748 #line 394 "cwebdir/comm-w2c.ch"
749 p->link= hash[h];hash[h]= p;
750 #line 697 "cwebdir/common.w"
753 /*:39*/
754 #line 674 "cwebdir/common.w"
756 if(p==name_ptr)/*41:*/
757 #line 706 "cwebdir/common.w"
759 if(byte_ptr+l> byte_mem_end)overflow("byte memory");
760 if(name_ptr>=name_dir_end)overflow("name");
761 strncpy(byte_ptr,first,l);
762 (++name_ptr)->byte_start= byte_ptr+= l;
763 if(program==cweave)init_p(p,t);
766 /*:41*/
767 #line 675 "cwebdir/common.w"
769 return(p);
772 /*:37*//*44:*/
773 #line 764 "cwebdir/common.w"
775 void
776 #line 413 "cwebdir/comm-w2c.ch"
777  print_section_name(name_pointer p)
778 #line 768 "cwebdir/common.w"
780 char*ss,*s= first_chunk(p);
781 name_pointer q= p+1;
782 while(p!=name_dir){
783 ss= (p+1)->byte_start-1;
784 if(*ss==' '&&ss>=s){
785 term_write(s,ss-s);p= q->link;q= p;
786 }else{
787 term_write(s,ss+1-s);p= name_dir;q= NULL;
789 s= p->byte_start;
791 if(q)term_write("...",3);
794 /*:44*//*45:*/
795 #line 783 "cwebdir/common.w"
797 void
798 #line 423 "cwebdir/comm-w2c.ch"
799  sprint_section_name(char*dest,name_pointer p)
800 #line 788 "cwebdir/common.w"
802 char*ss,*s= first_chunk(p);
803 name_pointer q= p+1;
804 while(p!=name_dir){
805 ss= (p+1)->byte_start-1;
806 if(*ss==' '&&ss>=s){
807 p= q->link;q= p;
808 }else{
809 ss++;p= name_dir;
811 strncpy(dest,s,ss-s),dest+= ss-s;
812 s= p->byte_start;
814 *dest= '\0';
817 /*:45*//*46:*/
818 #line 804 "cwebdir/common.w"
820 #line 433 "cwebdir/comm-w2c.ch"
821 static void
822 print_prefix_name(name_pointer p)
823 #line 808 "cwebdir/common.w"
825 char*s= first_chunk(p);
826 int l= prefix_length(p);
827 term_write(s,l);
828 if(s+l<(p+1)->byte_start)term_write("...",3);
831 /*:46*//*47:*/
832 #line 825 "cwebdir/common.w"
834 #line 444 "cwebdir/comm-w2c.ch"
836 static int
837 web_strcmp(char*j,int j_len,char*k,int k_len)
838 #line 829 "cwebdir/common.w"
840 #line 456 "cwebdir/comm-w2c.ch"
841 char*j1= j+j_len,*k1= k+k_len;
842 while(k<k1&&j<j1&&*j==*k)k++,j++;
843 if(k==k1)if(j==j1)return equal;
844 else return extension;
845 else if(j==j1)return prefix;
846 #line 835 "cwebdir/common.w"
847 else if(*j<*k)return less;
848 else return greater;
851 /*:47*//*49:*/
852 #line 855 "cwebdir/common.w"
854 #line 484 "cwebdir/comm-w2c.ch"
855 static name_pointer
856 add_section_name(name_pointer par,int c,char*first,char*last,
857 int ispref)
858 #line 863 "cwebdir/common.w"
860 name_pointer p= name_ptr;
861 char*s= first_chunk(p);
862 int name_len= last-first+ispref;
863 if(s+name_len> byte_mem_end)overflow("byte memory");
864 if(name_ptr+1>=name_dir_end)overflow("name");
865 (++name_ptr)->byte_start= byte_ptr= s+name_len;
866 if(ispref){
867 *(byte_ptr-1)= ' ';
868 name_len--;
869 name_ptr->link= name_dir;
870 (++name_ptr)->byte_start= byte_ptr;
872 set_prefix_length(p,name_len);
873 strncpy(s,first,name_len);
874 p->llink= NULL;
875 p->rlink= NULL;
876 init_node(p);
877 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
880 /*:49*//*50:*/
881 #line 884 "cwebdir/common.w"
883 #line 499 "cwebdir/comm-w2c.ch"
884 static void
885 extend_section_name(name_pointer p,char*first,char*last,int ispref)
886 #line 891 "cwebdir/common.w"
888 char*s;
889 name_pointer q= p+1;
890 int name_len= last-first+ispref;
891 if(name_ptr>=name_dir_end)overflow("name");
892 while(q->link!=name_dir)q= q->link;
893 q->link= name_ptr;
894 s= name_ptr->byte_start;
895 name_ptr->link= name_dir;
896 if(s+name_len> byte_mem_end)overflow("byte memory");
897 (++name_ptr)->byte_start= byte_ptr= s+name_len;
898 strncpy(s,first,name_len);
899 if(ispref)*(byte_ptr-1)= ' ';
902 /*:50*//*51:*/
903 #line 912 "cwebdir/common.w"
905 name_pointer
906 #line 510 "cwebdir/comm-w2c.ch"
908 section_lookup(char*first,char*last,int ispref)
909 #line 917 "cwebdir/common.w"
911 int c= 0;
912 name_pointer p= root;
913 name_pointer q= NULL;
914 name_pointer r= NULL;
915 name_pointer par= NULL;
917 int name_len= last-first+1;
918 /*52:*/
919 #line 936 "cwebdir/common.w"
921 while(p){
922 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
923 if(c==less||c==greater){
924 if(r==NULL)
925 par= p;
926 p= (c==less?p->llink:p->rlink);
927 }else{
928 if(r!=NULL){
929 printf("\n! Ambiguous prefix: matches <");
931 print_prefix_name(p);
932 printf(">\n and <");
933 print_prefix_name(r);
934 err_print(">");
935 return name_dir;
937 r= p;
938 p= p->llink;
939 q= r->rlink;
941 if(p==NULL)
942 p= q,q= NULL;
945 /*:52*/
946 #line 926 "cwebdir/common.w"
948 /*53:*/
949 #line 961 "cwebdir/common.w"
951 if(r==NULL)
952 return add_section_name(par,c,first,last+1,ispref);
954 /*:53*/
955 #line 927 "cwebdir/common.w"
957 /*54:*/
958 #line 969 "cwebdir/common.w"
960 switch(section_name_cmp(&first,name_len,r)){
962 case prefix:
963 if(!ispref){
964 printf("\n! New name is a prefix of <");
966 print_section_name(r);
967 err_print(">");
969 else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
971 case equal:return r;
972 case extension:if(!ispref||first<=last)
973 extend_section_name(r,first,last+1,ispref);
974 return r;
975 case bad_extension:
976 printf("\n! New name extends <");
978 print_section_name(r);
979 err_print(">");
980 return r;
981 default:
982 printf("\n! Section name incompatible with <");
984 print_prefix_name(r);
985 printf(">,\n which abbreviates <");
986 print_section_name(r);
987 err_print(">");
988 return r;
991 /*:54*/
992 #line 928 "cwebdir/common.w"
996 /*:51*//*56:*/
997 #line 1020 "cwebdir/common.w"
999 #line 530 "cwebdir/comm-w2c.ch"
1000 static int
1001 section_name_cmp(char**pfirst,int len,name_pointer r)
1002 #line 1025 "cwebdir/common.w"
1004 char*first= *pfirst;
1005 name_pointer q= r+1;
1006 char*ss,*s= first_chunk(r);
1007 int c;
1008 int ispref;
1009 while(1){
1010 ss= (r+1)->byte_start-1;
1011 if(*ss==' '&&ss>=r->byte_start)ispref= 1,q= q->link;
1012 else ispref= 0,ss++,q= name_dir;
1013 switch(c= web_strcmp(first,len,s,ss-s)){
1014 case equal:if(q==name_dir)
1015 if(ispref){
1016 *pfirst= first+(ss-s);
1017 return extension;
1018 }else return equal;
1019 else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
1020 case extension:
1021 if(!ispref)return bad_extension;
1022 first+= ss-s;
1023 if(q!=name_dir){len-= ss-s;s= q->byte_start;r= q;continue;}
1024 *pfirst= first;return extension;
1025 default:return c;
1030 /*:56*//*60:*/
1031 #line 1095 "cwebdir/common.w"
1033 void
1034 #line 550 "cwebdir/comm-w2c.ch"
1035  err_print(const char*s)
1036 #line 1099 "cwebdir/common.w"
1038 char*k,*l;
1039 printf(*s=='!'?"\n%s":"%s",s);
1040 if(web_file_open)/*61:*/
1041 #line 1115 "cwebdir/common.w"
1043 {if(changing&&include_depth==change_depth)
1044 printf(". (l. %d of change file)\n",change_line);
1045 else if(include_depth==0)printf(". (l. %d)\n",cur_line);
1046 else printf(". (l. %d of include file %s)\n",cur_line,cur_file_name);
1047 l= (loc>=limit?limit:loc);
1048 if(l> buffer){
1049 for(k= buffer;k<l;k++)
1050 if(*k=='\t')putchar(' ');
1051 else putchar(*k);
1052 putchar('\n');
1053 for(k= buffer;k<l;k++)putchar(' ');
1055 for(k= l;k<limit;k++)putchar(*k);
1056 if(*limit=='|')putchar('|');
1057 putchar(' ');
1060 /*:61*/
1061 #line 1102 "cwebdir/common.w"
1063 update_terminal;mark_error;
1066 /*:60*//*63:*/
1067 #line 1150 "cwebdir/common.w"
1069 #line 570 "cwebdir/comm-w2c.ch"
1070 int wrap_up(void){
1071 #line 1152 "cwebdir/common.w"
1072 putchar('\n');
1073 if(show_stats)
1074 print_stats();
1075 /*64:*/
1076 #line 1160 "cwebdir/common.w"
1078 switch(history){
1079 case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
1080 case harmless_message:
1081 printf("(Did you see the warning message above?)\n");break;
1082 case error_message:
1083 printf("(Pardon me, but I think I spotted something wrong.)\n");break;
1084 case fatal_message:printf("(That was a fatal error, my friend.)\n");
1087 /*:64*/
1088 #line 1155 "cwebdir/common.w"
1090 if(history> harmless_message)return(1);
1091 else return(0);
1094 /*:63*//*66:*/
1095 #line 1179 "cwebdir/common.w"
1096 void
1097 #line 590 "cwebdir/comm-w2c.ch"
1098  fatal(const char*s,const char*t)
1099 #line 1182 "cwebdir/common.w"
1101 if(*s)printf(s);
1102 err_print(t);
1103 history= fatal_message;exit(wrap_up());
1106 /*:66*//*67:*/
1107 #line 1190 "cwebdir/common.w"
1108 void
1109 #line 599 "cwebdir/comm-w2c.ch"
1110  overflow(const char*t)
1111 #line 1193 "cwebdir/common.w"
1113 printf("\n! Sorry, %s capacity exceeded",t);fatal("","");
1117 /*:67*//*72:*/
1118 #line 1254 "cwebdir/common.w"
1120 #line 658 "cwebdir/comm-w2c.ch"
1121 static void
1122 scan_args(void)
1123 #line 1257 "cwebdir/common.w"
1125 char*dot_pos;
1126 char*name_pos;
1127 register char*s;
1128 boolean found_web= 0,found_change= 0,found_out= 0;
1130 boolean flag_change;
1132 while(--argc> 0){
1133 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*76:*/
1134 #line 683 "cwebdir/comm-w2c.ch"
1137 if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
1138 /*86:*/
1139 #line 798 "cwebdir/comm-w2c.ch"
1141 usagehelp(program==ctangle?CTANGLEHELP:CWEAVEHELP,NULL);
1144 /*:86*/
1145 #line 686 "cwebdir/comm-w2c.ch"
1147 if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
1148 /*87:*/
1149 #line 807 "cwebdir/comm-w2c.ch"
1151 printversionandexit((program==ctangle?ctangle_banner:cweave_banner),
1152 "Silvio Levy and Donald E. Knuth",NULL,NULL);
1155 /*:87*/
1156 #line 688 "cwebdir/comm-w2c.ch"
1158 #line 1346 "cwebdir/common.w"
1159 if(**argv=='-')flag_change= 0;
1160 #line 694 "cwebdir/comm-w2c.ch"
1161 else flag_change= 1;
1162 if(*(*argv+1)=='d')
1163 if(sscanf(*argv+2,"%u",&kpathsea_debug)!=1)/*77:*/
1164 #line 1352 "cwebdir/common.w"
1167 #line 717 "cwebdir/comm-w2c.ch"
1168 if(program==ctangle){
1169 fprintf(stderr,"ctangle: Need one to three file arguments.\n");
1170 usage("ctangle");
1171 }else{
1172 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1173 usage("cweave");
1175 #line 1362 "cwebdir/common.w"
1178 /*:77*/
1179 #line 696 "cwebdir/comm-w2c.ch"
1181 #line 1348 "cwebdir/common.w"
1182 for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
1183 #line 702 "cwebdir/comm-w2c.ch"
1184 flags[(unsigned char)*dot_pos]= flag_change;
1185 #line 1350 "cwebdir/common.w"
1188 /*:76*/
1189 #line 1266 "cwebdir/common.w"
1191 else{
1192 s= name_pos= *argv;dot_pos= NULL;
1193 while(*s){
1194 if(*s=='.')dot_pos= s++;
1195 else if(*s=='/')dot_pos= NULL,name_pos= ++s;
1196 else s++;
1198 if(!found_web)/*73:*/
1199 #line 1292 "cwebdir/common.w"
1202 if(s-*argv> max_file_name_length-5)
1203 /*78:*/
1204 #line 1364 "cwebdir/common.w"
1205 fatal("! Filename too long\n",*argv);
1208 /*:78*/
1209 #line 1295 "cwebdir/common.w"
1211 if(dot_pos==NULL)
1212 sprintf(web_file_name,"%s.w",*argv);
1213 else{
1214 strcpy(web_file_name,*argv);
1215 *dot_pos= 0;
1217 #line 1303 "cwebdir/common.w"
1218 sprintf(tex_file_name,"%s.tex",name_pos);
1219 sprintf(idx_file_name,"%s.idx",name_pos);
1220 sprintf(scn_file_name,"%s.scn",name_pos);
1221 sprintf(C_file_name,"%s.c",name_pos);
1222 found_web= 1;
1225 /*:73*/
1226 #line 1275 "cwebdir/common.w"
1228 else if(!found_change)/*74:*/
1229 #line 1310 "cwebdir/common.w"
1232 if(strcmp(*argv,"-")==0)found_change= -1;
1233 else{
1234 if(s-*argv> max_file_name_length-4)
1235 /*78:*/
1236 #line 1364 "cwebdir/common.w"
1237 fatal("! Filename too long\n",*argv);
1240 /*:78*/
1241 #line 1315 "cwebdir/common.w"
1243 if(dot_pos==NULL)
1244 sprintf(change_file_name,"%s.ch",*argv);
1245 else strcpy(change_file_name,*argv);
1246 found_change= 1;
1250 /*:74*/
1251 #line 1276 "cwebdir/common.w"
1253 else if(!found_out)/*75:*/
1254 #line 1323 "cwebdir/common.w"
1257 if(s-*argv> max_file_name_length-5)
1258 /*78:*/
1259 #line 1364 "cwebdir/common.w"
1260 fatal("! Filename too long\n",*argv);
1263 /*:78*/
1264 #line 1326 "cwebdir/common.w"
1266 if(dot_pos==NULL){
1267 sprintf(tex_file_name,"%s.tex",*argv);
1268 sprintf(idx_file_name,"%s.idx",*argv);
1269 sprintf(scn_file_name,"%s.scn",*argv);
1270 sprintf(C_file_name,"%s.c",*argv);
1271 }else{
1272 strcpy(tex_file_name,*argv);
1273 strcpy(C_file_name,*argv);
1274 if(flags['x']){
1275 *dot_pos= 0;
1276 sprintf(idx_file_name,"%s.idx",*argv);
1277 sprintf(scn_file_name,"%s.scn",*argv);
1280 found_out= 1;
1283 #line 683 "cwebdir/comm-w2c.ch"
1284 /*:75*/
1285 #line 1277 "cwebdir/common.w"
1287 else/*77:*/
1288 #line 1352 "cwebdir/common.w"
1291 #line 717 "cwebdir/comm-w2c.ch"
1292 if(program==ctangle){
1293 fprintf(stderr,"ctangle: Need one to three file arguments.\n");
1294 usage("ctangle");
1295 }else{
1296 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1297 usage("cweave");
1299 #line 1362 "cwebdir/common.w"
1302 /*:77*/
1303 #line 1278 "cwebdir/common.w"
1307 if(!found_web)/*77:*/
1308 #line 1352 "cwebdir/common.w"
1311 #line 717 "cwebdir/comm-w2c.ch"
1312 if(program==ctangle){
1313 fprintf(stderr,"ctangle: Need one to three file arguments.\n");
1314 usage("ctangle");
1315 }else{
1316 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1317 usage("cweave");
1319 #line 1362 "cwebdir/common.w"
1322 /*:77*/
1323 #line 1281 "cwebdir/common.w"
1325 #line 668 "cwebdir/comm-w2c.ch"
1326 if(found_change<=0)strcpy(change_file_name,DEV_NULL);
1327 #line 1283 "cwebdir/common.w"
1330 /*:72*/