#define buf_size 100 \

#define max_include_depth 10 \

#define max_file_name_length 60
#define cur_file file[include_depth]
#define cur_file_name file_name[include_depth]
#define cur_line line[include_depth]
#define web_file file[0]
#define web_file_name file_name[0] \

#define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
strncmp(buffer,change_buffer,limit-buffer)) \

#define max_modules 2000 \
 \

#define spotless 0
#define harmless_message 1
#define error_message 2
#define fatal_message 3
#define mark_harmless {if(history==spotless)history= harmless_message;}
#define mark_error history= error_message \

#define fatal(s1,s2){ \
fprintf(stderr,s1);err_print(s2); \
history= fatal_message;wrap_up(); \
} \

#define confusion(s)fatal("! This can't happen: ",s) \
 \

#define overflow(s){ \
fprintf(stderr,"! Sorry, capacity exceeded: ");fatal("",s); \
} \
 \

#define update_terminal fflush(stdout) \

#line 183 "examples/wmerge-p.ch"

/*1:*/
#line 12 "examples/wmerge.w"

#line 57 "examples/wmerge-p.ch"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*2:*/
#line 71 "examples/wmerge-p.ch"

typedef short boolean;
#ifdef __SASC
typedef unsigned char eight_bits;
#else
typedef char unsigned eight_bits;
#endif
typedef char ASCII;
#line 30 "examples/wmerge.w"

/*:2*//*3:*/
#line 49 "examples/wmerge.w"

ASCII buffer[buf_size];
ASCII*buffer_end= buffer+buf_size-2;
ASCII*limit;
ASCII*loc;

/*:3*//*5:*/
#line 117 "examples/wmerge.w"

int include_depth;
FILE*file[max_include_depth];
FILE*change_file;
char file_name[max_include_depth][max_file_name_length];

char change_file_name[max_file_name_length];
int line[max_include_depth];
int change_line;
boolean input_has_ended;
boolean changing;

/*:5*//*6:*/
#line 140 "examples/wmerge.w"

ASCII change_buffer[buf_size];
ASCII*change_limit;

/*:6*//*17:*/
#line 305 "examples/wmerge.w"

typedef unsigned short sixteen_bits;
sixteen_bits module_count;
boolean changed_module[max_modules];
boolean print_where= 0;

/*:17*//*23:*/
#line 438 "examples/wmerge.w"

int history= spotless;

/*:23*/
#line 60 "examples/wmerge-p.ch"

/*38:*/
#line 183 "examples/wmerge-p.ch"

int input_ln(FILE*fp);
int prime_the_change_buffer(void);
int check_change(void);
int reset_input(void);
int get_line(void);
int put_line(void);
int check_complete(void);
int err_print(char*s);
int wrap_up(void);
int scan_args(int argc,char**argv);
int main(int argc,char**argv);

/*:38*/
#line 61 "examples/wmerge-p.ch"

/*4:*/
#line 90 "examples/wmerge-p.ch"

#line 76 "examples/wmerge.w"
input_ln(fp)
FILE*fp;
{
register int c;
register ASCII*k;
if(feof(fp))return(0);
limit= k= buffer;
while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
if((*(k++)= c)!=32)limit= k;
if(k>buffer_end)
if((c= getc(fp))!=EOF&&c!='\n'){
ungetc(c,fp);loc= buffer;err_print("\n! Input line too long");

}
if(c==EOF&&limit==buffer)return(0);

return(1);
}

/*:4*//*7:*/
#line 150 "examples/wmerge.w"

prime_the_change_buffer()
{
change_limit= change_buffer;
/*8:*/
#line 164 "examples/wmerge.w"

while(1){
change_line++;
if(!input_ln(change_file))return;
if(limit<buffer+2)continue;
if(buffer[0]!=64)continue;
/*9:*/
#line 182 "examples/wmerge.w"

if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;

#line 96 "examples/wmerge-p.ch"
/*:9*/
#line 170 "examples/wmerge.w"
;
/*10:*/
#line 187 "examples/wmerge.w"
{
#line 188 "examples/wmerge.w"
if(buffer[1]==105){
loc= buffer+2;
err_print("! No includes allowed in change file");

}
}

/*:10*/
#line 171 "examples/wmerge.w"
;
if(buffer[1]==120)break;
if(buffer[1]==121||buffer[1]==122){
loc= buffer+2;
err_print("! Where is the matching @x?");

}
}

/*:8*/
#line 154 "examples/wmerge.w"
;
/*11:*/
#line 197 "examples/wmerge.w"

do{
change_line++;
if(!input_ln(change_file)){
err_print("! Change file ended after @x");

return;
}
}while(limit==buffer);

/*:11*/
#line 155 "examples/wmerge.w"
;
/*12:*/
#line 207 "examples/wmerge.w"

{
change_limit= change_buffer-buffer+limit;
strncpy(change_buffer,buffer,limit-buffer+1);
}

/*:12*/
#line 156 "examples/wmerge.w"
;
}

/*:7*//*13:*/
#line 222 "examples/wmerge.w"

