148 std::string bankName,
155 std::unordered_set<std::string>
symbols;
156 std::unordered_set<DataTag>
tags;
160 while (std::getline(
input, line))
164 if (line.find(
"DMAKE99: Data file builder ver 2.03") !=
170 constexpr std::string_view
CountPrefix =
"There were ";
172 " unique items in the DF file.";
187 auto view =
trim(line);
189 if (!view.starts_with(
"#define"))
194 view.remove_prefix(std::string_view(
"#define").size());
197 view.begin(), view.end(),
198 [](
char value) { return !isSymbolCharacter(value); });
204 return std::unexpected(makeError(
208 "#define has no symbol"));
214 if (symbol ==
"DEF_blank")
223 return std::unexpected(makeError(
227 "unsupported DMake item prefix in " + symbol));
234 return std::unexpected(makeError(
238 "item tag is not an unsigned decimal or hexadecimal value"));
241 if (*
rawTag > std::numeric_limits<DataTag>::max())
243 return std::unexpected(makeError(
247 "DMake item tag exceeds the 16-bit DataTag space"));
250 const auto tag =
static_cast<DataTag>(*rawTag);
252 if (!
symbols.emplace(symbol).second)
254 return std::unexpected(makeError(
258 "duplicate DMake symbol " + symbol));
261 if (!
tags.emplace(tag).second)
263 return std::unexpected(makeError(
267 "duplicate DMake numeric tag"));
274 return std::unexpected(makeError(
278 "DMake tags must follow their source order from zero"));
281 manifest.entries.push_back({ tag, *type, symbol });
286 return std::unexpected(makeError(
290 "header is not identified as DMAKE99 version 2.03 output"));
295 return std::unexpected(makeError(
299 "DMake declared item count was not found"));
304 return std::unexpected(makeError(
308 "DMake declared item count differs from parsed definitions"));