27 #ifndef MLN_IO_FLD_LOAD_HEADER_HH
28 # define MLN_IO_FLD_LOAD_HEADER_HH
35 # include <mln/io/fld/header.hh>
59 # ifndef MLN_INCLUDE_ONLY
66 abort_fld_reader(
const char* msg,
unsigned line = 0)
68 std::cerr <<
"AVS field file reader: " << msg <<
" on line " <<
line << std::endl;
78 std::stringstream ins;
79 std::string line_str, lhs, rhs;
83 std::getline(file, line_str);
85 if (line_str.compare(0, 5,
"# AVS"))
86 internal::abort_fld_reader(
"Invalid format", line);
88 while (file.good() && file.peek() !=
'\f')
90 std::getline(file, line_str);
104 while (isalnum(c) || c ==
'_')
112 internal::abort_fld_reader(
"Parse error", line);
113 while (isspace(ins.peek()))
121 internal::abort_fld_reader(
"Invalid dimension", line);
122 header.dim =
new int[header.ndim];
123 std::fill(header.dim, header.dim + header.ndim, -1);
125 else if (lhs.compare(0, 3,
"dim") == 0)
127 std::stringstream ss(lhs.substr(3));
130 if (dim < 1 || dim > header.ndim)
131 internal::abort_fld_reader(
"Invalid dimension", line);
133 internal::abort_fld_reader(
"Parse error", line);
134 ins >> header.dim[dim - 1];
135 if (header.dim[dim - 1] < 1)
136 internal::abort_fld_reader(
"Invalid dimension", line);
138 else if (lhs ==
"nspace")
140 ins >> header.nspace;
141 if (header.nspace < 1)
142 internal::abort_fld_reader(
"Invalid space dimension", line);
143 header.min_ext =
new float[header.nspace];
144 header.max_ext =
new float[header.nspace];
146 else if (lhs ==
"veclen")
148 ins >> header.veclen;
149 if (header.veclen == -1)
150 internal::abort_fld_reader(
"Invalid vector length", line);
152 else if (lhs ==
"data")
156 header.data = data_type::BYTE;
157 else if (rhs ==
"short")
158 header.data = data_type::SHORT;
159 else if (rhs ==
"integer")
160 header.data = data_type::INTEGER;
161 else if (rhs ==
"float")
162 header.data = data_type::FLOAT;
163 else if (rhs ==
"double")
164 header.data = data_type::DOUBLE;
166 internal::abort_fld_reader(
"Invalid data type", line);
168 else if (lhs ==
"field")
171 if (rhs !=
"uniform")
172 internal::abort_fld_reader(
"Unhandled field type", line);
173 header.field = field_type::UNIFORM;
175 else if (lhs ==
"min_ext")
177 for (
int i = 0; i < header.ndim; ++i)
179 ins >> header.min_ext[i];
180 if (ins.peek() ==
',')
184 else if (lhs ==
"max_ext")
186 for (
int i = 0; i < header.ndim; ++i)
188 ins >> header.max_ext[i];
189 if (ins.peek() ==
',')
194 internal::abort_fld_reader(
"Parse error", line);
198 if (!rhs.empty() && rhs[0] !=
'#')
199 internal::abort_fld_reader(
"Parse error", line);
203 if (file.get() !=
'\f')
204 internal::abort_fld_reader(
"Parse error", line);
206 if (header.ndim == -1 || header.nspace == -1 || header.veclen == -1 ||
207 header.data == data_type::UNKNOWN || header.field == field_type::UNKNOWN)
208 internal::abort_fld_reader(
"Invalid format", line);
209 for (
int i = 0; i < header.ndim; ++i)
210 if (header.dim[i] == -1)
211 internal::abort_fld_reader(
"Invalid format", line);
215 # endif // ! MLN_INCLUDE_ONLY
223 #endif // !MLN_IO_FLD_LOAD_HEADER_HH