# 帳票設計書 1-IREPバイナリダンプ (mrb形式)

## 概要

mrubyの中間表現(IREP: Intermediate Representation)をRiteBinaryフォーマット(.mrb)でバイナリファイルに出力する帳票設計書である。`mrb_dump_irep_binary`関数により生成され、mrbcコマンドの標準出力形式として使用される。

### 本帳票の処理概要

本帳票は、mrubyコンパイラ(mrbc)がRubyスクリプトをコンパイルした結果得られる中間表現(IREP)を、ポータブルなバイナリ形式(RiteBinaryフォーマット)でファイルに出力する機能である。出力されたバイナリファイル(.mrb)は、mruby VMによって直接ロード・実行可能であり、ソースコードの配布なしにプログラムを実行環境に展開できる。

**業務上の目的・背景**：組み込みシステムやリソース制約のある環境において、Rubyスクリプトを事前コンパイルしてバイトコードとして配布することで、実行時のコンパイルコストを排除し、ソースコードの秘匿性を確保する。また、コンパイル済みバイトコードは環境に依存しないポータブルなフォーマットであるため、異なるプラットフォーム間でのバイトコード共有が可能となる。

**帳票の利用シーン**：mrubyアプリケーションの開発・デプロイ時に、mrbcコマンドを用いてRubyスクリプトをコンパイルし、.mrbファイルとして出力する場面で使用される。特に、組み込みLinuxやマイクロコントローラ上でmrubyを利用する際に、事前コンパイルされたバイナリを配置するワークフローで多用される。

**主要な出力内容**：
1. RiteBinaryヘッダー（マジックナンバー"RITE"、バージョン情報、バイナリサイズ、コンパイラ情報）
2. IREPセクション（命令列、リテラルプール、シンボルテーブル、子IREP）
3. デバッグ情報セクション（-gフラグ指定時: ファイル名テーブル、行番号情報）
4. ローカル変数セクション（ローカル変数名テーブル）
5. フッターセクション（終端マーカー"END"）

**帳票の出力タイミング**：mrbcコマンドを`-B`オプションなしで実行した際に出力される。具体的には `mrbc script.rb` のようなコマンドで、`script.mrb` がカレントディレクトリに生成される。

**帳票の利用者**：mrubyアプリケーション開発者、組み込みシステムエンジニア、CI/CDパイプライン上のビルドスクリプト。

## 帳票種別

バイナリダンプ（RiteBinaryフォーマット .mrb ファイル）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | CLIコマンド (mrbc) | `mrbc [options] script.rb` | mrbcコマンド実行（-Bオプションなし） |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | バイナリ（RiteBinary .mrb） |
| 用紙サイズ | N/A（バイナリファイル） |
| 向き | N/A |
| ファイル名 | 命名規則: `{入力ファイル名(拡張子なし)}.mrb` （-oオプションで任意指定可能） |
| 出力方法 | ファイル書き込み（fwrite） |
| 文字コード | バイナリ（ビッグエンディアンのバイト列、ただしfloatはリトルエンディアン） |

### PDF固有設定

N/A（バイナリファイル形式のため該当なし）

### Excel固有設定

N/A（バイナリファイル形式のため該当なし）

## 帳票レイアウト

### レイアウト概要

RiteBinaryフォーマットは、ヘッダー・複数セクション・フッターから構成されるバイナリ構造体である。各セクションはセクション識別子とサイズを持つ自己記述的な構造をとる。

```
┌─────────────────────────────────────┐
│      RiteBinaryヘッダー (20 bytes)    │
│  "RITE" | ver | size | compiler     │
├─────────────────────────────────────┤
│     IREPセクション                    │
│  "IREP" | size | VM ver |           │
│  ┌─ IREP Record (再帰構造) ────────┐ │
│  │ header | iseq | pool | syms     │ │
│  │ [child IREP Records...]         │ │
│  └─────────────────────────────────┘ │
├─────────────────────────────────────┤
│  デバッグセクション (optional)        │
│  "DBG\0" | size | filename table   │
│  | debug records                    │
├─────────────────────────────────────┤
│  ローカル変数セクション (optional)    │
│  "LVAR" | size | sym table         │
│  | lv records                       │
├─────────────────────────────────────┤
│      フッター (8 bytes)              │
│  "END\0" | size                     │
└─────────────────────────────────────┘
```

