# 帳票設計書 13-バージョン情報出力

## 概要

本ドキュメントは、mrubyのバージョン情報(MRUBY_DESCRIPTION)を標準出力に表示する機能の設計仕様を記述する。mrb_show_version関数によりバージョン文字列が出力される。

### 本帳票の処理概要

mrb_show_version関数は、mrubyのバージョン情報を含む説明文字列(MRUBY_DESCRIPTION)をObject定数から取得し、標準出力に改行付きで出力する。

**業務上の目的・背景**：ユーザがmrubyの実行環境バージョンを確認するための基本機能である。バージョン情報はバグレポート、互換性確認、デプロイ管理において不可欠な情報であり、コマンドラインツール(mrubyコマンド、mrbcコマンド)の`--version`オプションで使用される。MRUBY_DESCRIPTIONはバージョン番号、パッチレベル、リリース日を含む統合的な識別文字列を提供する。

**帳票の利用シーン**：mrubyコマンドやmrbcコマンドに`--version`オプションを指定して実行した場合、またはC APIからmrb_show_version関数を直接呼び出した場合に使用される。

**主要な出力内容**：
1. mrubyのバージョン番号(例: "3.4.0")
2. パッチレベル文字列(例: "" または "dev" または "p1")
3. リリース日(例: "2025-04-20")

**帳票の出力タイミング**：mrubyコマンドまたはmrbcコマンドの起動時に`--version`オプションが指定された場合、プログラム実行前に出力される。

**帳票の利用者**：mruby利用者、mruby組み込みアプリケーション開発者、システム管理者

## 帳票種別

情報出力(テキスト出力)

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| N/A | コンソール/ターミナル | N/A | mruby --version / mrbc --version |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | テキスト(標準出力ストリーム) |
| 用紙サイズ | N/A |
| 向き | N/A |
| ファイル名 | N/A (stdoutへの直接出力) |
| 出力方法 | 標準出力(stdout)への書き込み |
| 文字コード | UTF-8 |

### PDF固有設定

N/A

### Excel固有設定

N/A

## 帳票レイアウト

### レイアウト概要

バージョン情報は1行の固定フォーマット文字列として出力される。

```
┌─────────────────────────────────────┐
│ mruby 3.4.0 (2025-04-20)           │
└─────────────────────────────────────┘
```

### ヘッダー部

N/A

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | プレフィックス | 固定文字列 "mruby " | MRUBY_DESCRIPTIONマクロ | 文字列 | 6文字 |
| 2 | バージョン番号 | "MAJOR.MINOR.TEENY"形式 | MRUBY_VERSION | "3.4.0"形式 | 可変 |
| 3 | パッチレベル | パッチレベル文字列 | MRUBY_PATCHLEVEL_STR | ""(空文字)/"dev"/"pN" | 可変 |
| 4 | リリース日 | "(YYYY-MM-DD)"形式 | MRUBY_RELEASE_DATE | "(2025-04-20)"形式 | 12文字 |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | 改行 | 末尾改行文字 | printstrln関数 | "\n" |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| MRB_NO_STDIO未定義 | MRB_NO_STDIOが定義されている場合、出力は何も行わない | Yes |
| --versionオプション | コマンドライン引数に--versionが指定されていること | Yes(コマンド経由の場合) |

### ソート順

N/A

### 改ページ条件

N/A

## データベース参照仕様

### 参照テーブル一覧

N/A

### テーブル別参照項目詳細

N/A

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| MRUBY_VERSION | MRB_STRINGIZE(MRUBY_RELEASE_MAJOR) "." MRB_STRINGIZE(MRUBY_RELEASE_MINOR) "." MRB_STRINGIZE(MRUBY_RELEASE_TEENY) | N/A | コンパイル時にプリプロセッサで文字列結合 |
| MRUBY_DESCRIPTION | "mruby " MRUBY_VERSION MRUBY_PATCHLEVEL_STR " (" MRUBY_RELEASE_DATE ")" | N/A | コンパイル時にプリプロセッサで文字列結合 |
| MRUBY_RELEASE_DATE | YYYY "-" MM "-" DD形式 | N/A | 月・日が10未満の場合は先頭0埋め |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[--version オプション検出] --> B[mrb_show_version 呼び出し]
    B --> C[mrb_const_get で MRUBY_DESCRIPTION 定数取得]
    C --> D[printstrln で改行付き出力]
    D --> E[終了]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| MRB_NO_STDIO | MRB_NO_STDIOマクロが定義されている場合 | (出力なし - 空実装) | ビルド設定を変更 |
