picox  0.1
Xstdio

stdio.h系統の機能を提供します [詳解]

Xstdio 連携図

printf

printf系関数のグループです

printf系関数は使用頻度が高いですが、標準ライブラリの実装によって、メモリの 使い方(スタック使用量や、mallocの使用の有無)や対応しているフォーマット指定 にかなりのバラつきがあるという問題があります。 このライブラリが提供するprintfを使用することで、環境によって異なるライブラリ の実装に悩まされることなく安定して使用することができます。 mallocは未使用で、スタック使用量は可変引数の分を除くと、sizeof(int) == 2の 環境では80バイト程度。sizeof(int) == 4の環境では100バイト程度です。

ただし、printfのすべてのフォーマット指定には対応しておらず、厳選した使用頻 度の高いもののみを実装しています。


対応format

フォーマット指定の用語は以下リンク先から参照しています<
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/printf.3.html

対応フラグ文字

  • '0' 0パディング
  • '-' 左揃え

対応精度

  • '*' int引数による精度指定
  • '.'のみは精度0とみなす

対応長さ修飾子

  • 'h' 引数は short or unsigned short
  • 'l' 引数は long or unsigned long
  • 'z' 引数は size_t (ssize_tには未対応なので、"zd"指定は不正です)

対応変換指定子

  • 'd' 符号あり10進数表記
  • 'u' 符号なし10進数表記
  • 'o' 符号なし8進数表記
  • 'b' 符号なし2進数表記(独自拡張)
  • 'x' 符号なし小文字16進数表記
  • 'X' 符号なし大文字16進数表記
  • 'c' 引数をunsigned charに変換して出力する
  • 's' const char*へのポインタ型の引数であると期待して終端('\0')まで出力する
  • 'p' 引数をポインタ型であると期待して、アドレスを小文字16進数で出力する
  • '' ''自身を出力する

その他対応

  • フィールド幅指定
x_printf("%d", 1234); "1234"
x_printf("%6d,%3d%%", -200, 5); " -200, 5%"
x_printf("%-6u", 100); "100 "
x_printf("%ld", 12345678L); "12345678"
x_printf("%04x", 0xA3); "00a3"
x_printf("%08LX", 0x123ABC); "00123ABC"
x_printf("%016b", 0x550F); "0101010100001111"
x_printf("%s", "String"); "String"
x_printf("%-4s", "abc"); "abc "
x_printf("%4s", "abc"); " abc"
x_printf("%c", 'a'); "a"
#if X_CONFIG_USE_FLOATING_POINT_PRINTF
x_printf("%f", 10.0); "10.000000"
x_printf("%.2f", 12.345678); "12.34"
#endif
typedef int(* XCharPutFunc) (int c)
 1文字出力を行う関数ポインタ型です [詳解]
 
XCharPutFunc x_putc_stdout
 1文字出力関数ポインタです [詳解]
 
int x_putc (int c)
 cをuint8_tにキャストして出力先に書き込みます [詳解]
 
int x_puts (const char *str)
 strと改行を出力します [詳解]
 
int x_puts2 (const char *str)
 strを出力します [詳解]
 
int x_snprintf (char *buf, size_t size, const char *fmt,...)
 fmtに従って、出力をsizeバイトの領域を持つbufに書き込みます
 
int x_sprintf (char *buf, const char *fmt,...)
 fmtに従って、出力をbufに書き込みます [詳解]
 
int x_vsnprintf (char *buf, size_t size, const char *fmt, va_list args)
 fmtに従って、出力をsizeバイトの領域を持つbufに書き込みます
 
int x_vsprintf (char *buf, const char *fmt, va_list args)
 fmtに従って、出力をbufに書き込みます [詳解]
 
int x_printf (const char *fmt,...)
 fmtに従って出力先に書き込みます
 
int x_vprintf (const char *fmt, va_list args)
 fmtに従って出力先に書き込みます
 
int x_printf_to_cputter (XCharPutFunc cputter, const char *fmt,...)
 fmtに従ってcputterに書き込みます
 
int x_vprintf_to_cputter (XCharPutFunc cputter, const char *fmt, va_list args)
 fmtに従ってcputterに書き込みます
 
int x_printf_to_stream (XStream *stream, const char *fmt,...)
 fmtに従ってstreamに書き込みます
 
int x_vprintf_to_stream (XStream *stream, const char *fmt, va_list args)
 fmtに従ってstreamに書き込みます
 

詳解

stdio.h系統の機能を提供します

型定義詳解

typedef int(* XCharPutFunc) (int c)

1文字出力を行う関数ポインタ型です

覚え書き
1文字をどこに出力するのかを関数ポインタで変更できるようにしておくと、UART等 のデバイスや、RAMへの出力等、応用範囲が非常に広がります。

関数詳解

int x_putc ( int  c)

cをuint8_tにキャストして出力先に書き込みます

戻り値
エラー発生時はEOFを、それ以外の時はcを返します
int x_puts ( const char *  str)

strと改行を出力します

戻り値
エラー発生時はEOFを、それ以外の時は非負の値を返します
int x_puts2 ( const char *  str)

strを出力します

戻り値
エラー発生時はEOFを、それ以外の時は非負の値を返します
int x_sprintf ( char *  buf,
const char *  fmt,
  ... 
)

fmtに従って、出力をbufに書き込みます

バッファオーバフローの危険性があるので、通常はx_snprintfを使用してください。 この関数は既存のsprintfを使用したコードの移植用に用意しています。

int x_vsprintf ( char *  buf,
const char *  fmt,
va_list  args 
)

fmtに従って、出力をbufに書き込みます

バッファオーバフローの危険性があるので、通常はx_snprintfを使用してください。 この関数は既存のsprintfを使用したコードの移植用に用意しています。

変数詳解

XCharPutFunc x_putc_stdout

1文字出力関数ポインタです

x_printf系関数を使用する場合は、このポインタになんらかの出力関数をセットして ください。

x_printf("stdout outputs\n");
x_putc_stdout = my_uart_putchar;
x_printf("uart outputs\n");