diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericopenlibs/openenvcore/libc/src/mbrtowc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/genericopenlibs/openenvcore/libc/src/mbrtowc.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,108 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Name : mbrtowc.cpp +// Part of : MRT LIBC +// Contains the source for the mbrtowc API implementation. +// Version : +// + + + +#include <e32std.h> +#include <utf.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +#include <stdio.h> +#include "wcharcnv.h" + +#if (defined(__SYMBIAN32__) && (defined(__WINSCW__) || defined(__WINS__))) +#include "libc_wsd_defs.h" +#endif + +#ifdef EMULATOR + +GET_STATIC_VAR_FROM_TLS(mbrtowc_mbs, mbstate_t) +#define mbs (*GET_WSD_VAR_NAME(mbrtowc_mbs, s)()) +#endif //EMULATOR + +extern "C" { + +//----------------------------------------------------------------------------- +//Function Name : size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, +// mbstate_t *ps) +//Description :inspects at most n bytes of the multibyte string starting +//at s, extracts the next complete multi-byte character, converts it to a wide +//character and stores it at *pwc.It updates the shift state *ps. +//Return Value : returns the number of bytes parsed from the multi-byte +//sequence starting at s, if a non-L'\0' wide character was recognized. It +//returns 0, if a Lâ\0â wide character was recognized. It returns (size_t)(-1) +//and sets errno to EILSEQ, if an invalid multibyte sequence was encountered. +//It returns (size_t)(-2) if it couldn't parse a complete multibyte character, +//meaning that n should be increased. +//----------------------------------------------------------------------------- +EXPORT_C size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) +{ + int rval = 0; +#ifndef EMULATOR + static mbstate_t mbs; +#endif //EMULATOR + + if (ps == NULL) + ps = &mbs; + + if (s) + { + wchar_t wide; + + //number of chars to convert has a max of MB_CUR_MAX + TInt maxlen = (n > MB_CUR_MAX ? MB_CUR_MAX : n); + + TPtrC8 src((const TUint8*)s, maxlen); + //length of 1 as we only want 1 wide character + TPtr16 awc((TUint16*)&wide, 1); + + TInt ret = ConvertToUnicodeFromUtf8(awc, src, ps); + + //return the number of chars converted which is the max number + //- the number not converted unless the character converted + //was the wide null character + if (ret >= 0) + { + //rval = (L'\0' != wide) ? maxlen - ret : 0; + if(L'\0' == wide) + { + rval = 0; + } + else + { + rval = ret; + } + + if (pwc) + { + //only assign the return if we have a target + *pwc = wide; + } + } + else + { + rval = ret; + } + } + return (size_t)(rval); + +} //end of function + +} //extern "C"