std::unordered_map read_xar_header()

in xar/XarHelpers.cpp [40:93]


std::unordered_map<std::string, std::string> read_xar_header(
    const char* filename) {
  const auto maybe_header = read_file_prefix(filename, kDefaultHeaderSize);
  if (!maybe_header) {
    XAR_FATAL << "Unable to open or read XAR header from " << filename;
  }
  const auto header = *maybe_header;
  if (header.size() != kDefaultHeaderSize) {
    XAR_FATAL << "Short read of header of " << filename << ", " << header.size()
              << " vs expected " << kDefaultHeaderSize;
  }

  std::unordered_map<std::string, std::string> ret;
  auto lines = tools::xar::split('\n', header);
  for (const auto& line : lines) {
    if (line == "#xar_stop") {
      break;
    }
    if (line.empty() || line[0] == '#') {
      continue;
    }

    auto name_value = tools::xar::split('=', line, 1);
    if (name_value.size() != 2) {
      XAR_FATAL << "malformed header line: " << line;
    }
    std::string name = name_value[0];
    std::string value = name_value[1];

    if (name.empty() || value.size() < 2 || value.front() != '"' ||
        value.back() != '"') {
      XAR_FATAL << "invalid line in xar header: " << line;
    }
    // skip quotes around value
    ret[name] = value.substr(1, value.size() - 2);
  }

  if (ret.find(kOffsetName) == ret.end() ||
      ret[kOffsetName] != std::to_string(kDefaultHeaderSize)) {
    XAR_FATAL << "TODO(chip): support headers other than he default";
  }

  if (ret.find(kUuidName) == ret.end()) {
    XAR_FATAL << "No UUID in XAR header";
  }

  if (debugging) {
    for (const auto& p : ret) {
      std::cerr << "header " << p.first << "=" << p.second << std::endl;
    }
  }

  return ret;
}