WindowsXP-SP1/windows/appcompat/shimdbc/fileio.cpp
2020-09-30 16:53:49 +02:00

231 lines
4.8 KiB
C++

////////////////////////////////////////////////////////////////////////////////////
//
// File: fileio.cpp
//
// History: 06-Apr-01 markder Created.
//
// Desc: This file contains classes to encapsulate MBCS and UNICODE files.
//
////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "FileIO.h"
CTextFile::CTextFile( LPCTSTR lpszFileName, UINT nOpenFlags ) :
CFile(lpszFileName, nOpenFlags)
{
}
CANSITextFile::CANSITextFile(LPCTSTR lpszFileName, UINT dwCodePage, UINT nOpenFlags) :
CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary)
{
m_dwCodePage = dwCodePage;
}
CUTF8TextFile::CUTF8TextFile(LPCTSTR lpszFileName, UINT nOpenFlags) :
CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary)
{
UCHAR EncodingMarker[3];
EncodingMarker[0] = (UCHAR) 0xEF;
EncodingMarker[1] = (UCHAR) 0xBB;
EncodingMarker[2] = (UCHAR) 0xBF;
Write(&EncodingMarker, 3);
}
CUTF16TextFile::CUTF16TextFile(LPCTSTR lpszFileName, UINT nOpenFlags) :
CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary)
{
UCHAR EncodingMarker[2];
EncodingMarker[0] = (UCHAR) 0xFF;
EncodingMarker[1] = (UCHAR) 0xFE;
Write(&EncodingMarker, 2);
}
void CANSITextFile::WriteString(LPCTSTR lpsz)
{
LPVOID lpBuf = NULL;
LPVOID lpAllocatedBuffer = NULL;
LONG nBufSize = 0;
LONG nBytesToWrite = 0;
CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
nBufSize = WideCharToMultiByte(
m_dwCodePage,
0,
csStringToWrite,
-1,
NULL,
0,
NULL,
NULL
);
lpAllocatedBuffer = malloc(nBufSize);
if (lpAllocatedBuffer == NULL) {
AfxThrowMemoryException();
}
lpBuf = lpAllocatedBuffer;
nBytesToWrite = WideCharToMultiByte(
m_dwCodePage,
0,
csStringToWrite,
-1,
(LPSTR) lpBuf,
nBufSize,
NULL,
NULL
);
//
// Take off NULL terminator
//
nBytesToWrite--;
#else
lpBuf = (LPVOID) (LPCSTR) csStringToWrite;
nBytesToWrite = strlen(csStringToWrite); // we use strlen to get total bytes
#endif
if (nBytesToWrite == 0) {
goto eh;
}
Write(lpBuf, nBytesToWrite);
eh:
if (lpAllocatedBuffer) {
free(lpAllocatedBuffer);
}
}
void CUTF8TextFile::WriteString(LPCTSTR lpsz)
{
LPVOID lpBuf = NULL;
LPVOID lpAllocatedBuffer = NULL;
LONG nBufSize = 0;
LONG nBytesToWrite = 0;
CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
nBufSize = WideCharToMultiByte(
CP_UTF8,
0,
csStringToWrite,
-1,
NULL,
0,
NULL,
NULL
);
lpAllocatedBuffer = malloc(nBufSize);
if (lpAllocatedBuffer == NULL) {
AfxThrowMemoryException();
}
lpBuf = lpAllocatedBuffer;
nBytesToWrite = WideCharToMultiByte(
CP_UTF8,
0,
csStringToWrite,
-1,
(LPSTR) lpBuf,
nBufSize,
NULL,
NULL
);
//
// Take off NULL terminator
//
nBytesToWrite--;
#else
lpBuf = (LPVOID) (LPCSTR) csStringToWrite;
nBytesToWrite = strlen(csStringToWrite); // we use strlen to get total bytes
#endif
if (nBytesToWrite == 0) {
goto eh;
}
Write(lpBuf, nBytesToWrite);
eh:
if (lpAllocatedBuffer) {
free(lpAllocatedBuffer);
}
}
void CUTF16TextFile::WriteString(LPCTSTR lpsz)
{
LPVOID lpBuf = NULL;
LPVOID lpAllocatedBuffer = NULL;
LONG nBufSize = 0;
LONG nBytesToWrite = 0;
CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
lpBuf = (LPVOID) (LPCWSTR) csStringToWrite;
nBytesToWrite = csStringToWrite.GetLength() * sizeof(WCHAR);
#else
nBufSize = MultiByteToWideChar(
CP_ACP,
0,
csStringToWrite,
-1,
NULL,
0);
lpAllocatedBuffer = malloc(nBufSize);
if (lpAllocatedBuffer == NULL) {
AfxThrowMemoryException();
}
lpBuf = lpAllocatedBuffer;
nBytesToWrite = MultiByteToWideChar(
CP_ACP,
0,
csStringToWrite,
-1,
lpBuf,
nBufSize);
//
// Take off NULL terminator
//
nBytesToWrite -= sizeof(WCHAR);
#endif
if (nBytesToWrite == 0) {
goto eh;
}
Write(lpBuf, nBytesToWrite);
eh:
if (lpAllocatedBuffer) {
free(lpAllocatedBuffer);
}
}