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