Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define end( result ) { fclose( output ); fclose( expected ); fclose(flog); return( result ); }
- enum name3{
- unlock = 0,
- lock = 1
- };
- struct name2{
- name3 type;
- int index;
- };
- struct name1{
- int cnt;
- name2 *steps;
- } seqs[ 2 ];
- void readseq( FILE *f, int s ) {
- fscanf( f, " %d", &seqs[ s ].cnt );
- seqs[ s ].steps = new name2[seqs[s].cnt];//malloc( seqs[ s ].cnt * sizeof(name2) );
- for( int i = 0; i < seqs[ s ].cnt; ++ i ) {
- char type[4];
- fscanf( f, "%s %d", type, &seqs[ s ].steps[ i ].index );
- seqs[ s ].steps[ i ].index--;
- seqs[ s ].steps[ i ].type = ( type[2] == 'S' )?lock:unlock;
- }
- }
- int main( int argc, char *argv[] ) {
- if( argc < 4 ) {
- fprintf( stderr, "check input output expected \n" );
- return 2;
- }
- FILE *output = fopen( argv[ 2 ], "rt" );
- FILE *expected = fopen( argv[ 3 ], "rt" );
- FILE* flog = fopen(argv[4],"w");
- int deadlock;
- fscanf( expected, "%d", &deadlock );
- if( deadlock ) {
- FILE *input = fopen( argv[ 1 ], "rt" );
- int run_cnt;
- fscanf( input, "%d", &run_cnt );
- char *runways = new char[run_cnt]; // malloc( run_cnt * sizeof *runways );
- memset( runways, 0, run_cnt * sizeof *runways );
- readseq( input, 0 );
- readseq( input, 1 );
- fclose( input );
- int pos[ 2 ] = { 0, 0 };
- char inp;
- while( ( inp = fgetc( output ) ) != EOF ) {
- int seqi;
- if( inp == '1' )
- seqi = 0;
- else if( inp == '2' )
- seqi = 1;
- else
- continue; /*Something else - like space, do not care */
- if( pos[ seqi ] >= seqs[ seqi ].cnt ) {
- fprintf( flog, "No more actions in the sequence\n" );
- end( 1 );
- }
- if( runways[ seqs[ seqi ].steps[ pos[ seqi ] ].index ] && seqs[ seqi ].steps[ pos[ seqi ] ].type ) {
- fprintf( flog, "That one is already locked (%d, %d)\n", pos[0]+1, pos[1]+1 );
- end( 1 );
- }
- runways[ seqs[ seqi ].steps[ pos[ seqi ] ].index ] = seqs[ seqi ].steps[ pos[ seqi ] ].type;
- pos[ seqi ] ++;
- }
- if( ( pos[ 0 ] == seqs[ 0 ].cnt ) || ( pos[ 1 ] == seqs[ 1 ].cnt ) ) {
- fprintf( flog, "Run out of sequence\n" );
- end( 1 );
- }
- if( ( seqs[ 0 ].steps[ pos[ 0 ] ].type ) && ( runways[ seqs[ 0 ].steps[ pos[ 0 ] ].index ] ) &&
- ( seqs[ 0 ].steps[ pos[ 0 ] ].type ) && ( runways[ seqs[ 0 ].steps[ pos[ 0 ] ].index ] ) ) {
- fprintf(flog, "OK");
- end( 0 );
- } else {
- fprintf( flog, "Not a deadlock\n" );
- end( 1 );
- }
- } else {
- char result[ 100 ];
- fgets( result, 100, output );
- if( strlen( result ) && ( result[ strlen( result ) - 1 ] == '\n' ) )
- result[ strlen( result ) - 1 ] = '\0';
- if( strcmp( "The performances will always finish.", result ) == 0 ) {
- fprintf(flog, "OK Impossible");
- end( 0 );
- } else {
- fprintf( flog, "False alarm\n" );
- end( 1 );
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement