log_output.c

説明を見る。
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.

ホームページ制作