blob: c1813c4f7241a0c57f4ebc08c875a7baa8285a65 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _STRCONVERT_H_
#define _STRCONVERT_H_
#include <windows.h>
#ifdef NDEBUG
#define STRCONVERT_H_HAD_NDEBUG
#undef NDEBUG
#endif
#if OSL_DEBUG_LEVEL == 0
#define NDEBUG
#endif
#include <assert.h>
#ifdef __cplusplus
extern "C"{
#endif
int AllocNecessarySpaceAndCopyWStr2Str( LPCWSTR lpcwstrString, LPSTR* lppStr );
int AllocSpaceAndCopyWStr2Str( LPCWSTR lpcwstrString, DWORD nWCharsToCopy, LPSTR* lppStr );
int CalcLenDblNullTerminatedWStr( LPCWSTR lpcwstrString );
int CalcLenDblNullTerminatedStr( LPCSTR lpcstrString );
void FreeSpaceStr( LPSTR lpszString );
/* WC2MB allocates a sufficient amount of memory on stack and converts
the wide char parameter to multi byte string using the actual code
page.
@Param: wcStr - a wide char string
mbStr - the corresponding multi byte string
NOTE: due to the use of _alloca, this must be a macro and no function
*/
#define WC2MB( wcStr, mbStr ) \
if( wcStr ) \
{ \
int needed = WideCharToMultiByte( CP_ACP, 0, wcStr, -1, NULL, 0, NULL, NULL ); \
if( needed > 0 ) \
{ \
int copied; \
mbStr = _alloca( needed * sizeof( CHAR ) ); \
copied = WideCharToMultiByte( CP_ACP, 0, wcStr, -1, mbStr, needed, NULL, NULL ); \
assert( copied == needed ); \
} \
}
/* WideCharListGetMultiByteLength
calculates the needed length of a corresponding the multi byte string
list for a wide char string list.
@Param: cp - the code page to use for convertion.
wcList - a double '\0' terminated wide char string list.
*/
int WideCharListGetMultiByteLength( UINT codepage, LPCWSTR wcList );
/* WideCharListToMultiByteList
converts a double '\0' terminated list of wide char strings to a
multi byte string list.
@Param: cp - the code page to use for convertion.
wcList - a double '\0' terminated wide char string list.
mbList - a double '\0' terminated multi byte string list.
dwSize - size of buffer for multi byte string list.
*/
int WideCharListToMultiByteList( UINT codepage, LPCWSTR wcList, LPSTR mbList, DWORD dwSize );
/* WCL2MBL allocates a sufficient amount of memory on stack and converts
the wide char list parameter to multi byte string list using the actual
code page.
@Param: wcList - a wide char string list
mbList - the corresponding multi byte string list
NOTE: due to the use of _alloca, this must be a macro and no function
*/
#define WCL2MBL( wcList, mbList ) \
if( wcList ) \
{ \
int needed = WideCharListGetMultiByteLength( CP_ACP, wcList ); \
if( needed > 0 ) \
{ \
int copied; \
mbList = _alloca( needed * sizeof( CHAR ) ); \
copied = WideCharListToMultiByteList( CP_ACP, wcList, mbList, needed ); \
assert( copied == needed ); \
} \
}
#ifdef __cplusplus
}
#endif
// Restore NDEBUG state
#ifdef STRCONVERT_H_HAD_NDEBUG
#define NDEBUG
#else
#undef NDEBUG
#endif
#endif