| 定数未定義 | MRUBY_DESCRIPTION定数がObjectクラスに存在しない場合 | (例外発生の可能性) | 通常発生しない(起動時に設定される) |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1行(固定) |
| 目標出力時間 | 即時 |
| 同時出力数上限 | N/A |

## セキュリティ考慮事項

- バージョン情報は公開情報であり、セキュリティ上の特別な考慮は不要
- ただし、バージョン情報から既知の脆弱性を特定されるリスクは一般的に存在する

## 備考

- MRUBY_DESCRIPTIONはinclude/mruby/version.hでマクロとして定義されており、コンパイル時に文字列リテラルとして展開される
- mrb_show_version関数はMRB_APIとして公開されており、C言語アプリケーションから直接呼び出し可能
- 現在のバージョン定義値: MRUBY_RELEASE_MAJOR=3, MRUBY_RELEASE_MINOR=4, MRUBY_RELEASE_TEENY=0, MRUBY_RELEASE_YEAR=2025, MRUBY_RELEASE_MONTH=4, MRUBY_RELEASE_DAY=20

---

## コードリーディングガイド

本帳票を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

バージョン情報を構成するマクロ定義の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | version.h | `include/mruby/version.h` | MRUBY_RELEASE_MAJOR/MINOR/TEENY(行40-50)、MRUBY_VERSION(行73)、MRUBY_DESCRIPTION(行127-130) |

**読解のコツ**: マクロは階層的に構成されている。MRUBY_DESCRIPTIONはMRUBY_VERSION、MRUBY_PATCHLEVEL_STR、MRUBY_RELEASE_DATEを結合して構築される。MRB_STRINGIZEマクロによる数値の文字列化に注意。

#### Step 2: エントリーポイントを理解する

mrb_show_version関数の実装を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | print.c | `src/print.c` | mrb_show_version関数(行98-102) |

**主要処理フロー**:
1. **行101 (print.c)**: mrb_const_getでmrb->object_class(Objectクラス)からMRUBY_DESCRIPTIONシンボルに対応する定数値を取得
2. **行101 (print.c)**: printstrln関数で改行付きで標準出力に出力

#### Step 3: 出力基盤を理解する

printstrln以降の出力処理チェーンを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | print.c | `src/print.c` | printstrln(行54-59) → printstr(行46-52) → printcstr(行26-43) |

**主要処理フロー**:
- **行54-59 (print.c)**: printstrln = printstr + printcstr("\n")
- **行46-52 (print.c)**: printstr = 文字列型チェック + printcstr
- **行26-43 (print.c)**: printcstr = fwrite (Windows tty時はWriteConsoleW)

### プログラム呼び出し階層図

```
mruby --version (コマンドライン)
    |
    +-- mrb_show_version (src/print.c:98)  ※MRB_API公開関数
           |
           +-- mrb_const_get(mrb, mrb_obj_value(mrb->object_class), MRB_SYM(MRUBY_DESCRIPTION))
           |
           +-- printstrln (src/print.c:54)
                  +-- printstr (src/print.c:46)
                  |      +-- printcstr (src/print.c:26)
                  |             +-- fwrite / WriteConsoleW
                  +-- printcstr("\n")
```

### データフロー図

```
[入力]                        [処理]                          [出力]

version.h マクロ定義    mrb_const_get()
(MRUBY_DESCRIPTION) ──> (Object定数から取得) ──> printstrln ──> stdout
                                                                  |
                                                    "mruby 3.4.0 (2025-04-20)\n"
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| print.c | `src/print.c` | ソース | mrb_show_version関数の実装 |
| version.h | `include/mruby/version.h` | ヘッダ | MRUBY_DESCRIPTION等のバージョンマクロ定義 |
| mruby.h | `include/mruby.h` | ヘッダ | mrb_state構造体、MRB_API宣言 |
| variable.h | `include/mruby/variable.h` | ヘッダ | mrb_const_get関数宣言 |
| presym.h | `include/mruby/presym.h` | ヘッダ | MRB_SYMマクロ(事前定義シンボル) |
