History

CWEB — Release 3.3, 1994-12-06.

Andreas Scherer committed 15 years ago

Commit 22cd55e1 parent 6f710fc16 files · +379 −303Browse files

Unified · Split

16 files
  1. common.c +126 −125
  2. common.w +8 −7
  3. ctang-bs.ch +2 −2
  4. ctang-pc.ch +2 −2
  5. ctang-vms.ch +2 −2
  6. ctangle.c +100 −95
  7. ctangle.w +21 −13
  8. cweav-bs.ch +33 −5
  9. cweav-pc.ch +2 −2
  10. cweav-vms.ch +2 −2
  11. cweave.w +24 −12
  12. cwebmac.tex +3 −3
  13. cwebman.tex +21 −19
  14. examples/wc.w +23 −8
  15. examples/wmerge.w +1 −1
  16. prod.w +9 −5
common.c+126−125
@@ -7,12 +7,12 @@ · 6 unmodified lines
77 #include <ctype.h>
88
99 /*:5*//*8:*/
10−#line 163 "common.w"
10+#line 164 "common.w"
1111
1212 #include <stdio.h>
1313
1414 /*:8*//*22:*/
15−#line 468 "common.w"
15+#line 469 "common.w"
1616
1717 #include <stdlib.h>
1818
@@ -39,9 +39,10 @@ · 20 unmodified lines
3939 #define minus_gt_ast 027 \
4040
4141 #define buf_size 100
42−#define long_buf_size 500
43−#define xisspace(c)(isspace(c)&&((unsigned char)c<0200))
44−#define xisupper(c)(isupper(c)&&((unsigned char)c<0200)) \
42+#define longest_name 1000
43+#define long_buf_size (buf_size+longest_name)
44+#define xisspace(c) (isspace(c) &&((unsigned char) c<0200) )
45+#define xisupper(c) (isupper(c) &&((unsigned char) c<0200) ) \
4546
4647 #define max_include_depth 10 \
4748
@@ -53,27 +54,27 @@ · 5 unmodified lines
5354 #define web_file_name file_name[0] \
5455
5556 #define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
56−strncmp(buffer,change_buffer,limit-buffer)) \
57+strncmp(buffer,change_buffer,limit-buffer) ) \
5758
58−#define if_section_start_make_pending(b){*limit= '!'; \
59−for(loc= buffer;xisspace(*loc);loc++); \
59+#define if_section_start_make_pending(b) {*limit= '!'; \
60+for(loc= buffer;xisspace(*loc) ;loc++) ; \
6061 *limit= ' '; \
61−if(*loc=='@'&&(xisspace(*(loc+1))||*(loc+1)=='*'))change_pending= b; \
62+if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
6263 } \
6364
6465 #define max_sections 2000 \
6566 \
6667
67−#define too_long(){include_depth--; \
68−err_print("! Include file name too long");goto restart;} \
68+#define too_long() {include_depth--; \
69+err_print("! Include file name too long") ;goto restart;} \
6970
7071 #define max_bytes 90000 \
7172
7273 #define max_names 4000 \
7374 \
7475
75−#define length(c)(c+1)->byte_start-(c)->byte_start
76−#define print_id(c)term_write((c)->byte_start,length((c))) \
76+#define length(c) (c+1) ->byte_start-(c) ->byte_start
77+#define print_id(c) term_write((c) ->byte_start,length((c) ) ) \
7778
7879 #define hash_size 353 \
7980
@@ -82,11 +83,11 @@ err_print("! Include file name too long");goto restart;} \ · 2 unmodified lines
8283 #define root name_dir->rlink \
8384 \
8485
85−#define first_chunk(p)((p)->byte_start+2)
86−#define prefix_length(p)(int)((unsigned char)*((p)->byte_start)*256+ \
87−(unsigned char)*((p)->byte_start+1))
88−#define set_prefix_length(p,m)(*((p)->byte_start)= (m)/256, \
89−*((p)->byte_start+1)= (m)%256) \
86+#define first_chunk(p) ((p) ->byte_start+2)
87+#define prefix_length(p) (int) ((unsigned char) *((p) ->byte_start) *256+ \
88+(unsigned char) *((p) ->byte_start+1) )
89+#define set_prefix_length(p,m) (*((p) ->byte_start) = (m) /256, \
90+*((p) ->byte_start+1) = (m) %256) \
9091
9192 #define less 0
9293 #define equal 1
@@ -100,10 +101,10 @@ err_print("! Include file name too long");goto restart;} \ · 7 unmodified lines
100101 #define harmless_message 1
101102 #define error_message 2
102103 #define fatal_message 3
103−#define mark_harmless {if(history==spotless)history= harmless_message;}
104+#define mark_harmless {if(history==spotless) history= harmless_message;}
104105 #define mark_error history= error_message \
105106
106−#define confusion(s)fatal("! This can't happen: ",s) \
107+#define confusion(s) fatal("! This can't happen: ",s) \
107108 \
108109
109110 #define show_banner flags['b']
@@ -111,13 +112,13 @@ err_print("! Include file name too long");goto restart;} \ · 1 unmodified line
111112 #define show_stats flags['s']
112113 #define show_happiness flags['h'] \
113114
114−#define update_terminal fflush(stdout) \
115+#define update_terminal fflush(stdout) \
115116
116−#define new_line putchar('\n')
117+#define new_line putchar('\n')
117118 #define putxchar putchar
118−#define term_write(a,b)fflush(stdout),fwrite(a,sizeof(char),b,stdout)
119−#define C_printf(c,a)fprintf(C_file,c,a)
120−#define C_putc(c)putc(c,C_file) \
119+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
120+#define C_printf(c,a) fprintf(C_file,c,a)
121+#define C_putc(c) putc(c,C_file) \
121122
122123
123124 #line 59 "common.w"
@@ -129,7 +130,7 @@ typedef short boolean; · 5 unmodified lines
129130 boolean program;
130131
131132 /*:2*//*7:*/
132−#line 157 "common.w"
133+#line 158 "common.w"
133134
134135 char buffer[long_buf_size];
135136 char*buffer_end= buffer+buf_size-2;
@@ -137,7 +138,7 @@ char*limit= buffer; · 1 unmodified line
137138 char*loc= buffer;
138139
139140 /*:7*//*10:*/
140−#line 212 "common.w"
141+#line 213 "common.w"
141142
142143 int include_depth;
143144 FILE*file[max_include_depth];
@@ -154,7 +155,7 @@ boolean changing; · 10 unmodified lines
154155 boolean web_file_open= 0;
155156
156157 /*:10*//*20:*/
157−#line 416 "common.w"
158+#line 417 "common.w"
158159
159160 typedef unsigned short sixteen_bits;
160161 sixteen_bits section_count;
@@ -164,17 +165,17 @@ boolean change_pending; · 3 unmodified lines
164165 boolean print_where= 0;
165166
166167 /*:20*//*27:*/
167−#line 586 "common.w"
168+#line 587 "common.w"
168169
169170 typedef struct name_info{
170171 char*byte_start;
171172 /*31:*/
172−#line 623 "common.w"
173+#line 624 "common.w"
173174
174175 struct name_info*link;
175176
176177 /*:31*//*40:*/
177−#line 722 "common.w"
178+#line 723 "common.w"
178179
179180 union{
180181 struct name_info*Rlink;
@@ -183,12 +184,12 @@ char Ilk; · 2 unmodified lines
183184 }dummy;
184185
185186 /*:40*//*55:*/
186−#line 1054 "common.w"
187+#line 1055 "common.w"
187188
188189 char*equiv_or_xref;
189190
190191 /*:55*/
191−#line 589 "common.w"
192+#line 590 "common.w"
192193
193194 }name_info;
194195 typedef name_info*name_pointer;
@@ -198,13 +199,13 @@ name_info name_dir[max_names]; · 3 unmodified lines
198199 name_pointer name_dir_end= name_dir+max_names-1;
199200
200201 /*:27*//*29:*/
201−#line 609 "common.w"
202+#line 610 "common.w"
202203
203204 name_pointer name_ptr;
204205 char*byte_ptr;
205206
206207 /*:29*//*32:*/
207−#line 636 "common.w"
208+#line 637 "common.w"
208209
209210 typedef name_pointer*hash_pointer;
210211 name_pointer hash[hash_size];
@@ -212,12 +213,12 @@ hash_pointer hash_end= hash+hash_size-1; · 1 unmodified line
212213 hash_pointer h;
213214
214215 /*:32*//*56:*/
215−#line 1074 "common.w"
216+#line 1075 "common.w"
216217
217218 int history= spotless;
218219
219220 /*:56*//*67:*/
220−#line 1212 "common.w"
221+#line 1213 "common.w"
221222
222223 int argc;
223224 char**argv;
@@ -228,7 +229,7 @@ char scn_file_name[max_file_name_length]; · 4 unmodified lines
228229 boolean flags[128];
229230
230231 /*:67*//*77:*/
231−#line 1366 "common.w"
232+#line 1367 "common.w"
232233
233234 FILE*C_file;
234235 FILE*tex_file;
@@ -244,7 +245,7 @@ FILE*active_file; · 9 unmodified lines
244245 int phase;
245246
246247 /*:3*//*11:*/
247−#line 238 "common.w"
248+#line 239 "common.w"
248249
249250 char change_buffer[buf_size];
250251 char*change_limit;
@@ -253,48 +254,48 @@ char*change_limit; · 2 unmodified lines
253254 #line 61 "common.w"
254255
255256 /*33:*/
256−#line 642 "common.w"
257+#line 643 "common.w"
257258
258259 extern int names_match();
259260
260261 /*:33*//*38:*/
261−#line 695 "common.w"
262+#line 696 "common.w"
262263
263264 void init_p();
264265
265266 /*:38*//*46:*/
266−#line 844 "common.w"
267+#line 845 "common.w"
267268
268269 extern void init_node();
269270
270271 /*:46*//*53:*/
271−#line 1009 "common.w"
272+#line 1010 "common.w"
272273
273274 int section_name_cmp();
274275
275276 /*:53*//*57:*/
276−#line 1084 "common.w"
277+#line 1085 "common.w"
277278
278279 void err_print();
279280
280281 /*:57*//*60:*/
281−#line 1132 "common.w"
282+#line 1133 "common.w"
282283
283284 int wrap_up();
284285 extern void print_stats();
285286
286287 /*:60*//*63:*/
287−#line 1165 "common.w"
288+#line 1166 "common.w"
288289
289290 void fatal(),overflow();
290291
291292 /*:63*//*69:*/
292−#line 1243 "common.w"
293+#line 1244 "common.w"
293294
294295 void scan_args();
295296
296297 /*:69*//*81:*/
297−#line 1407 "common.w"
298+#line 1408 "common.w"
298299
299300 extern int strlen();
300301 extern int strcmp();
@@ -313,19 +314,19 @@ void · 12 unmodified lines
313314 common_init()
314315 {
315316 /*30:*/
316−#line 613 "common.w"
317+#line 614 "common.w"
317318
318319 name_dir->byte_start= byte_ptr= byte_mem;
319320 name_ptr= name_dir+1;
320321 name_ptr->byte_start= byte_mem;
321322
322323 /*:30*//*34:*/
323−#line 647 "common.w"
324+#line 648 "common.w"
324325
325326 for(h= hash;h<=hash_end;*h++= NULL);
326327
327328 /*:34*//*41:*/
328−#line 729 "common.w"
329+#line 730 "common.w"
329330
330331 root= NULL;
331332
@@ -333,7 +334,7 @@ root= NULL; · 1 unmodified line
333334 #line 92 "common.w"
334335 ;
335336 /*68:*/
336−#line 1225 "common.w"
337+#line 1226 "common.w"
337338
338339 show_banner= show_happiness= show_progress= 1;
339340
@@ -341,7 +342,7 @@ show_banner= show_happiness= show_progress= 1; · 1 unmodified line
341342 #line 93 "common.w"
342343 ;
343344 /*78:*/
344−#line 1373 "common.w"
345+#line 1374 "common.w"
345346
346347 scan_args();
347348 if(program==ctangle){
@@ -360,7 +361,7 @@ fatal("! Cannot open output file ",tex_file_name); · 12 unmodified lines
360361 }
361362
362363 /*:4*//*9:*/
363−#line 170 "common.w"
364+#line 171 "common.w"
364365
365366 int input_ln(fp)
366367 FILE*fp;
@@ -382,14 +383,14 @@ return(1); · 15 unmodified lines
382383 }
383384
384385 /*:9*//*12:*/
385−#line 249 "common.w"
386+#line 250 "common.w"
386387
387388 void
388389 prime_the_change_buffer()
389390 {
390391 change_limit= change_buffer;
391392 /*13:*/
392−#line 263 "common.w"
393+#line 264 "common.w"
393394
394395 while(1){
395396 change_line++;
@@ -406,10 +407,10 @@ err_print("! Missing @x in change file"); · 10 unmodified lines
406407 }
407408
408409 /*:13*/
409−#line 254 "common.w"
410+#line 255 "common.w"
410411 ;
411412 /*14:*/
412−#line 280 "common.w"
413+#line 281 "common.w"
413414
414415 do{
415416 change_line++;
@@ -421,10 +422,10 @@ return; · 5 unmodified lines
421422 }while(limit==buffer);
422423
423424 /*:14*/
424−#line 255 "common.w"
425+#line 256 "common.w"
425426 ;
426427 /*15:*/
427−#line 290 "common.w"
428+#line 291 "common.w"
428429
429430 {
430431 change_limit= change_buffer-buffer+limit;
@@ -432,12 +433,12 @@ strncpy(change_buffer,buffer,limit-buffer+1); · 1 unmodified line
432433 }
433434
434435 /*:15*/
435−#line 256 "common.w"
436+#line 257 "common.w"
436437 ;
437438 }
438439
439440 /*:12*//*16:*/
440−#line 318 "common.w"
441+#line 319 "common.w"
441442
442443 void
443444 check_change()
@@ -460,7 +461,7 @@ return; · 16 unmodified lines
460461 if(limit>buffer+1&&buffer[0]=='@'){
461462 if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
462463 /*17:*/
463−#line 356 "common.w"
464+#line 357 "common.w"
464465
465466 if(buffer[1]=='x'||buffer[1]=='z'){
466467 loc= buffer+2;err_print("! Where is the matching @y?");
@@ -478,11 +479,11 @@ return; · 11 unmodified lines
478479 }
479480
480481 /*:17*/
481−#line 340 "common.w"
482+#line 341 "common.w"
482483 ;
483484 }
484485 /*15:*/
485−#line 290 "common.w"
486+#line 291 "common.w"
486487
487488 {
488489 change_limit= change_buffer-buffer+limit;
@@ -490,7 +491,7 @@ strncpy(change_buffer,buffer,limit-buffer+1); · 1 unmodified line
490491 }
491492
492493 /*:15*/
493−#line 342 "common.w"
494+#line 343 "common.w"
494495 ;
495496 changing= 0;cur_line++;
496497 while(!input_ln(cur_file)){
@@ -506,14 +507,14 @@ if(lines_dont_match)n++; · 9 unmodified lines
506507 }
507508
508509 /*:16*//*18:*/
509−#line 376 "common.w"
510+#line 377 "common.w"
510511
511512 void
512513 reset_input()
513514 {
514515 limit= buffer;loc= buffer+1;buffer[0]= ' ';
515516 /*19:*/
516−#line 391 "common.w"
517+#line 392 "common.w"
517518
518519 if((web_file= fopen(web_file_name,"r"))==NULL){
519520 strcpy(web_file_name,alt_web_file_name);
@@ -527,7 +528,7 @@ if((change_file= fopen(change_file_name,"r"))==NULL) · 7 unmodified lines
527528 fatal("! Cannot open change file ",change_file_name);
528529
529530 /*:19*/
530−#line 381 "common.w"
531+#line 382 "common.w"
531532 ;
532533 include_depth= 0;cur_line= 0;change_line= 0;
533534 change_depth= include_depth;
@@ -536,14 +537,14 @@ limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0; · 2 unmodified lines
536537 }
537538
538539 /*:18*//*21:*/
539−#line 424 "common.w"
540+#line 425 "common.w"
540541
541542 int get_line()
542543 {
543544 restart:
544545 if(changing&&include_depth==change_depth)
545546 /*25:*/
546−#line 529 "common.w"
547+#line 530 "common.w"
547548 {
548549 change_line++;
549550 if(!input_ln(change_file)){
@@ -574,11 +575,11 @@ prime_the_change_buffer();changing= !changing;print_where= 1; · 24 unmodified lines
574575 }
575576
576577 /*:25*/
577−#line 429 "common.w"
578+#line 430 "common.w"
578579 ;
579580 if(!changing||include_depth>change_depth){
580581 /*24:*/
581−#line 512 "common.w"
582+#line 513 "common.w"
582583 {
583584 cur_line++;
584585 while(!input_ln(cur_file)){
@@ -597,7 +598,7 @@ if(change_limit>change_buffer)check_change(); · 12 unmodified lines
597598 }
598599
599600 /*:24*/
600−#line 431 "common.w"
601+#line 432 "common.w"
601602 ;
602603 if(changing&&include_depth==change_depth)goto restart;
603604 }
@@ -617,7 +618,7 @@ goto restart; · 13 unmodified lines
617618 }
618619 include_depth++;
619620 /*23:*/
620−#line 471 "common.w"
621+#line 472 "common.w"
621622 {
622623 char temp_file_name[max_file_name_length];
623624 char*cur_file_name_end= cur_file_name+max_file_name_length-1;
@@ -660,14 +661,14 @@ include_depth--;err_print("! Cannot open include file");goto restart; · 36 unmodified lines
660661 }
661662
662663 /*:23*/
663−#line 449 "common.w"
664+#line 450 "common.w"
664665 ;
665666 }
666667 return(!input_has_ended);
667668 }
668669
669670 /*:21*//*26:*/
670−#line 561 "common.w"
671+#line 562 "common.w"
671672
672673 void
673674 check_complete(){
@@ -681,7 +682,7 @@ err_print("! Change file entry did not match"); · 7 unmodified lines
681682 }
682683
683684 /*:26*//*35:*/
684−#line 652 "common.w"
685+#line 653 "common.w"
685686
686687 name_pointer
687688 id_lookup(first,last,t)
@@ -696,17 +697,17 @@ name_pointer p; · 8 unmodified lines
696697 if(last==NULL)for(last= first;*last!='\0';last++);
697698 l= last-first;
698699 /*36:*/
699−#line 675 "common.w"
700+#line 676 "common.w"
700701
701702 h= (unsigned char)*i;
702703 while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
703704
704705
705706 /*:36*/
706−#line 665 "common.w"
707+#line 666 "common.w"
707708 ;
708709 /*37:*/
709−#line 683 "common.w"
710+#line 684 "common.w"
710711
711712 p= hash[h];
712713 while(p&&!names_match(p,first,l,t))p= p->link;
@@ -716,10 +717,10 @@ p->link= hash[h];hash[h]= p; · 3 unmodified lines
716717 }
717718
718719 /*:37*/
719−#line 666 "common.w"
720+#line 667 "common.w"
720721 ;
721722 if(p==name_ptr)/*39:*/
722−#line 698 "common.w"
723+#line 699 "common.w"
723724 {
724725 if(byte_ptr+l>byte_mem_end)overflow("byte memory");
725726 if(name_ptr>=name_dir_end)overflow("name");
@@ -729,13 +730,13 @@ if(program==cweave)init_p(p,t); · 3 unmodified lines
729730 }
730731
731732 /*:39*/
732−#line 667 "common.w"
733+#line 668 "common.w"
733734 ;
734735 return(p);
735736 }
736737
737738 /*:35*//*42:*/
738−#line 756 "common.w"
739+#line 757 "common.w"
739740
740741 void
741742 print_section_name(p)
@@ -756,7 +757,7 @@ if(q)term_write("...",3); · 14 unmodified lines
756757 }
757758
758759 /*:42*//*43:*/
759−#line 775 "common.w"
760+#line 776 "common.w"
760761
761762 void
762763 sprint_section_name(dest,p)
@@ -779,7 +780,7 @@ s= p->byte_start; · 16 unmodified lines
779780 }
780781
781782 /*:43*//*44:*/
782−#line 796 "common.w"
783+#line 797 "common.w"
783784
784785 void
785786 print_prefix_name(p)
@@ -792,7 +793,7 @@ if(s+l<(p+1)->byte_start)term_write("...",3); · 6 unmodified lines
792793 }
793794
794795 /*:44*//*45:*/
795−#line 817 "common.w"
796+#line 818 "common.w"
796797
797798 int web_strcmp(j,j_len,k,k_len)
798799 char*j,*k;
@@ -808,7 +809,7 @@ else return greater; · 9 unmodified lines
808809 }
809810
810811 /*:45*//*47:*/
811−#line 847 "common.w"
812+#line 848 "common.w"
812813
813814 name_pointer
814815 add_section_name(par,c,first,last,ispref)
@@ -839,7 +840,7 @@ return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p); · 24 unmodified lines
839840 }
840841
841842 /*:47*//*48:*/
842−#line 876 "common.w"
843+#line 877 "common.w"
843844
844845 void
845846 extend_section_name(p,first,last,ispref)
@@ -863,7 +864,7 @@ if(ispref)*(byte_ptr-1)= ' '; · 17 unmodified lines
863864 }
864865
865866 /*:48*//*49:*/
866−#line 904 "common.w"
867+#line 905 "common.w"
867868
868869 name_pointer
869870 section_lookup(first,last,ispref)
@@ -878,7 +879,7 @@ name_pointer par= NULL; · 8 unmodified lines
878879
879880 int name_len= last-first+1;
880881 /*50:*/
881−#line 928 "common.w"
882+#line 929 "common.w"
882883
883884 while(p){
884885 c= web_strcmp(first,name_len,first_chunk(p),prefix_length(p));
@@ -905,19 +906,19 @@ p= q,q= NULL; · 20 unmodified lines
905906 }
906907
907908 /*:50*/
908−#line 918 "common.w"
909+#line 919 "common.w"
909910 ;
910911 /*51:*/
911−#line 953 "common.w"
912+#line 954 "common.w"
912913
913914 if(r==NULL)
914915 return add_section_name(par,c,first,last+1,ispref);
915916
916917 /*:51*/
917−#line 919 "common.w"
918+#line 920 "common.w"
918919 ;
919920 /*52:*/
920−#line 961 "common.w"
921+#line 962 "common.w"
921922
922923 switch(section_name_cmp(&first,name_len,r)){
923924
@@ -951,12 +952,12 @@ return r; · 27 unmodified lines
951952 }
952953
953954 /*:52*/
954−#line 920 "common.w"
955+#line 921 "common.w"
955956 ;
956957 }
957958
958959 /*:49*//*54:*/
959−#line 1012 "common.w"
960+#line 1013 "common.w"
960961
961962 int section_name_cmp(pfirst,len,r)
962963 char**pfirst;
@@ -990,7 +991,7 @@ default:return c; · 27 unmodified lines
990991 }
991992
992993 /*:54*//*58:*/
993−#line 1087 "common.w"
994+#line 1088 "common.w"
994995
995996 void
996997 err_print(s)
@@ -999,7 +1000,7 @@ char*s; · 2 unmodified lines
9991000 char*k,*l;
10001001 printf(*s=='!'?"\n%s":"%s",s);
10011002 if(web_file_open)/*59:*/
1002−#line 1107 "common.w"
1003+#line 1108 "common.w"
10031004
10041005 {if(changing&&include_depth==change_depth)
10051006 printf(". (l. %d of change file)\n",change_line);
@@ -1019,20 +1020,20 @@ putchar(' '); · 13 unmodified lines
10191020 }
10201021
10211022 /*:59*/
1022−#line 1094 "common.w"
1023+#line 1095 "common.w"
10231024 ;
10241025 update_terminal;mark_error;
10251026 }
10261027
10271028 /*:58*//*61:*/
1028−#line 1142 "common.w"
1029+#line 1143 "common.w"
10291030
10301031 int wrap_up(){
10311032 putchar('\n');
10321033 if(show_stats)
10331034 print_stats();
10341035 /*62:*/
1035−#line 1152 "common.w"
1036+#line 1153 "common.w"
10361037
10371038 switch(history){
10381039 case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
@@ -1044,14 +1045,14 @@ case fatal_message:printf("(That was a fatal error, my friend.)\n"); · 5 unmodified lines
10441045 }
10451046
10461047 /*:62*/
1047−#line 1147 "common.w"
1048+#line 1148 "common.w"
10481049 ;
10491050 if(history>harmless_message)return(1);
10501051 else return(0);
10511052 }
10521053
10531054 /*:61*//*64:*/
1054−#line 1171 "common.w"
1055+#line 1172 "common.w"
10551056 void
10561057 fatal(s,t)
10571058 char*s,*t;
@@ -1062,7 +1063,7 @@ history= fatal_message;exit(wrap_up()); · 4 unmodified lines
10621063 }
10631064
10641065 /*:64*//*65:*/
1065−#line 1182 "common.w"
1066+#line 1183 "common.w"
10661067 void
10671068 overflow(t)
10681069 char*t;
@@ -1072,7 +1073,7 @@ printf("\n! Sorry, %s capacity exceeded",t);fatal("",""); · 3 unmodified lines
10721073
10731074
10741075 /*:65*//*70:*/
1075−#line 1246 "common.w"
1076+#line 1247 "common.w"
10761077
10771078 void
10781079 scan_args()
@@ -1086,7 +1087,7 @@ boolean flag_change; · 7 unmodified lines
10861087
10871088 while(--argc>0){
10881089 if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*74:*/
1089−#line 1340 "common.w"
1090+#line 1341 "common.w"
10901091
10911092 {
10921093 if(**argv=='-')flag_change= 0;
@@ -1096,7 +1097,7 @@ flags[*dot_pos]= flag_change; · 3 unmodified lines
10961097 }
10971098
10981099 /*:74*/
1099−#line 1258 "common.w"
1100+#line 1259 "common.w"
11001101
11011102 else{
11021103 s= name_pos= *argv;dot_pos= NULL;
@@ -1106,17 +1107,17 @@ else if(*s=='/')dot_pos= NULL,name_pos= ++s; · 3 unmodified lines
11061107 else s++;
11071108 }
11081109 if(!found_web)/*71:*/
1109−#line 1284 "common.w"
1110+#line 1285 "common.w"
11101111
11111112 {
11121113 if(s-*argv>max_file_name_length-5)
11131114 /*76:*/
1114−#line 1360 "common.w"
1115+#line 1361 "common.w"
11151116 fatal("! Filename too long\n",*argv);
11161117
11171118
11181119 /*:76*/
1119−#line 1287 "common.w"
1120+#line 1288 "common.w"
11201121 ;
11211122 if(dot_pos==NULL)
11221123 sprintf(web_file_name,"%s.w",*argv);
@@ -1133,22 +1134,22 @@ found_web= 1; · 10 unmodified lines
11331134 }
11341135
11351136 /*:71*/
1136−#line 1267 "common.w"
1137+#line 1268 "common.w"
11371138
11381139 else if(!found_change)/*72:*/
1139−#line 1302 "common.w"
1140+#line 1303 "common.w"
11401141
11411142 {
11421143 if(strcmp(*argv,"-")==0)found_change= -1;
11431144 else{
11441145 if(s-*argv>max_file_name_length-4)
11451146 /*76:*/
1146−#line 1360 "common.w"
1147+#line 1361 "common.w"
11471148 fatal("! Filename too long\n",*argv);
11481149
11491150
11501151 /*:76*/
1151−#line 1307 "common.w"
1152+#line 1308 "common.w"
11521153 ;
11531154 if(dot_pos==NULL)
11541155 sprintf(change_file_name,"%s.ch",*argv);
@@ -1158,20 +1159,20 @@ found_change= 1; · 3 unmodified lines
11581159 }
11591160
11601161 /*:72*/
1161−#line 1268 "common.w"
1162+#line 1269 "common.w"
11621163
11631164 else if(!found_out)/*73:*/
1164−#line 1315 "common.w"
1165+#line 1316 "common.w"
11651166
11661167 {
11671168 if(s-*argv>max_file_name_length-5)
11681169 /*76:*/
1169−#line 1360 "common.w"
1170+#line 1361 "common.w"
11701171 fatal("! Filename too long\n",*argv);
11711172
11721173
11731174 /*:76*/
1174−#line 1318 "common.w"
1175+#line 1319 "common.w"
11751176 ;
11761177 if(dot_pos==NULL){
11771178 sprintf(tex_file_name,"%s.tex",*argv);
@@ -1195,10 +1196,10 @@ found_out= 1; · 17 unmodified lines
11951196 }
11961197
11971198 /*:73*/
1198−#line 1269 "common.w"
1199+#line 1270 "common.w"
11991200
12001201 else/*75:*/
1201−#line 1348 "common.w"
1202+#line 1349 "common.w"
12021203
12031204 {
12041205 if(program==ctangle)
@@ -1212,12 +1213,12 @@ else fatal( · 7 unmodified lines
12121213 }
12131214
12141215 /*:75*/
1215−#line 1270 "common.w"
1216+#line 1271 "common.w"
12161217 ;
12171218 }
12181219 }
12191220 if(!found_web)/*75:*/
1220−#line 1348 "common.w"
1221+#line 1349 "common.w"
12211222
12221223 {
12231224 if(program==ctangle)
@@ -1231,7 +1232,7 @@ else fatal( · 7 unmodified lines
12311232 }
12321233
12331234 /*:75*/
1234−#line 1273 "common.w"
1235+#line 1274 "common.w"
12351236 ;
12361237 if(found_change<=0)strcpy(change_file_name,"/dev/null");
12371238 }
common.w+8−7
@@ -2,7 +2,7 @@ · 1 unmodified line
22 % This program by Silvio Levy and Donald E. Knuth
33 % is based on a program by Knuth.
44 % It is distributed WITHOUT ANY WARRANTY, express or implied.
5−% Version 3.1 --- November 1993 (works with later versions too)
5+% Version 3.3 --- December 1994 (works with later versions too)
66
77 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
88
@@ -17,12 +17,12 @@ · 8 unmodified lines
1717
1818 \def\v{\char'174} % vertical (|) in typewriter font
1919
20−\def\title{Common code for CTANGLE and CWEAVE (Version 3.1)}
20+\def\title{Common code for CTANGLE and CWEAVE (Version 3.3)}
2121 \def\topofcontents{\null\vfill
2222 \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
2323 {\ttitlefont CWEAVE}}
2424 \vskip 15pt
25− \centerline{(Version 3.1)}
25+ \centerline{(Version 3.3)}
2626 \vfill}
2727 \def\botofcontents{\vfill
2828 \noindent
@@ -105,7 +105,7 @@ common_init() · 76 unmodified lines
105105 using the definitions below. These definitions are consistent with
106106 an extension of ASCII code originally developed at MIT and explained in
107107 Appendix~C of {\sl The \TEX/book\/}; thus, users who have such a
108−character set can type things like \.{\char'32} and \.{char'4} instead
108+character set can type things like \.{\char'32} and \.{\char'4} instead
109109 of \.{!=} and \.{\&\&}. (However, their files will not be too portable
110110 until more people adopt the extended code.)
111111
@@ -150,7 +150,8 @@ some of \.{CWEB}'s routines use the fact that it is safe to refer to · 38 unmodified lines
150150 |*(limit+2)| without overstepping the bounds of the array.
151151
152152 @d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
153−@d long_buf_size 500 /* for \.{CWEAVE} */
153+@d longest_name 1000
154+@d long_buf_size (buf_size+longest_name) /* for \.{CWEAVE} */
154155 @d xisspace(c) (isspace(c)&&((unsigned char)c<0200))
155156 @d xisupper(c) (isupper(c)&&((unsigned char)c<0200))
156157
@@ -897,7 +898,7 @@ int ispref; /* are we adding a prefix or a full name? */ · 740 unmodified lines
897898
898899 @ The |section_lookup| procedure is supposed to find a
899900 section name that matches a new name, installing the new name if
900−its doesn't match an existing one. The new name is the string
901+it doesn't match an existing one. The new name is the string
901902 between |first| and |last|; a ``match'' means that the new name
902903 exactly equals or is a prefix or extension of a name in the tree.
903904
@@ -1079,7 +1080,7 @@ the user, by printing the error message at the beginning of a new line and · 175 unmodified lines
10791080 then giving an indication of where the error was spotted in the source file.
10801081 Note that no period follows the error message, since the error routine
10811082 will automatically supply a period. A newline is automatically supplied
1082−if the string begins with |"|"|.
1083+if the string begins with |"!"|.
10831084
10841085 @<Predecl...@>=
10851086 void err_print();
ctang-bs.ch+2−2
@@ -17,12 +17,12 @@ by using "huge" pointers. · 16 unmodified lines
1717 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
1818 is modified.
1919
20−@d banner "This is CTANGLE (Version 3.2)\n"
20+@d banner "This is CTANGLE (Version 3.3)\n"
2121 @y
2222 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
2323 is modified.
2424
25−@d banner "This is CTANGLE (Version 3.2pc/big)\n"
25+@d banner "This is CTANGLE (Version 3.3pc/big)\n"
2626 @z
2727
2828
ctang-pc.ch+2−2
@@ -9,9 +9,9 @@ that allows >64K arrays. If you need lots of bytes and toks, try the · 8 unmodified lines
99 alternate change files with -bs suffix instead of -pc.
1010
1111 @x section 1
12−@d banner "This is CTANGLE (Version 3.2)\n"
12+@d banner "This is CTANGLE (Version 3.3)\n"
1313 @y
14−@d banner "This is CTANGLE (Version 3.2pc)\n"
14+@d banner "This is CTANGLE (Version 3.3pc)\n"
1515 @z
1616 @x section 4
1717 @d max_bytes 90000 /* the number of bytes in identifiers,
ctang-vms.ch+2−2
@@ -10,9 +10,9 @@ created: · 9 unmodified lines
1010 (these changes not necessary for initial bootstrapping)
1111
1212 @x section 1 (01-FEB-1992 ST)
13−@d banner "This is CTANGLE (Version 3.2)\n"
13+@d banner "This is CTANGLE (Version 3.3)\n"
1414 @y
15−@d banner "This is CTANGLE (VAX/VMS Version 3.2)\n"
15+@d banner "This is CTANGLE (VAX/VMS Version 3.3)\n"
1616 @z
1717
1818 @x section 6 (from common.h) (01-FEB-1992 ST)
ctangle.c+100−95
@@ -7,7 +7,7 @@ · 6 unmodified lines
77 #include <stdio.h>
88
99 /*:6*//*62:*/
10−#line 874 "ctangle.w"
10+#line 875 "ctangle.w"
1111
1212 #include <ctype.h>
1313 #include <stdlib.h>
@@ -15,7 +15,7 @@ · 1 unmodified line
1515 /*:62*/
1616 #line 62 "ctangle.w"
1717
18−#define banner "This is CTANGLE (Version 3.2)\n" \
18+#define banner "This is CTANGLE (Version 3.3)\n" \
1919
2020 #define max_bytes 90000 \
2121
@@ -47,15 +47,15 @@ · 25 unmodified lines
4747 #define period_ast 026
4848 #define minus_gt_ast 027 \
4949
50−#define xisalpha(c)(isalpha(c)&&((eight_bits)c<0200))
51−#define xisdigit(c)(isdigit(c)&&((eight_bits)c<0200))
52−#define xisspace(c)(isspace(c)&&((eight_bits)c<0200))
53−#define xislower(c)(islower(c)&&((eight_bits)c<0200))
54−#define xisupper(c)(isupper(c)&&((eight_bits)c<0200))
55−#define xisxdigit(c)(isxdigit(c)&&((eight_bits)c<0200)) \
50+#define xisalpha(c) (isalpha(c) &&((eight_bits) c<0200) )
51+#define xisdigit(c) (isdigit(c) &&((eight_bits) c<0200) )
52+#define xisspace(c) (isspace(c) &&((eight_bits) c<0200) )
53+#define xislower(c) (islower(c) &&((eight_bits) c<0200) )
54+#define xisupper(c) (isupper(c) &&((eight_bits) c<0200) )
55+#define xisxdigit(c) (isxdigit(c) &&((eight_bits) c<0200) ) \
5656
57−#define length(c)(c+1)->byte_start-(c)->byte_start
58−#define print_id(c)term_write((c)->byte_start,length((c)))
57+#define length(c) (c+1) ->byte_start-(c) ->byte_start
58+#define print_id(c) term_write((c) ->byte_start,length((c) ) )
5959 #define llink link
6060 #define rlink dummy.Rlink
6161 #define root name_dir->rlink \
@@ -66,9 +66,9 @@ · 4 unmodified lines
6666 #define harmless_message 1
6767 #define error_message 2
6868 #define fatal_message 3
69−#define mark_harmless {if(history==spotless)history= harmless_message;}
69+#define mark_harmless {if(history==spotless) history= harmless_message;}
7070 #define mark_error history= error_message
71−#define confusion(s)fatal("! This can't happen: ",s) \
71+#define confusion(s) fatal("! This can't happen: ",s) \
7272
7373 #define max_file_name_length 60
7474 #define cur_file file[include_depth]
@@ -80,12 +80,12 @@ · 5 unmodified lines
8080 #define show_progress flags['p']
8181 #define show_happiness flags['h'] \
8282
83−#define update_terminal fflush(stdout)
84−#define new_line putchar('\n')
83+#define update_terminal fflush(stdout)
84+#define new_line putchar('\n')
8585 #define putxchar putchar
86−#define term_write(a,b)fflush(stdout),fwrite(a,sizeof(char),b,stdout)
87−#define C_printf(c,a)fprintf(C_file,c,a)
88−#define C_putc(c)putc(c,C_file) \
86+#define term_write(a,b) fflush(stdout) ,fwrite(a,sizeof(char) ,b,stdout)
87+#define C_printf(c,a) fprintf(C_file,c,a)
88+#define C_putc(c) putc(c,C_file) \
8989
9090 #define equiv equiv_or_xref \
9191
@@ -93,7 +93,7 @@ · 1 unmodified line
9393
9494 #define string 02
9595 #define join 0177
96−#define output_defs_flag (2*024000-1) \
96+#define output_defs_flag (2*024000-1) \
9797
9898 #define cur_end cur_state.end_field
9999 #define cur_byte cur_state.byte_field
@@ -125,14 +125,14 @@ · 25 unmodified lines
125125
126126 #define constant 03 \
127127
128−#define isxalpha(c)((c)=='_')
129−#define ishigh(c)((unsigned char)(c)>0177) \
128+#define isxalpha(c) ((c) =='_')
129+#define ishigh(c) ((unsigned char) (c) >0177) \
130130 \
131131
132−#define compress(c)if(loc++<=limit)return(c) \
132+#define compress(c) if(loc++<=limit) return(c) \
133133
134134 #define macro 0
135−#define app_repl(c){if(tok_ptr==tok_mem_end)overflow("token");*tok_ptr++= c;} \
135+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
136136
137137
138138 #line 63 "ctangle.w"
@@ -345,15 +345,16 @@ boolean comment_continues= 0; · 206 unmodified lines
345345 #line 871 "ctangle.w"
346346
347347 name_pointer cur_section_name;
348+int no_where;
348349
349350 /*:61*//*75:*/
350−#line 1181 "ctangle.w"
351+#line 1185 "ctangle.w"
351352
352353 text_pointer cur_text;
353354 eight_bits next_control;
354355
355356 /*:75*//*82:*/
356−#line 1328 "ctangle.w"
357+#line 1335 "ctangle.w"
357358
358359 extern sixteen_bits section_count;
359360
@@ -382,15 +383,15 @@ void output_defs(); · 22 unmodified lines
382383 /*:46*//*48:*/
383384 #line 642 "ctangle.w"
384385
385−void out_char();
386+static void out_char();
386387
387388 /*:48*//*90:*/
388−#line 1434 "ctangle.w"
389+#line 1442 "ctangle.w"
389390
390391 void phase_one();
391392
392393 /*:90*//*92:*/
393−#line 1452 "ctangle.w"
394+#line 1460 "ctangle.w"
394395
395396 void skip_limbo();
396397
@@ -457,7 +458,7 @@ ccode['\'']= ord; · 60 unmodified lines
457458 }
458459
459460 /*:57*//*71:*/
460−#line 1105 "ctangle.w"
461+#line 1106 "ctangle.w"
461462 section_text[0]= ' ';
462463
463464 /*:71*/
@@ -717,7 +718,7 @@ pop_level(0); · 253 unmodified lines
717718 /*:47*//*49:*/
718719 #line 645 "ctangle.w"
719720
720−void
721+static void
721722 out_char(cur_char)
722723 eight_bits cur_char;
723724 {
@@ -861,7 +862,7 @@ else loc++; · 137 unmodified lines
861862 }
862863
863864 /*:60*//*63:*/
864−#line 885 "ctangle.w"
865+#line 886 "ctangle.w"
865866
866867 eight_bits
867868 get_next()
@@ -872,10 +873,10 @@ while(1){ · 4 unmodified lines
872873 if(loc>limit){
873874 if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
874875 if(get_line()==0)return(new_section);
875−else if(print_where){
876+else if(print_where&&!no_where){
876877 print_where= 0;
877878 /*77:*/
878−#line 1208 "ctangle.w"
879+#line 1215 "ctangle.w"
879880
880881 store_two_bytes(0150000);
881882 if(changing)id_first= change_file_name;
@@ -883,11 +884,11 @@ else id_first= cur_file_name; · 1 unmodified line
883884 id_loc= id_first+strlen(id_first);
884885 if(changing)store_two_bytes((sixteen_bits)change_line);
885886 else store_two_bytes((sixteen_bits)cur_line);
886−{int a= id_lookup(id_first,id_loc)-name_dir;app_repl((a/0400)+0200);
887+{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
887888 app_repl(a%0400);}
888889
889890 /*:77*/
890−#line 897 "ctangle.w"
891+#line 898 "ctangle.w"
891892 ;
892893 }
893894 else return('\n');
@@ -901,7 +902,7 @@ else continue; · 7 unmodified lines
901902 }
902903 loc++;
903904 if(xisdigit(c)||c=='\\'||c=='.')/*66:*/
904−#line 963 "ctangle.w"
905+#line 964 "ctangle.w"
905906 {
906907 id_first= loc-1;
907908 if(*id_first=='.'&&!xisdigit(*loc))goto mistake;
@@ -929,11 +930,11 @@ return(constant); · 21 unmodified lines
929930 }
930931
931932 /*:66*/
932−#line 909 "ctangle.w"
933+#line 910 "ctangle.w"
933934
934935 else if(c=='\''||c=='"'||(c=='L'&&(*loc=='\''||*loc=='"')))
935936 /*67:*/
936−#line 994 "ctangle.w"
937+#line 995 "ctangle.w"
937938 {
938939 char delim= c;
939940 id_first= section_text+1;
@@ -976,11 +977,11 @@ return(string); · 36 unmodified lines
976977 }
977978
978979 /*:67*/
979−#line 911 "ctangle.w"
980+#line 912 "ctangle.w"
980981
981982 else if(isalpha(c)||isxalpha(c)||ishigh(c))
982983 /*65:*/
983−#line 957 "ctangle.w"
984+#line 958 "ctangle.w"
984985 {
985986 id_first= --loc;
986987 while(isalpha(*++loc)||isdigit(*loc)||isxalpha(*loc)||ishigh(*loc));
@@ -988,10 +989,10 @@ id_loc= loc;return(identifier); · 1 unmodified line
988989 }
989990
990991 /*:65*/
991−#line 913 "ctangle.w"
992+#line 914 "ctangle.w"
992993
993994 else if(c=='@')/*68:*/
994−#line 1038 "ctangle.w"
995+#line 1039 "ctangle.w"
995996 {
996997 c= ccode[(eight_bits)*loc++];
997998 switch(c){
@@ -1008,11 +1009,11 @@ continue; · 10 unmodified lines
10081009 case section_name:
10091010 cur_section_name_char= *(loc-1);
10101011 /*70:*/
1011−#line 1087 "ctangle.w"
1012+#line 1088 "ctangle.w"
10121013 {
10131014 char*k;
10141015 /*72:*/
1015−#line 1107 "ctangle.w"
1016+#line 1108 "ctangle.w"
10161017
10171018 k= section_text;
10181019 while(1){
@@ -1023,7 +1024,7 @@ loc= buffer+1;break; · 4 unmodified lines
10231024 }
10241025 c= *loc;
10251026 /*73:*/
1026−#line 1131 "ctangle.w"
1027+#line 1132 "ctangle.w"
10271028
10281029 if(c=='@'){
10291030 c= *(loc+1);
@@ -1042,7 +1043,7 @@ err_print("! Nesting of section names not allowed");break; · 12 unmodified lines
10421043 }
10431044
10441045 /*:73*/
1045−#line 1116 "ctangle.w"
1046+#line 1117 "ctangle.w"
10461047 ;
10471048 loc++;if(k<section_text_end)k++;
10481049 if(xisspace(c)){
@@ -1059,7 +1060,7 @@ printf("...");mark_harmless; · 10 unmodified lines
10591060 if(*k==' '&&k>section_text)k--;
10601061
10611062 /*:72*/
1062−#line 1089 "ctangle.w"
1063+#line 1090 "ctangle.w"
10631064 ;
10641065 if(k-section_text>3&&strncmp(k-2,"...",3)==0)
10651066 cur_section_name= section_lookup(section_text+1,k-3,1);
@@ -1082,16 +1083,16 @@ overflow("output files"); · 16 unmodified lines
10821083 }
10831084
10841085 /*:40*/
1085−#line 1095 "ctangle.w"
1086+#line 1096 "ctangle.w"
10861087 ;
10871088 return(section_name);
10881089 }
10891090
10901091 /*:70*/
1091−#line 1053 "ctangle.w"
1092+#line 1054 "ctangle.w"
10921093 ;
10931094 case string:/*74:*/
1094−#line 1153 "ctangle.w"
1095+#line 1154 "ctangle.w"
10951096 {
10961097 id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
10971098 while(*loc!='@'||*(loc+1)!='>')loc++;
@@ -1102,10 +1103,10 @@ return(string); · 4 unmodified lines
11021103 }
11031104
11041105 /*:74*/
1105−#line 1054 "ctangle.w"
1106+#line 1055 "ctangle.w"
11061107 ;
11071108 case ord:/*69:*/
1108−#line 1066 "ctangle.w"
1109+#line 1067 "ctangle.w"
11091110
11101111 id_first= loc;
11111112 if(*loc=='\\'){
@@ -1128,14 +1129,14 @@ loc++; · 16 unmodified lines
11281129 return(ord);
11291130
11301131 /*:69*/
1131−#line 1055 "ctangle.w"
1132+#line 1056 "ctangle.w"
11321133 ;
11331134 default:return(c);
11341135 }
11351136 }
11361137
11371138 /*:68*/
1138−#line 914 "ctangle.w"
1139+#line 915 "ctangle.w"
11391140
11401141 else if(xisspace(c)){
11411142 if(!preprocessing||loc>limit)continue;
@@ -1144,7 +1145,7 @@ else return(' '); · 2 unmodified lines
11441145 }
11451146 else if(c=='#'&&loc==buffer+1)preprocessing= 1;
11461147 mistake:/*64:*/
1147−#line 935 "ctangle.w"
1148+#line 936 "ctangle.w"
11481149
11491150 switch(c){
11501151 case'+':if(*loc=='+')compress(plus_plus);break;
@@ -1168,14 +1169,14 @@ case'!':if(*loc=='=')compress(not_eq);break; · 17 unmodified lines
11681169 }
11691170
11701171 /*:64*/
1171−#line 921 "ctangle.w"
1172+#line 922 "ctangle.w"
11721173
11731174 return(c);
11741175 }
11751176 }
11761177
11771178 /*:63*//*76:*/
1178−#line 1185 "ctangle.w"
1179+#line 1189 "ctangle.w"
11791180
11801181 void
11811182 scan_repl(t)
@@ -1183,7 +1184,7 @@ eight_bits t; · 1 unmodified line
11831184 {
11841185 sixteen_bits a;
11851186 if(t==section_name){/*77:*/
1186−#line 1208 "ctangle.w"
1187+#line 1215 "ctangle.w"
11871188
11881189 store_two_bytes(0150000);
11891190 if(changing)id_first= change_file_name;
@@ -1191,23 +1192,23 @@ else id_first= cur_file_name; · 1 unmodified line
11911192 id_loc= id_first+strlen(id_first);
11921193 if(changing)store_two_bytes((sixteen_bits)change_line);
11931194 else store_two_bytes((sixteen_bits)cur_line);
1194−{int a= id_lookup(id_first,id_loc)-name_dir;app_repl((a/0400)+0200);
1195+{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
11951196 app_repl(a%0400);}
11961197
11971198 /*:77*/
1198−#line 1191 "ctangle.w"
1199+#line 1195 "ctangle.w"
11991200 ;}
12001201 while(1)switch(a= get_next()){
12011202 /*78:*/
1202−#line 1218 "ctangle.w"
1203+#line 1225 "ctangle.w"
12031204
1204−case identifier:a= id_lookup(id_first,id_loc)-name_dir;
1205+case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
12051206 app_repl((a/0400)+0200);
12061207 app_repl(a%0400);break;
12071208 case section_name:if(t!=section_name)goto done;
12081209 else{
12091210 /*79:*/
1210−#line 1246 "ctangle.w"
1211+#line 1253 "ctangle.w"
12111212 {
12121213 char*try_loc= loc;
12131214 while(*try_loc==' '&&try_loc<limit)try_loc++;
@@ -1220,13 +1221,13 @@ if(*try_loc=='=')err_print("! Missing `@ ' before a named section"); · 6 unmodified lines
12201221 }
12211222
12221223 /*:79*/
1223−#line 1224 "ctangle.w"
1224+#line 1231 "ctangle.w"
12241225 ;
12251226 a= cur_section_name-name_dir;
12261227 app_repl((a/0400)+0250);
12271228 app_repl(a%0400);
12281229 /*77:*/
1229−#line 1208 "ctangle.w"
1230+#line 1215 "ctangle.w"
12301231
12311232 store_two_bytes(0150000);
12321233 if(changing)id_first= change_file_name;
@@ -1234,11 +1235,11 @@ else id_first= cur_file_name; · 1 unmodified line
12341235 id_loc= id_first+strlen(id_first);
12351236 if(changing)store_two_bytes((sixteen_bits)change_line);
12361237 else store_two_bytes((sixteen_bits)cur_line);
1237−{int a= id_lookup(id_first,id_loc)-name_dir;app_repl((a/0400)+0200);
1238+{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
12381239 app_repl(a%0400);}
12391240
12401241 /*:77*/
1241−#line 1228 "ctangle.w"
1242+#line 1235 "ctangle.w"
12421243 ;break;
12431244 }
12441245 case output_defs_code:
@@ -1246,7 +1247,7 @@ a= output_defs_flag; · 1 unmodified line
12461247 app_repl((a/0400)+0200);
12471248 app_repl(a%0400);
12481249 /*77:*/
1249−#line 1208 "ctangle.w"
1250+#line 1215 "ctangle.w"
12501251
12511252 store_two_bytes(0150000);
12521253 if(changing)id_first= change_file_name;
@@ -1254,15 +1255,15 @@ else id_first= cur_file_name; · 1 unmodified line
12541255 id_loc= id_first+strlen(id_first);
12551256 if(changing)store_two_bytes((sixteen_bits)change_line);
12561257 else store_two_bytes((sixteen_bits)cur_line);
1257−{int a= id_lookup(id_first,id_loc)-name_dir;app_repl((a/0400)+0200);
1258+{int a= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a/0400)+0200);
12581259 app_repl(a%0400);}
12591260
12601261 /*:77*/
1261−#line 1234 "ctangle.w"
1262+#line 1241 "ctangle.w"
12621263 ;break;
12631264 case constant:case string:
12641265 /*80:*/
1265−#line 1257 "ctangle.w"
1266+#line 1264 "ctangle.w"
12661267
12671268 app_repl(a);
12681269 while(id_first<id_loc){
@@ -1276,11 +1277,11 @@ app_repl(*id_first++); · 7 unmodified lines
12761277 app_repl(a);break;
12771278
12781279 /*:80*/
1279−#line 1236 "ctangle.w"
1280+#line 1243 "ctangle.w"
12801281 ;
12811282 case ord:
12821283 /*81:*/
1283−#line 1273 "ctangle.w"
1284+#line 1280 "ctangle.w"
12841285 {
12851286 int c= (eight_bits)*id_first;
12861287 if(c=='\\'){
@@ -1331,7 +1332,7 @@ app_repl(constant); · 44 unmodified lines
13311332 break;
13321333
13331334 /*:81*/
1334−#line 1238 "ctangle.w"
1335+#line 1245 "ctangle.w"
13351336 ;
13361337 case definition:case format_code:case begin_C:if(t!=section_name)goto done;
13371338 else{
@@ -1341,8 +1342,11 @@ err_print("! @d, @f and @c are ignored in C text");continue; · 3 unmodified lines
13411342 case new_section:goto done;
13421343
13431344 /*:78*/
1344−#line 1196 "ctangle.w"
1345+#line 1200 "ctangle.w"
13451346
1347+case')':app_repl(a);
1348+if(t==macro)app_repl(' ');
1349+break;
13461350 default:app_repl(a);
13471351 }
13481352 done:next_control= (eight_bits)a;
@@ -1351,7 +1355,7 @@ cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr; · 2 unmodified lines
13511355 }
13521356
13531357 /*:76*//*83:*/
1354−#line 1335 "ctangle.w"
1358+#line 1342 "ctangle.w"
13551359
13561360 void
13571361 scan_section()
@@ -1359,14 +1363,14 @@ scan_section() · 1 unmodified line
13591363 name_pointer p;
13601364 text_pointer q;
13611365 sixteen_bits a;
1362−section_count++;
1366+section_count++;no_where= 1;
13631367 if(*(loc-1)=='*'&&show_progress){
13641368 printf("*%d",section_count);update_terminal;
13651369 }
13661370 next_control= 0;
13671371 while(1){
13681372 /*84:*/
1369−#line 1373 "ctangle.w"
1373+#line 1381 "ctangle.w"
13701374
13711375 while(next_control<definition)
13721376
@@ -1375,11 +1379,11 @@ loc-= 2;next_control= get_next(); · 2 unmodified lines
13751379 }
13761380
13771381 /*:84*/
1378−#line 1349 "ctangle.w"
1382+#line 1356 "ctangle.w"
13791383 ;
13801384 if(next_control==definition){
13811385 /*85:*/
1382−#line 1380 "ctangle.w"
1386+#line 1388 "ctangle.w"
13831387 {
13841388 while((next_control= get_next())=='\n');
13851389 if(next_control!=identifier){
@@ -1387,18 +1391,18 @@ err_print("! Definition flushed, must start with identifier"); · 1 unmodified line
13871391
13881392 continue;
13891393 }
1390−app_repl(((a= id_lookup(id_first,id_loc)-name_dir)/0400)+0200);
1394+app_repl(((a= id_lookup(id_first,id_loc,0)-name_dir)/0400)+0200);
13911395
13921396 app_repl(a%0400);
13931397 if(*loc!='('){
13941398 app_repl(string);app_repl(' ');app_repl(string);
13951399 }
1396−print_where= 0;scan_repl(macro);
1400+scan_repl(macro);
13971401 cur_text->text_link= 0;
13981402 }
13991403
14001404 /*:85*/
1401−#line 1351 "ctangle.w"
1405+#line 1358 "ctangle.w"
14021406
14031407 continue;
14041408 }
@@ -1408,34 +1412,35 @@ p= name_dir;break; · 3 unmodified lines
14081412 if(next_control==section_name){
14091413 p= cur_section_name;
14101414 /*86:*/
1411−#line 1405 "ctangle.w"
1415+#line 1413 "ctangle.w"
14121416
14131417 while((next_control= get_next())=='+');
14141418 if(next_control!='='&&next_control!=eq_eq)
14151419 continue;
14161420
14171421 /*:86*/
1418−#line 1359 "ctangle.w"
1422+#line 1366 "ctangle.w"
14191423 ;
14201424 break;
14211425 }
14221426 return;
14231427 }
1428+no_where= print_where= 0;
14241429 /*87:*/
1425−#line 1410 "ctangle.w"
1430+#line 1418 "ctangle.w"
14261431
14271432 /*88:*/
1428−#line 1415 "ctangle.w"
1433+#line 1423 "ctangle.w"
14291434
14301435 store_two_bytes((sixteen_bits)(0150000+section_count));
14311436
14321437
14331438 /*:88*/
1434−#line 1411 "ctangle.w"
1439+#line 1419 "ctangle.w"
14351440 ;
14361441 scan_repl(section_name);
14371442 /*89:*/
1438−#line 1419 "ctangle.w"
1443+#line 1427 "ctangle.w"
14391444
14401445 if(p==name_dir||p==0){
14411446 (last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
@@ -1452,16 +1457,16 @@ cur_text->text_link= section_flag; · 10 unmodified lines
14521457
14531458
14541459 /*:89*/
1455−#line 1413 "ctangle.w"
1460+#line 1421 "ctangle.w"
14561461 ;
14571462
14581463 /*:87*/
1459−#line 1364 "ctangle.w"
1464+#line 1372 "ctangle.w"
14601465 ;
14611466 }
14621467
14631468 /*:83*//*91:*/
1464−#line 1437 "ctangle.w"
1469+#line 1445 "ctangle.w"
14651470
14661471 void
14671472 phase_one(){
@@ -1475,7 +1480,7 @@ phase= 2; · 7 unmodified lines
14751480 }
14761481
14771482 /*:91*//*93:*/
1478−#line 1455 "ctangle.w"
1483+#line 1463 "ctangle.w"
14791484
14801485 void
14811486 skip_limbo()
@@ -1490,7 +1495,7 @@ c= *loc++; · 8 unmodified lines
14901495 if(ccode[(eight_bits)c]==new_section)break;
14911496 switch(ccode[(eight_bits)c]){
14921497 case translit_code:/*94:*/
1493−#line 1484 "ctangle.w"
1498+#line 1492 "ctangle.w"
14941499
14951500 while(xisspace(*loc)&&loc<limit)loc++;
14961501 loc+= 3;
@@ -1515,7 +1520,7 @@ translit[i-0200][loc-beg]= '\0'; · 18 unmodified lines
15151520 }
15161521
15171522 /*:94*/
1518−#line 1468 "ctangle.w"
1523+#line 1476 "ctangle.w"
15191524 ;break;
15201525 case format_code:case'@':break;
15211526 case control_text:if(c=='q'||c=='Q'){
@@ -1533,7 +1538,7 @@ default:err_print("! Double @ should be used in limbo"); · 11 unmodified lines
15331538 }
15341539
15351540 /*:93*//*95:*/
1536−#line 1510 "ctangle.w"
1541+#line 1518 "ctangle.w"
15371542
15381543 void
15391544 print_stats(){
ctangle.w+21−13
@@ -2,7 +2,7 @@ · 1 unmodified line
22 % This program by Silvio Levy and Donald E. Knuth
33 % is based on a program by Knuth.
44 % It is distributed WITHOUT ANY WARRANTY, express or implied.
5−% Version 3.2 --- July 1994
5+% Version 3.3 --- December 1994
66
77 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
88
@@ -22,11 +22,11 @@ · 13 unmodified lines
2222 \mathchardef\RA="3221 % right arrow
2323 \mathchardef\BA="3224 % double arrow
2424
25−\def\title{CTANGLE (Version 3.2)}
25+\def\title{CTANGLE (Version 3.3)}
2626 \def\topofcontents{\null\vfill
2727 \centerline{\titlefont The {\ttitlefont CTANGLE} processor}
2828 \vskip 15pt
29− \centerline{(Version 3.2)}
29+ \centerline{(Version 3.3)}
3030 \vfill}
3131 \def\botofcontents{\vfill
3232 \noindent
@@ -56,7 +56,7 @@ Joachim Schrod, Lee Wittenberg, and others who have contributed improvements. · 23 unmodified lines
5656 The ``banner line'' defined here should be changed whenever \.{CTANGLE}
5757 is modified.
5858
59−@d banner "This is CTANGLE (Version 3.2)\n"
59+@d banner "This is CTANGLE (Version 3.3)\n"
6060
6161 @c
6262 @<Include files@>@/
@@ -640,10 +640,10 @@ is not called if |out_state==verbatim|, except perhaps with arguments · 577 unmodified lines
640640 (end the constant).
641641
642642 @<Predecl...@>=
643−void out_char();
643+static void out_char();
644644
645645 @ @c
646−void
646+static void
647647 out_char(cur_char)
648648 eight_bits cur_char;
649649 {
@@ -827,7 +827,7 @@ newline. The boolean argument |is_long_comment| distinguishes between · 177 unmodified lines
827827 the two types of comments.
828828
829829 If |skip_comment| comes to the end of the section, it prints an error message.
830−No comment, long or short, is allowed to contain `\.{@@ }' or `\.{@@*}'.
830+No comment, long or short, is allowed to contain `\.{@@\ }' or `\.{@@*}'.
831831
832832 @<Global...@>=
833833 boolean comment_continues=0; /* are we scanning a comment? */
@@ -870,6 +870,7 @@ boolean is_long_comment; · 36 unmodified lines
870870
871871 @<Global...@>=
872872 name_pointer cur_section_name; /* name of section just scanned */
873+int no_where; /* suppress |print_where|? */
873874
874875 @ @<Include...@>=
875876 #include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
@@ -892,7 +893,7 @@ get_next() /* produces the next input token */ · 16 unmodified lines
892893 if (loc>limit) {
893894 if (preprocessing && *(limit-1)!='\\') preprocessing=0;
894895 if (get_line()==0) return(new_section);
895− else if (print_where) {
896+ else if (print_where && !no_where) {
896897 print_where=0;
897898 @<Insert the line number into |tok_mem|@>;
898899 }
@@ -1170,6 +1171,9 @@ the name of the current section. · 271 unmodified lines
11701171 \item{b)}The symbols \.{@@d} and \.{@@f} and \.{@@c} are not allowed after
11711172 section names, while they terminate macro definitions.
11721173
1174+\item{c)}Spaces are inserted after right parentheses in macros, because the
1175+ANSI \CEE/ preprocessor sometimes requires it.
1176+
11731177 \yskip Therefore there is a single procedure |scan_repl| whose parameter
11741178 |t| specifies either |macro| or |section_name|. After |scan_repl| has
11751179 acted, |cur_text| will point to the replacement text just generated, and
@@ -1194,6 +1198,9 @@ eight_bits t; · 18 unmodified lines
11941198 |section_name|, etc.), either process it and change |a| to a byte
11951199 that should be stored, or |continue| if |a| should be ignored,
11961200 or |goto done| if |a| signals the end of this replacement text@>@;
1201+ case ')': app_repl(a);
1202+ if (t==macro) app_repl(' ');
1203+ break;
11971204 default: app_repl(a); /* store |a| in |tok_mem| */
11981205 }
11991206 done: next_control=(eight_bits) a;
@@ -1212,11 +1219,11 @@ else id_first=cur_file_name; · 12 unmodified lines
12121219 id_loc=id_first+strlen(id_first);
12131220 if (changing) store_two_bytes((sixteen_bits)change_line);
12141221 else store_two_bytes((sixteen_bits)cur_line);
1215−{int a=id_lookup(id_first,id_loc)-name_dir; app_repl((a / 0400)+0200);
1222+{int a=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a / 0400)+0200);
12161223 app_repl(a % 0400);}
12171224
12181225 @ @<In cases that |a| is...@>=
1219−case identifier: a=id_lookup(id_first,id_loc)-name_dir;
1226+case identifier: a=id_lookup(id_first,id_loc,0)-name_dir;
12201227 app_repl((a / 0400)+0200);
12211228 app_repl(a % 0400); break;
12221229 case section_name: if (t!=section_name) goto done;
@@ -1339,7 +1346,7 @@ scan_section() · 116 unmodified lines
13391346 name_pointer p; /* section name for the current section */
13401347 text_pointer q; /* text for the current section */
13411348 sixteen_bits a; /* token for left-hand side of definition */
1342− section_count++;
1349+ section_count++; @+ no_where=1;
13431350 if (*(loc-1)=='*' && show_progress) { /* starred section */
13441351 printf("*%d",section_count); update_terminal;
13451352 }
@@ -1361,6 +1368,7 @@ scan_section() · 15 unmodified lines
13611368 }
13621369 return; /* \.{@@\ } or \.{@@*} */
13631370 }
1371+ no_where=print_where=0;
13641372 @<Scan the \CEE/ part of the current section@>;
13651373 }
13661374
@@ -1384,13 +1392,13 @@ while (next_control<definition) · 17 unmodified lines
13841392 @.Definition flushed...@>
13851393 continue;
13861394 }
1387− app_repl(((a=id_lookup(id_first,id_loc)-name_dir) / 0400)+0200);
1395+ app_repl(((a=id_lookup(id_first,id_loc,0)-name_dir) / 0400)+0200);
13881396 /* append the lhs */
13891397 app_repl(a % 0400);
13901398 if (*loc!='(') { /* identifier must be separated from replacement text */
13911399 app_repl(string); app_repl(' '); app_repl(string);
13921400 }
1393− print_where=0; scan_repl(macro);
1401+ scan_repl(macro);
13941402 cur_text->text_link=0; /* |text_link==0| characterizes a macro */
13951403 }
13961404
cweav-bs.ch+33−5
@@ -9,23 +9,23 @@ the code. (See makefile.bs.) · 8 unmodified lines
99 The main purpose of these changes is to support MSDOS with full-size arrays
1010 by using "huge" pointers.
1111
12−(This file contributed by Barry Schwartz, trashman@crud.mn.org, 28 Jun 94;
13− revised 24 Jul 94.)
12+This file contributed by Barry Schwartz, trashman@crud.mn.org, 28 Jun 94.
1413 (Includes workaround for compiler bug [pointers wrapping around at
1514 segment boundaries], November 1993, contributed by Jorge Fernandez Arnaiz
1615 -- arnaiz@redvax1.dgsca.unam.mx)
16+(Last revised 5 Dec 94 with help of bob@microprograms.com.)
1717
1818
1919 @x Section 1.
2020 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
2121 is modified.
2222
23−@d banner "This is CWEAVE (Version 3.2)\n"
23+@d banner "This is CWEAVE (Version 3.3)\n"
2424 @y
2525 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
2626 is modified.
2727
28−@d banner "This is CWEAVE (Version 3.2pc/big)\n"
28+@d banner "This is CWEAVE (Version 3.3pc/big)\n"
2929 @z
3030
3131
@@ -162,6 +162,34 @@ xmem->num=0; /* sentinel value */ · 130 unmodified lines
162162 p->xref = (char huge*)xref_ptr;
163163 @z
164164
165+@x Section 25. (to please Borland's C++, version 4.02)
166+token tok_mem[max_toks]; /* tokens */
167+token_pointer tok_mem_end = tok_mem+max_toks-1; /* end of |tok_mem| */
168+token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
169+token_pointer tok_ptr; /* first unused position in |tok_mem| */
170+text_pointer text_ptr; /* first unused position in |tok_start| */
171+text_pointer tok_start_end = tok_start+max_texts-1; /* end of |tok_start| */
172+token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
173+@y
174+token tok_mem[max_toks]; /* tokens */
175+token_pointer tok_mem_end; /* end of |tok_mem| */
176+token_pointer tok_start[max_texts]; /* directory into |tok_mem| */
177+token_pointer tok_ptr; /* first unused position in |tok_mem| */
178+text_pointer text_ptr; /* first unused position in |tok_start| */
179+text_pointer tok_start_end; /* end of |tok_start| */
180+token_pointer max_tok_ptr; /* largest value of |tok_ptr| */
181+@z
182+
183+@x Section 26. (goes with the previous change)
184+tok_start[1]=tok_mem+1;
185+max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
186+@y
187+tok_start[1]=tok_mem+1;
188+tok_mem_end=tok_mem+max_toks-1;
189+tok_start_end=tok_start+max_texts-1;
190+max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
191+@z
192+
165193
166194 @x Section 27.
167195 p->ilk=t; p->xref=(char*)xmem;
@@ -173,7 +201,7 @@ xmem->num=0; /* sentinel value */ · 5 unmodified lines
173201 @x Section 27.
174202 p->xref=(char*)xmem;
175203 @y
176− p->xref=(char*)xmem;
204+ p->xref=(char huge*)xmem;
177205 @z
178206
179207
cweav-pc.ch+2−2
@@ -11,9 +11,9 @@ that allows >64K arrays. (If you need lots more bytes, try the alternate · 10 unmodified lines
1111 change files that have -bs in their name instead of -pc.)
1212
1313 @x section 1
14−@d banner "This is CWEAVE (Version 3.2)\n"
14+@d banner "This is CWEAVE (Version 3.3)\n"
1515 @y
16−@d banner "This is CWEAVE (Version 3.2pc)\n"
16+@d banner "This is CWEAVE (Version 3.3pc)\n"
1717 @z
1818
1919 @x section 4
cweav-vms.ch+2−2
@@ -13,9 +13,9 @@ modified: · 12 unmodified lines
1313 (also modified by Don Knuth to keep version numbers uptodate)
1414
1515 @x section 1 (01-FEB-1992 ST)
16−@d banner "This is CWEAVE (Version 3.2)\n"
16+@d banner "This is CWEAVE (Version 3.3)\n"
1717 @y
18−@d banner "This is CWEAVE (VAX/VMS Version 3.2)\n"
18+@d banner "This is CWEAVE (VAX/VMS Version 3.3)\n"
1919 @z
2020
2121 @x section 6 (from common.h) (01-FEB-1992 ST)
cweave.w+24−12
@@ -2,7 +2,7 @@ · 1 unmodified line
22 % This program by Silvio Levy and Donald E. Knuth
33 % is based on a program by Knuth.
44 % It is distributed WITHOUT ANY WARRANTY, express or implied.
5−% Version 3.2 --- July 1994
5+% Version 3.3 --- December 1994
66
77 % Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
88
@@ -27,11 +27,11 @@ · 18 unmodified lines
2727 \def\skipxTeX{\\{skip\_\TEX/}}
2828 \def\copyxTeX{\\{copy\_\TEX/}}
2929
30−\def\title{CWEAVE (Version 3.2)}
30+\def\title{CWEAVE (Version 3.3)}
3131 \def\topofcontents{\null\vfill
3232 \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
3333 \vskip 15pt
34− \centerline{(Version 3.2)}
34+ \centerline{(Version 3.3)}
3535 \vfill}
3636 \def\botofcontents{\vfill
3737 \noindent
@@ -61,7 +61,7 @@ Joachim Schrod, Lee Wittenberg, and others who have contributed improvements. · 23 unmodified lines
6161 The ``banner line'' defined here should be changed whenever \.{CWEAVE}
6262 is modified.
6363
64−@d banner "This is CWEAVE (Version 3.2)\n"
64+@d banner "This is CWEAVE (Version 3.3)\n"
6565
6666 @c @<Include files@>@/
6767 @h
@@ -795,7 +795,7 @@ are pointers into the array |section_text|, not into |buffer|. · 727 unmodified lines
795795 }
796796 while (*loc=='u' || *loc=='U' || *loc=='l' || *loc=='L'
797797 || *loc=='f' || *loc=='F') {
798− *id_loc++='$'; *id_loc++=toupper(*loc++);
798+ *id_loc++='$'; *id_loc++=toupper(*loc); loc++;
799799 }
800800 return(constant);
801801 }
@@ -1594,7 +1594,7 @@ The combination rules are given as context-sensitive productions that are · 792 unmodified lines
15941594 applied from left to right. Suppose that we are currently working on the
15951595 sequence of scraps $s_1\,s_2\ldots s_n$. We try first to find the longest
15961596 production that applies to an initial substring $s_1\,s_2\ldots\,$; but if
1597−no such productions exist, we find to find the longest production
1597+no such productions exist, we try to find the longest production
15981598 applicable to the next substring $s_2\,s_3\ldots\,$; and if that fails, we
15991599 try to match $s_3\,s_4\ldots\,$, etc.
16001600
@@ -1850,9 +1850,9 @@ with discretionary breaks in between. · 249 unmodified lines
18501850 \.-&|unorbinop|: \.-&yes\cr
18511851 \.*&|raw_unorbin|: \.*&yes\cr
18521852 \./&|binop|: \./&yes\cr
1853−\.<&|binop|: \.<&yes\cr
1853+\.<&|prelangle|: \.{\\langle}&yes\cr
18541854 \.=&|binop|: \.{\\K}&yes\cr
1855−\.>&|binop|: \.>&yes\cr
1855+\.>&|prerangle|: \.{\\rangle}&yes\cr
18561856 \..&|binop|: \..&yes\cr
18571857 \.{\v}&|binop|: \.{\\OR}&yes\cr
18581858 \.\^&|binop|: \.{\\XOR}&yes\cr
@@ -2828,7 +2828,9 @@ if (cat1==public_like && cat2==exp) { · 969 unmodified lines
28282828 }
28292829
28302830 @ @<Cases for |raw_rpar|@>=
2831−if (cat1==const_like) {
2831+if (cat1==const_like && @|
2832+ (cat2==semi || cat2==lbrace || cat2==comma || cat2==binop
2833+ || cat2==const_like)) {
28322834 big_app1(pp); big_app(' ');
28332835 big_app1(pp+1); reduce(pp,2,raw_rpar,0,103);
28342836 } else squash(pp,1,rpar,-3,104);
@@ -3253,9 +3255,19 @@ app_scrap(exp,maybe_math); · 418 unmodified lines
32533255
32543256 @ We do not make the \TEX/ string into a scrap, because there is no
32553257 telling what the user will be putting into it; instead we leave it
3256−open, to be picked up by next scrap. If it comes at the end of a
3258+open, to be picked up by the next scrap. If it comes at the end of a
32573259 section, it will be made into a scrap when |finish_C| is called.
32583260
3261+There's a known bug here, in cases where an adjacent scrap is
3262+|prelangle| or |prerangle|. Then the \TEX/ string can disappear
3263+when the \.{\\langle} or \.{\\rangle} becomes \.{<} or \.{>}.
3264+For example, if the user writes \.{\v x<@@ty@@>\v}, the \TEX/ string
3265+\.{\\hbox\{y\}} eventually becomes part of an |insert| scrap, which is combined
3266+with a |prelangle| scrap and eventually lost. The best way to work around
3267+this bug is probably to enclose the \.{@@t...@@>} in \.{@@[...@@]} so that
3268+the \TEX/ string is treated as an expression.
3269+@^bug, known@>
3270+
32593271 @<Append a \TEX/ string, without forming a scrap@>=
32603272 app_str("\\hbox{"@q}@>);
32613273 @^high-bit character handling@>
@@ -3950,7 +3962,7 @@ text starts immediately after the identifier. In the former case, · 688 unmodified lines
39503962 it starts after we scan the matching `\.)'.
39513963
39523964 @<Start a macro...@>= {
3953− if (save_line!=out_line || save_place!=out_ptr) app(backup);
3965+ if (save_line!=out_line || save_place!=out_ptr || space_checked) app(backup);
39543966 if(!space_checked){emit_space_if_needed;save_position;}
39553967 app_str("\\D"); /* this will produce `\&{define }' */
39563968 @.\\D@>
@@ -4127,7 +4139,7 @@ flush_buffer(out_buf,0,0); /* insert a blank line, it looks nice */ · 170 unmodified lines
41274139 We are nearly finished! \.{CWEAVE}'s only remaining task is to write out the
41284140 index, after sorting the identifiers and index entries.
41294141
4130−If the user has set the |no_xref| flag (the |-x| option on the command line),
4142+If the user has set the |no_xref| flag (the \.{-x} option on the command line),
41314143 just finish off the page, omitting the index, section name list, and table of
41324144 contents.
41334145
cwebmac.tex+3−3
@@ -1,7 +1,7 @@
11 % standard macros for CWEB listings (in addition to plain.tex)
2−% Version 3.0 --- June 1993
2+% Version 3.1 --- September 1994
33 \ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
4−\xdef\fmtversion{\fmtversion+CWEB3.0}
4+\xdef\fmtversion{\fmtversion+CWEB3.1}
55
66 \let\:=\. % preserve a way to get the dot accent
77 % (all other accents will still work as usual)
@@ -119,7 +119,7 @@ · 111 unmodified lines
119119 \def\B{\rightskip=0pt plus 100pt minus 10pt % go into C mode
120120 \sfcode`;=3000
121121 \pretolerance 10000
122− \hyphenpenalty 9999 % so strings can be broken (discretionary \ is inserted)
122+ \hyphenpenalty 1000 % so strings can be broken (discretionary \ is inserted)
123123 \exhyphenpenalty 10000
124124 \global\ind=2 \1\ \unskip}
125125 \def\C#1{\5\5\quad$/\ast\,${\cmntfont #1}$\,\ast/$}
cwebman.tex+21−19
@@ -144,15 +144,15 @@ The \.{CWEB} system consists of two programs named \.{CWEAVE} and \.{CTANGLE}. · 143 unmodified lines
144144 When writing a \.{CWEB} program the user keeps the
145145 \CEE/ code and the documentation in the same file, called the \.{CWEB}
146146 file and generally named \.{something.w}. The command
147−`\.{cweave something}' creates an output file \.{something.tex}, which
147+`\.{cweave} \.{something}' creates an output file \.{something.tex}, which
148148 can then be fed to \TEX/, yielding a ``pretty printed'' version of
149149 \.{something.w} that correctly handles
150150 typographic details like page layout and the use of indentation,
151151 italics, boldface, and mathematical symbols. The typeset output also
152152 includes extensive cross-index
153153 information that is gathered automatically. Similarly, if you run the
154−command `\.{ctangle something}' you will get a \CEE/ file \.{something.c},
155−with can then be compiled to yield executable code.
154+command `\.{ctangle} \.{something}' you will get a \CEE/ file \.{something.c},
155+which can then be compiled to yield executable code.
156156
157157 Besides providing a documentation tool, \.{CWEB} enhances the \CEE/
158158 language by providing the
@@ -166,7 +166,7 @@ explained separately. The \.{CWEAVE} program is so named because it takes · 7 unmodified lines
166166 a given web and intertwines the \TEX/ and \CEE/ portions contained in
167167 each section, then it knits the whole fabric into a structured document.
168168 (Get it? Wow.) Perhaps there is some deep connection here with the fact
169−that the German word for ``weave'' is ``{\it web\/}'', and the
169+that the German word for ``weave'' is ``{\it webe\/}'', and the
170170 corresponding Latin imperative is ``{\it texe\/}''!
171171
172172 A user of \.{CWEB} should be fairly familiar with the \CEE/
@@ -406,7 +406,8 @@ Although a section begins with \TEX/ text and ends with \CEE/ text, we · 233 unmodified lines
406406 have noted that the dividing line isn't sharp, since \CEE/ text can be
407407 included in \TEX/ text if it is enclosed in `\pb'. Conversely, \TEX/ text
408408 appears frequently within \CEE/ text, because everything in
409−comments (i.e., between \.{/*} and \.{*/}) is treated as \TEX/ text.
409+comments (i.e., between \.{/*} and \.{*/}, or following \.{//})
410+is treated as \TEX/ text.
410411 Likewise, the text of a section name consists of \TEX/ text, but
411412 the construct \.{@<section name@>} as a whole is is expected to be found
412413 in \CEE/ text; thus, one typically goes back and forth
@@ -665,7 +666,7 @@ be put into a \TEX/ \.{\\hbox} and formatted along with the neighboring · 252 unmodified lines
665666 \CEE/ program. This text is ignored by \.{CTANGLE}, but it can be used
666667 for various purposes within \.{CWEAVE}. For example, you can make comments
667668 that mix \CEE/ and classical mathematics, as in `$\\{size}<2^{15}$', by
668−typing `\.{|size < @t\$2\^\{15\}\$@>|}'.
669+typing `\.{|size < 2@t\$\^\{15\}\$@>|}'.
669670
670671 \@= [MCc] $*$ The control text that follows will
671672 be passed verbatim to the \CEE/ program.
@@ -689,13 +690,14 @@ code; for example, the definition · 17 unmodified lines
689690 $$\hbox{\&{int} \\{array}[\\{max\_dim}], \\{count}${}=\\{old\_count};$}$$
690691 makes the names \\{array} and \\{count} get an underlined entry in the
691692 index. Statement labels, function definitions like
692−$\\{main}(\\{argc},\39\\{argv})$, and \&{typedef} definitions also
693−imply underlining. A traditional-style
693+\\{main}(\&{int}~\\{argc},\,\&{char}~$*$\\{argv}[\,]),
694+and \&{typedef} definitions also
695+imply underlining. An old-style
694696 function definition (without prototyping) doesn't define its arguments;
695−the arguments will, however, be defined
697+the arguments will, however, be considered to be defined
696698 (i.e., their index entries will be underlined) if their types are
697699 declared before the body of the function in the usual way
698−(e.g., `\.{int}~\\{argc}; \.{char}~${**}\\{argv}$; $\{\,\ldots\,\}$').
700+(e.g., `\&{int}~\\{argc}; \&{char}~${*}\\{argv}[\,]$; $\{\,\ldots\,\}$').
699701
700702 \subsec
701703 We now turn to control codes that affect only the operation of
@@ -772,7 +774,8 @@ program formatted by \.{CWEAVE}. Line breaks · 70 unmodified lines
772774 are chosen automatically by \TEX/ according to a scheme that works 99\%\
773775 of the time, but sometimes you will prefer to force a line break so that
774776 the program is segmented according to logical rather than visual
775−criteria.
777+criteria. If a comment follows, say `\.{@/@,}' to break the line
778+before the comment.
776779
777780 \@| [MC] This control code specifies an optional line break in the midst of
778781 an expression. For example, if you have
@@ -857,7 +860,7 @@ to time. · 78 unmodified lines
857860 Furthermore the \\{web\_file} itself can be a combination of
858861 several files. When either \.{CWEAVE} or \.{CTANGLE} is reading a file and
859862 encounters the control code \.{@i} at the beginning of a line, it
860−interrupts normal reading and start looking at the file named after the
863+interrupts normal reading and starts looking at the file named after the
861864 \.{@i}, much as the \CEE/ preprocessor does when it encounters an \.{\#include}
862865 line. After the included file has been entirely read, the program
863866 goes back to the next line
@@ -963,10 +966,9 @@ contain labeled statements, so that the label will stick out a little at · 99 unmodified lines
963966 the left.) You can also use `\.{@t\}\\3\{-5@>}' to force a break
964967 in the middle of an expression.
965968
966−10. Don't use a change file to change just part of a macro call that
967−extends over more than one line; change the whole call or nothing.
968−Otherwise \.{CTANGLE} will insert \.{\#line} directives that confuse
969−the \CEE/ preprocessor.
969+10. Each identifier in \.{CWEB} has a single formatting convention. Therefore
970+you shouldn't use the same identifier to denote, say, both a type name and
971+part of a \.{struct}, even though \CEE/ does allow this.
970972
971973 \section Running the programs.
972974 The \UNIX/ command line for \.{CTANGLE} is
@@ -1083,8 +1085,7 @@ In this case you should help \.{CWEAVE} by putting `\.{@/}' after · 110 unmodified lines
10831085 `\.{main(argc,argv)}'.
10841086
10851087 \.{CWEAVE} automatically inserts a bit of extra space between declarations
1086−and the first apparent statement of a block, unless you turn off the
1087−feature globally by running with the \.{-o} option. One way to defeat this
1088+and the first apparent statement of a block. One way to defeat this
10881089 spacing locally is
10891090 $$\vbox{\halign{#\hfil\cr
10901091 \.{int x;@+@t\}\\6\{@>}\cr
@@ -1590,7 +1591,8 @@ customary to make this the first change in your change file. · 499 unmodified lines
15901591
15911592 \point 14. To get output in languages other than English, redefine the
15921593 macros \.{\\A}, \.{\\ET}, \.{\\Q}, \.{\\U},
1593−\.{\\ch}, \.{\\fin}, and \.{\\con}. \.{CWEAVE} itself need not be changed.
1594+\.{\\ch}, \.{\\fin}, \.{\\con}, \.{\\today}, \.{\\datethis}, and
1595+\.{\\datecontentspage}. \.{CWEAVE} itself need not be changed.
15941596
15951597 \point 15. Some output can be selectively suppressed with the macros
15961598 \.{\\noatl}, \.{\\noinx}, \.{\\nosecs}, \.{\\nocon}.
examples/wc.w+23−8
@@ -19,6 +19,9 @@ A ``word'' is a maximal sequence of consecutive characters other than · 18 unmodified lines
1919 newline, space, or tab, containing at least one visible ASCII code.
2020 (We assume that the standard ASCII code is in use.)
2121
22+This version of \.{wc} has a nonstandard ``silent'' option (\.{-s}),
23+which suppresses printing except for the grand totals over all files.
24+
2225 @ Most \.{CWEB} programs share a common structure. It's probably a
2326 good idea to state the overall structure explicitly at the outset,
2427 even though the various parts could all be introduced in unnamed
@@ -71,18 +74,27 @@ the desired counts and specifying the order in which they should be · 46 unmodified lines
7174 displayed. Each selection is given by the initial character
7275 (lines, words, or characters). For example, `\.{-cl}' would cause
7376 just the number of characters and the number of lines to be printed,
74−in that order.
77+in that order. The default, if no special argument is given, is `\.{-lwc}'.
7578
7679 We do not process this string now; we simply remember where it is.
77− It will be used to control the formatting at output time.
80+It will be used to control the formatting at output time.
81+
82+If the `\.{-}' is immediately followed by `\.{s}', only summary totals
83+are printed.
7884
7985 @<Var...@>=
8086 int file_count; /* how many files there are */
8187 char *which; /* which counts to print */
88+int silent=0; /* nonzero if the silent option was selected */
8289
8390 @ @<Set up o...@>=
8491 which="lwc"; /* if no option is given, print all three values */
85−if (argc>1 && *argv[1] == '-') { which=argv[1]+1; argc--; argv++; }
92+if (argc>1 && *argv[1] == '-') {
93+ argv[1]++;
94+ if (*argv[1]=='s') silent=1,argv[1]++;
95+ if (*argv[1]) which=argv[1];
96+ argc--; argv++;
97+}
8698 file_count=argc-1;
8799
88100 @ Now we scan the remaining arguments and try to open a file, if
@@ -183,9 +195,11 @@ Additionally we must decide here if we know the name of the file · 94 unmodified lines
183195 we have processed or if it was just |stdin|.
184196
185197 @<Write...@>=
186−wc_print(which, char_count, word_count, line_count);
187−if (file_count) printf (" %s\n", *argv); /* not |stdin| */
188−else printf ("\n"); /* |stdin| */
198+if (!silent) {
199+ wc_print(which, char_count, word_count, line_count);
200+ if (file_count) printf (" %s\n", *argv); /* not |stdin| */
201+ else printf ("\n"); /* |stdin| */
202+}
189203
190204 @ @<Upda...@>=
191205 tot_line_count+=line_count;
@@ -196,9 +210,10 @@ tot_char_count+=char_count; · 4 unmodified lines
196210 number of files too.
197211
198212 @<Print the...@>=
199−if (file_count>1) {
213+if (file_count>1 || silent) {
200214 wc_print(which, tot_char_count, tot_word_count, tot_line_count);
201− printf(" total in %d files\n",file_count);
215+ if (!file_count) printf("\n");
216+ else printf(" total in %d file%s\n",file_count,file_count>1?"s":"");
202217 }
203218
204219 @ Here now is the function that prints the values according to the
examples/wmerge.w+1−1
@@ -63,7 +63,7 @@ than |buf_size|, so that |buffer[buf_size-1]| is never filled. · 62 unmodified lines
6363 Some of the routines use the fact that it is safe to refer to
6464 |*(limit+2)| without overstepping the bounds of the array.
6565
66−@d buf_size 100
66+@d buf_size 1024
6767
6868 @<Definitions...@>=
6969 ASCII buffer[buf_size]; /* where each line of input goes */
prod.w+9−5
@@ -70,7 +70,7 @@ We use \\{in}, \\{out}, \\{back} and · 69 unmodified lines
7070 \+& |lpar| |rpar| & |exp| \hfill $L\.{\\,}R$ & functions, declarations\cr
7171 \+& |lpar| \alt |decl_head| |int_like| |rpar| & |cast| & |(char*)|\cr
7272 \+& |lpar| \altt |decl_head| |int_like| |exp| |comma| & |lpar| \hfill
73− L\,\altt $D$ $I$ $E$ C\,|opt|9 & |(int,|\cr
73+ $L$\,\altt $D$ $I$ $E$ C\,|opt|9 & |(int,|\cr
7474 \+& |lpar| \alt |stmt| |decl| & |lpar| \hfill \alt {$LS\.\ $} {$LD\.\ $} &
7575 \alt {|(k=5;|} {|(int k=5;|} \cr
7676 \+& |question| |exp| |colon| & |binop| & |?x:|\cr
@@ -197,14 +197,14 @@ We use \\{in}, \\{out}, \\{back} and · 120 unmodified lines
197197 &$\langle\,$section name$\,\rangle$;\cr
198198 \+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
199199 \+& |insert| |any| & |any| & \.{\v\#include\v}\cr
200−\+& |prelangle| & |binop| \hfill $<$ & $<$ not in template\cr
201−\+& |prerangle| & |binop| \hfill $>$ & $>$ not in template\cr
200+\+& |prelangle| & |binop| \hfill \.< & $<$ not in template\cr
201+\+& |prerangle| & |binop| \hfill \.> & $>$ not in template\cr
202202 \+& |langle| |exp| |prerangle| & |cast| & $\langle\,0\,\rangle$\cr
203203 \+& |langle| |prerangle| & |cast| \hfill $L\.{\\,}P$ & $\langle\,\rangle$\cr
204204 \+& |langle| \alt|decl_head| |int_like| |prerangle| & |cast| &
205205 $\langle\&{class}\,\&C\rangle$\cr
206206 \+& |langle| \alt|decl_head| |int_like| |comma| & |langle| \hfill
207− L\,\alt $D$ $I$ C\,|opt|9 & $\langle\&{class}\,\&C,$\cr
207+ $L$\,\alt $D$ $I$ C\,|opt|9 & $\langle\&{class}\,\&C,$\cr
208208 \+& |public_like| |colon| & |tag| & \&{private}:\cr
209209 \+& |public_like| & |int_like| & \&{private}\cr
210210 \+& |colcol| \alt|exp| |int_like| & \alt|exp| |int_like| & |::x|\cr
@@ -224,7 +224,8 @@ We use \\{in}, \\{out}, \\{back} and · 13 unmodified lines
224224 : \&{public} $a$,\cr
225225 \+& |base| |public_like| |exp| & |base| |int_like| \hfill $I=P\.\ E$ &
226226 : \&{public} $a$\cr
227−\+& |raw_rpar| |const_like| & |raw_rpar| \hfill $R\.\ C$ & ) \&{const};\cr
227+\+\dag\theprodno& |raw_rpar| |const_like| & |raw_rpar| \hfill $R\.\ C$ &
228+ ) \&{const};\cr
228229 \+& |raw_rpar| & |rpar| & );\cr
229230 \+& |raw_unorbin| |const_like| & |raw_unorbin| \hfill $RC$\.{\\\ }
230231 & $*$\&{const} |x|\cr
@@ -262,4 +263,7 @@ Rule 96: The |new_like| must not be immediately followed by |lpar|, · 31 unmodified lines
262263 Rule 97: The operator after |operator_like|
263264 must not be immediately followed by a |binop|.
264265
266+Rule 103: The operator after |const_like| must be |semi|, |lbrace|, |comma|,
267+|binop|, or |const_like|.
268+
265269 \endgroup

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t