
void each_block(std::function <void(const char *, size_t)> f,
 HANDLE fh, size_t bsize) {
  std::vector<char> buff(bsize);
  for (;;) {
    DWORD n = 0;
    if (::ReadFile(fh, &(buff[0]), buff.size(), &n, NULL)) {
      if (n == 0) break; // EOF
      f(&(buff[0]), n);
    } else { // ERR
      throw winsys::win_error<char>(winsys::strsyserr_a());
    }
  }
}

// t@C}CiX̏ꍇ"./-"ȂǂƂ

void each_file(std::function <void(const char *, size_t)> f,
 const std::string &fname, size_t bsize) {
  try {
    if (fname == "-") {
      HANDLE fh = ::GetStdHandle(STD_INPUT_HANDLE); // closesv
      each_block(fh, bsize);
    } else {
      HANDLE fh = ::CreateFile(fname.c_str(), 
       GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, 0, NULL);
      if (fh != INVALID_HANDLE_VALUE) {
        class keeper {
          HANDLE handle;
        public:
          keeper(HANDLE h): handle(h) {}
          ~keeper() { ::CloseHandle(handle); }
        } keep(fh);
        each_block(fh, bsize);
      } else { // ERROR
        throw winsys::win_error<char>(winsys::strsyserr_a());
      }
    }
  } catch (std::exception &e) {
    printf("%s:%s\n", fname.c_str(), e.what());
  } catch (winsys::win_error<char> &e) {
    printf("%s:%s\n", fname.c_str(), e.what());
  } catch (winsys::win_error<wchar_t> &e) {
    printf("%s:%ls\n", fname.c_str(), e.what());
  }
}