### ヘッダー部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | binary_ident | バイナリ識別子 "RITE" | 定数 `RITE_BINARY_IDENT` | 4バイト ASCII |
| 2 | major_version | メジャーバージョン "04" | 定数 `RITE_BINARY_MAJOR_VER` | 2バイト ASCII |
| 3 | minor_version | マイナーバージョン "00" | 定数 `RITE_BINARY_MINOR_VER` | 2バイト ASCII |
| 4 | binary_size | バイナリ全体のサイズ | 計算値 | uint32_t (4バイト) |
| 5 | compiler_name | コンパイラ名 "MATZ" | 定数 `RITE_COMPILER_NAME` | 4バイト ASCII |
| 6 | compiler_version | コンパイラバージョン "0000" | 定数 `RITE_COMPILER_VERSION` | 4バイト ASCII |

### 明細部

#### IREPセクションヘッダー

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | section_ident | セクション識別子 "IREP" | 定数 `RITE_SECTION_IREP_IDENT` | 4バイト ASCII | 4 |
| 2 | section_size | セクションサイズ | 計算値 | uint32_t | 4 |
| 3 | rite_version | VM バージョン "0400" | 定数 `RITE_VM_VER` | 4バイト ASCII | 4 |

#### IREPレコード（再帰構造）

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | record_size | レコードサイズ | `get_irep_record_size_1()` | uint32_t | 4 |
| 2 | nlocals | ローカル変数数 | `irep->nlocals` | uint16_t | 2 |
| 3 | nregs | レジスタ変数数 | `irep->nregs` | uint16_t | 2 |
| 4 | rlen | 子IREPの数 | `irep->rlen` | uint16_t | 2 |
| 5 | clen | キャッチハンドラ数 | `irep->clen` | uint16_t | 2 |
| 6 | ilen | 命令数 | `irep->ilen` | uint32_t | 4 |
| 7 | iseq | 命令列 | `irep->iseq` | mrb_code配列 | 可変 |
| 8 | catch_handlers | キャッチハンドラテーブル | `irep->iseq`後方 | 構造体配列 | 可変 |
| 9 | plen | リテラルプール数 | `irep->plen` | uint16_t | 2 |
| 10 | pool[] | リテラルプール | `irep->pool` | 型別バイナリ | 可変 |
| 11 | slen | シンボル数 | `irep->slen` | uint16_t | 2 |
| 12 | syms[] | シンボルテーブル | `irep->syms` | 長さ+文字列+NULL | 可変 |

#### デバッグセクション（オプション）

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | section_ident | セクション識別子 "DBG\0" | 定数 `RITE_SECTION_DEBUG_IDENT` | 4バイト | 4 |
| 2 | section_size | セクションサイズ | 計算値 | uint32_t | 4 |
| 3 | filenames_len | ファイル名テーブル長 | 計算値 | uint16_t | 2 |
| 4 | filenames[] | ファイル名テーブル | `mrb_sym_name_len()` | 長さ+文字列 | 可変 |
| 5 | debug_records | デバッグレコード群 | `irep->debug_info` | 再帰構造 | 可変 |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | section_ident | 終端識別子 "END\0" | 定数 `RITE_BINARY_EOF` | 4バイト ASCII |
| 2 | section_size | フッターサイズ (8) | `sizeof(struct rite_binary_footer)` | uint32_t |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| 入力ファイル | コンパイル対象のRubyスクリプトファイル(.rb) | Yes |
| -g フラグ | デバッグ情報を含める場合に指定 | No |
| --remove-lv フラグ | ローカル変数情報を除去する場合に指定 | No |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| 1 | IREP構造の階層順（親→子の深さ優先） | 昇順 |

### 改ページ条件

N/A（バイナリファイルのため改ページの概念なし）

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

### 参照テーブル一覧

本帳票はデータベースを参照しない。mrubyコンパイラが生成するインメモリのIREPデータ構造体を参照する。

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| mrb_irep (構造体) | IREP本体データ | コンパイル結果から直接取得 |
| mrb_irep_pool (構造体) | リテラルプール | `irep->pool` |
| mrb_irep_debug_info (構造体) | デバッグ情報 | `irep->debug_info` |

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

#### mrb_irep

