Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

107 lines
1.7 KiB
C++

// MsgBuffer.h
// Created by Robin Rowe on 1/2/2016
// Copyright (c) 2016 Robin.Rowe@CinePaint.org
#ifndef MsgBuffer_h
#define MsgBuffer_h
#ifdef UNREAL_ENGINE
#include <AllowWindowsPlatformTypes.h>
#endif
#include <string.h>
#include <cerrno>
#ifdef _WIN32
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
#endif
#ifndef __cplusplus
#error
#endif
namespace portable
{
template<unsigned bufsize>
class MsgBuffer
{ char buffer[bufsize];
void SetPerErrno()
{ char* p=strerror(errno);
Append(p);
}
void SetPerLastError()
{
#ifdef _WIN32
const unsigned len = length();
const DWORD num = FormatMessageA(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
WSAGetLastError(),
0,
buffer+len,
bufsize-len-1,
NULL);
#else
SetPerErrno();
#endif
}
public:
MsgBuffer()
{ Reset();
}
void Reset()
{ buffer[0]=0;
}
operator const char*() const
{ return buffer;
}
const char* GetErrnoError()
{ SetPerErrno();
return buffer;
}
const char* GetLastError()
{ SetPerLastError();
return buffer;
}
int GetErrno()
{ return errno;
}
int GetSocketErrorCode()
{
#ifdef _WIN32
return WSAGetLastError();
#else
return GetErrno();
#endif
}
unsigned length() const
{ return (unsigned) strlen(buffer);
}
unsigned capacity() const
{ return bufsize-1;
}
void Append(const char* text)
{ const unsigned len=length();
#pragma warning (disable : 4996)
strncpy(buffer+len,text,bufsize-len-1);
#pragma warning (default : 4996)
buffer[bufsize-1]=0;
}
void Set(const char* text)
{ Reset();
Append(text);
}
void SystemLog() const
{ puts(buffer);
}
};
}
#ifdef UNREAL_ENGINE
#include <HideWindowsPlatformTypes.h>
#endif
#endif