1//************************************************************************* 2//* 3//* Copyright (c) 2001 Data Access Corporation, Miami Florida, 4//* All rights reserved. 5//* DataFlex is a registered trademark of Data Access Corporation. 6//* 7//************************************************************************* 8//* 9//* Module Name: 10//* CharTranslate.pkg 11//* 12//* Creator: 13//* SF 14//* 15//* 16//* Purpose: 17//* Various global functions to translate OEM to UTF. 18//* 19//************************************************************************* 20 21Use Windows.pkg 22 23#REPLACE CP_ACP 0 // default to ANSI code page 24#REPLACE CP_OEMCP 1 // default to OEM code page 25#REPLACE CP_MACCP 2 // default to MAC code page 26#REPLACE CP_THREAD_ACP 3 // current thread's ANSI code page 27#REPLACE CP_SYMBOL 42 // SYMBOL translations 28#REPLACE CP_UTF7 65000 // UTF-7 translation 29#REPLACE CP_UTF8 65001 // UTF-8 translation 30 31External_Function32 MultiByteToWideChar "MultiByteToWideChar" kernel32.dll; 32 DWORD dwCodePage; 33 DWORD dwFlags; 34 Pointer pMultiByteStr; 35 Integer cbMultiByte; 36 Pointer pWideStr; 37 Integer cchWideChar; 38 Returns Integer 39 40External_Function32 WideCharToMultiByte "WideCharToMultiByte" kernel32.dll; 41 DWORD dwCodePage; 42 DWORD dwFlags; 43 Pointer pWideStr; 44 Integer cchWideChar; 45 Pointer pMultiByteStr; 46 Integer cbMultiByte; 47 Pointer pDefaultChar; 48 Pointer pUsedDefaultChar; 49 Returns Integer 50 51//dwCodePage = Multi Byte Code Page to convert from 52//pMultiBuf = Pointer to Multi Byte string 53//iLen = Length in bytes of Multi Byte string 54//ppWideBuf = Contents of ppWideBuf contains a pointer to the destination buffer on return 55Function MultiToWideBuffer Global DWORD dwCodePage Address pMultiBuf Integer iLen Address ppWideBuf Returns Integer 56 Integer iWideSize 57 Integer iVoid 58 Address pWideBuf 59 Move (MultiByteToWideChar(dwCodePage,0,pMultiBuf,iLen,0,0)) to iWideSize 60 If (iWideSize=0); 61 Function_Return 0 62 Move (Alloc((iWideSize+1)*2)) to pWideBuf 63 If (pWideBuf=0); 64 Function_Return 0 65 Move (MultiByteToWideChar(dwCodePage,0,pMultiBuf,iLen,pWideBuf,iWideSize)) to iWideSize 66 If (iWideSize=0) ; 67 Move (Free(pWideBuf)) to iVoid 68 else begin 69 Move (StoreW(pWideBuf,(iWideSize*2),0)) to iVoid 70 Move (StoreDW(ppWideBuf,0,pWideBuf)) to iVoid 71 end 72 Function_Return iWideSize 73End_Function 74 75//dwCodePage = Multi Byte Code Page to convert to 76//pWideBuf = Pointer to Wide Character string 77//iLen = Length in characters of Wide Character string 78//ppMultiBuf = Contents of ppMultiBuf contains a pointer to the destination buffer on return 79Function WideToMultiBuffer Global DWORD dwCodePage Address pWideBuf Integer iLen Address ppMultiBuf Returns Integer 80 Integer iMultiSize 81 Address pMultiBuf 82 Integer iVoid 83 Move (WideCharToMultiByte(dwCodePage,0,pWideBuf,iLen,0,0,0,0)) to iMultiSize 84 If (iMultiSize=0); 85 Function_Return 0 86 Move (Alloc(iMultiSize+1)) to pMultiBuf 87 If (pMultiBuf=0); 88 Function_Return 0 89 Move (WideCharToMultiByte(dwCodePage,0,pWideBuf,iLen,pMultiBuf,iMultiSize,0,0)) to iMultiSize 90 If (iMultiSize=0) ; 91 Move (Free(pMultiBuf)) to iVoid 92 else begin 93 Move (StoreC(pMultiBuf,iMultiSize,0)) to iVoid 94 Move (StoreDW(ppMultiBuf,0,pMultiBuf)) to iVoid 95 end 96 Function_Return iMultiSize 97End_Function 98 99//Converts a UTF-8 string to OEM 100//pUtf8Buf = Pointer to UTF-8 string 101//iLen = Length of UTF-8 string in bytes 102//Returns pointer to OEM string, use free() to deallocate buffer when it's no longer needed 103Function Utf8ToOemBuffer Global Address pUtf8Buf Integer iLen Returns Address 104 Address pWideBuf 105 Address pOemBuf 106 Integer iWideBufLen 107 Integer iMultiBufLen 108 Integer iVoid 109 Move 0 to pWideBuf 110 Move 0 to pOemBuf 111 Move (MultiToWideBuffer(CP_UTF8,pUtf8Buf,iLen,AddressOf(pWideBuf))) to iWideBufLen 112 If (iWideBufLen=0); 113 Function_Return 0 114 Move (WideToMultiBuffer(CP_OEMCP,pWideBuf,iWideBufLen,AddressOf(pOemBuf))) to iMultiBufLen 115 Move (Free(pWideBuf)) to iVoid 116 Function_Return pOemBuf 117End_Function 118 119//Converts a OEM string to UTF-8 120//pOemBuf = Pointer to OEM string 121//iLen = Length of OEM string in bytes 122//Returns pointer to UTF-8 string, use free() to deallocate buffer when it's no longer needed 123Function OemToUtf8Buffer Global Address pOemBuf Integer iLen Returns Address 124 Address pWideBuf 125 Address pUtf8Buf 126 Integer iWideBufLen 127 Integer iMultiBufLen 128 Integer iVoid 129 Move 0 to pWideBuf 130 Move 0 to pUtf8Buf 131 Move (MultiToWideBuffer(CP_OEMCP,pOemBuf,iLen,AddressOf(pWideBuf))) to iWideBufLen 132 If (iWideBufLen=0); 133 Function_Return 0 134 Move (WideToMultiBuffer(CP_UTF8,pWideBuf,iWideBufLen,AddressOf(pUtf8Buf))) to iMultiBufLen 135 Move (Free(pWideBuf)) to iVoid 136 Function_Return pUtf8Buf 137End_Function 138 139 140//Converts a OEM string to UTF-16 141//pOemBuf = Pointer to OEM string 142//iLen = Length of OEM string in bytes 143//Returns pointer to UTF-16 string, use free() to deallocate buffer when it's no longer needed 144Function OemToUtf16Buffer Global Address pOemBuf Integer iLen Returns Address 145 Address pWideBuf 146 Integer iWideBufLen 147 Move 0 to pWideBuf 148 Move (MultiToWideBuffer(CP_OEMCP,pOemBuf,iLen,AddressOf(pWideBuf))) to iWideBufLen 149 If (iWideBufLen=0) Begin 150 Function_Return 0 151 End 152 Function_Return pWideBuf 153End_Function 154 155//Converts a UTF-16 string to OEM 156//pWideBuf = Pointer to UTF-16 string 157//iWideBufLen = Length of UTF-16 in characters 158//Returns pointer to OEM string, use free() to deallocate buffer when it's no longer needed 159Function Utf16ToOemBuffer Global Address pWideBuf Integer iWideBufLen Returns Address 160 Address pOemBuf 161 Integer iMultiBufLen 162 Move 0 to pOemBuf 163 Move (WideToMultiBuffer(CP_OEMCP,pWideBuf,iWideBufLen,AddressOf(pOemBuf))) to iMultiBufLen 164 If (iMultiBufLen=0) Begin 165 Function_Return 0 166 End 167 Function_Return pOemBuf 168End_Function 169