# 帳票設計書 14-著作権情報出力

## 概要

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

### 本帳票の処理概要

mrb_show_copyright関数は、mrubyの著作権情報を含む文字列(MRUBY_COPYRIGHT)をObject定数から取得し、標準出力に改行付きで出力する。

**業務上の目的・背景**：オープンソースソフトウェアとしてのmrubyの著作権表示を提供するための基本機能である。ライセンス遵守の観点から、ソフトウェアの著作権情報を表示する手段を用意することは重要である。コマンドラインツール(mrubyコマンド、mrbcコマンド)の`--copyright`オプションで使用される。著作権情報には、mrubyの誕生年(2010年)から現在のリリース年までの期間と著作者名が含まれる。

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

**主要な出力内容**：
1. 固定プレフィックス "mruby - Copyright (c) "
2. 著作権期間(誕生年-リリース年): "2010-2025"
3. 著作者名: "mruby developers"

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

**帳票の利用者**：mruby利用者、ライセンス確認担当者、システム管理者

## 帳票種別

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

## 利用画面

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

## 出力形式

### 基本仕様

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

### PDF固有設定

N/A

### Excel固有設定

N/A

## 帳票レイアウト

### レイアウト概要

著作権情報は1行の固定フォーマット文字列として出力される。

```
┌─────────────────────────────────────────────────────────┐
│ mruby - Copyright (c) 2010-2025 mruby developers       │
└─────────────────────────────────────────────────────────┘
```

### ヘッダー部

N/A

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | プレフィックス | 固定文字列 "mruby - Copyright (c) " | MRUBY_COPYRIGHTマクロ | 文字列 | 23文字 |
| 2 | 誕生年 | mruby誕生年 | MRUBY_BIRTH_YEAR (2010) | "2010" | 4文字 |
| 3 | ハイフン | 年の区切り | 固定文字列 | "-" | 1文字 |
| 4 | リリース年 | 現在のリリース年 | MRUBY_RELEASE_YEAR (2025) | "2025" | 4文字 |
| 5 | スペース | 区切り | 固定文字列 | " " | 1文字 |
| 6 | 著作者名 | mrubyの著作者 | MRUBY_AUTHOR | "mruby developers" | 17文字 |

### フッター部

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

## 出力条件

### 抽出条件

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

### ソート順

N/A

### 改ページ条件

N/A

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

### 参照テーブル一覧

N/A

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

N/A

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| MRUBY_COPYRIGHT | "mruby - Copyright (c) " MRB_STRINGIZE(MRUBY_BIRTH_YEAR) "-" MRB_STRINGIZE(MRUBY_RELEASE_YEAR) " " MRUBY_AUTHOR | N/A | コンパイル時にプリプロセッサで文字列結合 |

## 処理フロー

### 出力フロー

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

## エラー処理

### エラーケース一覧

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

## パフォーマンス要件

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

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

- 著作権情報は公開情報であり、セキュリティ上の特別な考慮は不要

## 備考

- mrb_show_copyright関数はmrb_show_version関数と同じ実装パターンを採用しており、Object定数からの取得とprintstrlnによる出力の組み合わせである
- MRUBY_COPYRIGHTはinclude/mruby/version.hの行135-139で定義されている
- mrb_show_copyright関数はMRB_APIとして公開されており、C言語アプリケーションから直接呼び出し可能
- MRUBY_AUTHOR定数は"mruby developers"(行122)

---

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

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

### 推奨読解順序

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

著作権情報を構成するマクロ定義の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | version.h | `include/mruby/version.h` | MRUBY_COPYRIGHT(行135-139)、MRUBY_BIRTH_YEAR(行117)、MRUBY_AUTHOR(行122)、MRUBY_RELEASE_YEAR(行83) |

**読解のコツ**: MRUBY_COPYRIGHTはMRB_STRINGIZEマクロによってMRUBY_BIRTH_YEARとMRUBY_RELEASE_YEARを文字列化し、MRUBY_AUTHORと結合する。バージョン情報(No.13)と同じヘッダファイルで定義されている。

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

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

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

**主要処理フロー**:
1. **行107 (print.c)**: mrb_const_getでmrb->object_class(Objectクラス)からMRUBY_COPYRIGHTシンボルに対応する定数値を取得
2. **行107 (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")
- **行26-43 (print.c)**: printcstr = fwrite (Windows tty時はWriteConsoleW)

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

```
mruby --copyright (コマンドライン)
    |
    +-- mrb_show_copyright (src/print.c:104)  ※MRB_API公開関数
           |
           +-- mrb_const_get(mrb, mrb_obj_value(mrb->object_class), MRB_SYM(MRUBY_COPYRIGHT))
           |
           +-- 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_COPYRIGHT) ───> (Object定数から取得) ──> printstrln ──> stdout
                                                                  |
                                              "mruby - Copyright (c) 2010-2025 mruby developers\n"
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| print.c | `src/print.c` | ソース | mrb_show_copyright関数の実装 |
| version.h | `include/mruby/version.h` | ヘッダ | MRUBY_COPYRIGHT/MRUBY_BIRTH_YEAR/MRUBY_AUTHORマクロ定義 |
| 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マクロ(事前定義シンボル) |
