123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //===-- WinAdapter.cpp - Windows Adapter for other platforms ----*- C++ -*-===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #ifndef _WIN32
- #include "dxc/Support/WinAdapter.h"
- #include "dxc/Support/WinFunctions.h"
- //===--------------------------- IUnknown ---------------------------------===//
- ULONG IUnknown::AddRef() {
- ++m_count;
- return m_count;
- }
- ULONG IUnknown::Release() {
- ULONG result = --m_count;
- if (m_count == 0) {
- delete this;
- }
- return result;
- }
- IUnknown::~IUnknown() {}
- //===--------------------------- IMalloc ----------------------------------===//
- void *IMalloc::Alloc(size_t size) { return malloc(size); }
- void *IMalloc::Realloc(void *ptr, size_t size) { return realloc(ptr, size); }
- void IMalloc::Free(void *ptr) { free(ptr); }
- HRESULT IMalloc::QueryInterface(REFIID riid, void **ppvObject) {
- assert(false && "QueryInterface not implemented for IMalloc.");
- return E_NOINTERFACE;
- }
- //===--------------------------- CAllocator -------------------------------===//
- void *CAllocator::Reallocate(void *p, size_t nBytes) throw() {
- return realloc(p, nBytes);
- }
- void *CAllocator::Allocate(size_t nBytes) throw() { return malloc(nBytes); }
- void CAllocator::Free(void *p) throw() { free(p); }
- //===--------------------------- BSTR Allocation --------------------------===//
- void SysFreeString(BSTR bstrString) {
- if (bstrString)
- free((void *)((uintptr_t)bstrString - sizeof(uint32_t)));
- }
- // Allocate string with length prefix
- // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/automat/bstr
- BSTR SysAllocStringLen(const OLECHAR *strIn, UINT ui) {
- uint32_t *blobOut =
- (uint32_t *)malloc(sizeof(uint32_t) + (ui + 1) * sizeof(OLECHAR));
- if (!blobOut)
- return nullptr;
- // Size in bytes without trailing NULL character
- blobOut[0] = ui * sizeof(OLECHAR);
- BSTR strOut = (BSTR)&blobOut[1];
- if (strIn)
- memcpy(strOut, strIn, blobOut[0]);
- // Write trailing NULL character:
- strOut[ui] = 0;
- return strOut;
- }
- //===---------------------- Char converstion ------------------------------===//
- const char *CPToLocale(uint32_t CodePage) {
- #ifdef __APPLE__
- static const char *utf8 = "en_US.UTF-8";
- static const char *iso88591 = "en_US.ISO8859-1";
- #else
- static const char *utf8 = "en_US.utf8";
- static const char *iso88591 = "en_US.iso88591";
- #endif
- if (CodePage == CP_UTF8) {
- return utf8;
- } else if (CodePage == CP_ACP) {
- // Experimentation suggests that ACP is expected to be ISO-8859-1
- return iso88591;
- }
- return nullptr;
- }
- //===--------------------------- CHandle -------------------------------===//
- CHandle::CHandle(HANDLE h) { m_h = h; }
- CHandle::~CHandle() { CloseHandle(m_h); }
- CHandle::operator HANDLE() const throw() { return m_h; }
- #endif
|