check_change()
{
int n= 0;
if(lines_dont_match)return;
while(1){
changing= 1;print_where= 1;change_line++;
if(!input_ln(change_file)){
err_print("! Change file ended before @y");

change_limit= change_buffer;changing= 0;print_where= 1;
return;
}
#line 237 "examples/wmerge.w"
/*14:*/
#line 253 "examples/wmerge.w"

if(limit>buffer+1&&buffer[0]==64){
/*9:*/
#line 182 "examples/wmerge.w"

if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;

#line 96 "examples/wmerge-p.ch"
/*:9*/
#line 255 "examples/wmerge.w"
;
if(buffer[1]==120||buffer[1]==122){
loc= buffer+2;err_print("! Where is the matching @y?");

}
else if(buffer[1]==121){
if(n>0){
loc= buffer+2;
err_print("! Hmm... some of the preceding lines failed to match");

}
return;
}
}

/*:14*/
#line 238 "examples/wmerge.w"
;
/*12:*/
#line 207 "examples/wmerge.w"

{
change_limit= change_buffer-buffer+limit;
strncpy(change_buffer,buffer,limit-buffer+1);
}

/*:12*/
#line 239 "examples/wmerge.w"
;
changing= 0;print_where= 1;cur_line++;
while(!input_ln(cur_file)){
if(include_depth==0){
err_print("! WEB file ended during a change");

input_has_ended= 1;return;
}
include_depth--;print_where= 1;cur_line++;
}
if(lines_dont_match)n++;
}
}

/*:13*//*15:*/
#line 273 "examples/wmerge.w"

reset_input()
{
limit= buffer;loc= buffer+1;buffer[0]= 32;
/*16:*/
#line 286 "examples/wmerge.w"

if((web_file= fopen(web_file_name,"r"))==NULL)
fatal("! Cannot open input file",web_file_name);
if((change_file= fopen(change_file_name,"r"))==NULL)
fatal("! Cannot open change file",change_file_name);

/*:16*/
#line 277 "examples/wmerge.w"
;
cur_line= 0;change_line= 0;include_depth= 0;
changing= 1;prime_the_change_buffer();changing= !changing;
limit= buffer;loc= buffer+1;buffer[0]= 32;input_has_ended= 0;
}

/*:15*//*18:*/
#line 311 "examples/wmerge.w"

get_line()
{
restart:
if(changing)changed_module[module_count]= 1;
else/*20:*/
#line 373 "examples/wmerge.w"
{
cur_line++;
while(!input_ln(cur_file)){
print_where= 1;
if(include_depth==0){input_has_ended= 1;break;}
else{include_depth--;cur_line++;}
}
if(!input_has_ended)
if(limit==change_limit-change_buffer+buffer)
if(buffer[0]==change_buffer[0])
if(change_limit>change_buffer)check_change();
}

/*:20*/
#line 316 "examples/wmerge.w"
;
if(changing){
/*21:*/
#line 386 "examples/wmerge.w"
{
change_line++;
if(!input_ln(change_file)){
err_print("! Change file ended without @z");

buffer[0]= 64;buffer[1]= 122;limit= buffer+2;
}
if(limit>buffer+1)
if(buffer[0]==64){
/*9:*/
#line 182 "examples/wmerge.w"

if(buffer[1]>=88&&buffer[1]<=90||buffer[1]==73)buffer[1]+= 122-90;

#line 96 "examples/wmerge-p.ch"
/*:9*/
#line 395 "examples/wmerge.w"
;
#line 397 "examples/wmerge.w"
if(buffer[1]==120||buffer[1]==121){
loc= buffer+2;err_print("! Where is the matching @z?");

}
else if(buffer[1]==122){
prime_the_change_buffer();changing= !changing;print_where= 1;
}
}
}

/*:21*/
#line 318 "examples/wmerge.w"
;
if(!changing){
changed_module[module_count]= 1;goto restart;
}
}
loc= buffer;*limit= 32;
if(*buffer==64&&(*(buffer+1)==105||*(buffer+1)==73))
/*19:*/
#line 345 "examples/wmerge.w"
{
ASCII*k,*j;
loc= buffer+2;
while(loc<=limit&&(*loc==32||*loc==9||*loc==34))loc++;
if(loc>=limit)err_print("! Include file name not given");

else{
if(++include_depth<max_include_depth){
k= cur_file_name;j= loc;
while(*loc!=32&&*loc!=9&&*loc!=34)*k++= *loc++;
*k= '\0';
if((cur_file= fopen(cur_file_name,"r"))==NULL){
loc= j;
include_depth--;
err_print("! Cannot open include file");

}
else{cur_line= 0;print_where= 1;}
}
else{
include_depth--;
err_print("! Too many nested includes");

}
}
goto restart;
}

/*:19*/
#line 325 "examples/wmerge.w"
;
return(!input_has_ended);
}

#line 119 "examples/wmerge-p.ch"
put_line()
{
char*ptr= buffer;
while(ptr<limit)
{
putchar(*ptr);
*ptr++;
}
putchar('\n');
}
#line 335 "examples/wmerge.w"

