diff options
Diffstat (limited to 'rsc/source/tools/rscchar.cxx')
-rw-r--r-- | rsc/source/tools/rscchar.cxx | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/rsc/source/tools/rscchar.cxx b/rsc/source/tools/rscchar.cxx new file mode 100644 index 000000000000..c23022e4222e --- /dev/null +++ b/rsc/source/tools/rscchar.cxx @@ -0,0 +1,196 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_rsc.hxx" +/****************** I N C L U D E S **************************************/ +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +#ifndef _TABLE_HXX //autogen +#include <tools/table.hxx> +#endif + +// Solar Definitionen +#include <tools/solar.h> +#include <rsctools.hxx> + +#include <rtl/textcvt.h> +#include <rtl/textenc.h> +#include <rtl/alloc.h> + +/************************************************************************* +|* +|* RscChar::MakeChar() +|* +|* Beschreibung Der String wird nach C-Konvention umgesetzt +|* Ersterstellung MM 20.03.91 +|* Letzte Aenderung MM 20.03.91 +|* +*************************************************************************/ +char * RscChar::MakeUTF8( char * pStr, UINT16 nTextEncoding ) +{ + sal_Size nMaxUniCodeBuf = strlen( pStr ) + 1; + char * pOrgStr = new char[ nMaxUniCodeBuf ]; + sal_uInt32 nOrgLen = 0; + + if( nMaxUniCodeBuf * 6 > 0x0FFFFF ) + RscExit( 10 ); + + char cOld = '1'; + while( cOld != 0 ) + { + char c; + + if( *pStr == '\\' ) + { + ++pStr; + switch( *pStr ) + { + case 'a': + c = '\a'; + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'v': + c = '\v'; + break; + case '\\': + c = '\\'; + break; + case '?': + c = '\?'; + break; + case '\'': + c = '\''; + break; + case '\"': + c = '\"'; + break; + default: + { + if( '0' <= *pStr && '7' >= *pStr ) + { + sal_uInt16 nChar = 0; + int i = 0; + while( '0' <= *pStr && '7' >= *pStr && i != 3 ) + { + nChar = nChar * 8 + (BYTE)*pStr - (BYTE)'0'; + ++pStr; + i++; + } + if( nChar > 255 ) + { + rtl_freeMemory( pOrgStr ); + + // Wert zu gross, oder kein 3 Ziffern + return( NULL ); + } + c = (char)nChar; + pStr--; + } + else if( 'x' == *pStr ) + { + sal_uInt16 nChar = 0; + int i = 0; + ++pStr; + while( isxdigit( *pStr ) && i != 2 ) + { + if( isdigit( *pStr ) ) + nChar = nChar * 16 + (BYTE)*pStr - (BYTE)'0'; + else if( isupper( *pStr ) ) + nChar = nChar * 16 + (BYTE)*pStr - (BYTE)'A' +10; + else + nChar = nChar * 16 + (BYTE)*pStr - (BYTE)'a' +10; + ++pStr; + i++; + } + c = (char)nChar; + pStr--; + } + else + c = *pStr; + }; + } + } + else + c = *pStr; + pOrgStr[ nOrgLen++ ] = c; + cOld = *pStr; + pStr++; + } + + sal_Unicode * pUniCode = new sal_Unicode[ nMaxUniCodeBuf ]; + rtl_TextToUnicodeConverter hConv = rtl_createTextToUnicodeConverter( nTextEncoding ); + + sal_uInt32 nInfo; + sal_Size nSrcCvtBytes; + sal_Size nUniSize = rtl_convertTextToUnicode( hConv, 0, + pOrgStr, nOrgLen, + pUniCode, nMaxUniCodeBuf, + RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT + | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT + | RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT + | RTL_TEXTTOUNICODE_FLAGS_FLUSH, + &nInfo, + &nSrcCvtBytes ); + + rtl_destroyTextToUnicodeConverter( hConv ); + + hConv = rtl_createUnicodeToTextConverter( RTL_TEXTENCODING_UTF8 ); + // factor fo 6 is the maximum size of an UNICODE character as utf8 + char * pUtf8 = (char *)rtl_allocateMemory( nUniSize * 6 ); + rtl_convertUnicodeToText( hConv, 0, + pUniCode, nUniSize, + pUtf8, nUniSize * 6, + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT + | RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT + | RTL_UNICODETOTEXT_FLAGS_FLUSH, + &nInfo, + &nSrcCvtBytes ); + + rtl_destroyTextToUnicodeConverter( hConv ); + + delete[] pUniCode; + delete[] pOrgStr; + + return pUtf8; +}; |