00001 /* 00002 * TOPPERS Software 00003 * Toyohashi Open Platform for Embedded Real-Time Systems 00004 * 00005 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00006 * Toyohashi Univ. of Technology, JAPAN 00007 * Copyright (C) 2004-2008 by Embedded and Real-Time Systems Laboratory 00008 * Graduate School of Information Science, Nagoya Univ., JAPAN 00009 * 00010 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00011 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00012 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00013 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00014 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00015 * スコード中に含まれていること. 00016 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00017 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00018 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00019 * の無保証規定を掲載すること. 00020 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00021 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00022 * と. 00023 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00024 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00025 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00026 * 報告すること. 00027 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00028 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00029 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00030 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00031 * 免責すること. 00032 * 00033 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00034 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00035 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00036 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00037 * の責任を負わない. 00038 * 00039 * @(#) $Id: log_output.c 817 2008-03-18 01:33:12Z hiro $ 00040 */ 00041 00042 /* 00043 * システムログのフォーマット出力 00044 */ 00045 00046 #include <t_stddef.h> 00047 #include <t_syslog.h> 00048 00049 /* 00050 * 数値を文字列に変換 00051 */ 00052 #define CONVERT_BUFLEN ((sizeof(uintptr_t) * CHAR_BIT + 2) / 3) 00053 /* uintptr_t型の数値の最大文字数 */ 00054 static void 00055 convert(uintptr_t val, uint_t radix, const char *radchar, 00056 uint_t width, bool_t minus, bool_t padzero, void (*putc)(char_t)) 00057 { 00058 char buf[CONVERT_BUFLEN]; 00059 uint_t i, j; 00060 00061 i = 0U; 00062 do { 00063 buf[i++] = radchar[val % radix]; 00064 val /= radix; 00065 } while (i < CONVERT_BUFLEN && val != 0); 00066 00067 if (minus && width > 0) { 00068 width -= 1; 00069 } 00070 if (minus && padzero) { 00071 (*putc)('-'); 00072 } 00073 for (j = i; j < width; j++) { 00074 (*putc)((char_t)(padzero ? '0' : ' ')); 00075 } 00076 if (minus && !padzero) { 00077 (*putc)('-'); 00078 } 00079 while (i > 0U) { 00080 (*putc)(buf[--i]); 00081 } 00082 } 00083 00084 /* 00085 * 文字列整形出力 00086 */ 00087 static const char raddec[] = "0123456789"; 00088 static const char radhex[] = "0123456789abcdef"; 00089 static const char radHEX[] = "0123456789ABCDEF"; 00090 00091 void 00092 syslog_printf(const char *format, intptr_t *p_args, void (*putc)(char_t)) 00093 { 00094 char c; 00095 uint_t width; 00096 bool_t padzero; 00097 intptr_t val; 00098 const char *str; 00099 00100 while ((c = *format++) != '\0') { 00101 if (c != '%') { 00102 (*putc)(c); 00103 continue; 00104 } 00105 00106 width = 0U; 00107 padzero = false; 00108 if ((c = *format++) == '0') { 00109 padzero = true; 00110 c = *format++; 00111 } 00112 while ('0' <= c && c <= '9') { 00113 width = width * 10U + c - '0'; 00114 c = *format++; 00115 } 00116 if (c == 'l') { 00117 c = *format++; 00118 } 00119 switch (c) { 00120 case 'd': 00121 val = (intptr_t)(*p_args++); 00122 if (val >= 0) { 00123 convert((uintptr_t) val, 10U, raddec, 00124 width, false, padzero, putc); 00125 } 00126 else { 00127 convert((uintptr_t)(-val), 10U, raddec, 00128 width, true, padzero, putc); 00129 } 00130 break; 00131 case 'u': 00132 val = (intptr_t)(*p_args++); 00133 convert((uintptr_t) val, 10U, raddec, width, false, padzero, putc); 00134 break; 00135 case 'x': 00136 case 'p': 00137 val = (intptr_t)(*p_args++); 00138 convert((uintptr_t) val, 16U, radhex, width, false, padzero, putc); 00139 break; 00140 case 'X': 00141 val = (intptr_t)(*p_args++); 00142 convert((uintptr_t) val, 16U, radHEX, width, false, padzero, putc); 00143 break; 00144 case 'c': 00145 (*putc)((char_t)(intptr_t)(*p_args++)); 00146 break; 00147 case 's': 00148 str = (const char *)(*p_args++); 00149 while ((c = *str++) != '\0') { 00150 (*putc)(c); 00151 } 00152 break; 00153 case '%': 00154 (*putc)('%'); 00155 break; 00156 case '\0': 00157 format--; 00158 break; 00159 default: 00160 break; 00161 } 00162 } 00163 } 00164 00165 /* 00166 * ログ情報の出力 00167 */ 00168 void 00169 syslog_print(SYSLOG *p_syslog, void (*putc)(char_t)) 00170 { 00171 switch (p_syslog->logtype) { 00172 case LOG_TYPE_COMMENT: 00173 syslog_printf((const char *)(p_syslog->loginfo[0]), 00174 &(p_syslog->loginfo[1]), putc); 00175 break; 00176 case LOG_TYPE_ASSERT: 00177 syslog_printf("%s:%u: Assertion `%s' failed.", 00178 &(p_syslog->loginfo[0]), putc); 00179 break; 00180 } 00181 } 00182 00183 /* 00184 * ログ情報喪失メッセージの出力 00185 */ 00186 void 00187 syslog_lostmsg(uint_t lost, void (*putc)(char_t)) 00188 { 00189 intptr_t lostinfo[1]; 00190 00191 lostinfo[0] = (intptr_t) lost; 00192 syslog_printf("%d messages are lost.", lostinfo, putc); 00193 (*putc)('\n'); 00194 }
Copyright © 2008 by Kijineko Inc.