translate.cpp

00001 /*
00002  *  TOPPERS/FDMP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Function Distributed Multiprocessor Kernel
00005  *
00006  *  Copyright (C) 2004 by Witz Corporation, JAPAN    
00007  *  Copyright (C) 2005 by Takagi Nobuhisa
00008  * 
00009  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
00010  *  によって公表されている GNU General Public License の Version 2 に記
00011  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00012  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00013  *  利用と呼ぶ)することを無償で許諾する.
00014  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00015  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00016  *      スコード中に含まれていること.
00017  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00018  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00019  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00020  *      の無保証規定を掲載すること.
00021  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00022  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00023  *      と.
00024  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00025  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00026  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00027  *        報告すること.
00028  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00029  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00030  * 
00031  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00032  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00033  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00034  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00035  * 
00036  */
00037 
00038 /*
00039  *  translate.cpp
00040  */
00041 #include "toppers/reporter.hpp"
00042 #include <cstring>
00043 #include <string>
00044 #include <map>
00045 #include <utility>
00046 #include <boost/scoped_array.hpp>
00047 
00048 #ifdef  TOPPERS_HAS_ICONV
00049 #include <iconv.h>
00050 #endif
00051 
00052 namespace
00053 {
00054 
00055   const int number_of_languages = toppers::reporter::number_of_languages;
00056   toppers::reporter::language_type language = toppers::reporter::English;
00057 
00058   const char* message_table[][number_of_languages] =
00059   {
00060     {
00061       "Usage: cfg [options] file\n"
00062       "Options:\n"
00063       "  -h   --help              Display this information\n"
00064       "  -lj  --japanese          Use Japanese\n"
00065       "  -le  --english           Use English\n"
00066       "  -cfg --kernel_cfg=<file> Specify the <file> instead of `kernel_cfg.c\'\n"
00067       "  -id  --kernel_id=<file>  Specify the <file> instead of `kernel_id.h\'\n"
00068       "  -ucn                     Enable universal character name in CFG file\n"
00069       "  -sjis                    Enable Shift-JIS in CFG file\n"
00070       "  -n <directory>           Specify the <directory> where output files\n"
00071       "  -kernel <type>           Specify the kernel type, <type> which is JSP or FDMP\n",
00072 
00073       "使用方法: cfg [options] file\n"
00074       "オプション:\n"
00075       "  -h  --help               この情報を表示します\n"
00076       "  -lj  --japanese          日本語を使用します\n"
00077       "  -le  --english           英語を使用します\n"
00078       "  -cfg --kernel_cfg=<file> `kernel_cfg.c\'の代わりに<file>を指定します\n"
00079       "  -id  --kernel_id=<file>  `kernel_id.h\'の代わりに<file>を指定します\n"
00080       "  -ucn                     CFGファイル内の国際文字名を許可します\n"
00081       "  -sjis                    CFGファイル内のシフトJISを許可します\n"
00082       "  -n <directory>           ファイルの出力先として<directory>を指定します\n"
00083       "  -kernel <type>           カーネル種別(JSPまたはFDMP)を指定します\n",
00084     },
00085     {
00086       "no input file",
00087       "入力ファイルが指定されていません",
00088     },
00089     {
00090       "too many input files",
00091       "入力ファイルが多すぎます",
00092     },
00093     {
00094       "illegal option `%1%\'",
00095       "`%1%\'は不正なオプションです",
00096     },
00097     {
00098       "unknown error",
00099       "未知のエラーが発生しました",
00100     },
00101     {
00102       "internal error",
00103       "内部エラーが発生しました",
00104     },
00105     {
00106       "argument to `%1%\' is missing",
00107       "`%1%\'の引数がありません",
00108     },
00109     {
00110       "%1% is not directory",
00111       "%1%はディレクトリではありません",
00112     },
00113     {
00114       "cannot make directory `%1%\'",
00115       "ディレクトリ`%1%\'を作成できません",
00116     },
00117     {
00118       "cannot create file `%1%\'",
00119       "ファイル`%1%\'を作成できません",
00120     },
00121     {
00122       "cannot open file `%1%\'",
00123       "ファイル`%1%\'を開けません",
00124     },
00125     {
00126       "warning: ",
00127       "警告: ",
00128     },
00129     {
00130       "error: ",
00131       "エラー: ",
00132     },
00133     {
00134       "fatal error: ",
00135       "致命的エラー: ",
00136     },
00137     {
00138       "syntax error",
00139       "構文エラー",
00140     },
00141     {
00142       "static API `%1%\' cannot be unresolved",
00143       "静的API `%1%\'を解決できません",
00144     },
00145     {
00146       "parameter `%1%\' must be `NULL\'",
00147       "パラメータ`%1%\'はNULLでなければなりません",
00148     },
00149     {
00150       "parameter `%1%\' is negative",
00151       "パラメータ`%1%\'が負の値です",
00152     },
00153     {
00154       "`INCLUDE\' expects string literal",
00155       "`INCLUDE\'には文字列リテラルを指定しなければなりません",
00156     },
00157     {
00158       "missing `%1%\' before `%2%\'",
00159       "`%2\'の前に`%1%\'がありません",
00160     },
00161     {
00162       "illegal argument `%1%'",
00163       "引数`%1\'が不正です",
00164     },
00165     {
00166       "id `%1%\' of %2% is duplicated",
00167       "%2%のID番号`%1\'が重複しています",
00168     },
00169     {
00170       "missing `}\'",
00171         "`}\'がありません",
00172     },
00173     {
00174       "kerne type `%1%\' is not supported",
00175       "カーネル種別`%1%\'はサポートされていません"
00176     },
00177     {
00178       "unknown #pragma directive `%1%\'",
00179         "不明な#pragma指令`%1%\'",
00180     },
00181     {
00182       "no contents in cfg file",
00183       "cfgファイルにコンテンツが含まれていません",
00184     },
00185   };
00186 
00187   const char* encode( const char* s )
00188   {
00189 #if defined( __CYGWIN__ ) || defined( __MINGW32__ )
00190 # if ' ' == 0xa1a1   // CFGのソースコードはEUC
00191     static boost::scoped_array<char> t;
00192     std::size_t ss = std::strlen( s );
00193     std::size_t st = ss;
00194 
00195     t.reset( new char[ss+1] );
00196     const char *ps = s;
00197     char *pt = t.get();
00198     iconv_t cd = iconv_open( "SHIFT_JIS", "EUCJP" );
00199     iconv( cd, &ps, &ss, &pt, &st );
00200     iconv_close( cd );
00201     *pt = '\0';
00202     s = t.get();
00203 # endif
00204 #endif
00205     return s;
00206   }
00207 
00208   const char* translate( const char* s )
00209   {
00210     struct translation_map
00211     {
00212       std::map<std::string, const char*const*> map_;
00213 
00214       translation_map( const char* message[][number_of_languages], std::size_t size )
00215       {
00216         for ( std::size_t i = 0; i < size; i++ )
00217         {
00218           map_.insert( std::make_pair( std::string( message[i][0] ), message[i] ) );
00219         }
00220       }
00221     };
00222     static translation_map tr( message_table, sizeof( message_table )/sizeof( message_table[0] ) );
00223     const std::map<std::string, const char*const*>::const_iterator iter( tr.map_.find( s ) );
00224     if ( iter != tr.map_.end() )
00225     {
00226       return encode( iter->second[language] );
00227     }
00228     return s;
00229   }
00230 
00231 }
00232 
00237 void set_language( toppers::reporter::language_type lang )
00238 {
00239   language = lang;
00240   toppers::reporter::set_translator( &translate );
00241 }
00242 

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Wed Apr 12 16:31:55 2006 に Doxygen によって生成されました。