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.
|
|
/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
fefont.c
Abstract:
Text setup display support for FarEast text output.
Author:
Hideyuki Nagase (hideyukn) 01-July-1994
Revision History:
--*/
#include <precomp.h>
#pragma hdrstop
PWCHAR PaddedString(int size, PWCHAR pwch, PWCHAR buffer);
ULONG FEGetStringColCount( IN PCWSTR String ) { UNICODE_STRING UnicodeString;
//
// Each DBCS char takes 2 columns, and each SBCS char takes 1.
// Thus each char takes as much space as the number of bytes
// in its representation in codepage 932.
//
RtlInitUnicodeString(&UnicodeString,String); return(RtlxUnicodeStringToOemSize(&UnicodeString)-1); }
PWSTR FEPadString( IN int Size, IN PCWSTR String ) { return(PaddedString(Size,(PWCHAR)String,NULL)); }
/***************************************************************************\
* BOOL IsFullWidth(WCHAR wch) * * Determine if the given Unicode char is fullwidth or not. * * History: * 04-08-92 ShunK Created. \***************************************************************************/
BOOL IsFullWidth(WCHAR wch) { if (wch <= 0x007f || (wch >= 0xff60 && wch <= 0xff9f)) return(FALSE); // Half width.
else return(TRUE); // Full width.
}
/***************************************************************************\
* BOOL SizeOfHalfWidthString(PWCHAR pwch) * * Determine size of the given Unicode string, adjusting for half-width chars. * * History: * 08-08-93 FloydR Created. \***************************************************************************/
int SizeOfHalfWidthString(PWCHAR pwch) { int c=0;
while (*pwch) { if (IsFullWidth(*pwch)) c += 2; else c++; pwch++; } return c; }
/***************************************************************************\
* PWCHAR PaddedString(int size, PWCHAR pwch) * * Realize the string, left aligned and padded on the right to the field * width/precision specified. * * Limitations: This uses a static buffer under the assumption that * no more than one such string is printed in a single 'printf'. * * History: * 11-03-93 FloydR Created. \***************************************************************************/
WCHAR PaddingBuffer[160];
PWCHAR PaddedString(int size, PWCHAR pwch, PWCHAR buffer) { int realsize; int fEllipsis = FALSE;
if (buffer==NULL) buffer = PaddingBuffer;
if (size < 0) { fEllipsis = TRUE; size = -size; } realsize = _snwprintf(buffer, 160, L"%-*.*ws", size, size, pwch); if (realsize == 0) return NULL; if (SizeOfHalfWidthString(buffer) > size) { do { buffer[--realsize] = L'\0'; } while (SizeOfHalfWidthString(buffer) > size);
if (fEllipsis && buffer[realsize-1] != L' ') { WCHAR Trail1 = buffer[realsize-2], Trail2 = buffer[realsize-1]; int Length;
PWCHAR pwCurrent = &(buffer[realsize-2]);
if(!IsFullWidth(Trail2)) { *pwCurrent++ = L'.'; } else { pwCurrent++; }
if(!IsFullWidth(Trail1)) { *pwCurrent++ = L'.'; } else { *pwCurrent++ = L'.'; *pwCurrent++ = L'.'; }
*pwCurrent = L'\0';
Length = SizeOfHalfWidthString(buffer);
while( Length++ < size ) { *pwCurrent++ = L'.'; *pwCurrent = L'\0'; } } } return buffer; }
|