windows fixes + stdin/stdout/stderr might be defined as macros

master
Daniel Kolesa 2016-07-06 17:05:32 +01:00
parent f5a7c19acc
commit 0c8c16a44a
2 changed files with 22 additions and 9 deletions

View File

@ -124,9 +124,9 @@ private:
bool p_owned; bool p_owned;
}; };
static FileStream in(::stdin); static FileStream in(stdin);
static FileStream out(::stdout); static FileStream out(stdout);
static FileStream err(::stderr); static FileStream err(stderr);
/* no need to call anything from FileStream, prefer simple calls... */ /* no need to call anything from FileStream, prefer simple calls... */
@ -134,7 +134,7 @@ namespace detail {
struct IoNat {}; struct IoNat {};
inline void write_impl(ConstCharRange s) { inline void write_impl(ConstCharRange s) {
fwrite(&s[0], 1, s.size(), ::stdout); fwrite(&s[0], 1, s.size(), stdout);
} }
template<typename T> template<typename T>
@ -159,14 +159,14 @@ inline void write(T const &v, A const &...args) {
template<typename T> template<typename T>
inline void writeln(T const &v) { inline void writeln(T const &v) {
write(v); write(v);
putc('\n', ::stdout); putc('\n', stdout);
} }
template<typename T, typename ...A> template<typename T, typename ...A>
inline void writeln(T const &v, A const &...args) { inline void writeln(T const &v, A const &...args) {
write(v); write(v);
write(args...); write(args...);
putc('\n', ::stdout); putc('\n', stdout);
} }
template<typename ...A> template<typename ...A>
@ -176,19 +176,19 @@ inline void writef(ConstCharRange fmt, A const &...args) {
fmt, args...); fmt, args...);
if (need < 0) return; if (need < 0) return;
else if (Size(need) < sizeof(buf)) { else if (Size(need) < sizeof(buf)) {
fwrite(buf, 1, need, ::stdout); fwrite(buf, 1, need, stdout);
return; return;
} }
Vector<char> s; Vector<char> s;
s.reserve(need); s.reserve(need);
format(detail::UnsafeWritefRange(s.data()), fmt, args...); format(detail::UnsafeWritefRange(s.data()), fmt, args...);
fwrite(s.data(), 1, need, ::stdout); fwrite(s.data(), 1, need, stdout);
} }
template<typename ...A> template<typename ...A>
inline void writefln(ConstCharRange fmt, A const &...args) { inline void writefln(ConstCharRange fmt, A const &...args) {
writef(fmt, args...); writef(fmt, args...);
putc('\n', ::stdout); putc('\n', stdout);
} }
} /* namespace ostd */ } /* namespace ostd */

View File

@ -26,8 +26,21 @@ using ldouble = long double;
/* keywords in c++, but aliased */ /* keywords in c++, but aliased */
using Wchar = wchar_t; using Wchar = wchar_t;
/* while we do not support Visual Studio 2013, Clang on Windows by default
* pretends to be VS (with the default version being 2013). In this case,
* it also tries to be compatible (in order to not conflict with MS include
* headers) with said version, so it doesn't provide the builtins; so we work
* around this (same typedefs/behavior as VS 2013, of course not standards
* compliant but no way around it)
*/
#if defined(_MSC_VER) && (_MSC_VER < 1900)
using Char16 = uint16_t;
using Char32 = uint32_t;
#else
using Char16 = char16_t; using Char16 = char16_t;
using Char32 = char32_t; using Char32 = char32_t;
#endif
/* nullptr type */ /* nullptr type */