/**-------------------------------------------------------------------** ** CLooG ** **-------------------------------------------------------------------** ** cloogmatrix.c ** **-------------------------------------------------------------------**/ /****************************************************************************** * CLooG : the Chunky Loop Generator (experimental) * ****************************************************************************** * * * Copyright (C) 2001-2005 Cedric Bastoul * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * * CLooG, the Chunky Loop Generator * * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * * * ******************************************************************************/ #include #include #include #include "../include/cloog/cloog.h" /** * cloog_matrix_alloc: * Allocate a CloogMatrix data structure with NbRows rows and NbColumns columns. * All values are initialized to 0. * This method returns a pointer to the data structure if successful or a NULL * pointer otherwise. */ CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns) { CloogMatrix *matrix; cloog_int_t **p, *q; int i, j; matrix = (CloogMatrix *)malloc(sizeof(CloogMatrix)); if (!matrix) return NULL; matrix->NbRows = NbRows; matrix->NbColumns = NbColumns; if (!NbRows || !NbColumns) { matrix->p = NULL; matrix->p_Init = NULL; return matrix; } p = (cloog_int_t **)malloc(NbRows * sizeof(cloog_int_t *)); if (p == NULL) { free (matrix); return NULL; } q = (cloog_int_t *)malloc(NbRows * NbColumns * sizeof(cloog_int_t)); if (q == NULL) { free (matrix); free (p); return NULL; } matrix->p = p; matrix->p_Init = q; for (i = 0; i < NbRows; i++) { *p++ = q; for (j = 0; j < NbColumns; j++) { cloog_int_init(*(q+j)); cloog_int_set_si(*(q+j), 0); } q += NbColumns; } return matrix; } /** * cloog_matrix_free: * Free matrix. */ void cloog_matrix_free(CloogMatrix * matrix) { int i; cloog_int_t *p; int size = matrix->NbRows * matrix->NbColumns; p = matrix->p_Init; for (i = 0; i < size; i++) cloog_int_clear(*p++); if (matrix) { free(matrix->p_Init); free(matrix->p); free(matrix); } } /** * Print the elements of CloogMatrix M to file, with each row prefixed * by prefix and suffixed by suffix. */ void cloog_matrix_print_structure(FILE *file, CloogMatrix *M, const char *prefix, const char *suffix) { int i, j; for (i = 0; i < M->NbRows; ++i) { fprintf(file, "%s", prefix); for (j = 0; j < M->NbColumns; ++j) { cloog_int_print(file, M->p[i][j]); fprintf(file, " "); } fprintf(file, "%s\n", suffix); } } /** * cloog_matrix_print function: * This function prints the content of a CloogMatrix structure (matrix) into a * file (foo, possibly stdout). */ void cloog_matrix_print(FILE* foo, CloogMatrix* m) { if (!m) fprintf(foo, "(null)\n"); fprintf(foo, "%d %d\n", m->NbRows, m->NbColumns); cloog_matrix_print_structure(foo, m, "", ""); fflush(foo); } static char *next_line(FILE *input, char *line, unsigned len) { char *p; do { if (!(p = fgets(line, len, input))) return NULL; while (isspace(*p) && *p != '\n') ++p; } while (*p == '#' || *p == '\n'); return p; } CloogMatrix *cloog_matrix_read(FILE *input) { unsigned n_row, n_col; char line[1024]; if (!next_line(input, line, sizeof(line))) cloog_die("Input error.\n"); if (sscanf(line, "%u %u", &n_row, &n_col) != 2) cloog_die("Input error.\n"); return cloog_matrix_read_of_size(input, n_row, n_col); } /** * Read a matrix in PolyLib format from input. */ CloogMatrix *cloog_matrix_read_of_size(FILE *input, unsigned n_row, unsigned n_col) { CloogMatrix *M; int i, j; char line[1024]; char val[1024]; char *p; M = cloog_matrix_alloc(n_row, n_col); if (!M) cloog_die("memory overflow.\n"); for (i = 0; i < n_row; ++i) { int offset; int n; p = next_line(input, line, sizeof(line)); if (!p) cloog_die("Input error.\n"); for (j = 0; j < n_col; ++j) { n = sscanf(p, "%s%n", val, &offset); if (!n) cloog_die("Input error.\n"); cloog_int_read(M->p[i][j], val); p += offset; } } return M; }