lean4-htt/src/library/handle.cpp

80 lines
1.6 KiB
C++

/*
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura & Jared Roesch
*/
#include <string>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <utility>
#include <stdio.h>
#if defined(LEAN_WINDOWS) && !defined(LEAN_CYGWIN)
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#else
#include <sys/wait.h>
#include <unistd.h>
#endif
#include "library/process.h"
#include "library/handle.h"
#include "util/buffer.h"
#include "library/pipe.h"
namespace lean {
void handle::write(std::string const & buf) {
auto sz = buf.size();
if (fwrite(buf.data(), 1, sz, m_file) != sz) {
std::cout << "write_error: " << errno << std::endl;
clearerr(m_file);
throw handle_exception("write failed");
}
}
void handle::flush() {
if (fflush(m_file) != 0) {
clearerr(m_file);
throw handle_exception("flush failed");
}
}
handle::~handle() {
if (m_file && m_file != stdin &&
m_file != stderr && m_file != stdout) {
fclose(m_file);
m_file = nullptr;
}
}
bool handle::is_stdin() {
return m_file == stdin;
}
bool handle::is_stdout() {
return m_file == stdout;
}
bool handle::is_stderr() {
return m_file == stderr;
}
void handle::close() {
if (m_file == nullptr) {
// double close
} else if (fclose(m_file) == 0) {
m_file = nullptr;
} else {
clearerr(m_file);
throw handle_exception("close failed");
}
}
bool handle::is_closed() { return !m_file; }
}