git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/test/gtest-extra.cc

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Formatting library for C++ - custom Google Test assertions
f8deb5b9 Poul Sander 2022-01-15 13:55 2
//
f8deb5b9 Poul Sander 2022-01-15 13:55 3
// Copyright (c) 2012 - present, Victor Zverovich
f8deb5b9 Poul Sander 2022-01-15 13:55 4
// All rights reserved.
f8deb5b9 Poul Sander 2022-01-15 13:55 5
//
f8deb5b9 Poul Sander 2022-01-15 13:55 6
// For the license information refer to format.h.
f8deb5b9 Poul Sander 2022-01-15 13:55 7
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include "gtest-extra.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#if FMT_USE_FCNTL
f8deb5b9 Poul Sander 2022-01-15 13:55 11
f8deb5b9 Poul Sander 2022-01-15 13:55 12
using fmt::file;
f8deb5b9 Poul Sander 2022-01-15 13:55 13
f8deb5b9 Poul Sander 2022-01-15 13:55 14
output_redirect::output_redirect(FILE* f) : file_(f) {
f8deb5b9 Poul Sander 2022-01-15 13:55 15
  flush();
f8deb5b9 Poul Sander 2022-01-15 13:55 16
  int fd = FMT_POSIX(fileno(f));
f8deb5b9 Poul Sander 2022-01-15 13:55 17
  // Create a file object referring to the original file.
f8deb5b9 Poul Sander 2022-01-15 13:55 18
  original_ = file::dup(fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 19
  // Create a pipe.
f8deb5b9 Poul Sander 2022-01-15 13:55 20
  file write_end;
f8deb5b9 Poul Sander 2022-01-15 13:55 21
  file::pipe(read_end_, write_end);
f8deb5b9 Poul Sander 2022-01-15 13:55 22
  // Connect the passed FILE object to the write end of the pipe.
f8deb5b9 Poul Sander 2022-01-15 13:55 23
  write_end.dup2(fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 24
}
f8deb5b9 Poul Sander 2022-01-15 13:55 25
f8deb5b9 Poul Sander 2022-01-15 13:55 26
output_redirect::~output_redirect() FMT_NOEXCEPT {
f8deb5b9 Poul Sander 2022-01-15 13:55 27
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 28
    restore();
f8deb5b9 Poul Sander 2022-01-15 13:55 29
  } catch (const std::exception& e) {
f8deb5b9 Poul Sander 2022-01-15 13:55 30
    std::fputs(e.what(), stderr);
f8deb5b9 Poul Sander 2022-01-15 13:55 31
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 32
}
f8deb5b9 Poul Sander 2022-01-15 13:55 33
f8deb5b9 Poul Sander 2022-01-15 13:55 34
void output_redirect::flush() {
f8deb5b9 Poul Sander 2022-01-15 13:55 35
  int result = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  do {
f8deb5b9 Poul Sander 2022-01-15 13:55 37
    result = fflush(file_);
f8deb5b9 Poul Sander 2022-01-15 13:55 38
  } while (result == EOF && errno == EINTR);
f8deb5b9 Poul Sander 2022-01-15 13:55 39
  if (result != 0) throw fmt::system_error(errno, "cannot flush stream");
f8deb5b9 Poul Sander 2022-01-15 13:55 40
}
f8deb5b9 Poul Sander 2022-01-15 13:55 41
f8deb5b9 Poul Sander 2022-01-15 13:55 42
void output_redirect::restore() {
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  if (original_.descriptor() == -1) return;  // Already restored.
f8deb5b9 Poul Sander 2022-01-15 13:55 44
  flush();
f8deb5b9 Poul Sander 2022-01-15 13:55 45
  // Restore the original file.
f8deb5b9 Poul Sander 2022-01-15 13:55 46
  original_.dup2(FMT_POSIX(fileno(file_)));
f8deb5b9 Poul Sander 2022-01-15 13:55 47
  original_.close();
f8deb5b9 Poul Sander 2022-01-15 13:55 48
}
f8deb5b9 Poul Sander 2022-01-15 13:55 49
f8deb5b9 Poul Sander 2022-01-15 13:55 50
std::string output_redirect::restore_and_read() {
f8deb5b9 Poul Sander 2022-01-15 13:55 51
  // Restore output.
f8deb5b9 Poul Sander 2022-01-15 13:55 52
  restore();
f8deb5b9 Poul Sander 2022-01-15 13:55 53
f8deb5b9 Poul Sander 2022-01-15 13:55 54
  // Read everything from the pipe.
f8deb5b9 Poul Sander 2022-01-15 13:55 55
  std::string content;
f8deb5b9 Poul Sander 2022-01-15 13:55 56
  if (read_end_.descriptor() == -1) return content;  // Already read.
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  enum { BUFFER_SIZE = 4096 };
f8deb5b9 Poul Sander 2022-01-15 13:55 58
  char buffer[BUFFER_SIZE];
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  size_t count = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 60
  do {
f8deb5b9 Poul Sander 2022-01-15 13:55 61
    count = read_end_.read(buffer, BUFFER_SIZE);
f8deb5b9 Poul Sander 2022-01-15 13:55 62
    content.append(buffer, count);
f8deb5b9 Poul Sander 2022-01-15 13:55 63
  } while (count != 0);
f8deb5b9 Poul Sander 2022-01-15 13:55 64
  read_end_.close();
f8deb5b9 Poul Sander 2022-01-15 13:55 65
  return content;
f8deb5b9 Poul Sander 2022-01-15 13:55 66
}
f8deb5b9 Poul Sander 2022-01-15 13:55 67
f8deb5b9 Poul Sander 2022-01-15 13:55 68
std::string read(file& f, size_t count) {
f8deb5b9 Poul Sander 2022-01-15 13:55 69
  std::string buffer(count, '\0');
f8deb5b9 Poul Sander 2022-01-15 13:55 70
  size_t n = 0, offset = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 71
  do {
f8deb5b9 Poul Sander 2022-01-15 13:55 72
    n = f.read(&buffer[offset], count - offset);
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    // We can't read more than size_t bytes since count has type size_t.
f8deb5b9 Poul Sander 2022-01-15 13:55 74
    offset += n;
f8deb5b9 Poul Sander 2022-01-15 13:55 75
  } while (offset < count && n != 0);
f8deb5b9 Poul Sander 2022-01-15 13:55 76
  buffer.resize(offset);
f8deb5b9 Poul Sander 2022-01-15 13:55 77
  return buffer;
f8deb5b9 Poul Sander 2022-01-15 13:55 78
}
f8deb5b9 Poul Sander 2022-01-15 13:55 79
f8deb5b9 Poul Sander 2022-01-15 13:55 80
#endif  // FMT_USE_FCNTL
1970-01-01 00:00 81