| 参照項目（フィールド名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| nlocals | ローカル変数数 | 常時 | uint16_t |
| nregs | レジスタ変数数 | 常時 | uint16_t |
| clen | キャッチハンドラ数 | 常時 | uint16_t |
| iseq | 命令列 | 常時 | mrb_code配列 |
| pool | リテラルプール | 常時 | mrb_irep_pool配列 |
| syms | シンボルテーブル | 常時 | mrb_sym配列 |
| reps | 子IREP | 常時 | mrb_irep*配列 |
| lv | ローカル変数名 | MRB_DUMP_NO_LVARフラグなし | mrb_sym配列 |
| debug_info | デバッグ情報 | MRB_DUMP_DEBUG_INFOフラグあり | mrb_irep_debug_info* |
| ilen | 命令数 | 常時 | uint32_t |
| plen | プール数 | 常時 | uint16_t |
| slen | シンボル数 | 常時 | uint16_t |
| rlen | 子IREP数 | 常時 | uint16_t |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| バイナリ全体サイズ | `sizeof(rite_binary_header) + section_irep_size + section_lineno_size + section_lv_size + sizeof(rite_binary_footer)` | なし | uint32_t |
| IREPセクションサイズ | `sizeof(rite_section_irep_header) + get_irep_record_size(irep)` | なし | 再帰的に計算 |
| IREPレコードサイズ | `get_irep_header_size() + get_iseq_block_size() + get_pool_block_size() + get_syms_block_size()` | なし | 各子IREPのサイズを再帰的に加算 |
| iseqブロックサイズ | `sizeof(uint16_t) + sizeof(uint32_t) + ilen * sizeof(mrb_code) + clen * sizeof(mrb_irep_catch_handler)` | なし | - |
| poolブロックサイズ | `sizeof(uint16_t) + 型別サイズの合計` | なし | INT32=4, INT64=8, FLOAT=8, STR=2+len+1 |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[mrbcコマンド実行] --> B[コマンドライン引数解析 parse_args]
    B --> C[Rubyスクリプト読み込み load_file]
    C --> D[コンパイル mrb_load_file_cxt]
    D --> E{コンパイル成功?}
    E -->|No| F[エラー出力・終了]
    E -->|Yes| G[出力ファイルオープン]
    G --> H[dump_file呼び出し]
    H --> I{-Bオプションあり?}
    I -->|Yes| J[cfunc/cstruct形式出力]
    I -->|No| K[mrb_dump_irep_binary呼び出し]
    K --> L[mrb_dump_irep でバイナリ生成]
    L --> M[各セクションサイズ計算]
    M --> N[メモリ確保 mrb_malloc]
    N --> O[write_section_irep IREPセクション書き込み]
    O --> P{デバッグ情報あり?}
    P -->|Yes| Q[write_section_debug デバッグセクション書き込み]
    P -->|No| R{ローカル変数あり?}
    Q --> R
    R -->|Yes| S[write_section_lv ローカル変数セクション書き込み]
    R -->|No| T[write_footer フッター書き込み]
    S --> T
    T --> U[write_rite_binary_header ヘッダー書き込み]
    U --> V[fwrite でファイル出力]
    V --> W[メモリ解放・終了]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| MRB_DUMP_GENERAL_FAILURE (-1) | mrb_stateがNULL | - | mruby状態の初期化を確認 |
| MRB_DUMP_WRITE_FAULT (-2) | fwrite失敗（ディスクフル等） | `error in mrb dump ({outfile}) -2` | ディスク容量の確認 |
| MRB_DUMP_INVALID_IREP (-5) | IREPがNULL | - | コンパイル処理の結果を確認 |
| MRB_DUMP_INVALID_ARGUMENT (-6) | fpがNULL、またはmrbかbinがNULL | - | 引数の妥当性を確認 |
| ファイルオープン失敗 | 出力先ファイルを開けない | `cannot open output file:({outfile})` | 出力先パスと権限を確認 |
| コンパイルエラー | Rubyスクリプトの構文エラー | パーサーのエラーメッセージ | スクリプトの構文を修正 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1スクリプトファイルあたり数百〜数万のIREPレコード |
| 目標出力時間 | ミリ秒単位（メモリ上のデータを一括書き込み） |
| 同時出力数上限 | 1（mrbcは単一プロセスで動作） |

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

- 出力される.mrbファイルにはソースコード自体は含まれないが、シンボル名やデバッグ情報（行番号・ファイル名）は含まれる場合がある
- `--remove-lv` オプションでローカル変数名を除去可能
- `-g` オプションを指定しなければデバッグ情報（ファイル名・行番号）は含まれない
- バイナリファイルに暗号化やパスワード保護の機構はない

## 備考

- RiteBinaryフォーマットはバージョン04.00（RITE_BINARY_FORMAT_VER "0400"）
- 整数値はビッグエンディアンで格納されるが、浮動小数点数はIEEE754リトルエンディアンで格納される
- `mrb_dump_irep`関数は内部でメモリを確保し、全セクションをメモリ上で構築してから一括でファイルに書き出す
- `MRB_NO_STDIO`が定義されている環境では`mrb_dump_irep_binary`は使用不可（`mrb_dump_irep`でバッファに出力は可能）

