Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

333 lines
6.2 KiB

#include "stdafx.h"
#pragma hdrstop
// This function must be supplied by the application
PCSTR STDCALL GetStringResource(UINT idString);
#ifndef _OUTPUT_INCLUDED
#include "coutput.h"
#endif
#include <stdlib.h>
#ifndef SEEK_SET
#define SEEK_SET 0 // seek to an absolute position
#define SEEK_CUR 1 // seek relative to current position
#define SEEK_END 2 // seek relative to end of file
#endif //ifndef SEEK_SET
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/***************************************************************************
FUNCTION: COutput::COutput
PURPOSE: Open a file for writing
PARAMETERS:
pszFileName -- name fo the file
cbBuf -- size of the output buffer to allocate
fEnTab -- TRUE to entabify the output
fAppend -- TRUE to append to the end of an existing file
RETURNS:
COuput::fInitialized is set to TRUE if the file was opened
COMMENTS:
If NULL is specified for pszFileName, no file will be written,
but all functions may be used (debugging mode).
Check fInitialized before deleting the class. If it is FALSE,
then the write failed.
MODIFICATION DATES:
26-Aug-1993 [ralphw]
***************************************************************************/
COutput::COutput(const char* pszFileName, UINT cbBuf, BOOL fEnTab,
BOOL fAppend)
{
// If no filename is specified, then no output will be sent
if (pszFileName == NULL || !*pszFileName) {
fNull = TRUE;
fInitialized = FALSE;
return;
}
else
fNull = FALSE;
fNewLine = TRUE;
fEntabOutput = fEnTab;
fOpenForAppend = fAppend;
if (fEntabOutput)
pszTmpBuf = (PSTR) lcMalloc(512);
else
pszTmpBuf = NULL;
pszOutBuf = (PSTR) LocalAlloc(LMEM_FIXED, cbBuf);
pszCurOutBuf = pszOutBuf;
pszEndOutBuf = pszOutBuf + cbBuf;
/*
* If the file can't be opened, call CloseOuput to free the buffer
* allocated for output, and to reset the handle to zero.
*/
OFSTRUCT of;
of.cBytes = sizeof(of);
if ((hfOutput = OpenFile(pszFileName, &of,
OF_WRITE | OF_CREATE)) == HFILE_ERROR) {
fInitialized = FALSE;
return;
}
if (fOpenForAppend) {
fOpenForAppend = FALSE;
// seek to end of file
_llseek(hfOutput, 0, SEEK_END);
}
fInitialized = TRUE;
}
COutput::~COutput(void)
{
if (hfOutput != HFILE_ERROR) {
outflush();
_lclose(hfOutput);
}
if (pszTmpBuf)
lcFree(pszTmpBuf);
if (pszOutBuf)
LocalFree((HLOCAL) pszOutBuf);
}
/***************************************************************************
FUNCTION: outstring
PURPOSE:
RETURNS:
COMMENTS:
MODIFICATION DATES:
21-Jul-1990 [ralphw]
***************************************************************************/
void STDCALL COutput::outstring(PCSTR pszString)
{
if (!pszString)
return;
if (fEntabOutput) {
strcpy(pszTmpBuf, pszString);
EntabString(pszTmpBuf);
pszString = pszTmpBuf;
}
UINT cbString;
FastSection:
if ((UINT) (cbString = (UINT) strlen(pszString)) <
(UINT) (pszEndOutBuf - pszCurOutBuf) &&
strchr(pszString, '\n') == NULL) {
strcpy(pszCurOutBuf, pszString);
pszCurOutBuf += cbString;
}
else {
while (*pszString) {
if (*pszString != '\n') {
if (*pszString == '\r') {
pszString++;
continue;
}
*pszCurOutBuf++ = *pszString++;
if (pszCurOutBuf >= pszEndOutBuf) {
outflush();
goto FastSection;
}
}
else {
if (*pszString == '\n') {
*pszCurOutBuf++ = '\r';
if (pszCurOutBuf >= pszEndOutBuf)
outflush();
if (!fNewLine)
return;
}
*pszCurOutBuf++ = *pszString++;
if (pszCurOutBuf >= pszEndOutBuf)
outflush();
}
}
}
}
/***************************************************************************
FUNCTION: outchar
PURPOSE:
RETURNS:
COMMENTS:
MODIFICATION DATES:
21-Jul-1990 [ralphw]
***************************************************************************/
void STDCALL COutput::outchar(char c)
{
if (c == '\n') {
*pszCurOutBuf++ = '\r';
if (pszCurOutBuf >= pszEndOutBuf)
outflush();
if (!fNewLine)
return;
}
*pszCurOutBuf++ = c;
if (pszCurOutBuf >= pszEndOutBuf)
outflush();
}
/***************************************************************************
FUNCTION: outflush
PURPOSE:
RETURNS:
COMMENTS:
MODIFICATION DATES:
18-Mar-1990 [ralphw]
***************************************************************************/
void STDCALL NEAR COutput::outflush(void)
{
UINT cbWrite = (UINT) (pszCurOutBuf - pszOutBuf);
if (fNull || !cbWrite || hfOutput == HFILE_ERROR)
return;
if (_lwrite(hfOutput, pszOutBuf, cbWrite) != cbWrite) {
fInitialized = FALSE;
fNull = TRUE;
_lclose(hfOutput);
hfOutput = HFILE_ERROR;
}
pszCurOutBuf = pszOutBuf;
}
/***************************************************************************
FUNCTION: outstring_eol
PURPOSE:
RETURNS:
COMMENTS:
MODIFICATION DATES:
21-Jul-1990 [ralphw]
***************************************************************************/
void STDCALL COutput::outstring_eol(PCSTR pszString)
{
outstring(pszString);
outchar('\n');
}
#ifndef CHAR_SPACE
const char CHAR_SPACE = ' ';
const char CHAR_TAB = '\t';
#endif
void STDCALL NEAR COutput::EntabString(PSTR pszLine)
{
int i = 0;
PSTR psz = pszLine, pszStart;
while (*psz) {
if (psz[0] == CHAR_SPACE && psz[1] == CHAR_SPACE && i < 7) {
pszStart = psz;
do {
i++;
psz++;
} while (i % 8 && *psz == CHAR_SPACE);
if ((i % 8) == 0) {
*pszStart = '\t';
strcpy(pszStart + 1, psz);
psz = pszStart + 1;
i = 0;
continue;
}
}
i++;
psz++;
if (i == 8)
i = 0;
}
}
void STDCALL COutput::outint(int val)
{
char szBuf[10];
_itoa(val, szBuf, 10);
outstring(szBuf);
}
void STDCALL COutput::outhex(int val)
{
char szBuf[10];
strcpy(szBuf, "0x");
_itoa(val, szBuf + strlen(szBuf), 16);
outstring(szBuf);
}
void STDCALL COutput::outint(int idResource, int val)
{
char szBuf[256];
wsprintf(szBuf, GetStringResource(idResource), val);
outstring(szBuf);
}
void STDCALL COutput::outint(int idResource, int val1, int val2)
{
char szBuf[256];
wsprintf(szBuf, GetStringResource(idResource), val1, val2);
outstring(szBuf);
}
void STDCALL COutput::WriteTable(CTable* ptbl)
{
if (!ptbl)
return;
for (int i = 1; i <= ptbl->CountStrings(); i++)
outstring_eol(ptbl->GetPointer(i));
}