/* * Copyright © 2016-2017 Inria. All rights reserved. * * $COPYRIGHT$ * * Additional copyrights may follow * See COPYING in top-level directory. * * $HEADER$ */ #define _GNU_SOURCE /* See feature_test_macros(7) */ #include #include #include #include int netloc_build_comm_mat(char *filename, int *pn, double ***pmat) { FILE *input = fopen(filename, "r"); if (!input ) { perror("fopen"); return NETLOC_ERROR; } char *line = NULL; size_t linesize = 0; char *ptr= NULL; int i,j; j = -1; i = 0; /* Get the number of elements in a line to find the size of the matrix */ netloc_line_get(&line, &linesize, input); int n = 0; char *remain_line = line; while ((ptr = netloc_line_get_next_token(&remain_line, ' '))) { if (!strlen(ptr)) break; n++; } rewind(input); if (!n) { goto error; } double *mat_values = (double *)malloc(sizeof(double[n*n])); double **mat = (double **)malloc(sizeof(double *[n])); for (int i = 0; i < n; i++) { mat[i] = &mat_values[i*n]; } while (netloc_line_get(&line, &linesize, input) != -1) { char *remain_line = line; j = 0; while ((ptr = netloc_line_get_next_token(&remain_line, ' '))){ if (!strlen(ptr)) break; mat[i][j] = atof(ptr); if (mat[i][j] < 0) { fprintf(stderr, "Warning: negative value in comm matrix " "(mat[%d][%d] = %f)\n", i, j, mat[i][j]); } j++; } if (j != n) { fprintf(stderr, "Error at %d %d (%d!=%d). " "Too many columns for %s\n", i, j, j, n, filename); goto error; } i++; } if (i != n) { fprintf(stderr,"Error at %d %d. Too many rows for %s\n", i, j, filename); goto error; } fclose (input); *pn = n; *pmat = mat; free(line); return NETLOC_SUCCESS; error: free(line); free(mat_values); free(mat); *pmat = NULL; *pn = 0; fclose (input); return NETLOC_ERROR; }