1
0
Files
Laboratori-OS/Lab06/sort.c
2024-03-22 16:54:05 +01:00

86 lines
1.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#define BUF_SIZE 2048
int **matrix;
int lines[100];
char filenames[2][10] = {"foo", "bar"};
int cmpfunc (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
int count_lines(FILE* file)
{
char buf[BUF_SIZE];
int counter = 0;
for(;;)
{
size_t res = fread(buf, 1, BUF_SIZE, file);
if (ferror(file))
return -1;
int i;
for(i = 0; i < res; i++)
if (buf[i] == '\n')
counter++;
if (feof(file))
break;
}
return counter;
}
void *sort(void * vargs) {
int num = (int) vargs;
FILE * fin = fopen(filenames[num], "r");
lines[num] = count_lines(fin);
fseek(fin,0L,SEEK_SET);
matrix[num] = malloc(lines[num]*sizeof(int));
for (int i = 0; i < lines[num]; i++) fscanf(fin, "%d", &matrix[num][i]);
fclose(fin);
qsort(matrix[num], lines[num], sizeof(int), cmpfunc);
return NULL;
}
int main(int argc, char ** argv) {
pthread_t tids[2];
int tmp[1000], res[1000], cur_len;
matrix = malloc(2*sizeof(int *));
pthread_create(&tids[0], NULL, sort, (void *)0);
pthread_create(&tids[1], NULL, sort, (void *)1);
for (int i = 0; i<2; i++) {
pthread_join(tids[i], NULL);
if (i == 0) {
memcpy(res, matrix[i], sizeof(int)*lines[i]);
cur_len = lines[i];
continue;
}
int a = 0, b = 0, j = 0;
while (a<cur_len && b<lines[i]) {
tmp[j++] = (res[a] > matrix[i][b]) ? matrix[i][b++] : res[a++];
}
while (a<cur_len) tmp[j++] = res[a++];
while (b<lines[i]) tmp[j++] = matrix[i][b++];
cur_len += lines[i];
memcpy(res, tmp, sizeof(int)*cur_len);
}
for (int i = 0; i<cur_len;i++) {
printf("%d ",res[i]);
}
return 0;
}