#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 ) ; 
} 
