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>