27 #ifndef MLN_IO_FLD_LOAD_HEADER_HH
28 # define MLN_IO_FLD_LOAD_HEADER_HH
35 # include <mln/io/fld/header.hh>
61 # ifndef MLN_INCLUDE_ONLY
68 abort_fld_reader(
const char* msg,
unsigned line = 0)
70 std::cerr <<
"AVS field file reader: " << msg <<
" on line " <<
line << std::endl;
80 std::stringstream ins;
81 std::string line_str, lhs,
rhs;
85 std::getline(file, line_str);
87 if (line_str.compare(0, 5,
"# AVS"))
88 internal::abort_fld_reader(
"Invalid format", line);
90 while (file.good() && file.peek() !=
'\f')
92 std::getline(file, line_str);
106 while (isalnum(c) || c ==
'_')
114 internal::abort_fld_reader(
"Parse error", line);
115 while (isspace(ins.peek()))
123 internal::abort_fld_reader(
"Invalid dimension", line);
124 header.dim =
new int[header.ndim];
125 std::fill(header.dim, header.dim + header.ndim, -1);
127 else if (lhs.compare(0, 3,
"dim") == 0)
129 std::stringstream ss(lhs.substr(3));
132 if (dim < 1 || dim > header.ndim)
133 internal::abort_fld_reader(
"Invalid dimension", line);
135 internal::abort_fld_reader(
"Parse error", line);
136 ins >> header.dim[dim - 1];
137 if (header.dim[dim - 1] < 1)
138 internal::abort_fld_reader(
"Invalid dimension", line);
140 else if (lhs ==
"nspace")
142 ins >> header.nspace;
143 if (header.nspace < 1)
144 internal::abort_fld_reader(
"Invalid space dimension", line);
145 header.min_ext =
new float[header.nspace];
146 header.max_ext =
new float[header.nspace];
148 else if (lhs ==
"veclen")
150 ins >> header.veclen;
151 if (header.veclen == -1)
152 internal::abort_fld_reader(
"Invalid vector length", line);
154 else if (lhs ==
"data")
159 else if (rhs ==
"short")
161 else if (rhs ==
"integer")
163 else if (rhs ==
"float")
165 else if (rhs ==
"double")
168 internal::abort_fld_reader(
"Invalid data type", line);
170 else if (lhs ==
"field")
173 if (rhs !=
"uniform")
174 internal::abort_fld_reader(
"Unhandled field type", line);
177 else if (lhs ==
"min_ext")
179 for (
int i = 0; i < header.ndim; ++i)
181 ins >> header.min_ext[i];
182 if (ins.peek() ==
',')
186 else if (lhs ==
"max_ext")
188 for (
int i = 0; i < header.ndim; ++i)
190 ins >> header.max_ext[i];
191 if (ins.peek() ==
',')
196 internal::abort_fld_reader(
"Parse error", line);
200 if (!rhs.empty() && rhs[0] !=
'#')
201 internal::abort_fld_reader(
"Parse error", line);
205 if (file.get() !=
'\f')
206 internal::abort_fld_reader(
"Parse error", line);
208 if (header.ndim == -1 || header.nspace == -1 || header.veclen == -1 ||
210 internal::abort_fld_reader(
"Invalid format", line);
211 for (
int i = 0; i < header.ndim; ++i)
212 if (header.dim[i] == -1)
213 internal::abort_fld_reader(
"Invalid format", line);
217 # endif // ! MLN_INCLUDE_ONLY
225 #endif // !MLN_IO_FLD_LOAD_HEADER_HH