/**************************** Module Header ********************************\ * Module Name: oemxlate.c * * Copyright (c) 1985 - 1999, Microsoft Corporation * * ANSI/UNICODE(U+00--) to/from OEM translation routines for CP 437 * * The goal of this module is to translate strings from ANSI/U+00-- to Oem * character set or the opposite. If there is no equivalent character * we use the followings rules: * * 1) we put a similar character (e.g. character without accent) * 2) In OemToChar, graphics vertical, horizontal, and junction characters * are usually translated to '|', '-', and '+' characters, as appropriate, * unless the ANSI set is expanded to include such graphics. * 3) Otherwise we put underscore "_". * * History: * IanJa 4/10/91 from Win3.1 \\pucus\win31ro!drivers\keyboard\xlat*.* \***************************************************************************/ #include "precomp.h" #pragma hdrstop /***************************************************************************\ * CharToOemA * * CharToOemA(pSrc, pDst) - Translates the ANSI string at pSrc into * the OEM string at pDst. pSrc == pDst is legal. * Always returns TRUE * \***************************************************************************/ FUNCLOG2(LOG_GENERAL, BOOL, WINAPI, CharToOemA, LPCSTR, pSrc, LPSTR, pDst) BOOL WINAPI CharToOemA( LPCSTR pSrc, LPSTR pDst) { UserAssert(gpsi); if (pSrc == NULL || pDst == NULL) { return FALSE; } do { *pDst++ = gpsi->acAnsiToOem[(UCHAR)*pSrc]; } while (*pSrc++); return TRUE; } /***************************************************************************\ * CharToOemBuffA * * CharToOemBuffA(pSrc, pDst, nLength) - Translates nLength characters from * the ANSI string at pSrc into OEM characters in the buffer at pDst. * pSrc == pDst is legal. * * History: \***************************************************************************/ FUNCLOG3(LOG_GENERAL, BOOL, WINAPI, CharToOemBuffA, LPCSTR, pSrc, LPSTR, pDst, DWORD, nLength) BOOL WINAPI CharToOemBuffA( LPCSTR pSrc, LPSTR pDst, DWORD nLength) { UserAssert(gpsi); if (pSrc == NULL || pDst == NULL) { return FALSE; } while (nLength--) { *pDst++ = gpsi->acAnsiToOem[(UCHAR)*pSrc++]; } return TRUE; } /***************************************************************************\ * OemToCharA * * OemToCharA(pSrc, pDst) - Translates the OEM string at pSrc into * the ANSI string at pDst. pSrc == pDst is legal. * * Always returns TRUE * * History: \***************************************************************************/ FUNCLOG2(LOG_GENERAL, BOOL, WINAPI, OemToCharA, LPCSTR, pSrc, LPSTR, pDst) BOOL WINAPI OemToCharA( LPCSTR pSrc, LPSTR pDst) { UserAssert(gpsi); if (pSrc == NULL || pDst == NULL) { return FALSE; } do { *pDst++ = gpsi->acOemToAnsi[(UCHAR)*pSrc]; } while (*pSrc++); return TRUE; } /***************************************************************************\ * OemToCharBuffA * * OemToCharBuffA(pSrc, pDst, nLength) - Translates nLength OEM characters from * the buffer at pSrc into ANSI characters in the buffer at pDst. * pSrc == pDst is legal. * * Always returns TRUE * * History: \***************************************************************************/ FUNCLOG3(LOG_GENERAL, BOOL, WINAPI, OemToCharBuffA, LPCSTR, pSrc, LPSTR, pDst, DWORD, nLength) BOOL WINAPI OemToCharBuffA( LPCSTR pSrc, LPSTR pDst, DWORD nLength) { UserAssert(gpsi); if (pSrc == NULL || pDst == NULL) { return FALSE; } while (nLength--) { *pDst++ = gpsi->acOemToAnsi[(UCHAR)*pSrc++]; } return TRUE; } /***************************************************************************\ * CharToOemW * * CharToOemW(pSrc, pDst) - Translates the Unicode string at pSrc into * the OEM string at pDst. pSrc == pDst is legal. * * History: \***************************************************************************/ FUNCLOG2(LOG_GENERAL, BOOL, WINAPI, CharToOemW, LPCWSTR, pSrc, LPSTR, pDst) BOOL WINAPI CharToOemW( LPCWSTR pSrc, LPSTR pDst) { int cch; if (pSrc == NULL || pDst == NULL) { return FALSE; } else if (pSrc == (LPCWSTR)pDst) { /* * WideCharToMultiByte() requires pSrc != pDst: fail this call. * LATER: Is this really true? */ return FALSE; } cch = wcslen(pSrc) + 1; WideCharToMultiByte( CP_OEMCP, // Unicode -> OEM 0, // gives best visual match (LPWSTR)pSrc, cch, // source & length pDst, // dest cch * 2, // max poss.length (DBCS may * 2) "_", // default char NULL); // (don't care whether defaulted) return TRUE; } /***************************************************************************\ * CharToOemBuffW * * CharToOemBuffW(pSrc, pDst, nLength) - Translates nLength characters from * the Unicode string at pSrc into OEM characters in the buffer at pDst. * pSrc == pDst is legal. * * History: \***************************************************************************/ FUNCLOG3(LOG_GENERAL, BOOL, WINAPI, CharToOemBuffW, LPCWSTR, pSrc, LPSTR, pDst, DWORD, nLength) BOOL WINAPI CharToOemBuffW( LPCWSTR pSrc, LPSTR pDst, DWORD nLength) { if (pSrc == NULL || pDst == NULL) { return FALSE; } else if (pSrc == (LPCWSTR)pDst) { /* * WideCharToMultiByte() requires pSrc != pDst: fail this call. * LATER: Is this really true? */ return FALSE; } WideCharToMultiByte( CP_OEMCP, // Unicode -> OEM 0, // gives best visual match (LPWSTR)pSrc, (int)nLength, // source & length pDst, // dest (int)nLength * 2, // max poss. length (DBCS may * 2) "_", // default char NULL); // (don't care whether defaulted) return TRUE; } /***************************************************************************\ * OemToCharW * * OemToCharW(pSrc, pDst) - Translates the OEM string at pSrc into * the Unicode string at pDst. pSrc == pDst is not legal. * * History: \***************************************************************************/ FUNCLOG2(LOG_GENERAL, BOOL, WINAPI, OemToCharW, LPCSTR, pSrc, LPWSTR, pDst) BOOL WINAPI OemToCharW( LPCSTR pSrc, LPWSTR pDst) { int cch; if (pSrc == NULL || pDst == NULL) { return FALSE; } else if (pSrc == (LPCSTR)pDst) { /* * MultiByteToWideChar() requires pSrc != pDst: fail this call. * LATER: Is this really true? */ return FALSE; } cch = strlen(pSrc) + 1; MultiByteToWideChar( CP_OEMCP, // Unicode -> OEM MB_PRECOMPOSED | MB_USEGLYPHCHARS, // visual map to precomposed (LPSTR)pSrc, cch, // source & length pDst, // destination cch); // max poss. precomposed length return TRUE; } /***************************************************************************\ * OemToCharBuffW * * OemToCharBuffW(pSrc, pDst, nLength) - Translates nLength OEM characters from * the buffer at pSrc into Unicode characters in the buffer at pDst. * pSrc == pDst is not legal. * * History: \***************************************************************************/ FUNCLOG3(LOG_GENERAL, BOOL, WINAPI, OemToCharBuffW, LPCSTR, pSrc, LPWSTR, pDst, DWORD, nLength) BOOL WINAPI OemToCharBuffW( LPCSTR pSrc, LPWSTR pDst, DWORD nLength) { if (pSrc == NULL || pDst == NULL) { return FALSE; } else if (pSrc == (LPCSTR)pDst) { /* * MultiByteToWideChar() requires pSrc != pDst: fail this call. * LATER: Is this really true? */ return FALSE; } if (MultiByteToWideChar( CP_OEMCP, // Unicode -> OEM MB_PRECOMPOSED | MB_USEGLYPHCHARS, // visual map to precomposed (LPSTR)pSrc, nLength, // source & length pDst, // destination nLength)) { // max poss. precomposed length return TRUE; } return FALSE; } /***************************************************************************\ * OemKeyScan (API) * * Converts an OEM character into a scancode plus shift state, returning * scancode in low byte, shift state in high byte. * * Returns -1 on error. * \***************************************************************************/ FUNCLOG1(LOG_GENERAL, DWORD, WINAPI, OemKeyScan, WORD, wOemChar) DWORD WINAPI OemKeyScan( WORD wOemChar) { WCHAR wchOem; SHORT sVk; UINT dwRet; #ifdef FE_SB // OemKeyScan() /* * Return 0xFFFFFFFF for DBCS LeadByte character. */ if (IsDBCSLeadByte(LOBYTE(wOemChar))) { return 0xFFFFFFFF; } #endif // FE_SB if (!OemToCharBuffW((LPCSTR)&wOemChar, &wchOem, 1)) { return 0xFFFFFFFF; } sVk = VkKeyScanW(wchOem); if ((dwRet = MapVirtualKeyW(LOBYTE(sVk), 0)) == 0) { return 0xFFFFFFFF; } return dwRet | ((sVk & 0xFF00) << 8); }