blob: acfa3888c63a9fe03d77615a03907587958df0a7 [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.
*/
/*
* $Id$
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include "Xlat.hpp"
// ---------------------------------------------------------------------------
// ICUResBundFormatter: Constructors and Destructor
// ---------------------------------------------------------------------------
ICUResBundFormatter::ICUResBundFormatter()
:fOutFl(0)
,fTranscoder(0)
{
//
// Try to create a transcoder for the format that we were told
// to output in.
//
// <TBD> Right now we are just using an LCP transcoding, which is not
// really the right thing to do!
//
fTranscoder = XMLPlatformUtils::fgTransService->makeNewLCPTranscoder(XMLPlatformUtils::fgMemoryManager);
if (!fTranscoder)
{
wprintf(L"Could not create LCP transcoder\n");
throw ErrReturn_NoTranscoder;
}
}
ICUResBundFormatter::~ICUResBundFormatter()
{
delete fTranscoder;
}
// ---------------------------------------------------------------------------
// ICUResBundFormatter: Implementation of the formatter interface
// ---------------------------------------------------------------------------
void ICUResBundFormatter::endDomain(const XMLCh* const domainName
, const unsigned int msgCount)
{
fwprintf(fOutFl, L"\t\t} \n\n");
}
void ICUResBundFormatter::endMsgType(const MsgTypes type)
{
#ifndef ICU_RESBUNDLE_IN_TABLE_FORM
fwprintf(fOutFl, L"\t\t\"%s End \" ,\n", xmlStrToPrintable(typePrefixes[type]) );
releasePrintableStr
#endif
}
void ICUResBundFormatter::endOutput()
{
// Close the output files
fwprintf(fOutFl, L"} \n\n");
fclose(fOutFl);
}
void
ICUResBundFormatter::nextMessage(const XMLCh* const msgText
, const XMLCh* const msgId
, const unsigned int messageId
, const unsigned int curId)
{
//
// We have to transcode the message text to UTF-8 in order to be able
// to write it out to a message catalog (which is not Unicode enabled.)
// If the text is just US-ASCII, this won't have any effect, but don't
// bother checking, just do it simple and stupid.
//
//
// array_name {
// "xxx" ,
// "yyy" ,
// }
//
//
// table_name {
// AB { "xxx" }
// CD { "yyy" }
// }
//
#ifdef ICU_RESBUNDLE_IN_TABLE_FORM
fwprintf(fOutFl, L"\t\t %3d { \"%s\" } \n", curId, xmlStrToPrintable(msgText));
releasePrintableStr
// need to print leading 0 if less than 100, not tested yet
#else
fwprintf(fOutFl, L"\t\t\"%s\" ,\n", xmlStrToPrintable(msgText));
releasePrintableStr
// need a space between the last character and the closing "
#endif
}
void ICUResBundFormatter::startDomain(const XMLCh* const domainName
, const XMLCh* const nameSpace)
{
//
// Output:
// // an array
// domainName {
//
int index = XMLString::lastIndexOf(domainName, chForwardSlash);
#ifdef ICU_RESBUNDLE_IN_TABLE_FORM
fwprintf(fOutFl, L"\n\t // a table \n");
#else
fwprintf(fOutFl, L"\n\t // an array \n");
#endif
fwprintf(fOutFl, L"\t%s { \n" , xmlStrToPrintable(&(domainName[index+1])));
releasePrintableStr
}
void ICUResBundFormatter::startMsgType(const MsgTypes type)
{
#ifndef ICU_RESBUNDLE_IN_TABLE_FORM
fwprintf(fOutFl, L"\t\t\"%s Start \" , \n", xmlStrToPrintable(typePrefixes[type]) );
releasePrintableStr
#endif
}
void ICUResBundFormatter::startOutput(const XMLCh* const msgLocale
, const XMLCh* const outPath)
{
//
// Ok, lets try to open the the output file. All of the messages
// for all the domains are put into a single Msg file, which can be
// compiled into the program.
//
// CppErrMsgs_xxxx.Msg
//
// where xxx is the locale suffix passed in.
//
const unsigned int bufSize = 4095;
XMLCh tmpBuf[bufSize + 1];
tmpBuf[0] = 0;
XMLCh *tmpXMLStr = XMLString::transcode(".txt");
// ICU Resource Bundles now uses "root" as locale
XMLCh* locale = XMLString::transcode ("root");
XMLString::catString(tmpBuf, outPath);
XMLString::catString(tmpBuf, locale);
XMLString::catString(tmpBuf, tmpXMLStr );
XMLString::release(&tmpXMLStr);
char *tmpStr = XMLString::transcode(tmpBuf);
fOutFl = fopen(tmpStr, "wt");
XMLString::release(&tmpStr);
if ((!fOutFl) || (fwide(fOutFl, 1) < 0))
{
wprintf(L"Could not open the output file: %s\n\n", xmlStrToPrintable(tmpBuf) );
releasePrintableStr
throw ErrReturn_OutFileOpenFailed;
}
// Set the message delimiter
fwprintf(fOutFl, L"%s { \n", xmlStrToPrintable(locale) );
releasePrintableStr
XMLString::release(&locale);
}