---

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

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

### 推奨読解順序

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

mrubyバイナリダンプの核心はIREPデータ構造とRiteBinaryフォーマットのヘッダー構造体にある。まずこれらの定義を把握することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | irep.h | `include/mruby/irep.h` | `struct mrb_irep`（55-80行目）: nlocals, nregs, iseq, pool, syms, reps, lv, debug_info等のフィールドを理解する |
| 1-2 | irep.h | `include/mruby/irep.h` | `enum irep_pool_type`（18-25行目）: リテラルプールの型定義（STR, INT32, INT64, BIGINT, FLOAT） |
| 1-3 | dump.h | `include/mruby/dump.h` | `struct rite_binary_header`（72-79行目）: バイナリファイルのヘッダー構造 |
| 1-4 | dump.h | `include/mruby/dump.h` | `struct rite_section_irep_header`（90-94行目）, `struct rite_section_debug_header`（96-98行目）等: 各セクションヘッダー |
| 1-5 | dump.h | `include/mruby/dump.h` | ダンプフラグ定義（20-22行目）: `MRB_DUMP_DEBUG_INFO`, `MRB_DUMP_STATIC`, `MRB_DUMP_NO_LVAR` |

**読解のコツ**: `RITE_SECTION_HEADER`マクロ（82-84行目）が各セクションヘッダーの共通部分（section_ident[4]とsection_size[4]）を定義している。これがすべてのセクションヘッダーに埋め込まれている。

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

mrbcコマンドのmain関数から`mrb_dump_irep_binary`までの呼び出しフローを追跡する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | mrbc.c | `mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c` | `main`関数（284-350行目）: コマンドライン引数解析→コンパイル→ダンプの全体フロー |
| 2-2 | mrbc.c | `mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c` | `dump_file`関数（258-281行目）: -Bオプションの有無で出力形式を分岐、275行目でmrb_dump_irep_binaryを呼び出し |

**主要処理フロー**:
1. **284行目**: main関数開始、mrb_open_core()でmruby状態を初期化
2. **295行目**: parse_args()でコマンドライン引数を解析
3. **316行目**: load_file()でRubyスクリプトをコンパイル
4. **343行目**: dump_file()でバイナリ出力を実行
5. **275行目**: dump_file内でmrb_dump_irep_binary()を呼び出し

#### Step 3: バイナリダンプのコア処理を理解する

`mrb_dump_irep_binary`から`mrb_dump_irep`へのフロー、各書き込み関数の詳細を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dump.c | `src/dump.c` | `mrb_dump_irep_binary`（914-932行目）: ファイルポインタの検証、mrb_dump_irep呼び出し、fwriteでファイル出力 |
| 3-2 | dump.c | `src/dump.c` | `mrb_dump_irep`（820-895行目）: 全セクションのサイズ計算、メモリ確保、各セクションの書き込み、ヘッダーとフッターの書き込み |

**主要処理フロー**:
- **822-827行目**: フラグに応じたデバッグ情報・ローカル変数の有無判定
- **834-835行目**: IREPセクションサイズの計算
- **838-844行目**: デバッグセクションサイズの計算（条件付き）
- **846-850行目**: ローカル変数セクションサイズの計算（条件付き）
- **852-856行目**: 全体サイズに基づくメモリ確保
- **858行目**: write_section_irep()呼び出し
- **868-874行目**: write_section_debug()呼び出し（条件付き）
- **876-882行目**: write_section_lv()呼び出し（条件付き）
- **884-885行目**: フッターとヘッダーの書き込み

#### Step 4: IREPセクション書き込みの詳細を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | dump.c | `src/dump.c` | `write_section_irep`（429-449行目）: セクションヘッダー書き込み後、write_irep_recordを呼び出し |
| 4-2 | dump.c | `src/dump.c` | `write_irep_record`（374-399行目）: ヘッダー→iseq→pool→symsの順で書き込み、子IREPを再帰的に処理 |
| 4-3 | dump.c | `src/dump.c` | `write_irep_header`（46-56行目）: レコードサイズ、nlocals、nregs、rlenを書き込み |
| 4-4 | dump.c | `src/dump.c` | `write_iseq_block`（83-95行目）: キャッチハンドラ数、命令数、命令列を書き込み |
| 4-5 | dump.c | `src/dump.c` | `write_pool_block`（210-277行目）: リテラルプールの各エントリを型別にバイナリ化 |
| 4-6 | dump.c | `src/dump.c` | `write_syms_block`（317-340行目）: シンボルテーブルの各エントリをバイナリ化 |

