1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.

53 lines
1.3 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Gleb Belov <gleb.belov@monash.edu>
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef __MINIZINC_UTILS_SAVESTREAM_H__
#define __MINIZINC_UTILS_SAVESTREAM_H__
#include <cstdio>
namespace MiniZinc {
/// Helper class to redirect, e.g., stdout to stderr
class StreamRedir {
/// The stream to be changed
FILE* const d_s0;
/*
* Structure for retaining information about a stream, sufficient to
* recreate that stream later on.
* See
* https://stackoverflow.com/questions/4760201/how-do-i-suppress-output-while-using-a-dynamic-library
*/
struct stream_info {
int fd = -1;
fpos_t pos;
};
/// The original stream
stream_info d_si;
public:
/// Constructs with the stream to be changed
// StreamRedir(FILE* s0);
/// Constructs with s0 and replaces it by s1
StreamRedir(FILE* s0, FILE* s1, bool fFlush = true);
~StreamRedir();
/// Restore original
void restore(bool fFLush = true);
protected:
/// Replace & save stream by s1
void replaceStream(FILE* s1, bool fFlush = true);
};
} // namespace MiniZinc
#endif // __MINIZINC_UTILS_SAVESTREAM_H__