#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * read_file( void * args );
int compare( const void * a, const void * b);

int array[3][100000] = { { 0 } };

main()
{
  int threadnum;
  pthread_t tid[3]; 
  pthread_attr_t attr[3];
  for( threadnum = 0; threadnum < 3; threadnum++ ){
    pthread_attr_init( &attr[threadnum] );
    pthread_create( &tid[threadnum], &attr[threadnum], read_file, (void*)threadnum );
  }
  for( threadnum = 0; threadnum < 3; threadnum++ ){
    pthread_join( tid[threadnum], NULL );
  }
  FILE *f;
  if( !( f = fopen( "sorted.dat", "w" ) ) ){
    printf( "Error opening file sorted.dat\n" );
  }
  int a = 0, b = 0, c = 0, d = 0, lowest;
  while( d < 299999 ){
    if( array[0][a] <= array[1][b] && array[0][a] <= array[2][c] && a < 100000 ){
      lowest = array[0][a];
      a++;
    }else if( array[1][b] <= array[0][a] && array[1][b] <= array[2][c] && b < 100000){
      lowest = array[1][b]; 
      b++;
    }else{
      lowest = array[2][c];
      c++;
    }
    fprintf( f, "%d\n", lowest );
    d++;
  }
  fclose( f );
}

void * read_file( void * args )
{
  int i = 0;
  int threadnum = (int)args;
  FILE *f;
  char line[10];
  char file[50] = "mergedata#.dat";
  file[9] = 49 + threadnum;
  printf( "Opening file %s\n", file );
  if( !( f = fopen( file, "r" ) ) ){
    printf( "Error opening file %s\n", file );
  }
  while( fgets( line, 10, f )){
    array[threadnum][i] = atoi( line );
    i++;
  }
  fclose( f );
  printf( "Thread %d finnished reading, starting sort\n", threadnum );
  qsort( array[threadnum], 100000, sizeof( int ), compare );
  printf( "Thread %d finnished sorting\n", threadnum );
  pthread_exit( 0 );
}

int compare( const void * a, const void * b )
{
  return ( *( int* )a - *( int* )b );
}

