/* See stmatrix.h */ /* Last edited on 2003-08-29 02:07:06 by stolfi */ #include #include #include #include #include #include #include #include #include /* IMPLEMENTATIONS */ Matrix st_read_Matrix(char *name) { affirm(name != NULL, "no file name given"); affirm(strlen(name) != 0, "empty file name"); FILE *rd = (strcmp(name, "-") == 0 ? stdin : open_read(name)); Matrix M = st_fread_Matrix(rd); if (rd != stdin) { fclose(rd); } return M; } Matrix st_fread_Matrix(FILE *rd) { int nel = nget_int(rd, "elems"); fget_eol(rd); Matrix M = Matrix_new(nel); int i; for (i = 0; i < nel; i++) { MatEntry *e = &(M.el[i]); e->row = fget_int(rd); e->col = fget_int(rd); e->val = fget_double(rd); fget_eol(rd); } return M; } void st_write_Matrix(char *name, Matrix M) { affirm(name != NULL, "no file name given"); affirm(strlen(name) != 0, "empty file name"); FILE *wr = (strcmp(name, "-") == 0 ? stdout : open_write(name)); st_fwrite_Matrix(wr, M); if (wr != stdout) { fclose(wr); } } void st_fwrite_Matrix(FILE *wr, Matrix M) { int i; fprintf(wr, "elems = %d\n", M.nel); for (i = 0; i < M.nel; i++) { MatEntry *e = &(M.el[i]); fprintf(wr, "%5d %5d %24.16e\n", e->row, e->col, e->val); } fflush(wr); } Matrix Matrix_new(nat nel) { /* This is not a macro only because gcc does not allow cast of struct: */ vec_t v = vec_new(nel, sizeof(MatEntry)); Matrix r; r.nel = v.nel; r.el = (MatEntry *)v.el; return r; }