**主要処理フロー**:
- **382行目**: write_irep_header でIREPヘッダー書き込み
- **383行目**: write_iseq_block で命令列書き込み
- **384行目**: write_pool_block でリテラルプール書き込み
- **385行目**: write_syms_block でシンボルテーブル書き込み
- **387-396行目**: 子IREPの再帰処理

#### Step 5: デバッグセクションとローカル変数セクションを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | dump.c | `src/dump.c` | `write_section_debug`（600-635行目）: ファイル名テーブルとデバッグレコードの書き込み |
| 5-2 | dump.c | `src/dump.c` | `write_debug_record_1`（527-581行目）: 行番号情報の型別書き込み（ary/flat_map/packed_map） |
| 5-3 | dump.c | `src/dump.c` | `write_section_lv`（734-762行目）: ローカル変数シンボルテーブルとレコードの書き込み |

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

```
main() [mrbc.c:284]
    │
    ├─ parse_args() [mrbc.c:88]
    │
    ├─ load_file() [mrbc.c:219]
    │      └─ mrb_load_file_cxt() [外部: コンパイラ]
    │
    └─ dump_file() [mrbc.c:258]
           │
           └─ mrb_dump_irep_binary() [dump.c:914]
                  │
                  ├─ mrb_dump_irep() [dump.c:820]
                  │      │
                  │      ├─ get_irep_record_size() [dump.c:363]  ← サイズ計算
                  │      │      └─ get_irep_record_size_1() [dump.c:343]
                  │      │             ├─ get_irep_header_size() [dump.c:25]
                  │      │             ├─ get_iseq_block_size() [dump.c:59]
                  │      │             ├─ get_pool_block_size() [dump.c:139]
                  │      │             └─ get_syms_block_size() [dump.c:289]
                  │      │
                  │      ├─ write_section_irep() [dump.c:429]
                  │      │      └─ write_irep_record() [dump.c:374]  ← 再帰
                  │      │             ├─ write_irep_header() [dump.c:46]
                  │      │             ├─ write_iseq_block() [dump.c:83]
                  │      │             ├─ write_pool_block() [dump.c:210]
                  │      │             └─ write_syms_block() [dump.c:317]
                  │      │
                  │      ├─ write_section_debug() [dump.c:600]  ← オプション
                  │      │      └─ write_debug_record() [dump.c:584]  ← 再帰
                  │      │             └─ write_debug_record_1() [dump.c:527]
                  │      │
                  │      ├─ write_section_lv() [dump.c:734]  ← オプション
                  │      │      ├─ write_lv_sym_table() [dump.c:660]
                  │      │      └─ write_lv_record() [dump.c:680]  ← 再帰
                  │      │
                  │      ├─ write_footer() [dump.c:402]
                  │      └─ write_rite_binary_header() [dump.c:765]
                  │
                  └─ fwrite()  ← ファイル出力
```

### データフロー図

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

.rb スクリプト ───▶ mrb_load_file_cxt() ───▶ mrb_irep (メモリ上)
                        (コンパイル)

mrb_irep ───────▶ mrb_dump_irep() ─────────▶ uint8_t *bin (メモリ上)
                   │                            │
                   ├─ サイズ計算                  │
                   ├─ メモリ確保                  │
                   ├─ IREPセクション書き込み       │
                   ├─ DBGセクション書き込み(opt)   │
                   ├─ LVARセクション書き込み(opt)  │
                   ├─ フッター書き込み            │
                   └─ ヘッダー書き込み            │

uint8_t *bin ───▶ fwrite() ────────────────▶ .mrb ファイル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dump.c | `src/dump.c` | ソース | IREPバイナリダンプのコア実装。mrb_dump_irep, mrb_dump_irep_binary, mrb_dump_irep_cfunc |
| dump.h | `include/mruby/dump.h` | ヘッダー | RiteBinaryフォーマットの構造体定義、定数定義、バイト変換ユーティリティ |
| irep.h | `include/mruby/irep.h` | ヘッダー | mrb_irep構造体、irep_pool_type列挙型の定義 |
| mrbc.c | `mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c` | ソース | mrbcコマンドのエントリーポイント。コマンドライン引数解析とdump_file呼び出し |
| debug.h | `include/mruby/debug.h` | ヘッダー | mrb_irep_debug_info構造体の定義 |
| endian.h | `include/mruby/endian.h` | ヘッダー | エンディアン判定（littleendian変数） |
| cdump.c | `src/cdump.c` | ソース | C構造体形式ダンプ（参考：同じIREPデータを異なる形式で出力） |
