File: mmio.c

package info (click to toggle)
graphviz 14.1.2-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 139,476 kB
  • sloc: ansic: 142,288; cpp: 11,975; python: 7,883; makefile: 4,044; yacc: 3,030; xml: 2,972; tcl: 2,495; sh: 1,391; objc: 1,159; java: 560; lex: 423; perl: 243; awk: 156; pascal: 139; php: 58; ruby: 49; cs: 31; sed: 1
file content (122 lines) | stat: -rw-r--r-- 3,434 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*************************************************************************
 * Copyright (c) 2011 AT&T Intellectual Property 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors: Details at https://graphviz.org
 *************************************************************************/
/* 
*   Matrix Market I/O library for ANSI C
*
*   See http://math.nist.gov/MatrixMarket for details.
*
*
*/

#include "config.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <sparse/SparseMatrix.h>
#include <util/prisize_t.h>
#include <util/startswith.h>
#include <util/strcasecmp.h>

#include "mmio.h"

int mm_read_banner(FILE * f, MM_typecode * matcode)
{
    char line[MM_MAX_LINE_LENGTH];
    char banner[MM_MAX_TOKEN_LENGTH] = {0};
    char mtx[MM_MAX_TOKEN_LENGTH] = {0};
    char crd[MM_MAX_TOKEN_LENGTH] = {0};
    char data_type[MM_MAX_TOKEN_LENGTH] = {0};
    char storage_scheme[MM_MAX_TOKEN_LENGTH] = {0};

    *matcode = (MM_typecode){0};

    if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
	return MM_PREMATURE_EOF;

    // note: 63 == MM_MAX_TOKEN_LENGTH - 1
    if (sscanf(line, "%63s %63s %63s %63s %63s", banner, mtx, crd, data_type,
	       storage_scheme) != 5)
	return MM_PREMATURE_EOF;

    /* check for banner */
    if (!startswith(banner, MatrixMarketBanner))
	return MM_NO_HEADER;

    /* first field should be "mtx" */
    if (strcasecmp(mtx, MM_MTX_STR) != 0)
	return MM_UNSUPPORTED_TYPE;

    // second field describes whether this is a sparse matrix (in coordinate
    // storage) or a dense array

    if (strcasecmp(crd, MM_SPARSE_STR) != 0)
	return MM_UNSUPPORTED_TYPE;

    /* third field */

    if (strcasecmp(data_type, MM_REAL_STR) == 0)
	matcode->type = MATRIX_TYPE_REAL;
    else if (strcasecmp(data_type, MM_COMPLEX_STR) == 0)
	matcode->type = MATRIX_TYPE_COMPLEX;
    else if (strcasecmp(data_type, MM_PATTERN_STR) == 0)
	matcode->type = MATRIX_TYPE_PATTERN;
    else if (strcasecmp(data_type, MM_INT_STR) == 0)
	matcode->type = MATRIX_TYPE_INTEGER;
    else
	return MM_UNSUPPORTED_TYPE;


    /* fourth field */

    if (strcasecmp(storage_scheme, MM_GENERAL_STR) == 0)
	matcode->shape = MS_GENERAL;
    else if (strcasecmp(storage_scheme, MM_SYMM_STR) == 0)
	matcode->shape = MS_SYMMETRIC;
    else if (strcasecmp(storage_scheme, MM_HERM_STR) == 0)
	matcode->shape = MS_HERMITIAN;
    else if (strcasecmp(storage_scheme, MM_SKEW_STR) == 0)
	matcode->shape = MS_SKEW;
    else
	return MM_UNSUPPORTED_TYPE;


    return 0;
}

int mm_read_mtx_crd_size(FILE * f, int *M, int *N, size_t *nz) {
    char line[MM_MAX_LINE_LENGTH];
    int num_items_read;

    /* set return null parameter values, in case we exit with errors */
    *M = *N = 0;
    *nz = 0;

    /* now continue scanning until you reach the end-of-comments */
    do {
	if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
	    return MM_PREMATURE_EOF;
    } while (line[0] == '%');

    /* line[] is either blank or has M,N, nz */
    if (sscanf(line, "%d %d %" PRISIZE_T, M, N, nz) == 3)
	return 0;

    else
	do {
	    num_items_read = fscanf(f, "%d %d %" PRISIZE_T, M, N, nz);
	    if (num_items_read == EOF)
		return MM_PREMATURE_EOF;
	}
	while (num_items_read != 3);

    return 0;
}