/* basic matrix library for comp309 */ /* written by ian a. mason @ une march 15 '99 */ /* touched up august '02 */ /* rows & columns are numbers 1 through dimension */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int get_slot(int fd, int matrix_size, int row, int col, int *slot){ if((row <= 0) || (col <= 0) || (row > matrix_size) || (col > matrix_size)){ fprintf(stderr,"indexes out of range"); return -1; } else { off_t offset = (((row - 1)*matrix_size) + (col - 1))*sizeof(int); if(offset < 0){ fprintf(stderr,"offset overflow"); return -1; } else if(lseek(fd, offset, 0) < 0){ perror("lseek failed"); return -1; } else if(read(fd, slot, sizeof(int)) < 0){ perror("read failed"); return -1; }; return 0; } } int set_slot(int fd, int matrix_size, int row, int col, int value){ if((row <= 0) || (col <= 0) || (row > matrix_size) || (col > matrix_size)){ fprintf(stderr,"indexes out of range"); return -1; } else { off_t offset = (((row - 1)*matrix_size) + (col - 1))*sizeof(int); if(offset < 0){ fprintf(stderr,"offset overflow"); return -1; } else if(lseek(fd, offset, 0) < 0){ perror("lseek failed"); return -1; } else if(write(fd, &value, sizeof(int)) < 0){ perror("write failed"); return -1; }; return 0; } } int get_row(int fd, int matrix_size, int row, int matrix_row[]){ int column; if(row > matrix_size){ fprintf(stderr,"index out of range"); return -1; } else { off_t offset = ((row - 1) * matrix_size)*sizeof(int); if(offset < 0){ fprintf(stderr,"offset overflow"); return -1; } else if(lseek(fd, offset, 0) < 0){ perror("lseek failed"); return -1; } else for(column = 0; column < matrix_size; column++) if(read(fd, &matrix_row[column], sizeof(int)) < 0){ fprintf(stderr,"read failed column = %d\n",column); perror("read failed"); return -1; }; return 0; } } int set_row(int fd, int matrix_size, int row, int matrix_row[]){ if(row > matrix_size){ fprintf(stderr,"indexes out of range"); return -1; } else { int column; off_t offset = ((row - 1) * matrix_size)*sizeof(int); if(offset < 0){ fprintf(stderr,"offset overflow"); return -1; } else if(lseek(fd, offset, 0) < 0){ perror("lseek failed"); return -1; } else for(column = 0; column < matrix_size; column++) if(write(fd, &matrix_row[column], sizeof(int)) < 0){ perror("write failed"); return -1; }; return 0; } } int get_column(int fd, int matrix_size, int col, int matrix_col[]){ int row; if(col > matrix_size){ fprintf(stderr,"index out of range"); return -1; } else { off_t offset; for(row = 1; row <= matrix_size; row++){ offset = ((row - 1) * matrix_size + (col - 1)) * sizeof(int); if(offset < 0){ fprintf(stderr,"offset overflow"); return -1; } else if(lseek(fd, offset, 0) < 0){ perror("lseek failed"); return -1; } else if(read(fd, &matrix_col[row - 1], sizeof(int)) < 0){ fprintf(stderr,"read failed row = %d\n", row); perror("read failed"); return -1; }; } return 0; } }