/*:18*//*22:*/
#line 410 "examples/wmerge.w"

check_complete(){
if(change_limit!=change_buffer){
strncpy(buffer,change_buffer,change_limit-change_buffer+1);
limit= change_limit-change_buffer+buffer;
changing= 1;loc= change_limit;
err_print("! Change file entry did not match");

}
}

/*:22*//*24:*/
#line 452 "examples/wmerge.w"

err_print(s)
char*s;
{
ASCII*k,*l;
fprintf(stderr,"\n%s",s);
/*25:*/
#line 471 "examples/wmerge.w"

if(changing)fprintf(stderr,". (l. %d of change file)\n",change_line);
else if(include_depth==0)fprintf(stderr,". (l. %d)\n",cur_line);
else fprintf(stderr,". (l. %d of include file %s)\n",cur_line,cur_file_name);
l= (loc>=limit?limit:loc);
if(l>buffer){
for(k= buffer;k<l;k++)
if(*k=='\t')putc(' ',stderr);
else putc(*k,stderr);
putc('\n',stderr);
for(k= buffer;k<l;k++)putc(' ',stderr);
}
for(k= l;k<limit;k++)putc(*k,stderr);
if(*limit==124)putc('|',stderr);
putc(' ',stderr);

/*:25*/
#line 458 "examples/wmerge.w"
;
fflush(stdout);mark_error;
}

/*:24*//*29:*/
#line 517 "examples/wmerge.w"

wrap_up(){
putc('\n',stderr);
/*30:*/
#line 525 "examples/wmerge.w"

switch(history){
case spotless:fprintf(stderr,"(No errors were found.)\n");break;
case harmless_message:
fprintf(stderr,"(Did you see the warning message above?)\n");break;
case error_message:
fprintf(stderr,"(Pardon me, but I think I spotted something wrong.)\n");
break;
case fatal_message:fprintf(stderr,"(That was a fatal error, my friend.)\n");
}

/*:30*/
#line 520 "examples/wmerge.w"
;
if(history>harmless_message)exit(1);
else exit(0);
}

/*:29*//*31:*/
#line 549 "examples/wmerge.w"

#line 550 "examples/wmerge.w"
scan_args(argc,argv)
char**argv;
{
#line 151 "examples/wmerge-p.ch"
char*dot_pos;
#line 554 "examples/wmerge.w"
boolean found_web= 0,found_change= 0;
while(--argc>0){
++argv;
if(!found_web)/*32:*/
#line 570 "examples/wmerge.w"

{
if(strlen(*argv)>max_file_name_length-5)
/*36:*/
#line 600 "examples/wmerge.w"
fatal("! Filename %s too long\n",*argv);

/*:36*/
#line 573 "examples/wmerge.w"
;
#line 158 "examples/wmerge-p.ch"
if((dot_pos= strchr(*argv,'.'))==NULL)
#line 575 "examples/wmerge.w"
sprintf(web_file_name,"%s.w",*argv);
else{
sprintf(web_file_name,"%s",*argv);
*dot_pos= 0;
}
found_web= 1;
}

/*:32*/
#line 557 "examples/wmerge.w"

else if(!found_change)/*33:*/
#line 583 "examples/wmerge.w"

{
if(strlen(*argv)>max_file_name_length-5)
/*36:*/
#line 600 "examples/wmerge.w"
fatal("! Filename %s too long\n",*argv);

/*:36*/
#line 586 "examples/wmerge.w"
;
#line 164 "examples/wmerge-p.ch"
if((dot_pos= strchr(*argv,'.'))==NULL)
#line 588 "examples/wmerge.w"
sprintf(change_file_name,"%s.ch",*argv);
else sprintf(change_file_name,"%s",*argv);
found_change= 1;
}

#line 170 "examples/wmerge-p.ch"
/*:33*/
#line 558 "examples/wmerge.w"

else/*35:*/
#line 595 "examples/wmerge.w"

{
fatal("! Usage: wmerge webfile[.w] [changefile[.ch]]\n","")
}

/*:35*/
#line 559 "examples/wmerge.w"
;
}
if(!found_web)/*35:*/
#line 595 "examples/wmerge.w"

{
fatal("! Usage: wmerge webfile[.w] [changefile[.ch]]\n","")
}

/*:35*/
#line 561 "examples/wmerge.w"
;
if(!found_change)/*34:*/
#line 170 "examples/wmerge-p.ch"

#if defined( __TURBOC__ )
strcpy(change_file_name,"nul");
#elif defined( __SASC )
strcpy(change_file_name,"NIL:");
#else
strcpy(change_file_name,"/dev/null");
#endif
#line 594 "examples/wmerge.w"

/*:34*/
#line 562 "examples/wmerge.w"
;
}

/*:31*/
#line 62 "examples/wmerge-p.ch"

#line 16 "examples/wmerge.w"
main(argc,argv)
char**argv;
{
scan_args(argc,argv);
reset_input();
while(get_line())
put_line();
wrap_up();
}

#line 71 "examples/wmerge-p.ch"
/*:1*/
