1 /* 2 * 3 * Copyright 2016 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 /* Posix code for gpr snprintf support. */ 20 21 #include <grpc/support/port_platform.h> 22 23 #ifdef GPR_WINDOWS 24 25 /* Some platforms (namely msys) need wchar to be included BEFORE 26 anything else, especially strsafe.h. */ 27 #include <wchar.h> 28 29 #include <inttypes.h> 30 #include <stdarg.h> 31 #include <stdio.h> 32 #include <string.h> 33 #include <strsafe.h> 34 35 #include <grpc/support/alloc.h> 36 #include <grpc/support/log_windows.h> 37 #include <grpc/support/string_util.h> 38 39 #include "src/core/lib/gpr/string.h" 40 #include "src/core/lib/gpr/string_windows.h" 41 42 #if defined UNICODE || defined _UNICODE 43 LPTSTR 44 gpr_char_to_tchar(LPCSTR input) { 45 LPTSTR ret; 46 int needed = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); 47 if (needed <= 0) return NULL; 48 ret = (LPTSTR)gpr_malloc((unsigned)needed * sizeof(TCHAR)); 49 MultiByteToWideChar(CP_UTF8, 0, input, -1, ret, needed); 50 return ret; 51 } 52 53 LPSTR 54 gpr_tchar_to_char(LPCTSTR input) { 55 LPSTR ret; 56 int needed = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); 57 if (needed <= 0) return NULL; 58 ret = (LPSTR)gpr_malloc((unsigned)needed); 59 WideCharToMultiByte(CP_UTF8, 0, input, -1, ret, needed, NULL, NULL); 60 return ret; 61 } 62 #else 63 LPSTR gpr_tchar_to_char(LPCTSTR input) { return (LPSTR)gpr_strdup(input); } 64 65 LPTSTR gpr_char_to_tchar(LPCTSTR input) { return (LPTSTR)gpr_strdup(input); } 66 #endif 67 68 char* gpr_format_message(int messageid) { 69 LPTSTR tmessage; 70 char* message; 71 DWORD status = FormatMessage( 72 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 73 FORMAT_MESSAGE_IGNORE_INSERTS, 74 NULL, (DWORD)messageid, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), 75 (LPTSTR)(&tmessage), 0, NULL); 76 if (status == 0) return gpr_strdup("Unable to retrieve error string"); 77 message = gpr_tchar_to_char(tmessage); 78 LocalFree(tmessage); 79 return message; 80 } 81 82 #endif /* GPR_WINDOWS */ 83