|
|
log_output.c説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00012 * によって公表されている GNU General Public License の Version 2 に記 00013 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00014 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00015 * 利用と呼ぶ)することを無償で許諾する. 00016 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00017 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00018 * スコード中に含まれていること. 00019 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00020 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00021 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00022 * の無保証規定を掲載すること. 00023 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00024 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00025 * と. 00026 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00027 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00028 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00029 * 報告すること. 00030 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00031 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00032 * 00033 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00034 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00035 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00036 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00037 * 00038 * @(#) $Id: log_output.c,v 1.1 2005/04/03 13:33:19 honda Exp $ 00039 */ 00040 00045 #include <t_services.h> 00046 00047 /* 00048 * ポインタを格納できる整数型のデフォルトの定義 00049 */ 00050 #ifndef _intptr_ 00051 #define _intptr_ long 00052 #endif /* _intptr_ */ 00053 00054 /* 00055 * 数値を文字列に変換 00056 */ 00057 static void 00058 convert(unsigned _intptr_ val, unsigned int radix, const char *radchar, 00059 int width, int minus, int padzero, void (*putc)(char)) 00060 { 00061 char buf[12]; 00062 int i, j; 00063 00064 i = 0; 00065 do { 00066 buf[i++] = radchar[val % radix]; 00067 val /= radix; 00068 } while (val != 0); 00069 00070 width -= minus; 00071 if (minus > 0 && padzero > 0) { 00072 (*putc)('-'); 00073 } 00074 for (j = i; j < width; j++) { 00075 (*putc)((char)(padzero > 0 ? '0' : ' ')); 00076 } 00077 if (minus > 0 && padzero <= 0) { 00078 (*putc)('-'); 00079 } 00080 while (i > 0) { 00081 (*putc)(buf[--i]); 00082 } 00083 } 00084 00085 /* 00086 * ログ情報のフォーマット出力 00087 */ 00088 static const char raddec[] = "0123456789"; 00089 static const char radhex[] = "0123456789abcdef"; 00090 static const char radHEX[] = "0123456789ABCDEF"; 00091 00092 void 00093 syslog_printf(const char *format, VP_INT *args, void (*putc)(char)) 00094 { 00095 int c; 00096 int width; 00097 int padzero; 00098 _intptr_ val; 00099 const char *str; 00100 00101 while ((c = *format++) != '\0') { 00102 if (c != '%') { 00103 (*putc)((char) c); 00104 continue; 00105 } 00106 00107 width = padzero = 0; 00108 if ((c = *format++) == '0') { 00109 padzero = 1; 00110 c = *format++; 00111 } 00112 while ('0' <= c && c <= '9') { 00113 width = width * 10 + c - '0'; 00114 c = *format++; 00115 } 00116 switch (c) { 00117 case 'd': 00118 val = (_intptr_)(*args++); 00119 if (val >= 0) { 00120 convert((unsigned _intptr_) val, 10, raddec, 00121 width, 0, padzero, putc); 00122 } 00123 else { 00124 convert((unsigned _intptr_)(-val), 10, raddec, 00125 width, 1, padzero, putc); 00126 } 00127 break; 00128 case 'u': 00129 val = (_intptr_)(*args++); 00130 convert((unsigned _intptr_) val, 10, raddec, 00131 width, 0, padzero, putc); 00132 break; 00133 case 'x': 00134 case 'p': 00135 val = (_intptr_)(*args++); 00136 convert((unsigned _intptr_) val, 16, radhex, 00137 width, 0, padzero, putc); 00138 break; 00139 case 'X': 00140 val = (_intptr_)(*args++); 00141 convert((unsigned _intptr_) val, 16, radHEX, 00142 width, 0, padzero, putc); 00143 break; 00144 case 'c': 00145 (*putc)((char)(_intptr_)(*args++)); 00146 break; 00147 case 's': 00148 str = (const char *)(*args++); 00149 while ((c = *str++) != '\0') { 00150 (*putc)((char) c); 00151 } 00152 break; 00153 case '%': 00154 (*putc)('%'); 00155 break; 00156 case '\0': 00157 format--; 00158 break; 00159 default: 00160 break; 00161 } 00162 } 00163 (*putc)('\n'); 00164 } 00165 00166 void 00167 syslog_print(SYSLOG *p_log, void (*putc)(char)) 00168 { 00169 switch (p_log->logtype) { 00170 case LOG_TYPE_COMMENT: 00171 syslog_printf((const char *)(p_log->loginfo[0]), 00172 &(p_log->loginfo[1]), putc); 00173 break; 00174 case LOG_TYPE_ASSERT: 00175 syslog_printf("%s:%u: Assertion `%s' failed.", 00176 &(p_log->loginfo[0]), putc); 00177 break; 00178 } 00179 } 00180 00181 void 00182 syslog_output(void (*putc)(char)) 00183 { 00184 static const char lostmsg[] = "%d messages are lost."; 00185 SYSLOG log; 00186 INT lostnum, n; 00187 00188 lostnum = 0; 00189 while ((n = vrea_log(&log)) >= 0) { 00190 lostnum += n; 00191 if (log.logtype < LOG_TYPE_COMMENT) { 00192 continue; 00193 } 00194 if (lostnum > 0) { 00195 syslog_printf(lostmsg, (VP_INT *) &lostnum, putc); 00196 lostnum = 0; 00197 } 00198 syslog_print(&log, putc); 00199 } 00200 if (lostnum > 0) { 00201 syslog_printf(lostmsg, (VP_INT *) &lostnum, putc); 00202 } 00203 } Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:12 2006 に Doxygen によって生成されました。 |