#include "web2c.h"
/* 9999 */
#define bufsize 500
typedef schar ASCIIcode  ;
typedef file_ptr /* of  char */ textfile  ;
schar history  ;
ASCIIcode xord[128]  ;
char xchr[128]  ;
textfile docfile  ;
textfile changefile  ;
textfile progfile  ;
ASCIIcode buffer[bufsize + 1]  ;
integer line  ;
integer otherline  ;
integer templine  ;
integer limit  ;
boolean inputhasended  ;
boolean changing  ;
ASCIIcode changebuffer[bufsize + 1]  ;
integer changelimit  ;
schar state  ;
char docfilename[121], changefilename[121], progfilename[121]  ;
char progextension[121]  ;

#include "makeprog.h"
error () {
   {
   if ( changing )
   (void) Fputs( stdout ,  ". (change file " ) ;
   else
   (void) Fputs( stdout ,  ". (" ) ;
   (void) fprintf( stdout , "%s%ld%c\n",  "l." , (long)line , ')' ) ;
   (void) putc( ' ' ,  stdout );
 }
 flush ( stdout ) ;
}
scanargs () {
   integer docdotpos, dotpos, i, a, slashpos  ;
 char c  ;
 char fname[121]  ;
 boolean founddoc, foundchange  ;
 progextension [ 1 ] = 'p' ;
 progextension [ 2 ] = 'r' ;
 progextension [ 3 ] = 'o' ;
 progextension [ 4 ] = 'g' ;
 progextension [ 5 ] = ' ' ;
 founddoc = false ;
 foundchange = false ;
 {register integer for_end; a = 1 ; for_end = argc - 1 ; if ( a <= for_end)
 do
   {
     argv ( a , fname ) ;
     if ( fname [ 1 ] != '-' )
     {
       if ( ! founddoc )
       {
         slashpos = 0 ;
         dotpos = -1 ;
         i = 1 ;
         while ( ( fname [ i ] != ' ' ) && ( i <= 115 ) ) {

           docfilename [ i ] = fname [ i ] ;
           if ( fname [ i ] == '.' )
           dotpos = i ;
           else if ( fname [ i ] == '/' )
           {
             slashpos = i ;
             dotpos = -1 ;
           }
           i = i + 1 ;
         }
         if ( dotpos == -1 )
         {
           dotpos = i ;
           docfilename [ dotpos ] = '.' ;
           docfilename [ dotpos + 1 ] = 'd' ;
           docfilename [ dotpos + 2 ] = 'o' ;
           docfilename [ dotpos + 3 ] = 'c' ;
           docfilename [ dotpos + 4 ] = ' ' ;
         }
         dotpos = dotpos - slashpos ;
         {register integer for_end; i = 1 ; for_end = dotpos ; if ( i <=
         for_end) do
           {
             progfilename [ i ] = docfilename [ i + slashpos ] ;
           }
         while ( i++ < for_end ) ; }
         docdotpos = dotpos ;
         founddoc = true ;
       }
       else if ( ! foundchange )
       {
         dotpos = -1 ;
         i = 1 ;
         while ( ( fname [ i ] != ' ' ) && ( i <= 115 ) ) {

           changefilename [ i ] = fname [ i ] ;
           if ( fname [ i ] == '.' )
           dotpos = i ;
           else if ( fname [ i ] == '/' )
           dotpos = -1 ;
           i = i + 1 ;
         }
         if ( dotpos == -1 )
         {
           dotpos = i ;
           changefilename [ dotpos ] = '.' ;
           changefilename [ dotpos + 1 ] = 'c' ;
           changefilename [ dotpos + 2 ] = 'h' ;
           changefilename [ dotpos + 3 ] = ' ' ;
         }
         foundchange = true ;
       }
       else {

         {
           (void) putc('\n',  stdout );
           (void) Fputs( stdout ,              "! Usage: makeprog [-progext] docfile[.doc] [changefile[.ch]]" ) ;
         }
         error () ;
         uexit ( 1 ) ;
       }
     }
     else {

       i = 1 ;
       while ( ( i < 6 ) && ( fname [ i + 1 ] != ' ' ) ) {

         progextension [ i ] = fname [ i + 1 ] ;
         i = i + 1 ;
       }
       progextension [ i ] = ' ' ;
       if ( i > 5 )
       {
         {
           (void) putc('\n',  stdout );
           (void) Fputs( stdout ,              "! Usage: makeprog [-progext] docfile[.doc] [changefile[.ch]]" ) ;
         }
         error () ;
         uexit ( 1 ) ;
       }
     }
   }
 while ( a++ < for_end ) ; }
 if ( ! founddoc )
 {
   {
     (void) putc('\n',  stdout );
     (void) Fputs( stdout ,        "! Usage: makeprog [-progext] docfile[.doc] [changefile[.ch]]" ) ;
   }
   error () ;
   uexit ( 1 ) ;
 }
 {
   i = 1 ;
   if ( progextension [ 1 ] == ' ' )
   progfilename [ dotpos ] = ' ' ;
   else while ( progextension [ i ] != ' ' ) {

     progfilename [ docdotpos + i ] = progextension [ i ] ;
     i = i + 1 ;
   }
 }
 if ( ! foundchange )
 {
   changefilename [ 1 ] = '/' ;
   changefilename [ 2 ] = 'd' ;
   changefilename [ 3 ] = 'e' ;
   changefilename [ 4 ] = 'v' ;
   changefilename [ 5 ] = '/' ;
   changefilename [ 6 ] = 'n' ;
   changefilename [ 7 ] = 'u' ;
   changefilename [ 8 ] = 'l' ;
   changefilename [ 9 ] = 'l' ;
   changefilename [ 10 ] = ' ' ;
 }
}
initialize () {
   schar i  ;
 history = 0 ;
 xchr [ 32 ] = ' ' ;
 xchr [ 33 ] = '!' ;
 xchr [ 34 ] = '"' ;
 xchr [ 35 ] = '#' ;
 xchr [ 36 ] = '$' ;
 xchr [ 37 ] = '%' ;
 xchr [ 38 ] = '&' ;
 xchr [ 39 ] = '\'' ;
 xchr [ 40 ] = '(' ;
 xchr [ 41 ] = ')' ;
 xchr [ 42 ] = '*' ;
 xchr [ 43 ] = '+' ;
 xchr [ 44 ] = ',' ;
 xchr [ 45 ] = '-' ;
 xchr [ 46 ] = '.' ;
 xchr [ 47 ] = '/' ;
 xchr [ 48 ] = '0' ;
 xchr [ 49 ] = '1' ;
 xchr [ 50 ] = '2' ;
 xchr [ 51 ] = '3' ;
 xchr [ 52 ] = '4' ;
 xchr [ 53 ] = '5' ;
 xchr [ 54 ] = '6' ;
 xchr [ 55 ] = '7' ;
 xchr [ 56 ] = '8' ;
 xchr [ 57 ] = '9' ;
 xchr [ 58 ] = ':' ;
 xchr [ 59 ] = ';' ;
 xchr [ 60 ] = '<' ;
 xchr [ 61 ] = '=' ;
 xchr [ 62 ] = '>' ;
 xchr [ 63 ] = '?' ;
 xchr [ 64 ] = '@' ;
 xchr [ 65 ] = 'A' ;
 xchr [ 66 ] = 'B' ;
 xchr [ 67 ] = 'C' ;
 xchr [ 68 ] = 'D' ;
 xchr [ 69 ] = 'E' ;
 xchr [ 70 ] = 'F' ;
 xchr [ 71 ] = 'G' ;
 xchr [ 72 ] = 'H' ;
 xchr [ 73 ] = 'I' ;
 xchr [ 74 ] = 'J' ;
 xchr [ 75 ] = 'K' ;
 xchr [ 76 ] = 'L' ;
 xchr [ 77 ] = 'M' ;
 xchr [ 78 ] = 'N' ;
 xchr [ 79 ] = 'O' ;
 xchr [ 80 ] = 'P' ;
 xchr [ 81 ] = 'Q' ;
 xchr [ 82 ] = 'R' ;
 xchr [ 83 ] = 'S' ;
 xchr [ 84 ] = 'T' ;
 xchr [ 85 ] = 'U' ;
 xchr [ 86 ] = 'V' ;
 xchr [ 87 ] = 'W' ;
 xchr [ 88 ] = 'X' ;
 xchr [ 89 ] = 'Y' ;
 xchr [ 90 ] = 'Z' ;
 xchr [ 91 ] = '[' ;
 xchr [ 92 ] = '\\' ;
 xchr [ 93 ] = ']' ;
 xchr [ 94 ] = '^' ;
 xchr [ 95 ] = '_' ;
 xchr [ 96 ] = '`' ;
 xchr [ 97 ] = 'a' ;
 xchr [ 98 ] = 'b' ;
 xchr [ 99 ] = 'c' ;
 xchr [ 100 ] = 'd' ;
 xchr [ 101 ] = 'e' ;
 xchr [ 102 ] = 'f' ;
 xchr [ 103 ] = 'g' ;
 xchr [ 104 ] = 'h' ;
 xchr [ 105 ] = 'i' ;
 xchr [ 106 ] = 'j' ;
 xchr [ 107 ] = 'k' ;
 xchr [ 108 ] = 'l' ;
 xchr [ 109 ] = 'm' ;
 xchr [ 110 ] = 'n' ;
 xchr [ 111 ] = 'o' ;
 xchr [ 112 ] = 'p' ;
 xchr [ 113 ] = 'q' ;
 xchr [ 114 ] = 'r' ;
 xchr [ 115 ] = 's' ;
 xchr [ 116 ] = 't' ;
 xchr [ 117 ] = 'u' ;
 xchr [ 118 ] = 'v' ;
 xchr [ 119 ] = 'w' ;
 xchr [ 120 ] = 'x' ;
 xchr [ 121 ] = 'y' ;
 xchr [ 122 ] = 'z' ;
 xchr [ 123 ] = '{' ;
 xchr [ 124 ] = '|' ;
 xchr [ 125 ] = '}' ;
 xchr [ 126 ] = '~' ;
 xchr [ 0 ] = ' ' ;
 xchr [ 127 ] = ' ' ;
 {register integer for_end; i = 1 ; for_end = 31 ; if ( i <= for_end) do
   xchr [ i ] = ' ' ;
 while ( i++ < for_end ) ; }
 xchr [ 9 ] = chr ( 9 ) ;
 {register integer for_end; i = 0 ; for_end = 127 ; if ( i <= for_end) do
   xord [ chr ( i ) ] = 32 ;
 while ( i++ < for_end ) ; }
 {register integer for_end; i = 1 ; for_end = 126 ; if ( i <= for_end) do
   xord [ xchr [ i ] ] = i ;
 while ( i++ < for_end ) ; }
 scanargs () ;
 reset ( docfile , docfilename ) ;
 reset ( changefile , changefilename ) ;
 rewrite ( progfile , progfilename ) ;
 state = 2 ;
}
boolean zinputln ( f )
textfile f ;
{register boolean Result; integer finallimit  ;
 limit = 0 ;
 finallimit = 0 ;
 if ( feof ( f ) )
 Result = false ;
 else {

   while ( ! eoln ( f ) ) {

     buffer [ limit ] = xord [ getc ( f ) ] ;
     limit = limit + 1 ;
     if ( ( buffer [ limit - 1 ] != 32 ) && ( buffer [ limit - 1 ] != 9 ) )
     finallimit = limit ;
     if ( limit == bufsize )
     {
       while ( ! eoln ( f ) ) vgetc ( f ) ;
       limit = limit - 1 ;
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Input line too long" ) ;
       }
       error () ;
       history = 2 ;
     }
   }
   readln ( f ) ;
   limit = finallimit ;
   Result = true ;
 }
 return(Result) ;
}
boolean linesdontmatch () {
   /* 10 */ register boolean Result; integer k  ;
 Result = true ;
 if ( changelimit != limit )
 goto lab10 ;
 if ( limit > 0 )
 {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <= for_end)
 do
   if ( changebuffer [ k ] != buffer [ k ] )
   goto lab10 ;
 while ( k++ < for_end ) ; }
 Result = false ;
 lab10: ;
 return(Result) ;
}
primethechangebuffer () {
   /* 22 30 10 */ integer k  ;
 changelimit = 0 ;
 while ( true ) {

   line = line + 1 ;
   if ( ! inputln ( changefile ) )
   goto lab10 ;
   if ( limit < 2 )
   goto lab22 ;
   if ( buffer [ 0 ] != 64 )
   goto lab22 ;
   if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) )
   buffer [ 1 ] = buffer [ 1 ] + 32 ;
   if ( buffer [ 1 ] == 120 )
   goto lab30 ;
   if ( ( buffer [ 1 ] == 121 ) || ( buffer [ 1 ] == 122 ) )
   {
     {
       (void) putc('\n',  stdout );
       (void) Fputs( stdout ,  "! Where is the matching @x?" ) ;
     }
     error () ;
     history = 2 ;
   }
   lab22: ;
 }
 lab30: ;
 do {
     line = line + 1 ;
   if ( ! inputln ( changefile ) )
   {
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Change file ended after @x" ) ;
       }
       error () ;
       history = 2 ;
     }
     goto lab10 ;
   }
 } while ( ! ( limit > 0 ) ) ;
 {
   changelimit = limit ;
   {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <=
   for_end) do
     changebuffer [ k ] = buffer [ k ] ;
   while ( k++ < for_end ) ; }
 }
 lab10: ;
}
checkchange () {
   /* 10 */ integer n  ;
 integer k  ;
 if ( linesdontmatch () )
 goto lab10 ;
 n = 0 ;
 while ( true ) {

   {
     changing = ! changing ;
     templine = otherline ;
     otherline = line ;
     line = templine ;
   }
   line = line + 1 ;
   if ( ! inputln ( changefile ) )
   {
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Change file ended before @y" ) ;
       }
       error () ;
       history = 2 ;
     }
     changelimit = 0 ;
     {
       changing = ! changing ;
       templine = otherline ;
       otherline = line ;
       line = templine ;
     }
     goto lab10 ;
   }
   if ( limit > 1 )
   if ( buffer [ 0 ] == 64 )
   {
     if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) )
     buffer [ 1 ] = buffer [ 1 ] + 32 ;
     if ( ( buffer [ 1 ] == 120 ) || ( buffer [ 1 ] == 122 ) )
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Where is the matching @y?" ) ;
       }
       error () ;
       history = 2 ;
     }
     else if ( buffer [ 1 ] == 121 )
     {
       if ( n > 0 )
       {
         {
           (void) putc('\n',  stdout );
           (void) fprintf( stdout , "%s%ld%s",  "! Hmm... " , (long)n ,             " of the preceding lines failed to match" ) ;
         }
         error () ;
         history = 2 ;
       }
       goto lab10 ;
     }
   }
   {
     changelimit = limit ;
     {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <=
     for_end) do
       changebuffer [ k ] = buffer [ k ] ;
     while ( k++ < for_end ) ; }
   }
   {
     changing = ! changing ;
     templine = otherline ;
     otherline = line ;
     line = templine ;
   }
   line = line + 1 ;
   if ( ! inputln ( docfile ) )
   {
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! CWEB file ended during a change" ) ;
       }
       error () ;
       history = 2 ;
     }
     inputhasended = true ;
     goto lab10 ;
   }
   if ( linesdontmatch () )
   n = n + 1 ;
 }
 lab10: ;
}
getline () {
   /* 20 */ lab20: if ( changing )
 {
   line = line + 1 ;
   if ( ! inputln ( changefile ) )
   {
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Change file ended without @z" ) ;
       }
       error () ;
       history = 2 ;
     }
     buffer [ 0 ] = 64 ;
     buffer [ 1 ] = 122 ;
     limit = 2 ;
   }
   if ( limit > 1 )
   if ( buffer [ 0 ] == 64 )
   {
     if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) )
     buffer [ 1 ] = buffer [ 1 ] + 32 ;
     if ( ( buffer [ 1 ] == 120 ) || ( buffer [ 1 ] == 121 ) )
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Where is the matching @z?" ) ;
       }
       error () ;
       history = 2 ;
     }
     else if ( buffer [ 1 ] == 122 )
     {
       primethechangebuffer () ;
       {
         changing = ! changing ;
         templine = otherline ;
         otherline = line ;
         line = templine ;
       }
     }
   }
 }
 if ( ! changing )
 {
   {
     line = line + 1 ;
     if ( ! inputln ( docfile ) )
     inputhasended = true ;
     else if ( changelimit > 0 )
     checkchange () ;
   }
   if ( changing )
   goto lab20 ;
 }
 buffer [ limit ] = 32 ;
 if ( ( line % 500 ) == 0 )
 {
   (void) fprintf( stdout , "%ld",  (long)line ) ;
   flush ( stdout ) ;
 }
 else if ( ( line % 100 ) == 0 )
 {
   (void) putc( '.' ,  stdout );
   flush ( stdout ) ;
 }
}
putline () {
   integer i  ;
 {register integer for_end; i = 0 ; for_end = limit - 1 ; if ( i <= for_end)
 do
   (void) putc( xchr [ buffer [ i ] ] ,  progfile );
 while ( i++ < for_end ) ; }
 (void) putc('\n',  progfile );
}
main_body() {

 initialize () ;
 (void) fprintf( stdout , "%s\n",  "This is MAKEPROG, C Version 1.0.1." ) ;
 (void) fprintf( stdout , "%s\n",  "    (c) 1988,1990 by J.Schrod." ) ;
 (void) fprintf( stdout , "%s\n",  "        All rights reserved." ) ;
 {
   line = 0 ;
   otherline = 0 ;
   changing = true ;
   primethechangebuffer () ;
   {
     changing = ! changing ;
     templine = otherline ;
     otherline = line ;
     line = templine ;
   }
   limit = 0 ;
   buffer [ 0 ] = 32 ;
   inputhasended = false ;
 }
 {
   getline () ;
   while ( ! inputhasended ) {

     {
       if ( buffer [ 0 ] == 92 )
       if ( limit >= 10 )
       {
         if ( ( buffer [ 1 ] == 98 ) && ( buffer [ 2 ] == 101 ) && ( buffer [
         3 ] == 103 ) && ( buffer [ 4 ] == 105 ) && ( buffer [ 5 ] == 110 )
         && ( buffer [ 6 ] == 112 ) && ( buffer [ 7 ] == 114 ) && ( buffer [
         8 ] == 111 ) && ( buffer [ 9 ] == 103 ) && ( ( buffer [ 10 ] < 65 )
         || ( buffer [ 10 ] > 90 ) ) && ( ( buffer [ 10 ] < 97 ) || ( buffer
         [ 10 ] > 122 ) ) )
         state = 0 ;
       }
       else if ( limit >= 8 )
       if ( ( buffer [ 1 ] == 101 ) && ( buffer [ 2 ] == 110 ) && ( buffer [
       3 ] == 100 ) && ( buffer [ 4 ] == 112 ) && ( buffer [ 5 ] == 114 ) &&
       ( buffer [ 6 ] == 111 ) && ( buffer [ 7 ] == 103 ) && ( ( buffer [ 8 ]
       == 32 ) || ( buffer [ 8 ] == 9 ) ) )
       state = 2 ;
     }
     if ( state == 1 )
     putline () ;
     else if ( state == 0 )
     state = 1 ;
     getline () ;
   }
   if ( state == 1 )
   {
     {
       (void) putc('\n',  stdout );
       (void) Fputs( stdout ,  "! Input has ended prematurely" ) ;
     }
     error () ;
     history = 2 ;
   }
 }
 {
   if ( changelimit != 0 )
   {
     {register integer for_end; limit = 0 ; for_end = changelimit ; if (
     limit <= for_end) do
       buffer [ limit ] = changebuffer [ limit ] ;
     while ( limit++ < for_end ) ; }
     limit = changelimit ;
     changing = true ;
     line = otherline ;
     {
       {
         (void) putc('\n',  stdout );
         (void) Fputs( stdout ,  "! Change file entry did not match" ) ;
       }
       error () ;
       history = 2 ;
     }
   }
 }
 lab9999: switch ( history )
 {case 0 :
   {
     (void) putc('\n',  stdout );
     (void) Fputs( stdout ,  "(No errors were found.)" ) ;
   }
   break ;
 case 1 :
   {
     (void) putc('\n',  stdout );
     (void) Fputs( stdout ,  "(Did you see the warning message above?)" ) ;
   }
   break ;
 case 2 :
   {
     (void) putc('\n',  stdout );
     (void) Fputs( stdout ,  "(Pardon me, but I think I spotted something wrong.)" )
     ;
   }
   break ;
 case 3 :
   {
     (void) putc('\n',  stdout );
     (void) Fputs( stdout ,  "(That was a fatal error, my friend.)" ) ;
   }
   break ;
 }
 (void) putc('\n',  stdout );
 if ( ( history != 0 ) && ( history != 1 ) )
 exit ( 1 ) ;
 else exit ( 0 ) ;
}