Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

267 lines
5.1 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
Console.c
Abstract:
This module contains support for displaying output on the console.
Author:
David J. Gilman (davegi) 25-Nov-1992
Environment:
User Mode
--*/
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "wintools.h"
//
// BOOL
// IsConsoleHandle(
// IN HANDLE ConsoleHandle
// );
//
#define IsConsoleHandle( h ) \
((( DWORD_PTR )( h )) & 1 )
//
// Function Prototypes
//
int
VConsolePrintfW(
IN UINT Format,
IN va_list Args
);
int
ConsolePrintfW(
IN UINT Format,
IN ...
)
/*++
Routine Description:
Display a printf style resource string on the console.
Arguments:
Format - Supplies a resource number for a printf style format string.
... - Supplies zero or more values based on the format
descrpitors supplied in Format.
Return Value:
int - Returns the number of characters actually written.
--*/
{
va_list Args;
int CharsOut;
//
// Gain access to the replacement values.
//
va_start( Args, Format );
//
// Display the string and return the number of characters displayed.
//
CharsOut = VConsolePrintfW( Format, Args );
va_end( Args );
return CharsOut;
}
int
VConsolePrintfW(
IN UINT Format,
IN va_list Args
)
/*++
Routine Description:
Display a printf style resource string on the console.
Arguments:
Format - Supplies a resource number for a printf style format string.
Args - Supplies zero or more values based on the format
descrpitors supplied in Format.
Return Value:
int - Returns the number of characters actually written.
--*/
{
LPCWSTR FormatString;
BOOL Success;
WCHAR Buffer[ MAX_CHARS ];
DWORD CharsIn;
DWORD CharsOut;
HANDLE Handle;
//
// Attempt to retrieve the actual string resource.
//
FormatString = GetString( Format );
DbgPointerAssert( FormatString );
if ( FormatString == NULL ) {
return 0;
}
//
// Format the supplied string with the supplied arguments.
//
CharsIn = vswprintf( Buffer, FormatString, Args );
//
// Attempt to retrieve the standard output handle.
//
Handle = GetStdHandle( STD_OUTPUT_HANDLE );
DbgAssert( Handle != INVALID_HANDLE_VALUE );
if ( Handle == INVALID_HANDLE_VALUE ) {
return 0;
}
//
// If the standard output handle is a console handle, write the string.
//
if ( IsConsoleHandle( Handle )) {
Success = WriteConsoleW(
Handle,
Buffer,
CharsIn,
&CharsOut,
NULL
);
} else {
CHAR TmpBuffer[ MAX_CHARS ];
int rc;
//
// davegi 11/25/92
// This only exists because other tools can't handle Unicode data.
//
// The standard output handle is not a console handle so convert the
// output to ANSI and then write it.
//
rc = WideCharToMultiByte(
CP_ACP,
0,
Buffer,
CharsIn,
TmpBuffer,
sizeof( TmpBuffer ),
NULL,
NULL
);
DbgAssert( rc != 0 );
if ( rc == 0 ) {
return 0;
}
Success = WriteFile(
Handle,
TmpBuffer,
CharsIn,
&CharsOut,
NULL
);
}
DbgAssert( Success );
DbgAssert( CharsIn == CharsOut );
//
// Return the number of characters written.
//
if ( Success ) {
return CharsOut;
} else {
return 0;
}
}
VOID
ErrorExitW(
IN UINT ExitCode,
IN UINT Format,
IN ...
)
/*++
Routine Description:
Display a printf style resource string on the console and the exit.
Arguments:
ExistCode - Supplies the exit code for the process.
Format - Supplies a resource number for a printf style format string.
... - Supplies zero or more values based on the format
descrpitors supplied in Format.
Return Value:
None.
--*/
{
va_list Args;
//
// Gain access to the replacement values.
//
va_start( Args, Format );
//
// Display the string and retunr the number of characters displayed.
//
VConsolePrintfW( Format, Args );
va_end( Args );
//
// Exit the process with the supplied exit code.
//
ExitProcess( ExitCode );
}