chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

プリプロセッサ機能が欲しかった

C言語にはプリプロセッサというものがありまして。
マクロというもので色々定義しておくと、実装コードに書いたマクロが実コードに置き換えられるという単純なものです。
でもこれがあると条件変えるだけで実コードが変えられるのマルチプラットフォーム対応には結構便利だったり*1

MUGENでもあると便利だと思う。例えばGameWidthとかConst720pとかWin版には存在しないトリガーとかを定数に置き換えるのに使えるのではと。
なので作った。その名も『mcpp - MUGEN CNS Pre-Processor -』。
プロジェクトページは→chiku2gonzalez / mcpp — Bitbucket
DLはプロジェクトページ右方向の「get source」からzipを選べばいいんじゃなかろうか。

一応次のキャラ当たりから使う予定。

以下Readmeの抜粋

                                                                                                                                                            • -

mcpp - MUGEN CNS Pre-Processor -

Author : chikuchikugonzalez (chikuchikugonzalez@gmail.com)

                                                                                                                                                            • -

[概要]
C/C++プリプロセッサのようなものです。

[使い方]
Usage: ruby mcpp.rb [options]
-V, --verbose デバッグレベルのログを出力するようにします
-S, --silence Fatalレベル以外のログを出力しないようにします
-L, --log=FILE ログファイルを指定します
-I, --include=PATH includeでファイルを探索するパスを追加します
-M, --modern 標準形式 (1.0以降) として処理します (デフォルト)
-T, --traditional 互換形式 (Win版) として処理します
-D, --define=MACRO マクロを設定します

[文法]
<基本>
・「#」で始まる行がプリプロセス対象です
・コメントはMUGEN CNSと同じく「;」です

<各命令>

ファイルの取り込み

include <ファイル>
include "ファイル"
※1 上2つは同じ
※2 カレントディレクトリ -> mcppのあるディレクトリ -> -Iで追加されたディレクトリ
の順に探します

マクロ定義

defmacro NAME [VALUE]
※1 NAMEという名前のマクロを定義します
※2 VALUEは省略可能です
※3 関数マクロは未実装です

関数形式マクロ (インラインマクロ)

definline NAME(ARG[, ARG...]) VALUE
※1 NAMEでマクロを定義します
※2 VALUEは必須です
※3 ARGは複数可

(例)
#definline _IFELSE_(trgger, value1, value2) ifelse(trigger, value1, value2)

が定義されているときに

[State]
type = Null
trigger1 = _IFELSE_(NumHelper(0), 1, 0)

[State]
type = Null
trigger1 = ifelse(NumHelper(0), 1, 0)

となります

分岐

if 条件
if !条件
if not 条件
if defined(マクロ名)
if !defined(マクロ名)
if not defined(マクロ名)
ifdef マクロ名
ifndef マクロ名

[else
〜]
endif
※1 条件は
マクロ名 [比較演算子] 値
値 [比較演算子] マクロ名
値 [比較演算子] 値

などです
※2 ifdefはif defined、ifndefはif not definedに展開されます
※3 elseは省略可能です
※4 endifは省略不可能です (ない場合はファイルの終端がendifと同じ扱いになります)

繰り返し

for 識別子 in 開始値 to 終了値 [step 増分値]
※1 識別子はマクロとして定義されます
※2 インクリメントのみ対応しています。デクリメントは未実装です
※2 step省略時は1になります


:Rubyライブラリ読み込み
require
require "ruby-lib-name"


:Rubyコード実行 (埋め込みRubyコード)
(内部で) @{ 〜 }
※1 Rubyコードを実行します
※2 Rubyとしての結果で置き換えます。ただし、Falseとして評価される場合は空文字列になります

chiku2gonzalez / mcpp — Bitbucket

*1:charによる文字列とwchar_tによる文字列をTCHARマクロだけで表せる