1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/uconv/tests/convperf.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,172 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 +#include <windows.h> 1.9 +#include <winnls.h> 1.10 + 1.11 +#include "nscore.h" 1.12 +#include "nsString.h" 1.13 +#include "nsIServiceManager.h" 1.14 +#include "nsICharsetConverterManager.h" 1.15 +#include "nsIUnicodeEncoder.h" 1.16 +#include "nsIUnicodeDecoder.h" 1.17 + 1.18 +#include <stdio.h> 1.19 +#include <string.h> 1.20 +#include <stdlib.h> 1.21 +void usage() 1.22 +{ 1.23 + printf( 1.24 +"convperf -f fromcode -t tocode [file]\n" 1.25 + ); 1.26 +} 1.27 +int fromcodeind = 0; 1.28 +int tocodeind = 0; 1.29 +FILE* infile = 0; 1.30 +#define INBUFSIZE (1024*16) 1.31 +#define MEDBUFSIZE (1024*16*2) 1.32 +#define OUTBUFSIZE (1024*16*8) 1.33 +char inbuffer[INBUFSIZE]; 1.34 +char outbuffer[OUTBUFSIZE]; 1.35 +char16_t medbuffer[MEDBUFSIZE]; 1.36 +nsIUnicodeEncoder* encoder = nullptr; 1.37 +nsIUnicodeDecoder* decoder = nullptr; 1.38 +UINT incp = 932; 1.39 +UINT outcp = 932; 1.40 + 1.41 +void memcpyDecode(const char* src, int32_t srclen, char* dest) 1.42 +{ 1.43 + ::memcpy(dest, src, srclen); 1.44 +} 1.45 +void memcpyEncode(const char* src, int32_t srclen, char* dest) 1.46 +{ 1.47 + ::memcpy(dest, src, srclen); 1.48 +} 1.49 + 1.50 +void WideDecode(const char* src, 1.51 + int32_t srclen, char16_t *dest, int32_t *destLen) 1.52 +{ 1.53 + const char* end = src+srclen ; 1.54 + while(src < end) 1.55 + *dest++ = (char16_t) *src++; 1.56 + *destLen = srclen; 1.57 +} 1.58 +void NarrowEncode(const char16_t *src, 1.59 + int32_t srclen, char* dest, int32_t* destLen) 1.60 +{ 1.61 + const char16_t* end = src+srclen ; 1.62 + while(src < end) 1.63 + *dest++ = (char) *src++; 1.64 + *destLen = srclen; 1.65 +} 1.66 +void msDecode(UINT cp, const char* src, 1.67 + int32_t srclen, char16_t *dest, int32_t *destLen) 1.68 +{ 1.69 + *destLen = ::MultiByteToWideChar(cp, 0,src, srclen, (LPWSTR)dest, *destLen); 1.70 + if(*destLen <= 0) 1.71 + fprintf(stderr, "problem in ::MultiByteToWideChar\n"); 1.72 +} 1.73 +void msEncode(UINT cp, const char16_t *src, 1.74 + int32_t srcLen, char* dest, int32_t* destLen) 1.75 +{ 1.76 + *destLen = ::WideCharToMultiByte(cp, 0, src, srcLen, (LPSTR)dest, *destLen, 1.77 + (LPCSTR)" ", FALSE); 1.78 + if(*destLen <= 0) 1.79 + fprintf(stderr, "problem in ::WideCharToMultiByte\n"); 1.80 +} 1.81 + 1.82 +int main(int argc, const char** argv) 1.83 +{ 1.84 + nsresult res; 1.85 + nsCOMPtr<nsICharsetConverterManager> ccMain = 1.86 + do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &res); 1.87 + if(NS_FAILED(res)) 1.88 + { 1.89 + fprintf(stderr, "Cannot get Character Converter Manager %x\n", res); 1.90 + } 1.91 + int i; 1.92 + if(argc > 5) 1.93 + { 1.94 + for(i =0; i < argc; i++) 1.95 + { 1.96 + if(strcmp(argv[i], "-f") == 0) 1.97 + { 1.98 + tocodeind = i+1; 1.99 + res = ccMain->GetUnicodeDecoder(argv[tocodeind], &decoder); 1.100 + if(NS_FAILED(res)) { 1.101 + fprintf(stderr, "Cannot get Unicode decoder %s %x\n", 1.102 + argv[tocodeind],res); 1.103 + return -1; 1.104 + } 1.105 + 1.106 + } 1.107 + if(strcmp(argv[i], "-t") == 0) 1.108 + { 1.109 + fromcodeind = i+1; 1.110 + res = ccMain->GetUnicodeEncoderRaw(argv[fromcodeind], &encoder); 1.111 + if(NS_FAILED(res)) { 1.112 + fprintf(stderr, "Cannot get Unicode encoder %s %x\n", 1.113 + argv[fromcodeind],res); 1.114 + return -1; 1.115 + } 1.116 + } 1.117 + } 1.118 + if(argc == 6) 1.119 + { 1.120 + infile = fopen(argv[5], "rb"); 1.121 + if (!infile) 1.122 + { 1.123 + usage(); 1.124 + fprintf(stderr,"cannot open file %s\n", argv[5]); 1.125 + return -1; 1.126 + } 1.127 + } 1.128 + else 1.129 + { 1.130 + infile = stdin; 1.131 + } 1.132 + 1.133 + int32_t insize,medsize,outsize; 1.134 + while((insize=fread(inbuffer, 1,INBUFSIZE,infile)) > 0) 1.135 + { 1.136 + medsize=MEDBUFSIZE; 1.137 + 1.138 + res = decoder->Convert(inbuffer,&insize, medbuffer, &medsize); 1.139 + if(NS_FAILED(res)) { 1.140 + fprintf(stderr, "failed in decoder->Convert %x\n",res); 1.141 + return -1; 1.142 + } 1.143 + outsize = OUTBUFSIZE; 1.144 + res = encoder->Convert(medbuffer, &medsize, outbuffer,&outsize); 1.145 + if(NS_FAILED(res)) { 1.146 + fprintf(stderr, "failed in encoder->Convert %x\n",res); 1.147 + return -1; 1.148 + } 1.149 + fwrite(outbuffer, 1, outsize, stdout); 1.150 + 1.151 + memcpyDecode(inbuffer, insize, outbuffer); 1.152 + 1.153 + memcpyEncode(inbuffer, insize, outbuffer); 1.154 + 1.155 + medsize = MEDBUFSIZE; 1.156 + msDecode(incp, inbuffer, insize, medbuffer, &medsize); 1.157 + 1.158 + outsize = OUTBUFSIZE; 1.159 + msEncode(outcp, medbuffer, medsize, outbuffer, &outsize); 1.160 + 1.161 + medsize = MEDBUFSIZE; 1.162 + WideDecode( inbuffer, insize, medbuffer, &medsize); 1.163 + 1.164 + outsize = OUTBUFSIZE; 1.165 + NarrowEncode( medbuffer, medsize, outbuffer, &outsize); 1.166 + } 1.167 + 1.168 + fclose(infile); 1.169 + fclose(stdout); 1.170 + fprintf(stderr, "Done!\n"); 1.171 + return 0; 1.172 + } 1.173 + usage(); 1.174 + return -1; 1.175 +}