diff options
Diffstat (limited to 'web/spiderweb/src/c/tangle.c')
-rw-r--r-- | web/spiderweb/src/c/tangle.c | 2214 |
1 files changed, 2214 insertions, 0 deletions
diff --git a/web/spiderweb/src/c/tangle.c b/web/spiderweb/src/c/tangle.c new file mode 100644 index 0000000000..49add84999 --- /dev/null +++ b/web/spiderweb/src/c/tangle.c @@ -0,0 +1,2214 @@ +/*1:*/ +#line 44 "tangle.web" + +/*4:*/ +#line 15 "common.h" + +#line 16 "common.h" +#include<stdio.h> + +/*:4*//*94:*/ +#line 1046 "tangle.web" + +#line 1047 "tangle.web" +#include"ctype.h" + +/*:94*/ +#line 45 "tangle.web" + +/*3:*/ +#line 9 "common.h" + +typedef short boolean; +typedef char unsigned eight_bits; +extern boolean program; +extern int phase; + +/*:3*//*5:*/ +#line 24 "common.h" + +typedef char ASCII; +typedef char outer_char; +extern ASCII xord[]; +extern outer_char xchr[]; +ASCII mod_text[400+1]; +ASCII *mod_text_end= mod_text+400; +ASCII *id_first; +ASCII *id_loc; + +/*:5*//*6:*/ +#line 37 "common.h" + +#line 38 "common.h" +extern ASCII buffer[]; +extern ASCII *buffer_end; +extern ASCII *loc; +extern ASCII *limit; + +/*:6*//*7:*/ +#line 55 "common.h" + +typedef struct name_info{ +ASCII *byte_start; +struct name_info *link; +union{ +struct name_info *Rlink; + +eight_bits Ilk; + +}dummy; +ASCII *equiv_or_xref; +}name_info; +typedef name_info *name_pointer; +typedef name_pointer *hash_pointer; +extern ASCII byte_mem[]; +extern ASCII *byte_mem_end; +extern name_info name_dir[]; +extern name_pointer name_dir_end; +extern name_pointer name_ptr; +extern ASCII *byte_ptr; +extern name_pointer hash[]; +extern hash_pointer hash_end; +extern hash_pointer h; +extern name_pointer id_lookup(); +extern name_pointer mod_lookup(); +extern name_pointer prefix_lookup(); + +/*:7*//*8:*/ +#line 98 "common.h" + +extern history; + +/*:8*//*9:*/ +#line 109 "common.h" + +extern include_depth; +extern FILE *file[]; +extern FILE *change_file; +extern char C_file_name[]; +extern char tex_file_name[]; +extern char file_name[][60]; + +extern char change_file_name[]; +extern line[]; +extern change_line; +extern boolean input_has_ended; +extern boolean changing; + +/*:9*//*10:*/ +#line 124 "common.h" + +#line 125 "common.h" +typedef unsigned short sixteen_bits; +extern sixteen_bits module_count; +extern boolean changed_module[]; +extern boolean print_where; + +/*:10*//*11:*/ +#line 131 "common.h" + +#line 132 "common.h" +extern int argc; +extern char * *argv; +extern no_xref; + +/*:11*//*12:*/ +#line 144 "common.h" + +FILE *C_file; +FILE *tex_file; +#line 81 "tangle.web" + +/*:12*/ +#line 46 "tangle.web" + +/*14:*/ +#line 107 "tangle.web" + +#line 108 "tangle.web" +typedef struct{ +eight_bits *tok_start; +sixteen_bits text_link; +}text; +typedef text *text_pointer; + +/*:14*//*25:*/ +#line 254 "tangle.web" + +typedef struct{ +eight_bits *end_field; +eight_bits *byte_field; +name_pointer name_field; +text_pointer repl_field; +sixteen_bits mod_field; +}output_state; +typedef output_state *stack_pointer; + +/*:25*/ +#line 47 "tangle.web" + +/*15:*/ +#line 114 "tangle.web" + +#line 115 "tangle.web" +text text_info[2000]; +text_pointer text_info_end= text_info+2000-1; +text_pointer text_ptr; +eight_bits tok_mem[150000]; +eight_bits *tok_mem_end= tok_mem+150000-1; +eight_bits *tok_ptr; + +/*:15*//*21:*/ +#line 185 "tangle.web" + +text_pointer last_unnamed; + +/*:21*//*26:*/ +#line 270 "tangle.web" + +output_state cur_state; + +output_state stack[50+1]; +stack_pointer stack_ptr; +stack_pointer stack_end= stack+50; + +/*:26*//*37:*/ +#line 413 "tangle.web" + +int cur_val; + + +/*:37*//*46:*/ +#line 520 "tangle.web" + +#line 521 "tangle.web" +short balances[128]; +/*:46*//*50:*/ +#line 583 "tangle.web" + +#line 584 "tangle.web" +name_pointer parm_ptr; + +/*:50*//*62:*/ +#line 706 "tangle.web" + +eight_bits out_state; +boolean protect; + +/*:62*//*64:*/ +#line 735 "tangle.web" + +name_pointer output_files[256]; +name_pointer *cur_out_file, *end_output_files, *an_output_file; +char cur_module_char; +char output_file_name[400]; + +/*:64*//*78:*/ +#line 143 "outtoks.web" +char C_file_extension[]= "c"; +/*:78*//*80:*/ +#line 148 "outtoks.web" +char the_at_sign= 64; + +/*:80*//*86:*/ +#line 943 "tangle.web" + +eight_bits ccode[128]; + +/*:86*//*88:*/ +#line 975 "tangle.web" +short tracing; +#line 976 "tangle.web" +/*:88*//*91:*/ +#line 1009 "tangle.web" + +#line 1010 "tangle.web" +boolean comment_continues= 0; + +/*:91*//*93:*/ +#line 1043 "tangle.web" + +name_pointer cur_module; + +/*:93*//*108:*/ +#line 1310 "tangle.web" + +text_pointer cur_text; +eight_bits next_control; + +/*:108*//*111:*/ +#line 1373 "tangle.web" + +ASCII param_name_texts[256]; +ASCII *param_name_texts_end= param_name_texts+256; +ASCII *param_names[32]; +short next_param_name; +ASCII *next_param_name_text; + +/*:111*//*132:*/ +#line 1693 "tangle.web" + +#line 1694 "tangle.web" +extern sixteen_bits module_count; + +/*:132*/ +#line 48 "tangle.web" + + +main(ac,av) +char * *av; +{ +argc= ac;argv= av; +program= 0; +/*16:*/ +#line 122 "tangle.web" + +#line 123 "tangle.web" +text_info->tok_start= tok_ptr= tok_mem; +text_ptr= text_info+1;text_ptr->tok_start= tok_mem; + + +/*:16*//*18:*/ +#line 132 "tangle.web" + +name_dir->equiv_or_xref= (ASCII *)text_info; + +/*:18*//*22:*/ +#line 188 "tangle.web" +last_unnamed= text_info;text_info->text_link= 0; +#line 189 "tangle.web" + +/*:22*//*47:*/ +#line 522 "tangle.web" + +#line 523 "tangle.web" +{int i; +for(i= 0;i<128;i++)balances[i]= 0; +/*48:*/ +#line 529 "tangle.web" + +#line 530 "tangle.web" +balances[40]= 1; +balances[41]= -1; +balances[91]= 1; +balances[93]= -1; +balances[123]= 1; +balances[125]= -1; + +/*:48*/ +#line 525 "tangle.web" +; +} +/*:47*//*65:*/ +#line 745 "tangle.web" + +#line 746 "tangle.web" +cur_out_file= end_output_files= output_files+256; + +/*:65*//*87:*/ +#line 946 "tangle.web" +{ +#line 947 "tangle.web" +int c; +for(c= 0;c<=127;c++)ccode[c]= 0; +ccode[' ']= ccode[011]= ccode['*']= 255; +ccode['@']= '@'; +ccode['=']= 2; +ccode['d']= ccode['D']= 252; +ccode['f']= ccode['F']= 251; +ccode['c']= ccode['C']= 253; +ccode['u']= ccode['U']= 253; +ccode['^']= ccode[':']= ccode['.']= ccode['t']= ccode['T']= 250; +ccode['&']= 127; +ccode['<']= ccode['(']= 254; +ccode['`']= 249; +ccode['\'']= 5; +ccode['"']= 6; + + + +ccode['@']= ccode[64]; +ccode[64]= 64; + +#ifdef DEBUG +ccode['0']= ccode['1']= ccode['2']= ccode['3']= ccode['4']= 248; +#endif DEBUG + +} + +/*:87*//*89:*/ +#line 976 "tangle.web" +tracing= 0; +#line 977 "tangle.web" + +/*:89*//*104:*/ +#line 1239 "tangle.web" +mod_text[0]= ' '; +#line 1240 "tangle.web" + +/*:104*//*113:*/ +#line 1385 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1385 "tangle.web" +; +#line 1386 "tangle.web" + +/*:113*/ +#line 55 "tangle.web" +; +common_init(); +printf("This is C TANGLE (generated at 5:29 PM on April 5, 1993)\n"); +phase_one(); +phase_two(); +wrap_up(); +} + +/*:1*//*19:*/ +#line 138 "tangle.web" + +#line 139 "tangle.web" +names_match(p,first,l) +name_pointer p; +ASCII *first; +int l; +{ +if(((p+1)->byte_start-(p)->byte_start)!=l)return 0; +return!strncmp(first,p->byte_start,l); +} + +/*:19*//*20:*/ +#line 149 "tangle.web" + +#line 150 "tangle.web" +init_node(node) +name_pointer node; +{ +node->equiv_or_xref= (ASCII *)text_info; + +} +init_p(p,t) +name_pointer p; +eight_bits t; +{ +p->dummy.Ilk= t; +} + + + +/*:20*//*24:*/ +#line 219 "tangle.web" +store_two_bytes(x) +sixteen_bits x; +{ +if(tok_ptr+2>tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; + *tok_ptr++= x>>8; + *tok_ptr++= x&255; +} + + +/*:24*//*28:*/ +#line 294 "tangle.web" +push_level(p) +#line 295 "tangle.web" +name_pointer p; +{ +/*29:*/ +#line 306 "tangle.web" + +#line 307 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>0){ +printf("\nPushing ");fflush(stdout),write(1,(p)->byte_start,(((p)+1)->byte_start-((p))->byte_start)); +printf(" =nd[%d]",p-name_dir); +} +#endif TRACE_MACROS + +/*:29*/ +#line 297 "tangle.web" +; +if(stack_ptr==stack_end){{printf("\n! Sorry, capacity exceeded: ");err_print("stack");history= 3;wrap_up();};}; + *stack_ptr= cur_state; +stack_ptr++; +cur_state.name_field= p;cur_state.repl_field= (text_pointer)p->equiv_or_xref; +cur_state.byte_field= cur_state.repl_field->tok_start;cur_state.end_field= (cur_state.repl_field+1)->tok_start; +cur_state.mod_field= 0; +} + +/*:28*//*30:*/ +#line 321 "tangle.web" +pop_level() +#line 322 "tangle.web" +{int number_of_parameters; +/*33:*/ +#line 363 "tangle.web" + +#line 364 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>0){ +printf("\nPopping ");fflush(stdout),write(1,(cur_state.name_field)->byte_start,(((cur_state.name_field)+1)->byte_start-((cur_state.name_field))->byte_start)); +printf(" =nd[%d]",cur_state.name_field-name_dir); +} + +#endif TRACE_MACROS + + + +/*:33*/ +#line 323 "tangle.web" +; +if(cur_state.repl_field->text_link==0){ +if(cur_state.name_field->dummy.Ilk==1){ +/*31:*/ +#line 338 "tangle.web" + +#line 339 "tangle.web" +number_of_parameters= *(cur_state.repl_field->tok_start); +/*32:*/ +#line 357 "tangle.web" + +#line 358 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>1){ +printf("\nUnstacking %d parameters",number_of_parameters); +} +#endif TRACE_MACROS +/*:32*/ +#line 340 "tangle.web" +; +while(number_of_parameters-->0){ +name_ptr--;text_ptr--; +#ifdef TRACE_MACROS +byte_ptr-= 2; +#endif TRACE_MACROS +} +#ifdef STAT +#ifdef STAT_HAS_BEEN_FIXED +if(tok_ptr>max_tok_ptr)max_tok_ptr= tok_ptr; + + +#endif STAT_HAS_BEEN_FIXED +#endif STAT +tok_ptr= text_ptr->tok_start; + + +/*:31*/ +#line 326 "tangle.web" +; +} +}else if(cur_state.repl_field->text_link<2000){ +cur_state.repl_field= cur_state.repl_field->text_link+text_info; +cur_state.byte_field= cur_state.repl_field->tok_start;cur_state.end_field= (cur_state.repl_field+1)->tok_start; +return; +} +stack_ptr--; +if(stack_ptr>stack)cur_state= *stack_ptr; +} + + +/*:30*//*38:*/ +#line 418 "tangle.web" +sixteen_bits +#line 419 "tangle.web" + get_output() +{ +sixteen_bits a; +restart:if(stack_ptr==stack)return 0; +if(cur_state.byte_field==cur_state.end_field){ +cur_val= -((int)cur_state.mod_field); +pop_level(); +if(cur_val==0)goto restart; +out_char(129);return; +} +a= *cur_state.byte_field++; +if(a<128) +if(a==7){ +/*40:*/ +#line 454 "tangle.web" + +#line 455 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf(" [#%d]", *cur_state.byte_field); +} +#endif TRACE_MACROS + +/*:40*/ +#line 432 "tangle.web" +; +/*39:*/ +#line 452 "tangle.web" + +#line 453 "tangle.web" +push_level(name_ptr- *cur_state.byte_field++);goto restart; +/*:39*/ +#line 434 "tangle.web" +; +}else +out_char(a); +else{ +a= (a-128) *256+ *cur_state.byte_field++; +switch(a/10240){ +case 0: +/*41:*/ +#line 461 "tangle.web" + +#line 462 "tangle.web" +if(name_dir[a].dummy.Ilk==1){ +/*42:*/ +#line 475 "tangle.web" + +#line 476 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf("\nExpanding macro (");fflush(stdout),write(1,(name_dir+a)->byte_start,(((name_dir+a)+1)->byte_start-((name_dir+a))->byte_start)); +printf("=nd[%d])",a); +} +#endif TRACE_MACROS + +/*:42*/ +#line 463 "tangle.web" +; +/*44:*/ +#line 492 "tangle.web" + +#line 493 "tangle.web" +{int number_of_parameters; +while(cur_state.byte_field==cur_state.end_field&&stack_ptr>stack)pop_level(); +number_of_parameters= *(((text_pointer)name_dir[a].equiv_or_xref)->tok_start); +if(number_of_parameters>0){ +if(stack_ptr==stack|| *cur_state.byte_field!=40){ +printf("\n! No parameters given for "); +fflush(stdout),write(1,(a+name_dir)->byte_start,(((a+name_dir)+1)->byte_start-((a+name_dir))->byte_start)); +err_print(""); +goto restart; +} +cur_state.byte_field++; +parm_ptr= name_ptr; +while(number_of_parameters-->0){ +/*49:*/ +#line 537 "tangle.web" + +#line 538 "tangle.web" +{int bal; +eight_bits b,oldb; +sixteen_bits c; +bal= 0; +/*59:*/ +#line 647 "tangle.web" + +#line 648 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf("\nScanning #%d...",number_of_parameters+1); +} +#endif TRACE_MACROS +/*:59*/ +#line 542 "tangle.web" +; +while(1){ +b= *cur_state.byte_field++; +if(b==7){ +b= *cur_state.byte_field++; +/*56:*/ +#line 613 "tangle.web" + +#line 614 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf(" <#%d=",b);fflush(stdout),write(1,(name_ptr-b)->byte_start,(((name_ptr-b)+1)->byte_start-((name_ptr-b))->byte_start));printf("=nd[%d]>", +name_ptr-b-name_dir); +} +#endif TRACE_MACROS + +/*:56*/ +#line 547 "tangle.web" +; +c= name_ptr-name_dir-b; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 128+(c/256);}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= c%256;}; +}else{ +if(b>=128){ +/*57:*/ +#line 621 "tangle.web" + +#line 622 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +int c; +printf(" <"); +c= (b-128) *256+ *cur_state.byte_field; +switch(c/10240){ +case 0:fflush(stdout),write(1,(name_dir+c)->byte_start,(((name_dir+c)+1)->byte_start-((name_dir+c))->byte_start)); +printf(" =nd[%d]",c); +break; +case 1:printf("MODULE");break; +default:printf("CONTEXT");break; +} +printf(">"); +} +#endif TRACE_MACROS + +/*:57*/ +#line 553 "tangle.web" +; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= b;}; +b= *cur_state.byte_field++; +}else if(bal==0&&((number_of_parameters==0&&b==41) +||(number_of_parameters>0&&b==44))){ +goto done; +}else if(/*51:*/ +#line 586 "tangle.web" +(b==2||b==3) +#line 587 "tangle.web" +/*:51*/ +#line 559 "tangle.web" +){ +/*52:*/ +#line 587 "tangle.web" + +#line 588 "tangle.web" +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= b;}; +oldb= b; +/*53:*/ +#line 601 "tangle.web" + +#line 602 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2)printf(" <"); +#endif TRACE_MACROS +/*:53*/ +#line 590 "tangle.web" +; +while((b= *cur_state.byte_field++)!=oldb){ +/*54:*/ +#line 605 "tangle.web" + +#line 606 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2)printf("%c",b); +#endif TRACE_MACROS +/*:54*/ +#line 592 "tangle.web" +; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= b;}; +if(cur_state.byte_field>=cur_state.end_field) +{printf("\n! This can't happen: ");err_print("string or constant didn't end in token list");history= 3;wrap_up();}; +} +/*55:*/ +#line 609 "tangle.web" + +#line 610 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2)printf(">"); +#endif TRACE_MACROS +/*:55*/ +#line 597 "tangle.web" +; + + + +/*:52*/ +#line 560 "tangle.web" +; +}else{ +/*58:*/ +#line 638 "tangle.web" + +#line 639 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf(" <"); +if(31<b&&b<127)printf("%c",b); +printf(">"); +} +#endif TRACE_MACROS + +/*:58*/ +#line 562 "tangle.web" +; +bal+= balances[b]; +} +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= b;}; +} +} +done: +parm_ptr->equiv_or_xref= (ASCII *)text_ptr; +text_ptr->text_link= 0; +parm_ptr->dummy.Ilk= 2; +#ifdef TRACE_MACROS +if(byte_ptr+2>=byte_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("byte memory");history= 3;wrap_up();};}; + *byte_ptr++= 35; *byte_ptr++= number_of_parameters+1+48; +#endif TRACE_MACROS +if(parm_ptr>=name_dir_end){{printf("\n! Sorry, capacity exceeded: ");err_print("name");history= 3;wrap_up();};}; +(++parm_ptr)->byte_start= byte_ptr; +if(text_ptr>=text_info_end){{printf("\n! Sorry, capacity exceeded: ");err_print("text");history= 3;wrap_up();};}; +(++text_ptr)->tok_start= tok_ptr; +/*60:*/ +#line 653 "tangle.web" + +#line 654 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>1){ +printf("\nStacked ");fflush(stdout),write(1,(parm_ptr-1)->byte_start,(((parm_ptr-1)+1)->byte_start-((parm_ptr-1))->byte_start)); +printf("=nd[%d]",parm_ptr-1-name_dir); +} +#endif TRACE_MACROS + +/*:60*/ +#line 580 "tangle.web" +; +} + +/*:49*/ +#line 507 "tangle.web" +; +} +name_ptr= parm_ptr; + +} +} + +/*:44*/ +#line 465 "tangle.web" +; +push_level(name_dir+a); +cur_state.byte_field++; +goto restart; +}else if(name_dir[a].dummy.Ilk==2){ +/*43:*/ +#line 483 "tangle.web" + +#line 484 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf("\nExpanding parameter (");fflush(stdout),write(1,(name_dir+a)->byte_start,(((name_dir+a)+1)->byte_start-((name_dir+a))->byte_start)); +printf("=nd[%d])",a); +} +#endif TRACE_MACROS + + +/*:43*/ +#line 470 "tangle.web" +; +push_level(name_dir+a); +goto restart; +} + +/*:41*/ +#line 441 "tangle.web" +; +cur_val= a;out_char(130);break; +case 1:/*61:*/ +#line 664 "tangle.web" + +#line 665 "tangle.web" +a-= 10240; +if((a+name_dir)->equiv_or_xref!=(ASCII *)text_info)push_level(a+name_dir); +else if(a!=0){ +printf("\n! Not present: <");fflush(stdout),write(1,(a+name_dir)->byte_start,(((a+name_dir)+1)->byte_start-((a+name_dir))->byte_start));err_print(">"); + +} +goto restart; + +/*:61*/ +#line 443 "tangle.web" +; +default:cur_val= a-20480;if(cur_val>0)cur_state.mod_field= cur_val; +out_char(129); +} +} +return 1; +} + + +/*:38*//*63:*/ +#line 714 "tangle.web" +flush_buffer() +#line 715 "tangle.web" +{ +putc('\n',C_file); +if(line[include_depth]%100==0){ +printf("."); +if(line[include_depth]%500==0)printf("%d",line[include_depth]); +fflush(stdout); +} +line[include_depth]++; +} + +/*:63*//*67:*/ +#line 764 "tangle.web" + +#line 765 "tangle.web" +phase_two(){ +line[include_depth]= 1; +if(text_info->text_link==0){ +if(end_output_files==cur_out_file){ +printf("\n! No program text was specified.");{if(history==0)history= 1;}; + +} +}else{ +printf("\nWriting the output files: (%s)",C_file_name);fflush(stdout); +/*27:*/ +#line 283 "tangle.web" + +#line 284 "tangle.web" +stack_ptr= stack+1;cur_state.name_field= name_dir;cur_state.repl_field= text_info->text_link+text_info; +cur_state.byte_field= cur_state.repl_field->tok_start;cur_state.end_field= (cur_state.repl_field+1)->tok_start;cur_state.mod_field= 0; + +/*:27*/ +#line 774 "tangle.web" +; +while(stack_ptr>stack)get_output(); +flush_buffer(); +} +if(end_output_files>cur_out_file){ +if(text_info->text_link==0){ +printf("\nWriting the output files: ");fflush(stdout); +} +/*68:*/ +#line 790 "tangle.web" + +#line 791 "tangle.web" +for(an_output_file= end_output_files;an_output_file>cur_out_file;){ +an_output_file--; +strncpy(output_file_name,( *an_output_file)->byte_start,400); +output_file_name[(( *an_output_file+1)->byte_start-( *an_output_file)->byte_start)]= '\0'; +fclose(C_file); +C_file= fopen(output_file_name,"w"); +if(C_file==NULL){ +{printf("! Cannot open output file:");err_print(output_file_name);history= 3;wrap_up();} +}else{ +printf(" (%s)",output_file_name);fflush(stdout); +} +stack_ptr= stack+1; +cur_state.name_field= ( *an_output_file); +cur_state.repl_field= (text_pointer)cur_state.name_field->equiv_or_xref; +cur_state.byte_field= cur_state.repl_field->tok_start; +cur_state.end_field= (cur_state.repl_field+1)->tok_start; +cur_state.mod_field= 0; +while(stack_ptr>stack)get_output(); +flush_buffer(); +} + + + +/*:68*/ +#line 782 "tangle.web" + +} +printf("\nDone."); +} + +/*:67*//*69:*/ +#line 816 "tangle.web" +out_char(cur_char) +#line 817 "tangle.web" +eight_bits cur_char; +{ +ASCII *j; +/*70:*/ +#line 841 "tangle.web" + +#line 842 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +switch(cur_char){ +case 10:printf(" [\\n]");break; +case 2: +printf("[STRING]");break; +case 127: +printf("[JOIN]");break; +case 3: +printf("[CONSTANT]");break; +case 130: +printf(" [");fflush(stdout),write(1,(cur_val+name_dir)->byte_start,(((cur_val+name_dir)+1)->byte_start-((cur_val+name_dir))->byte_start));printf("]"); +break; +case 129: +if(cur_val>0){ +printf(" [%d:]",cur_val); +}else if(cur_val<0){ +printf(" [:%d]",-cur_val); +}else{ +printf("[LINE NUMBER]"); +} +break; + +default: +if(31<cur_char&&cur_char<127){ +printf(" [%c]",cur_char); +}else{ +printf(" [\\%3o]",cur_char); +} +} +} +#endif TRACE_MACROS + + + + +/*:70*/ +#line 820 "tangle.web" +; +switch(cur_char){ +case 10:if(protect)putc(' ',C_file); +if(protect||out_state==4)putc('\\',C_file); + +flush_buffer();if(out_state!=4)out_state= 0;break; +/*71:*/ +#line 878 "tangle.web" + +#line 879 "tangle.web" +case 130: +if(out_state==1)putc(' ',C_file); +for(j= (cur_val+name_dir)->byte_start;j<(name_dir+cur_val+1)->byte_start; +j++)putc( *j,C_file); +out_state= 1;break; + +/*:71*/ +#line 826 "tangle.web" +; +/*72:*/ +#line 885 "tangle.web" + +#line 886 "tangle.web" +case 129: +if(cur_val>0){ +fprintf(C_file,"%s","/*"); +fprintf(C_file,"%d:",cur_val); +fprintf(C_file,"%s","*/"); +}else if(cur_val<0){ +fprintf(C_file,"%s","/*"); +fprintf(C_file,":%d",-cur_val); +fprintf(C_file,"%s","*/"); +}else{ +sixteen_bits a; +a= 256 * *cur_state.byte_field++; +a+= *cur_state.byte_field++; +fprintf(C_file,"\n%s","#line"); +fprintf(C_file," %d \"",a); +cur_val= *cur_state.byte_field++; +cur_val= 256 *(cur_val-128)+ *cur_state.byte_field++; +for(j= (cur_val+name_dir)->byte_start;j<(name_dir+cur_val+1)->byte_start; +j++)putc( *j,C_file); +fprintf(C_file,"\"%s\n","" +#line 910 "tangle.web" +); +} +break; + +#line 1 "outtoks.web" +/*:72*/ +#line 827 "tangle.web" +; +/*75:*/ +#line 58 "outtoks.web" + +#line 59 "outtoks.web" +case 26: +fprintf(C_file,"%s","=="); +if(out_state!=4)out_state= 0; +break; +case 23: +fprintf(C_file,"%s","->"); +if(out_state!=4)out_state= 0; +break; +case 25: +fprintf(C_file,"%s","&&"); +if(out_state!=4)out_state= 0; +break; +case 24: +fprintf(C_file,"%s","||"); +if(out_state!=4)out_state= 0; +break; +case 21: +fprintf(C_file,"%s","<<"); +if(out_state!=4)out_state= 0; +break; +case 28: +fprintf(C_file,"%s","<="); +if(out_state!=4)out_state= 0; +break; +case 20: +if(out_state==4){ +fprintf(C_file,"%s","===>"); +}else{ +fprintf(C_file,"%s"," "); +} +if(out_state!=4)out_state= 0; +break; +case 31: +fprintf(C_file,"%s","++"); +if(out_state!=4)out_state= 0; +break; +case 27: +fprintf(C_file,"%s",">="); +if(out_state!=4)out_state= 0; +break; +case 22: +fprintf(C_file,"%s",">>"); +if(out_state!=4)out_state= 0; +break; +case 29: +fprintf(C_file,"%s","!="); +if(out_state!=4)out_state= 0; +break; +case 30: +fprintf(C_file,"%s","--"); +if(out_state!=4)out_state= 0; +break; +/*:75*//*76:*/ +#line 111 "outtoks.web" + +#line 112 "outtoks.web" +case'=': +if(out_state==4){ +fprintf(C_file,"%s","="); +}else{ +fprintf(C_file,"%s","= "); +} +if(out_state!=4)out_state= 0; +break; +case'*': +if(out_state==4){ +fprintf(C_file,"%s","*"); +}else{ +fprintf(C_file,"%s"," *"); +} +if(out_state!=4)out_state= 0; +break; +/*:76*/ +#line 828 "tangle.web" + +case 127:out_state= 3;break; +case 3:if(out_state==4){ +out_state= 1;break; +} +if(out_state==1)putc(' ',C_file);out_state= 4;break; +case 2:if(out_state==4)out_state= 0; +else out_state= 4;break; +default:putc(cur_char,C_file);if(out_state!=4)out_state= 0; +break; +} +} + +/*:69*//*90:*/ +#line 981 "tangle.web" +eight_bits skip_ahead() +#line 982 "tangle.web" +{ +eight_bits c; +while(1){ +if(loc>limit&&(get_line()==0))return(255); + *(limit+1)= 64; +while( *loc!=64)loc++; +if(loc<=limit){ +loc++;c= ccode[ *loc]; +#ifdef DEBUG +if(c==248){ +tracing= *loc-48;c= 0; +} +#endif DEBUG +loc++; +if(c!=0|| *(loc-1)=='>')return(c); +} +} +} + +/*:90*//*92:*/ +#line 1012 "tangle.web" + +#line 1013 "tangle.web" +skip_comment() +{ +ASCII c; +if(0){ +get_line(); +return(comment_continues= 0); +}else{ +while(1){ +if(loc>limit) +if(get_line())return(comment_continues= 1); +else{ +err_print("! Input ended in mid-comment"); + +return(comment_continues= 0); +} +c= *(loc++); +/*82:*/ +#line 163 "outtoks.web" + +{int len;len= strlen("*/"); +if(loc+len-1<=limit&&!strncmp(loc-1,"*/",len)){ +loc+= len-1;return(comment_continues= 0);}} +/*:82*/ +#line 1029 "tangle.web" + +if(c==64){ +if(ccode[ *loc]==255){ +err_print("! Section name ended in mid-comment");loc--; + +return(comment_continues= 0); +} +else loc++; +} +} +} +} +/*:92*//*95:*/ +#line 1052 "tangle.web" +eight_bits get_next() +#line 1053 "tangle.web" +{ +eight_bits c; +while(1){ +if(loc>limit){ +if(get_line()==0)return(255); +else if(print_where){ +print_where= 0; +/*125:*/ +#line 1586 "tangle.web" + +#line 1587 "tangle.web" +store_two_bytes(53248); +if(changing)id_first= change_file_name; +else id_first= file_name[include_depth]; +id_loc= id_first+strlen(id_first); +if(changing)store_two_bytes((sixteen_bits)change_line); +else store_two_bytes((sixteen_bits)line[include_depth]); +{int a= id_lookup(id_first,id_loc,0)-name_dir;{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= (a/256)+128;}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a%256;};} + +/*:125*/ +#line 1060 "tangle.web" +; +} +else return(10); +} +c= *loc; +if(comment_continues){ +skip_comment(); +if(comment_continues||0)return(10); +else continue; +} +/*81:*/ +#line 151 "outtoks.web" + +#line 152 "outtoks.web" +{int len;len= strlen("/*"); +if(loc+len<=limit&&!strncmp(loc,"/*",len)){ +loc+= len; +skip_comment(); +if(comment_continues||0) +return('\n'); +else continue; +} +} +/*:81*/ +#line 1070 "tangle.web" + +loc++; +if(isdigit(c)||c=='\\'||c=='.')/*97:*/ +#line 1092 "tangle.web" +{ +#line 1093 "tangle.web" +id_first= loc-1; +if( *id_first=='.'&&!isdigit( *loc))goto mistake; +if( *id_first=='\\')while(isdigit( *loc))loc++; +else{ +if( *id_first=='0'){ +if( *loc=='x'|| *loc=='X'){ +loc++;while(isxdigit( *loc))loc++;goto found; +} +} +while(isdigit( *loc))loc++; +if( *loc=='.'){ +loc++; +while(isdigit( *loc))loc++; +} +if( *loc=='e'|| *loc=='E'){ +if( *++loc=='+'|| *loc=='-')loc++; +while(isdigit( *loc))loc++; +} +} +found: +id_loc= loc; +return(3); +} + +/*:97*/ +#line 1072 "tangle.web" + +else if(isalpha(c)||c=='_'||c=='$')/*96:*/ +#line 1084 "tangle.web" +{ +#line 1085 "tangle.web" +id_first= --loc; +while(isalpha( *++loc)||isdigit( *loc)|| *loc=='_'); +if( *loc=='$')while(isdigit( *++loc)|| *loc=='$'); + +id_loc= loc;return(130); +} + +/*:96*/ +#line 1073 "tangle.web" + +else if(c=='\''||c=='\"')/*98:*/ +#line 1122 "tangle.web" +{ +#line 1123 "tangle.web" +ASCII delim= c; + + +if(delim=='\''&&(loc+1>=limit|| +( *loc!='\\'&& *loc!=64&&loc[1]!='\'')|| +( *loc=='\\'&&(loc+2>=limit||loc[2]!='\''))|| +( *loc==64&& +(loc+2>=limit||loc[1]!=64||loc[2]!='\'')) +))goto mistake; +id_first= mod_text+1; +id_loc= mod_text; *++id_loc= delim; +while(1){ +if(loc>=limit){ +if( *(limit-1)!='\\'){ +err_print("! String didn't end");loc= limit;break; + +} +if(get_line()==0){ +err_print("! Input ended in middle of string");loc= buffer;break; + +} +else if(++id_loc<=mod_text_end) *id_loc= 10; + +} +if((c= *loc++)==delim){ +if(++id_loc<=mod_text_end) *id_loc= c; +break; +} +if(c=='\\'){ +if(loc>=limit)continue; +if(++id_loc<=mod_text_end) *id_loc= '\\'; +c= *loc++; +} +if(++id_loc<=mod_text_end) *id_loc= c; +} +if(id_loc>=mod_text_end){ +printf("\n! String too long: "); + +fflush(stdout),write(1,mod_text+1,25); +printf("...");history= 2; +} +id_loc++; +return(2); +} + +/*:98*/ +#line 1074 "tangle.web" + +else if(c==64)/*99:*/ +#line 1171 "tangle.web" +{ +#line 1172 "tangle.web" +c= ccode[ *loc++]; +switch(c){ +case 0:continue; +case 250:while((c= skip_ahead())==64); + +if( *(loc-1)!='>')err_print("! Improper @ within control text"); + +continue; +case 254: +cur_module_char= *(loc-1); +/*103:*/ +#line 1221 "tangle.web" +{ +#line 1222 "tangle.web" +ASCII *k; +/*105:*/ +#line 1241 "tangle.web" + +#line 1242 "tangle.web" +k= mod_text; +while(1){ +if(loc>limit&&get_line()==0){ +err_print("! Input ended in section name"); + +loc= buffer+1;break; +} +c= *loc; +/*106:*/ +#line 1265 "tangle.web" + +#line 1266 "tangle.web" +if(c==64){ +c= *(loc+1); +if(c=='>'){ +loc+= 2;break; +} +if(ccode[c]==255){ +err_print("! Section name didn't end");break; + +} + *(++k)= 64;loc++; +} + +/*:106*/ +#line 1250 "tangle.web" +; +loc++;if(k<mod_text_end)k++; +if(c==' '||c==011){ +c= ' ';if( *(k-1)==' ')k--; +} + *k= c; +} +if(k>=mod_text_end){ +printf("\n! Section name too long: "); + +fflush(stdout),write(1,mod_text+1,25); +printf("...");{if(history==0)history= 1;}; +} +if( *k==' '&&k>mod_text)k--; + +/*:105*/ +#line 1223 "tangle.web" +; +if(k-mod_text>3&&strncmp(k-2,"...",3)==0)cur_module= prefix_lookup(mod_text+1,k-3); +else cur_module= mod_lookup(mod_text+1,k); +if(cur_module_char=='('){ +/*66:*/ +#line 749 "tangle.web" + +#line 750 "tangle.web" +{ +if(cur_out_file>output_files){ +for(an_output_file= cur_out_file; +an_output_file<end_output_files;an_output_file++) +if( *an_output_file==cur_module)break; +if(an_output_file==end_output_files) + *--cur_out_file= cur_module; +}else{ +{{printf("\n! Sorry, capacity exceeded: ");err_print("output files");history= 3;wrap_up();};}; +} +} + +/*:66*/ +#line 1228 "tangle.web" + +} +return(254); +} + +/*:103*/ +#line 1182 "tangle.web" +; +case 2:/*107:*/ +#line 1283 "tangle.web" +{ +#line 1284 "tangle.web" +id_first= loc++; *(limit+1)= 64; *(limit+2)= '>'; +while( *loc!=64|| *(loc+1)!='>')loc++; +if(loc>=limit)err_print("! Verbatim string didn't end"); + +id_loc= loc;loc+= 2; +return(2); +} + +/*:107*/ +#line 1183 "tangle.web" +; +#ifdef DEBUG +case 248:tracing= *(loc-1)-'0';continue; +#endif DEBUG +case 249:/*100:*/ +#line 1194 "tangle.web" + +#line 1195 "tangle.web" +id_first= loc; +if( *loc=='\\')loc++; +while( *loc!='\''){ +loc++; +if(loc>limit){ +err_print("! String didn't end");loc= limit-1;break; +} +} +loc++; +return(249); + +/*:100*/ +#line 1187 "tangle.web" +; +case 5:/*101:*/ +#line 1206 "tangle.web" +{ +#line 1207 "tangle.web" +id_first= loc; +while('0'<= *loc&& *loc<'8')loc++; +id_loc= loc; +return(5); +} + +/*:101*/ +#line 1188 "tangle.web" +; +case 6:/*102:*/ +#line 1213 "tangle.web" +{ +#line 1214 "tangle.web" +id_first= loc; +while(isxdigit( *loc))loc++; +id_loc= loc; +return(6); +} + + +/*:102*/ +#line 1189 "tangle.web" +; +default:return(c); +} +} + +/*:99*/ +#line 1075 "tangle.web" + +else if(c==' '||c==011){ +continue; +} +mistake:/*74:*/ +#line 3 "outtoks.web" + +#line 4 "outtoks.web" +if(loc+3<=limit){ +if(strncmp("===>",loc-1,4)==0){ +loc+= 3; +return 20; +} +} +if(loc+2<=limit){ +} +if(loc+1<=limit){ +if(strncmp("==",loc-1,2)==0){ +loc+= 1; +return 26; +} +else if(strncmp("->",loc-1,2)==0){ +loc+= 1; +return 23; +} +else if(strncmp("&&",loc-1,2)==0){ +loc+= 1; +return 25; +} +else if(strncmp("||",loc-1,2)==0){ +loc+= 1; +return 24; +} +else if(strncmp("<<",loc-1,2)==0){ +loc+= 1; +return 21; +} +else if(strncmp("<=",loc-1,2)==0){ +loc+= 1; +return 28; +} +else if(strncmp("++",loc-1,2)==0){ +loc+= 1; +return 31; +} +else if(strncmp(">=",loc-1,2)==0){ +loc+= 1; +return 27; +} +else if(strncmp(">>",loc-1,2)==0){ +loc+= 1; +return 22; +} +else if(strncmp("!=",loc-1,2)==0){ +loc+= 1; +return 29; +} +else if(strncmp("--",loc-1,2)==0){ +loc+= 1; +return 30; +} +} +/*:74*/ +#line 1079 "tangle.web" + +return(c); +} +} + +/*:95*//*109:*/ +#line 1314 "tangle.web" +scan_repl(t) +#line 1315 "tangle.web" +eight_bits t; +{ +sixteen_bits a; +int set_print_where; +if(t==254){/*125:*/ +#line 1586 "tangle.web" + +#line 1587 "tangle.web" +store_two_bytes(53248); +if(changing)id_first= change_file_name; +else id_first= file_name[include_depth]; +id_loc= id_first+strlen(id_first); +if(changing)store_two_bytes((sixteen_bits)change_line); +else store_two_bytes((sixteen_bits)line[include_depth]); +{int a= id_lookup(id_first,id_loc,0)-name_dir;{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= (a/256)+128;}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a%256;};} + +/*:125*/ +#line 1319 "tangle.web" +;} + + +while(1){ +if(t==1){ +print_where= 0; +} +a= get_next(); +if(t==1){ +set_print_where= print_where; +} +switch(a){ +/*124:*/ +#line 1529 "tangle.web" + +#line 1530 "tangle.web" +case 130: +{short n; +if((n= parameter_number(id_first,id_loc))!=0){ +#ifdef TRACE_MACROS +if(tracing>1){ +printf("\nIdentified ");fflush(stdout),write(1,id_first,id_loc-id_first); +printf(" as parameter number %d (%d from back)",n,next_param_name-n+1); +} +#endif TRACE_MACROS +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 7;}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= next_param_name-n+1;}; +}else{ +a= id_lookup(id_first,id_loc,0)-name_dir; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= (a/256)+128;};{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a%256;}; +} +} +break; +case 254:if(t!=254)goto done; +else{ +/*126:*/ +#line 1596 "tangle.web" +{ +#line 1597 "tangle.web" +ASCII *try_loc= loc; +while( *try_loc==' '&&try_loc<limit)try_loc++; +if( *try_loc=='+'&&try_loc<limit)try_loc++; +while( *try_loc==' '&&try_loc<limit)try_loc++; +if( *try_loc=='=')err_print("! Nested named modules. Missing @?"); + +} + +/*:126*/ +#line 1549 "tangle.web" +; +a= cur_module-name_dir; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= (a/256)+168;}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a%256;}; +/*125:*/ +#line 1586 "tangle.web" + +#line 1587 "tangle.web" +store_two_bytes(53248); +if(changing)id_first= change_file_name; +else id_first= file_name[include_depth]; +id_loc= id_first+strlen(id_first); +if(changing)store_two_bytes((sixteen_bits)change_line); +else store_two_bytes((sixteen_bits)line[include_depth]); +{int a= id_lookup(id_first,id_loc,0)-name_dir;{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= (a/256)+128;}; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a%256;};} + +/*:125*/ +#line 1553 "tangle.web" +;break; +} +case 3:case 2: +/*127:*/ +#line 1605 "tangle.web" + +#line 1606 "tangle.web" +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a;}; +while(id_first<id_loc){ +if( *id_first==64)id_first++; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= *id_first++;}; +} +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a;};break; + +/*:127*/ +#line 1556 "tangle.web" +; +case 249: +/*128:*/ +#line 1613 "tangle.web" +{ +#line 1614 "tangle.web" +int c; +if( *id_first==64){ +c= xchr[ *id_first++]; +if( *id_first!=64)err_print("! Double @ within string"); +} +else if( *id_first=='\\'){ +id_first++; +switch( *id_first){ +case't':c= 9;break; +case'n':c= 10;break; +case'b':c= 8;break; +case'0':c= 0;break; +case'\\':c= 92;break; +default:err_print("! Unrecognized escape sequence"); +} +} +else c= xchr[ *id_first]; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; + + +app_decimal((long)c); +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; +} +break; + +/*:128*/ +#line 1558 "tangle.web" +; +case 5: +/*129:*/ +#line 1640 "tangle.web" +{ +#line 1641 "tangle.web" +long sum= 0; +while(id_first<id_loc){ +sum= 8 *sum+ *id_first++-'0'; +if(sum>67108864)err_print("! Octal constant exceeds @\"04000000"); +} +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; +app_decimal(sum); +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; +} + +/*:129*/ +#line 1560 "tangle.web" +;break; +case 6: +/*130:*/ +#line 1651 "tangle.web" +{ +#line 1652 "tangle.web" +long sum= 0; +while(id_first<id_loc){ +sum= 16 *sum+ +(isdigit( *id_first) +? *id_first-'0' +:isupper( *id_first) +? *id_first-'A'+10 +: *id_first-'a'+10 +); +id_first++; +if(sum>67108864)err_print("! Hex constant exceeds @\"04000000"); +} +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; +app_decimal(sum); +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= 3;}; +} + +/*:130*/ +#line 1562 "tangle.web" +;break; +case 10: +#ifdef NEWLINES_IN_MACROS +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a;}; +#else +if(t==1)continue; +else{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a;}; +#endif NEWLINES_IN_MACROS +break; +case 252:case 251:case 253: +if(t!=254)goto done; +else{ +err_print("! @d, @f and @u are ignored in C text");continue; + +} +case 255:goto done; + +/*:124*/ +#line 1334 "tangle.web" + +default:{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= a;}; +} +} +done:next_control= (eight_bits)a; +if(text_ptr>text_info_end){{printf("\n! Sorry, capacity exceeded: ");err_print("text");history= 3;wrap_up();};}; +if(t==1){ +/*110:*/ +#line 1358 "tangle.web" + +#line 1359 "tangle.web" +tok_ptr-= 2; +while( *tok_ptr<128&& *(tok_ptr+1)==10)tok_ptr--; +tok_ptr+= 2; + +/*:110*/ +#line 1341 "tangle.web" +; +} +cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr; +print_where= set_print_where; +} + +/*:109*//*116:*/ +#line 1408 "tangle.web" + +#line 1409 "tangle.web" +int parameter_number(first,loc) +ASCII *first, *loc; +{ +ASCII *f, *p; +int n; +for(n= 0;n<next_param_name;n++){ +if(loc-first==param_names[n+1]-param_names[n]){ + +for(f= first,p= param_names[n];f<loc;) +if( *f++!= *p++)goto nomatch; +return n+1; +} +nomatch:continue; +} +return 0; +} + + +/*:116*//*131:*/ +#line 1670 "tangle.web" + +#line 1671 "tangle.web" +app_decimal(c) +long c; +{long power; +if(c==0){{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= '0';};return;} +if(c<0){{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= '-';};c= -c;} +for(power= 1;c>=power;power *= 10); + +for(power/= 10;power>=1;power/= 10){ +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= '0'+c/power;}; +c%= power; + +} +} + + + +/*:131*//*133:*/ +#line 1697 "tangle.web" +scan_module() +#line 1698 "tangle.web" +{ +name_pointer p; +text_pointer q; +sixteen_bits a; +module_count++; +if( *(loc-1)=='*') +printf("*%d",module_count);fflush(stdout); +/*134:*/ +#line 1714 "tangle.web" + +next_control= 0; +while(1){ +done_scanning: +while(next_control<=251) +if((next_control= skip_ahead())==254){ + +loc-= 2;next_control= get_next(); +} +if(next_control!=252)break; +/*117:*/ +#line 1433 "tangle.web" + +#line 1434 "tangle.web" +/*123:*/ +#line 1521 "tangle.web" + +#line 1522 "tangle.web" +while((next_control= get_next())==10); + +/*:123*/ +#line 1434 "tangle.web" + +/*121:*/ +#line 1484 "tangle.web" + +#line 1485 "tangle.web" +if(next_control!=130){ +err_print("! Macro name must be an identifier"); + +/*135:*/ +#line 1732 "tangle.web" + +#line 1733 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1733 "tangle.web" +; +p->dummy.Ilk= 0; +goto done_scanning; + + +/*:135*/ +#line 1488 "tangle.web" +; +}else{ +p= id_lookup(id_first,id_loc,1); +if(p->dummy.Ilk!=1){ +#ifdef WARN_USE_BEFORE_DEF +printf("\n! Warning: macro name "); +fflush(stdout),write(1,(p)->byte_start,(((p)+1)->byte_start-((p))->byte_start)); +printf(" was used before it was defined"); +{if(history==0)history= 1;}; +#endif WARN_USE_BEFORE_DEF +p->dummy.Ilk= 1; +}else if(p+1!=name_ptr){ +err_print("! Macro name is multiply defined: "); +} +} + +/*:121*/ +#line 1436 "tangle.web" +; +/*120:*/ +#line 1469 "tangle.web" + +#line 1470 "tangle.web" +/*123:*/ +#line 1521 "tangle.web" + +#line 1522 "tangle.web" +while((next_control= get_next())==10); + +/*:123*/ +#line 1470 "tangle.web" + +if(next_control==40){ +do{ +/*122:*/ +#line 1504 "tangle.web" + +#line 1505 "tangle.web" +/*123:*/ +#line 1521 "tangle.web" + +#line 1522 "tangle.web" +while((next_control= get_next())==10); + +/*:123*/ +#line 1505 "tangle.web" +; +if(next_control!=130){ +err_print("! Macro parameter name not an identifier"); + +/*135:*/ +#line 1732 "tangle.web" + +#line 1733 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1733 "tangle.web" +; +p->dummy.Ilk= 0; +goto done_scanning; + + +/*:135*/ +#line 1509 "tangle.web" +; +}else{ +if(parameter_number(id_first,id_loc)!=0){ +err_print("! Duplicate parameters in macro definition"); + +/*135:*/ +#line 1732 "tangle.web" + +#line 1733 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1733 "tangle.web" +; +p->dummy.Ilk= 0; +goto done_scanning; + + +/*:135*/ +#line 1514 "tangle.web" +; +}else{ +/*114:*/ +#line 1387 "tangle.web" + +#line 1388 "tangle.web" +/*115:*/ +#line 1393 "tangle.web" + +#line 1394 "tangle.web" +if(next_param_name==32) +{{printf("\n! Sorry, capacity exceeded: ");err_print("parameter names");history= 3;wrap_up();};}; +if(id_loc-id_first> +param_name_texts_end-next_param_name_text) +{{printf("\n! Sorry, capacity exceeded: ");err_print("parameter name texts");history= 3;wrap_up();};}; + + +/*:115*/ +#line 1388 "tangle.web" +; +while(id_first<id_loc) + *next_param_name_text++= *id_first++; +param_names[++next_param_name]= next_param_name_text; + +/*:114*/ +#line 1516 "tangle.web" +; +} +} + + +/*:122*/ +#line 1473 "tangle.web" +; +/*123:*/ +#line 1521 "tangle.web" + +#line 1522 "tangle.web" +while((next_control= get_next())==10); + +/*:123*/ +#line 1474 "tangle.web" + +}while(next_control==44); +if(next_control!=41){ +err_print("! Macro parameter list must end with )"); +/*135:*/ +#line 1732 "tangle.web" + +#line 1733 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1733 "tangle.web" +; +p->dummy.Ilk= 0; +goto done_scanning; + + +/*:135*/ +#line 1478 "tangle.web" +; +} +next_control= get_next(); +} + + +/*:120*/ +#line 1439 "tangle.web" +; +if(next_control!=61){ +err_print("! You must put an = sign before the macro replacement text"); +/*135:*/ +#line 1732 "tangle.web" + +#line 1733 "tangle.web" +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1733 "tangle.web" +; +p->dummy.Ilk= 0; +goto done_scanning; + + +/*:135*/ +#line 1442 "tangle.web" +; +} +/*118:*/ +#line 1451 "tangle.web" + +#line 1452 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>1){ +printf("\nScanning definition of macro ");fflush(stdout),write(1,(p)->byte_start,(((p)+1)->byte_start-((p))->byte_start)); +} +#endif TRACE_MACROS + +/*:118*/ +#line 1444 "tangle.web" +; +{if(tok_ptr==tok_mem_end){{printf("\n! Sorry, capacity exceeded: ");err_print("token");history= 3;wrap_up();};}; *tok_ptr++= next_param_name;}; +scan_repl(1); +p->equiv_or_xref= (ASCII *)cur_text; +/*119:*/ +#line 1458 "tangle.web" + +#line 1459 "tangle.web" +#ifdef TRACE_MACROS +if(tracing>2){ +printf("\nMacro ");fflush(stdout),write(1,(p)->byte_start,(((p)+1)->byte_start-((p))->byte_start)); +printf("'s replacement text is in text_info[%d]",cur_text-text_info); +} +#endif TRACE_MACROS + + +/*:119*/ +#line 1448 "tangle.web" +; +/*112:*/ +#line 1380 "tangle.web" + +#line 1381 "tangle.web" +next_param_name= 0; +next_param_name_text= param_name_texts; +param_names[next_param_name]= next_param_name_text; + +/*:112*/ +#line 1449 "tangle.web" +; + +/*:117*/ +#line 1724 "tangle.web" +; +cur_text->text_link= 0; +} + +/*:134*/ +#line 1705 "tangle.web" +; +/*136:*/ +#line 1738 "tangle.web" + +#line 1739 "tangle.web" +switch(next_control){ +case 253:p= name_dir;break; +case 254:p= cur_module; +/*137:*/ +#line 1750 "tangle.web" + +#line 1751 "tangle.web" +while((next_control= get_next())=='+'); +if(next_control!='='){ +err_print("! C text flushed, = sign is missing"); + +while((next_control= skip_ahead())!=255); +return; +} + +/*:137*/ +#line 1742 "tangle.web" +; +break; +default:return; +} +/*138:*/ +#line 1759 "tangle.web" + +#line 1760 "tangle.web" +store_two_bytes((sixteen_bits)(53248+module_count)); + +/*:138*/ +#line 1746 "tangle.web" +; +scan_repl(254); +/*139:*/ +#line 1762 "tangle.web" + +#line 1763 "tangle.web" +if(p==name_dir||p==0){ +(last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text; +} +else if(p->equiv_or_xref==(ASCII *)text_info)p->equiv_or_xref= (ASCII *)cur_text; + +else{ +q= (text_pointer)p->equiv_or_xref; +while(q->text_link<2000)q= q->text_link+text_info; +q->text_link= cur_text-text_info; +} +cur_text->text_link= 2000; + +/*:139*/ +#line 1748 "tangle.web" +; + +/*:136*/ +#line 1706 "tangle.web" +; +} + +/*:133*//*140:*/ +#line 1775 "tangle.web" +phase_one(){ +#line 1776 "tangle.web" +phase= 1; +module_count= 0; +reset_input(); +while((next_control= skip_ahead())!=255); +while(!input_has_ended)scan_module(); +check_complete(); +phase= 2; +} + +/*:140*//*141:*/ +#line 1785 "tangle.web" +print_stats(){ +#line 1786 "tangle.web" +printf("\nMemory usage statistics:\n"); +printf("%d names (out of %d)\n",name_ptr-name_dir,4000); +printf("%d replacement texts (out of %d)\n",text_ptr-text_info,2000); +printf("%d bytes (out of %d)\n",byte_ptr-byte_mem,90000); +printf("%d tokens (out of %d)\n",tok_ptr-tok_mem,150000); +} + +/*:141*/ |