// Created by Matt Bessey on 18/01/2012.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int x;
int y;
int value;
} point;
typedef struct l{
point point;
struct l* next;
} list;
typedef struct {
int n;
int m;
int elements;
list* first;
} matrix_list;
typedef struct y{
int n;
int m;
int elements;
int *IA;
int *JA;
int *A;
} yale;
matrix_list* readMatrix(FILE*);
int convertMatrix(matrix_list*, yale*);
matrix_list* readMatrix(FILE* file){
matrix_list* m = calloc(1, sizeof(matrix_list));
fscanf (file, "%d %*c ", &m->n);
fscanf (file, "%d", &m->m);
list* a = calloc(1, sizeof(list));
fscanf(file, "%d %*c%d %*c%d",&a->point.x,&a->point.y,&a->point.value);
m->first = a;
list* end = a;
m->elements = 1;
for(char c = fgetc(file); c != EOF; c = fgetc(file)){
ungetc(c, file);
list* b = calloc(1,sizeof(list));
fscanf(file, "%d %*c%d %*c%d",&b->point.x,&b->point.y,&b->point.value);
end->next = b;
end = b;
m->elements++;
//printf("%d,%d,%d\n",b->point.x,b->point.y,b->point.value);
}
return m;
}
int convertMatrix(matrix_list* input, yale* output){
int matrix_elements = input->elements;
int matrix_rows = input->m;
int* A = (int*)calloc(matrix_elements, sizeof(int));
int* IA = (int*)calloc(matrix_rows + 1, sizeof(int));
int* JA = (int*)calloc(matrix_elements, sizeof(int));
printf("%d elements\n",matrix_elements);
output->A = A; // Value
output->IA = IA; // Row (X)
output->JA = JA; // Column (Y)
output->elements = matrix_elements;
output->m = matrix_rows;
output->n = input->n;
list* tmp_list = input->first;
for(int i = 0, j = 0, tmp_y = 0; i < matrix_elements && tmp_list!=NULL; i++){
printf("Input Value: %d \n",tmp_list->point.value);
A[i] = tmp_list->point.value;
// Initialise the first row
if(i == 0) IA[0] = tmp_list->point.x;
else{
// Add a new row index
if(tmp_y != tmp_list->point.x){
j++;
IA[j] = i;
tmp_y = tmp_list->point.x;
}
}
JA[i] = tmp_list->point.y;
tmp_list = tmp_list->next;
}
for(int i = 0; i < matrix_elements; i++)
printf("%d,",output->A[i]);
printf("\n");
for(int i = 0; i < matrix_rows + 1; i++)
printf("%d,",output->IA[i]);
printf("\n");
for(int i = 0; i < matrix_elements; i++)
printf("%d,",output->JA[i]);
return 1;
}
int main (int argc, const char * argv[])
{
if (argc==1) {
perror("No arguments provided\n");
return -1;
}
FILE* pFile;
pFile = fopen(argv[2], "r");
if (pFile == NULL) {
perror("Couldn't open file\n");
return -1;
} else {
//printf("Opened file %s\n",argv[1]);
}
matrix_list* pre_yale = readMatrix(pFile);
yale yale;
convertMatrix(pre_yale, &yale);
if (!strncmp(argv[1], "stage3", 6)){
printf("\n\nBegin Main\n\n");
for(int i = 0; i < yale.elements; i++)
printf("%d,",yale.A[i]);
printf("\n");
for(int i = 0; i < yale.m + 1; i++)
printf("%d,",yale.IA[i]);
printf("\n");
for(int i = 0; i < yale.elements; i++)
printf("%d,",yale.JA[i]);
}
printf("\n");
fclose(pFile);
return 0;
}