2 #line 58 "cwebdir/common.w"
5 #line 102 "cwebdir/common.w"
7 #line 74 "cwebdir/comm-w2c.ch"
11 #line 104 "cwebdir/common.w"
14 #line 165 "cwebdir/common.w"
19 #line 471 "cwebdir/common.w"
21 #line 213 "cwebdir/comm-w2c.ch"
22 #include <kpathsea/kpathsea.h>
27 #line 59 "cwebdir/common.w"
36 #define minus_minus 01
43 #define dot_dot_dot 016
44 #define colon_colon 06
45 #define period_ast 026
46 #define minus_gt_ast 027 \
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++) ; \
69 if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
72 #define max_sections 10239 \
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 \
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 \
91 #define rlink dummy.Rlink
92 #define root name_dir->rlink \
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) \
105 #define extension 4 \
107 #define bad_extension 5 \
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"
141 #line 73 "cwebdir/common.w"
143 #line 75 "cwebdir/common.w"
147 #line 159 "cwebdir/common.w"
149 char buffer[long_buf_size];
150 char*buffer_end= buffer+buf_size-2;
155 #line 214 "cwebdir/common.w"
158 FILE*file[max_include_depth];
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];
167 boolean input_has_ended;
169 boolean web_file_open= 0;
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;
182 #line 594 "cwebdir/common.w"
184 typedef struct name_info{
187 #line 631 "cwebdir/common.w"
189 struct name_info*link;
192 #line 730 "cwebdir/common.w"
195 struct name_info*Rlink;
201 #line 1062 "cwebdir/common.w"
206 #line 597 "cwebdir/common.w"
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;
216 #line 617 "cwebdir/common.w"
218 name_pointer name_ptr;
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;
229 #line 345 "cwebdir/comm-w2c.ch"
231 #line 1082 "cwebdir/common.w"
233 int history= spotless;
236 #line 1220 "cwebdir/common.w"
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];
247 #line 1370 "cwebdir/common.w"
253 #line 731 "cwebdir/comm-w2c.ch"
256 #line 1376 "cwebdir/common.w"
259 #line 61 "cwebdir/common.w"
262 #line 83 "cwebdir/common.w"
266 #line 240 "cwebdir/common.w"
268 char change_buffer[buf_size];
272 #line 62 "cwebdir/common.w"
274 #line 38 "cwebdir/comm-w2c.ch"
275 #include "cwebboot.h"
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"
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"
291 #line 39 "cwebdir/comm-w2c.ch"
293 #line 64 "cwebdir/common.w"
296 #line 89 "cwebdir/common.w"
299 #line 59 "cwebdir/comm-w2c.ch"
301 #line 92 "cwebdir/common.w"
303 #line 65 "cwebdir/comm-w2c.ch"
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;
312 #line 655 "cwebdir/common.w"
314 for(h= hash;h<=hash_end;*h++= NULL);
317 #line 737 "cwebdir/common.w"
322 #line 65 "cwebdir/comm-w2c.ch"
325 #line 248 "cwebdir/comm-w2c.ch"
327 kpse_set_program_name(argv[0],"cweb");
328 #line 473 "cwebdir/common.w"
331 #line 66 "cwebdir/comm-w2c.ch"
333 #line 94 "cwebdir/common.w"
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"
342 #line 94 "cwebdir/common.w"
345 #line 1377 "cwebdir/common.w"
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);
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);
363 #line 95 "cwebdir/common.w"
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"
376 if(feof(fp))return(0);
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"
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);
393 #line 251 "cwebdir/common.w"
395 #line 129 "cwebdir/comm-w2c.ch"
397 prime_the_change_buffer(void)
398 #line 254 "cwebdir/common.w"
400 change_limit= change_buffer;
402 #line 265 "cwebdir/common.w"
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'){
415 err_print("! Missing @x in change file");
421 #line 256 "cwebdir/common.w"
424 #line 282 "cwebdir/common.w"
428 if(!input_ln(change_file)){
429 err_print("! Change file ended after @x");
433 }while(limit==buffer);
436 #line 257 "cwebdir/common.w"
439 #line 292 "cwebdir/common.w"
442 change_limit= change_buffer+(limit-buffer);
443 strncpy(change_buffer,buffer,limit-buffer+1);
447 #line 258 "cwebdir/common.w"
452 #line 320 "cwebdir/common.w"
454 #line 145 "cwebdir/comm-w2c.ch"
457 #line 323 "cwebdir/common.w"
460 if(lines_dont_match)return;
462 if(!changed_section[section_count]){
463 if_section_start_make_pending(1);
464 if(!change_pending)changed_section[section_count]= 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;
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"
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'){
488 printf("\n! Hmm... %d ",n);
489 err_print("of the preceding lines failed to match");
492 change_depth= include_depth;
497 #line 342 "cwebdir/common.w"
501 #line 292 "cwebdir/common.w"
504 change_limit= change_buffer+(limit-buffer);
505 strncpy(change_buffer,buffer,limit-buffer+1);
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++;
525 #line 378 "cwebdir/common.w"
528 #line 160 "cwebdir/comm-w2c.ch"
530 #line 381 "cwebdir/common.w"
532 limit= buffer;loc= buffer+1;buffer[0]= ' ';
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"
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"
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;
568 #line 426 "cwebdir/common.w"
570 #line 205 "cwebdir/comm-w2c.ch"
572 #line 428 "cwebdir/common.w"
575 if(changing&&include_depth==change_depth)
577 #line 537 "cwebdir/common.w"
580 if(!input_ln(change_file)){
581 err_print("! Change file ended without @z");
583 buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
587 if_section_start_make_pending(0);
589 changed_section[section_count]= 1;change_pending= 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'){
599 err_print("! Where is the matching @z?");
602 else if(buffer[1]=='z'){
603 prime_the_change_buffer();changing= !changing;print_where= 1;
610 #line 431 "cwebdir/common.w"
612 if(!changing||include_depth> change_depth){
614 #line 520 "cwebdir/common.w"
617 while(!input_ln(cur_file)){
619 if(include_depth==0){input_has_ended= 1;break;}
621 fclose(cur_file);include_depth--;
622 if(changing&&include_depth==change_depth)break;
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();
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++;
643 err_print("! Include file name not given");
647 if(include_depth>=max_include_depth-1){
648 err_print("! Too many nested includes");
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"
663 while(*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
664 if(loc==limit)k= cur_file_name_end+1;
666 while(*loc!=' '&&*loc!='\t'&&*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
667 if(k> cur_file_name_end)too_long();
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;
682 #line 517 "cwebdir/common.w"
683 include_depth--;err_print("! Cannot open include file");goto restart;
687 #line 452 "cwebdir/common.w"
694 #line 569 "cwebdir/common.w"
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");
710 #line 660 "cwebdir/common.w"
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"
720 #line 370 "cwebdir/comm-w2c.ch"
722 #line 669 "cwebdir/common.w"
725 if(last==NULL)for(last= first;*last!='\0';last++);
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"
737 #line 673 "cwebdir/common.w"
740 #line 691 "cwebdir/common.w"
742 #line 388 "cwebdir/comm-w2c.ch"
744 #line 693 "cwebdir/common.w"
745 while(p&&!names_match(p,first,l,t))p= p->link;
748 #line 394 "cwebdir/comm-w2c.ch"
749 p->link= hash[h];hash[h]= p;
750 #line 697 "cwebdir/common.w"
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);
767 #line 675 "cwebdir/common.w"
773 #line 764 "cwebdir/common.w"
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);
783 ss= (p+1)->byte_start-1;
785 term_write(s,ss-s);p= q->link;q= p;
787 term_write(s,ss+1-s);p= name_dir;q= NULL;
791 if(q)term_write("...",3);
795 #line 783 "cwebdir/common.w"
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);
805 ss= (p+1)->byte_start-1;
811 strncpy(dest,s,ss-s),dest+= ss-s;
818 #line 804 "cwebdir/common.w"
820 #line 433 "cwebdir/comm-w2c.ch"
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);
828 if(s+l<(p+1)->byte_start)term_write("...",3);
832 #line 825 "cwebdir/common.w"
834 #line 444 "cwebdir/comm-w2c.ch"
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;
852 #line 855 "cwebdir/common.w"
854 #line 484 "cwebdir/comm-w2c.ch"
856 add_section_name(name_pointer par,int c,char*first,char*last,
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;
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);
877 return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
881 #line 884 "cwebdir/common.w"
883 #line 499 "cwebdir/comm-w2c.ch"
885 extend_section_name(name_pointer p,char*first,char*last,int ispref)
886 #line 891 "cwebdir/common.w"
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;
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)= ' ';
903 #line 912 "cwebdir/common.w"
906 #line 510 "cwebdir/comm-w2c.ch"
908 section_lookup(char*first,char*last,int ispref)
909 #line 917 "cwebdir/common.w"
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;
919 #line 936 "cwebdir/common.w"
922 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
923 if(c==less||c==greater){
926 p= (c==less?p->llink:p->rlink);
929 printf("\n! Ambiguous prefix: matches <");
931 print_prefix_name(p);
933 print_prefix_name(r);
946 #line 926 "cwebdir/common.w"
949 #line 961 "cwebdir/common.w"
952 return add_section_name(par,c,first,last+1,ispref);
955 #line 927 "cwebdir/common.w"
958 #line 969 "cwebdir/common.w"
960 switch(section_name_cmp(&first,name_len,r)){
964 printf("\n! New name is a prefix of <");
966 print_section_name(r);
969 else if(name_len<prefix_length(r))set_prefix_length(r,name_len);
972 case extension:if(!ispref||first<=last)
973 extend_section_name(r,first,last+1,ispref);
976 printf("\n! New name extends <");
978 print_section_name(r);
982 printf("\n! Section name incompatible with <");
984 print_prefix_name(r);
985 printf(">,\n which abbreviates <");
986 print_section_name(r);
992 #line 928 "cwebdir/common.w"
997 #line 1020 "cwebdir/common.w"
999 #line 530 "cwebdir/comm-w2c.ch"
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);
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)
1016 *pfirst= first+(ss-s);
1019 else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
1021 if(!ispref)return bad_extension;
1023 if(q!=name_dir){len-= ss-s;s= q->byte_start;r= q;continue;}
1024 *pfirst= first;return extension;
1031 #line 1095 "cwebdir/common.w"
1034 #line 550 "cwebdir/comm-w2c.ch"
1035 err_print(const char*s)
1036 #line 1099 "cwebdir/common.w"
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);
1049 for(k= buffer;k<l;k++)
1050 if(*k=='\t')putchar(' ');
1053 for(k= buffer;k<l;k++)putchar(' ');
1055 for(k= l;k<limit;k++)putchar(*k);
1056 if(*limit=='|')putchar('|');
1061 #line 1102 "cwebdir/common.w"
1063 update_terminal;mark_error;
1067 #line 1150 "cwebdir/common.w"
1069 #line 570 "cwebdir/comm-w2c.ch"
1071 #line 1152 "cwebdir/common.w"
1076 #line 1160 "cwebdir/common.w"
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;
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");
1088 #line 1155 "cwebdir/common.w"
1090 if(history> harmless_message)return(1);
1095 #line 1179 "cwebdir/common.w"
1097 #line 590 "cwebdir/comm-w2c.ch"
1098 fatal(const char*s,const char*t)
1099 #line 1182 "cwebdir/common.w"
1103 history= fatal_message;exit(wrap_up());
1107 #line 1190 "cwebdir/common.w"
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("","");
1118 #line 1254 "cwebdir/common.w"
1120 #line 658 "cwebdir/comm-w2c.ch"
1123 #line 1257 "cwebdir/common.w"
1128 boolean found_web= 0,found_change= 0,found_out= 0;
1130 boolean flag_change;
1133 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*76:*/
1134 #line 683 "cwebdir/comm-w2c.ch"
1137 if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
1139 #line 798 "cwebdir/comm-w2c.ch"
1141 usagehelp(program==ctangle?CTANGLEHELP:CWEAVEHELP,NULL);
1145 #line 686 "cwebdir/comm-w2c.ch"
1147 if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
1149 #line 807 "cwebdir/comm-w2c.ch"
1151 printversionandexit((program==ctangle?ctangle_banner:cweave_banner),
1152 "Silvio Levy and Donald E. Knuth",NULL,NULL);
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;
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");
1172 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1175 #line 1362 "cwebdir/common.w"
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"
1189 #line 1266 "cwebdir/common.w"
1192 s= name_pos= *argv;dot_pos= NULL;
1194 if(*s=='.')dot_pos= s++;
1195 else if(*s=='/')dot_pos= NULL,name_pos= ++s;
1198 if(!found_web)/*73:*/
1199 #line 1292 "cwebdir/common.w"
1202 if(s-*argv> max_file_name_length-5)
1204 #line 1364 "cwebdir/common.w"
1205 fatal("! Filename too long\n",*argv);
1209 #line 1295 "cwebdir/common.w"
1212 sprintf(web_file_name,"%s.w",*argv);
1214 strcpy(web_file_name,*argv);
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);
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;
1234 if(s-*argv> max_file_name_length-4)
1236 #line 1364 "cwebdir/common.w"
1237 fatal("! Filename too long\n",*argv);
1241 #line 1315 "cwebdir/common.w"
1244 sprintf(change_file_name,"%s.ch",*argv);
1245 else strcpy(change_file_name,*argv);
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)
1259 #line 1364 "cwebdir/common.w"
1260 fatal("! Filename too long\n",*argv);
1264 #line 1326 "cwebdir/common.w"
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);
1272 strcpy(tex_file_name,*argv);
1273 strcpy(C_file_name,*argv);
1276 sprintf(idx_file_name,"%s.idx",*argv);
1277 sprintf(scn_file_name,"%s.scn",*argv);
1283 #line 683 "cwebdir/comm-w2c.ch"
1285 #line 1277 "cwebdir/common.w"
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");
1296 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1299 #line 1362 "cwebdir/common.w"
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");
1316 fprintf(stderr,"cweave: Need one to three file arguments.\n");
1319 #line 1362 "cwebdir/common.w"
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"