mirror of https://github.com/lianthony/NT4.0
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.
582 lines
10 KiB
582 lines
10 KiB
|
|
|
|
/*++
|
|
|
|
Module Name:
|
|
|
|
uni.cxx
|
|
|
|
Abstract:
|
|
|
|
Has some unicode/asci conversion functions.
|
|
|
|
|
|
Author:
|
|
|
|
Dieter Achtelstetter (A-DACH) 8/28/1995
|
|
|
|
NOTE:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
|
|
//
|
|
//---- Includes
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <wingdi.h>
|
|
#include <stdio.h>
|
|
#include <windef.h>
|
|
#include <winnt.h>
|
|
#include <winbase.h>
|
|
#include <winuser.h>
|
|
#include <CPL.H>
|
|
#include <stdlib.h>
|
|
#include <winsvc.h>
|
|
#include <string.h>
|
|
#include <commctrl.h>
|
|
#include <tchar.h>
|
|
#include <wchar.h>
|
|
#include "uni.h"
|
|
#include "resource.h"
|
|
|
|
|
|
|
|
CHAR strTmp[UNI_MAX_TEMP_BUFF][MAX_TEMP_INT_STRING_BUFF];
|
|
int tempI = -1;
|
|
|
|
extern HINSTANCE hinst;
|
|
|
|
|
|
#if 0
|
|
|
|
LPTCH U ,up;
|
|
|
|
int main (int argc, char ** argv)
|
|
{
|
|
char * ap ;
|
|
char * A = "Testing";
|
|
int i;
|
|
|
|
|
|
|
|
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
ap = TempBuff();
|
|
|
|
|
|
U = TEXT("Testing");
|
|
|
|
|
|
|
|
|
|
lstrcpy( (LPVOID) strTmp,U);
|
|
|
|
|
|
i = UnicodeToAsciI(strTmp,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
i = AsciToUnicodeI(strTmp,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
|
|
ap = UnicodeToAsciM(U);
|
|
|
|
up = AsciToUnicodeM(ap);
|
|
|
|
|
|
UnicodeToAsci(U,strTmp,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
AsciToUnicode(A,(LPVOID)strTmp,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:_snprintfWO
|
|
//*
|
|
//* PURPOSE: Is the same as _snprintf except that input is asci and
|
|
//* the formated outbut string is Unicode
|
|
//*
|
|
//*********************************************************************
|
|
int
|
|
_stownprintf(
|
|
LPWCH buff,
|
|
size_t count,
|
|
const char * format,
|
|
...)
|
|
{
|
|
va_list marker;
|
|
int c;
|
|
|
|
|
|
va_start(marker,format);
|
|
|
|
|
|
//---- create the formated asci string
|
|
c = _vsnprintf((char *)buff, count,format,marker);
|
|
|
|
|
|
//---- convert the formated asci string
|
|
//---- to unicode inplace.
|
|
AsciToUnicodeI(buff,count);
|
|
|
|
va_end(marker);
|
|
return(c);
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:Astr
|
|
//*
|
|
//* PURPOSE: Takes a unicode string and returns a pointer to
|
|
//* the equivelent asci string
|
|
//*********************************************************************
|
|
LPWCH
|
|
Ustr(
|
|
UCHAR * Astr)
|
|
{
|
|
return( Ustr((char*)Astr) );
|
|
|
|
}
|
|
//*********************************************************************
|
|
//* FUNCTION:Astr
|
|
//*
|
|
//* PURPOSE: Takes a unicode string and returns a pointer to
|
|
//* the equivelent asci string
|
|
//*********************************************************************
|
|
LPWCH
|
|
Ustr(
|
|
char * Astr)
|
|
{
|
|
LPVOID b = TempBuff();
|
|
|
|
AsciToUnicode(Astr,b ,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
|
|
return((LPWCH)b);
|
|
}
|
|
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:Astr
|
|
//*
|
|
//* PURPOSE: Takes a unicode string and returns a pointer to
|
|
//* the equivelent asci string
|
|
//*********************************************************************
|
|
char *
|
|
Astr(
|
|
LPWCH Wstr)
|
|
{
|
|
LPVOID b = TempBuff();
|
|
|
|
|
|
|
|
UnicodeToAsci(Wstr,b ,MAX_TEMP_INT_STRING_BUFF);
|
|
|
|
|
|
return((char *)b);
|
|
}
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:AsciToUnicodeM
|
|
//*
|
|
//* PURPOSE: mallocs the asci buffer and returns it
|
|
//*********************************************************************
|
|
LPWCH
|
|
AsciToUnicodeM(
|
|
char * Astr)
|
|
{
|
|
LPWCH OutBuff;
|
|
DWORD SizeOfAllocBuff;
|
|
|
|
//
|
|
//--- Determine size of buffer
|
|
//
|
|
SizeOfAllocBuff = (strlen(Astr)*2)+2;
|
|
|
|
//
|
|
//---- Malloc Buffer
|
|
//
|
|
OutBuff = (LPWCH) malloc(SizeOfAllocBuff);
|
|
if(OutBuff == NULL)
|
|
return(NULL);
|
|
|
|
//
|
|
//---- Conver to asci
|
|
//
|
|
AsciToUnicode(Astr, OutBuff, SizeOfAllocBuff);
|
|
|
|
return(OutBuff);
|
|
}
|
|
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:UnicodeToAsciM
|
|
//*
|
|
//* PURPOSE: mallocs the asci buffer and returns it
|
|
//*********************************************************************
|
|
char *
|
|
UnicodeToAsciM(
|
|
WCHAR * Ustr)
|
|
{
|
|
char * OutBuff;
|
|
DWORD SizeOfAllocBuff;
|
|
|
|
//
|
|
//--- Determine size of buffer
|
|
//
|
|
SizeOfAllocBuff = wcslen(Ustr)+1;
|
|
|
|
//
|
|
//---- Malloc Buffer
|
|
//
|
|
OutBuff = (char * ) malloc(SizeOfAllocBuff);
|
|
if(OutBuff == NULL)
|
|
return(NULL);
|
|
|
|
//
|
|
//---- Conver to asci
|
|
//
|
|
UnicodeToAsci(Ustr, OutBuff, SizeOfAllocBuff);
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
return(OutBuff);
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:UnicodeToAsciI
|
|
//*
|
|
//* PURPOSE: Does the convetion in place.
|
|
//*
|
|
//*********************************************************************
|
|
size_t
|
|
UnicodeToAsciI(
|
|
LPVOID Ustr,
|
|
int BuffLen)
|
|
{
|
|
char * OutBuff;
|
|
int c;
|
|
|
|
|
|
//
|
|
//---- Malloc temp Buffer z
|
|
//
|
|
OutBuff = (char * )malloc(BuffLen);
|
|
if(OutBuff == NULL)
|
|
return(0);
|
|
|
|
//
|
|
//---- Conver to asci in malloced buffer
|
|
//
|
|
c = UnicodeToAsci((LPWCH)Ustr, OutBuff, BuffLen);
|
|
|
|
//
|
|
//---- Copy the asci string back to the Ustr.
|
|
//
|
|
strcpy((PCHAR)Ustr,OutBuff);
|
|
|
|
free(OutBuff);
|
|
return(c);
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:AsciToUnicodeI
|
|
//*
|
|
//* PURPOSE: Does the convetion in place.
|
|
//*
|
|
//*********************************************************************
|
|
size_t
|
|
AsciToUnicodeI(
|
|
LPVOID Astr,
|
|
int BuffLen)
|
|
{
|
|
char * OutBuff;
|
|
int c;
|
|
|
|
|
|
//
|
|
//---- Malloc temp Buffer
|
|
//
|
|
OutBuff = (PCHAR)malloc(BuffLen);
|
|
if(OutBuff == NULL)
|
|
return(0);
|
|
|
|
//
|
|
//---- Conver to asci in malloced buffer
|
|
//
|
|
c = AsciToUnicode((PCHAR)Astr, OutBuff, BuffLen);
|
|
|
|
//
|
|
//---- Copy the asci string back to the Ustr.
|
|
//
|
|
wcscpy((LPWCH)Astr,(LPWCH)OutBuff);
|
|
|
|
free(OutBuff);
|
|
return(c);
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:UnicodeToAsci
|
|
//*
|
|
//* PURPOSE:
|
|
//*********************************************************************
|
|
size_t
|
|
UnicodeToAsci(
|
|
WCHAR * Ustr,
|
|
LPVOID OutBuff,
|
|
int OutBuffLen)
|
|
{
|
|
return(wcstombs((char*)OutBuff, (const wchar_t *) Ustr, OutBuffLen));
|
|
}
|
|
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:AsciToUnicode
|
|
//*
|
|
//* PURPOSE:
|
|
//*********************************************************************
|
|
size_t
|
|
AsciToUnicode(
|
|
const char * Astr,
|
|
LPVOID OutBuff,
|
|
int OutBuffLen)
|
|
{
|
|
return(mbstowcs( ( wchar_t *) OutBuff,Astr, OutBuffLen));
|
|
}
|
|
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:GetString
|
|
//*
|
|
//* PURPOSE:Gets the resoruce string identified in rid and
|
|
//* returns a pointer to it.
|
|
//* RETURNS:
|
|
//*
|
|
//*********************************************************************
|
|
WCHAR * GetString(
|
|
UINT rid)
|
|
{
|
|
int ret;
|
|
LPWCH p ;
|
|
|
|
p = (LPWCH) TempBuff();
|
|
|
|
ret = LoadString(hinst,rid,p ,MAX_TEMP_INT_STRING_BUFF);
|
|
if(ret != 0)
|
|
return(p);
|
|
else
|
|
return(TEXT(""));
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:SetAnyDlgItemText
|
|
//*
|
|
//* PURPOSE:
|
|
//* RETURNS:
|
|
//*
|
|
//*********************************************************************
|
|
BOOL
|
|
SetAnyDlgItemText(
|
|
HWND hwndDlg,
|
|
int idControl,
|
|
PCHAR lpsz)
|
|
{
|
|
|
|
|
|
if(lpsz)
|
|
{
|
|
if(*lpsz != '\0')
|
|
{
|
|
//
|
|
//--- lpsz is not NULL and not a empty string
|
|
//
|
|
//
|
|
WCHAR * String = Ustr(lpsz);
|
|
|
|
AdjustStringToFitControl( GetDlgItem(hwndDlg,idControl) , String,0);
|
|
|
|
return(SetDlgItemText(hwndDlg, idControl,String));
|
|
}
|
|
}
|
|
|
|
return(SetDlgItemText(hwndDlg, idControl,GetString(IDS_NotAvailible)));
|
|
|
|
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:SetAnyDlgItemText
|
|
//*
|
|
//* PURPOSE:
|
|
//* RETURNS:
|
|
//*
|
|
//*********************************************************************
|
|
BOOL
|
|
SetAnyDlgItemText(
|
|
HWND hwndDlg,
|
|
int idControl,
|
|
WCHAR * lpsz)
|
|
{
|
|
|
|
|
|
if(lpsz)
|
|
{
|
|
if(*lpsz != '\0')
|
|
{
|
|
//
|
|
//--- lpsz is not NULL and not a empty string
|
|
//
|
|
//
|
|
AdjustStringToFitControl( GetDlgItem(hwndDlg,idControl) , lpsz,0);
|
|
|
|
return(SetDlgItemText(hwndDlg, idControl,lpsz));
|
|
}
|
|
}
|
|
|
|
//
|
|
//--- We have not string display not availible.
|
|
//
|
|
return(SetDlgItemText(hwndDlg, idControl,GetString(IDS_NotAvailible)));
|
|
|
|
|
|
}
|
|
|
|
//*********************************************************************
|
|
//* FUNCTION:AdjustStringToFitControl
|
|
//*
|
|
//* PURPOSE:
|
|
//* RETURNS:
|
|
//*
|
|
//*********************************************************************
|
|
VOID
|
|
AdjustStringToFitControl(
|
|
HWND hWnd,
|
|
LPTSTR lpString,
|
|
DWORD ControlLength)
|
|
{
|
|
SIZE Size;
|
|
HDC hDc = GetDC(hWnd);
|
|
DWORD sl = wcslen(lpString);
|
|
RECT ControlRect;
|
|
DWORD TrunkSize=0;
|
|
|
|
|
|
if(!ControlLength)
|
|
{
|
|
|
|
//BUGBUG
|
|
//---- do nothing in this case.
|
|
//
|
|
return;
|
|
|
|
//
|
|
//--- Get width of control
|
|
//--- This is already in logical untis
|
|
//--- so no adjusting needed.
|
|
//
|
|
if(!GetClientRect(
|
|
hWnd,
|
|
&ControlRect))
|
|
return;
|
|
|
|
}
|
|
|
|
//
|
|
//--- See if string will fit into control
|
|
//
|
|
|
|
if(GetTextExtentPoint32(
|
|
hDc,
|
|
lpString,
|
|
sl,
|
|
&Size))
|
|
{
|
|
SIZE TaileSize;
|
|
|
|
|
|
if(ControlLength)
|
|
{
|
|
SIZE AbzStrSize;
|
|
DWORD AvgCharWidth;
|
|
|
|
//
|
|
//---- ControlLength is in dialog box units.
|
|
//---- conver to pixels.
|
|
//
|
|
|
|
GetTextExtentPoint32(hDc,
|
|
L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
|
52,&AbzStrSize);
|
|
|
|
AvgCharWidth = (AbzStrSize.cx/26+1)/2-1;
|
|
|
|
ControlRect.right = ((ControlLength * AvgCharWidth) / 4);
|
|
}
|
|
|
|
|
|
if(Size.cx > ControlRect.right)
|
|
{
|
|
|
|
//
|
|
//--- Get the pixel length
|
|
//--- of the "..." string.
|
|
//
|
|
if(!GetTextExtentPoint32(
|
|
hDc,
|
|
L"...",
|
|
3,
|
|
&TaileSize))
|
|
return;
|
|
|
|
ControlRect.right -= TaileSize.cx;
|
|
|
|
//
|
|
//--- Loop til string will fit into control
|
|
//
|
|
do
|
|
{
|
|
|
|
sl--;
|
|
|
|
if(!GetTextExtentPoint32(
|
|
hDc,
|
|
lpString,
|
|
sl,
|
|
&Size))
|
|
return;
|
|
|
|
|
|
}while(Size.cx > ControlRect.right);
|
|
|
|
wcscpy(lpString+sl,L"...");
|
|
}
|
|
}
|
|
else
|
|
return;
|
|
|
|
ReleaseDC(hWnd,hDc);
|
|
};
|
|
|
|
|
|
|
|
|