#include "common.h" int gasort[MAX_CARS]; int grace_results[CTRACKS][MAX_CARS]; int grace_time_results[CTRACKS][MAX_CARS]; int grace_sum[MAX_CARS]; int grace_sumtime[MAX_CARS]; int gcar_number[MAX_CARS]; long gusec_finish[CTRACKS]; // time in usec from reset to car crossing. long gusec_speed[CTRACKS]; // time in usec from front of car to back. int gplaces[CTRACKS]; // storage for what place each tracks car. int girace_num; // current race number. void rawout( char *psz ) { int len=128; len = strlen( psz ); #if 0 asm( "\tmovl\t$4,%eax\n" "\tmovl\t$1,%ebx\n" "\tmovl\t8(%ebp),%ecx\n" "\tmovl\t-4(%ebp),%edx\n" "\tmovl\t$0xffff,%edx\n" "\tint\t$0x80\n" ); #else write( STDOUT_FILENO, psz, len ); #endif fflush( stdout ); } char *inputstring( char *pszprompt ) { char buffer[256]; char *pszret; rawout( pszprompt ); fgets( buffer, 256, stdin ); pszret = malloc( strlen( buffer ) ); buffer[ strlen(buffer)-1 ] = '\0'; strcpy( pszret, buffer ); return( pszret ); } /***************************************************************************/ /* main() */ /* */ /***************************************************************************/ int main(int argc, char *argv[]) { int i; int fnotdone; int icar; int ccar; int sum; FILE *stream; char buffer[256]; char racetxt[256]; char *pszevent; struct termios org_opts; struct termios new_opts; girace_num = -1; CLS(); SET_FOREGROUND_BACKGROUND(39,40); tcgetattr(STDOUT_FILENO, &org_opts); memcpy(&new_opts, &org_opts, sizeof(new_opts)); new_opts.c_lflag &= ~(ICANON | ICRNL ); setvbuf( stdout, 0, _IONBF, 0 ); tcsetattr(STDOUT_FILENO, TCSANOW, &new_opts); SET_FOREGROUND_BACKGROUND(39,40); tcgetattr(STDIN_FILENO, &org_opts); memcpy(&new_opts, &org_opts, sizeof(new_opts)); new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL ); new_opts.c_cc[VMIN] = 1; GOTO_ROW_COL(STATUS_INPUT_LINE,TRACK_COL_START); printf( "Race(eg den1)? " ); fgets( racetxt, 256, stdin ); tcsetattr(STDIN_FILENO, TCSANOW, &new_opts); for ( i = 0; racetxt[i]; i++ ) { if ( racetxt[i] < 32 ) { racetxt[i] = '\0'; continue; } } sprintf( buffer, "%s_.txt", racetxt ); GOTO_ROW_COL(STATUS_INPUT_LINE+1,TRACK_COL_START); printf( "Race %s\n", racetxt ); stream = fopen( buffer, "r" ); if ( stream == NULL ) { ccar = -1; stream = fopen( buffer, "w" ); do { ccar++; if ( ccar >= MAX_CARS ) { fprintf( stderr, "PANIC:More than 20 cars, cannot be handled. Exiting\n" ); exit(2); } GOTO_ROW_COL(STATUS_INPUT_LINE,HEAT_COL_OFFSET); tcsetattr(STDIN_FILENO, TCSANOW, &org_opts); printf( "Car #?:" ); fgets( buffer, 256, stdin ); gcar_number[ccar] = atol(buffer,10); if ( gcar_number[ccar] ) { GOTO_ROW_COL(CAR_NUMBER+ccar*2+1,1); printf("%d ", gcar_number[ccar] ); GOTO_ROW_COL(CAR_NUMBER+ccar*2+1,4); putchar('|'); fprintf( stream, "%d\n", gcar_number[ccar] ); } } while ( gcar_number[ccar] != 0 ); fclose( stream ); tcsetattr(STDIN_FILENO, TCSANOW, &new_opts); } else { ccar = -1; while ( fgets( buffer, 256, stream ) ) { ccar++; if ( ccar >= MAX_CARS ) { fprintf( stderr, "PANIC:More than 20 cars, cannot be handled. Exiting\n" ); exit(2); } gcar_number[ccar] = atol(buffer,10); if ( gcar_number[ccar] ) { GOTO_ROW_COL(CAR_NUMBER+ccar*2+1,1); printf("%d ", gcar_number[ccar] ); GOTO_ROW_COL(CAR_NUMBER+ccar*2+1,4); putchar('|'); } } ccar++; if ( ccar >= MAX_CARS ) { fprintf( stderr, "PANIC:More than 20 cars, cannot be handled. Exiting\n" ); exit(2); } fclose( stream ); } GOTO_ROW_COL(CAR_TRACK,1);printf("\\L |1 |2 |3 |4 |T" ); GOTO_ROW_COL(CAR_TRACK+1,1);printf("Car" ); for ( icar = 0; icar < ccar; icar++ ) { GOTO_ROW_COL(CAR_NUMBER+icar*2,TRACK_NUM_WIDTH+1); printf("-------------------" ); GOTO_ROW_COL(CAR_NUMBER+icar*2+1,TRACK_NUM_WIDTH+1); printf("| | | | " ); } fflush( stdout ); fnotdone = 1; while ( fnotdone ) { do { GOTO_ROW_COL(STATUS_INPUT_LINE,TRACK_COL_START); printf( "Enter n for next race." ); fflush( stdout ); if ( read( 0, buffer, 1 ) != 1 ) { buffer[0] = '\0'; } } while ( buffer[0] == '\0' ); switch ( buffer[0] ) { case 'n': if ( girace_num < (max(ccar,CTRACKS)-1) ) { girace_num++; } else { girace_num = (max(ccar,CTRACKS)-1); } if ( recover_race_data( &(racetxt[0]), girace_num ) == SUCCESS ) { dorace( REDRAW_MPH_STATE, &(racetxt[0]), girace_num, ccar ); } else { dorace( SETUP_STATE, &(racetxt[0]), girace_num, ccar ); } break; case 'p': girace_num--; if ( girace_num < 0 ) { girace_num = 0; } if ( recover_race_data( &(racetxt[0]), girace_num ) == SUCCESS ) { dorace( REDRAW_MPH_STATE, &(racetxt[0]), girace_num, ccar ); } else { dorace( SETUP_STATE, &(racetxt[0]), girace_num, ccar ); } break; case 'q': fnotdone = 0; break; } if ( girace_num == (max(ccar,CTRACKS)-1) ) { heat_stats( ccar ); } } tcsetattr(STDIN_FILENO, TCSANOW, &org_opts); }