Annotation of embedaddon/php/ext/com_dotnet/com_olechar.c, revision 1.1.1.4
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.4 ! misho 5: | Copyright (c) 1997-2014 The PHP Group |
1.1 misho 6: +----------------------------------------------------------------------+
7: | This source file is subject to version 3.01 of the PHP license, |
8: | that is bundled with this package in the file LICENSE, and is |
9: | available through the world-wide-web at the following url: |
10: | http://www.php.net/license/3_01.txt |
11: | If you did not receive a copy of the PHP license and are unable to |
12: | obtain it through the world-wide-web, please send a note to |
13: | license@php.net so we can mail you a copy immediately. |
14: +----------------------------------------------------------------------+
15: | Author: Wez Furlong <wez@thebrainroom.com> |
16: | Harald Radi <h.radi@nme.at> |
17: +----------------------------------------------------------------------+
18: */
19:
1.1.1.2 misho 20: /* $Id$ */
1.1 misho 21:
22: #ifdef HAVE_CONFIG_H
23: #include "config.h"
24: #endif
25:
26: #include "php.h"
27: #include "php_ini.h"
28: #include "ext/standard/info.h"
29: #include "php_com_dotnet.h"
30: #include "php_com_dotnet_internal.h"
31:
32:
1.1.1.3 misho 33: PHP_COM_DOTNET_API OLECHAR *php_com_string_to_olestring(char *string, uint string_len, int codepage TSRMLS_DC)
1.1 misho 34: {
35: OLECHAR *olestring = NULL;
36: DWORD flags = codepage == CP_UTF8 ? 0 : MB_PRECOMPOSED | MB_ERR_INVALID_CHARS;
37: BOOL ok;
38:
39: if (string_len == -1) {
40: /* determine required length for the buffer (includes NUL terminator) */
41: string_len = MultiByteToWideChar(codepage, flags, string, -1, NULL, 0);
42: } else {
43: /* allow room for NUL terminator */
44: string_len++;
45: }
46:
47: if (string_len > 0) {
48: olestring = (OLECHAR*)safe_emalloc(string_len, sizeof(OLECHAR), 0);
1.1.1.4 ! misho 49: /* XXX if that's a real multibyte string, olestring is obviously allocated excessively.
! 50: This should be fixed by reallocating the olestring, but as emalloc is used, that doesn't
! 51: matter much. */
1.1 misho 52: ok = MultiByteToWideChar(codepage, flags, string, string_len, olestring, string_len);
1.1.1.4 ! misho 53: if (ok > 0 && ok < string_len) {
! 54: olestring[ok] = '\0';
! 55: }
1.1 misho 56: } else {
57: ok = FALSE;
58: olestring = (OLECHAR*)emalloc(sizeof(OLECHAR));
59: *olestring = 0;
60: }
61:
62: if (!ok) {
1.1.1.2 misho 63: char *msg = php_win32_error_to_msg(GetLastError());
1.1 misho 64:
65: php_error_docref(NULL TSRMLS_CC, E_WARNING,
66: "Could not convert string to unicode: `%s'", msg);
67:
68: LocalFree(msg);
69: }
70:
71: return olestring;
72: }
73:
1.1.1.3 misho 74: PHP_COM_DOTNET_API char *php_com_olestring_to_string(OLECHAR *olestring, uint *string_len, int codepage TSRMLS_DC)
1.1 misho 75: {
76: char *string;
77: uint length = 0;
78: BOOL ok;
79:
80: length = WideCharToMultiByte(codepage, 0, olestring, -1, NULL, 0, NULL, NULL);
81:
82: if (length) {
83: string = (char*)safe_emalloc(length, sizeof(char), 0);
84: length = WideCharToMultiByte(codepage, 0, olestring, -1, string, length, NULL, NULL);
85: ok = length > 0;
86: } else {
87: string = (char*)emalloc(sizeof(char));
88: *string = '\0';
89: ok = FALSE;
90: length = 0;
91: }
92:
93: if (!ok) {
1.1.1.2 misho 94: char *msg = php_win32_error_to_msg(GetLastError());
1.1 misho 95:
96: php_error_docref(NULL TSRMLS_CC, E_WARNING,
97: "Could not convert string from unicode: `%s'", msg);
98:
99: LocalFree(msg);
100: }
101:
102: if (string_len) {
103: *string_len = length-1;
104: }
105:
106: return string;
107: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>