michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: #include michael@0: #include michael@0: michael@0: #include "nscore.h" michael@0: #include "nsString.h" michael@0: #include "nsIServiceManager.h" michael@0: #include "nsICharsetConverterManager.h" michael@0: #include "nsIUnicodeEncoder.h" michael@0: #include "nsIUnicodeDecoder.h" michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: void usage() michael@0: { michael@0: printf( michael@0: "convperf -f fromcode -t tocode [file]\n" michael@0: ); michael@0: } michael@0: int fromcodeind = 0; michael@0: int tocodeind = 0; michael@0: FILE* infile = 0; michael@0: #define INBUFSIZE (1024*16) michael@0: #define MEDBUFSIZE (1024*16*2) michael@0: #define OUTBUFSIZE (1024*16*8) michael@0: char inbuffer[INBUFSIZE]; michael@0: char outbuffer[OUTBUFSIZE]; michael@0: char16_t medbuffer[MEDBUFSIZE]; michael@0: nsIUnicodeEncoder* encoder = nullptr; michael@0: nsIUnicodeDecoder* decoder = nullptr; michael@0: UINT incp = 932; michael@0: UINT outcp = 932; michael@0: michael@0: void memcpyDecode(const char* src, int32_t srclen, char* dest) michael@0: { michael@0: ::memcpy(dest, src, srclen); michael@0: } michael@0: void memcpyEncode(const char* src, int32_t srclen, char* dest) michael@0: { michael@0: ::memcpy(dest, src, srclen); michael@0: } michael@0: michael@0: void WideDecode(const char* src, michael@0: int32_t srclen, char16_t *dest, int32_t *destLen) michael@0: { michael@0: const char* end = src+srclen ; michael@0: while(src < end) michael@0: *dest++ = (char16_t) *src++; michael@0: *destLen = srclen; michael@0: } michael@0: void NarrowEncode(const char16_t *src, michael@0: int32_t srclen, char* dest, int32_t* destLen) michael@0: { michael@0: const char16_t* end = src+srclen ; michael@0: while(src < end) michael@0: *dest++ = (char) *src++; michael@0: *destLen = srclen; michael@0: } michael@0: void msDecode(UINT cp, const char* src, michael@0: int32_t srclen, char16_t *dest, int32_t *destLen) michael@0: { michael@0: *destLen = ::MultiByteToWideChar(cp, 0,src, srclen, (LPWSTR)dest, *destLen); michael@0: if(*destLen <= 0) michael@0: fprintf(stderr, "problem in ::MultiByteToWideChar\n"); michael@0: } michael@0: void msEncode(UINT cp, const char16_t *src, michael@0: int32_t srcLen, char* dest, int32_t* destLen) michael@0: { michael@0: *destLen = ::WideCharToMultiByte(cp, 0, src, srcLen, (LPSTR)dest, *destLen, michael@0: (LPCSTR)" ", FALSE); michael@0: if(*destLen <= 0) michael@0: fprintf(stderr, "problem in ::WideCharToMultiByte\n"); michael@0: } michael@0: michael@0: int main(int argc, const char** argv) michael@0: { michael@0: nsresult res; michael@0: nsCOMPtr ccMain = michael@0: do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &res); michael@0: if(NS_FAILED(res)) michael@0: { michael@0: fprintf(stderr, "Cannot get Character Converter Manager %x\n", res); michael@0: } michael@0: int i; michael@0: if(argc > 5) michael@0: { michael@0: for(i =0; i < argc; i++) michael@0: { michael@0: if(strcmp(argv[i], "-f") == 0) michael@0: { michael@0: tocodeind = i+1; michael@0: res = ccMain->GetUnicodeDecoder(argv[tocodeind], &decoder); michael@0: if(NS_FAILED(res)) { michael@0: fprintf(stderr, "Cannot get Unicode decoder %s %x\n", michael@0: argv[tocodeind],res); michael@0: return -1; michael@0: } michael@0: michael@0: } michael@0: if(strcmp(argv[i], "-t") == 0) michael@0: { michael@0: fromcodeind = i+1; michael@0: res = ccMain->GetUnicodeEncoderRaw(argv[fromcodeind], &encoder); michael@0: if(NS_FAILED(res)) { michael@0: fprintf(stderr, "Cannot get Unicode encoder %s %x\n", michael@0: argv[fromcodeind],res); michael@0: return -1; michael@0: } michael@0: } michael@0: } michael@0: if(argc == 6) michael@0: { michael@0: infile = fopen(argv[5], "rb"); michael@0: if (!infile) michael@0: { michael@0: usage(); michael@0: fprintf(stderr,"cannot open file %s\n", argv[5]); michael@0: return -1; michael@0: } michael@0: } michael@0: else michael@0: { michael@0: infile = stdin; michael@0: } michael@0: michael@0: int32_t insize,medsize,outsize; michael@0: while((insize=fread(inbuffer, 1,INBUFSIZE,infile)) > 0) michael@0: { michael@0: medsize=MEDBUFSIZE; michael@0: michael@0: res = decoder->Convert(inbuffer,&insize, medbuffer, &medsize); michael@0: if(NS_FAILED(res)) { michael@0: fprintf(stderr, "failed in decoder->Convert %x\n",res); michael@0: return -1; michael@0: } michael@0: outsize = OUTBUFSIZE; michael@0: res = encoder->Convert(medbuffer, &medsize, outbuffer,&outsize); michael@0: if(NS_FAILED(res)) { michael@0: fprintf(stderr, "failed in encoder->Convert %x\n",res); michael@0: return -1; michael@0: } michael@0: fwrite(outbuffer, 1, outsize, stdout); michael@0: michael@0: memcpyDecode(inbuffer, insize, outbuffer); michael@0: michael@0: memcpyEncode(inbuffer, insize, outbuffer); michael@0: michael@0: medsize = MEDBUFSIZE; michael@0: msDecode(incp, inbuffer, insize, medbuffer, &medsize); michael@0: michael@0: outsize = OUTBUFSIZE; michael@0: msEncode(outcp, medbuffer, medsize, outbuffer, &outsize); michael@0: michael@0: medsize = MEDBUFSIZE; michael@0: WideDecode( inbuffer, insize, medbuffer, &medsize); michael@0: michael@0: outsize = OUTBUFSIZE; michael@0: NarrowEncode( medbuffer, medsize, outbuffer, &outsize); michael@0: } michael@0: michael@0: fclose(infile); michael@0: fclose(stdout); michael@0: fprintf(stderr, "Done!\n"); michael@0: return 0; michael@0: } michael@0: usage(); michael@0: return -1; michael@0: }