[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 1563] Re: ASKAのプリプロセッサ(Re: atropos3).
- Subject: [OSASK 1563] Re: ASKAのプリプロセッサ(Re: atropos3).
- From: Koyanagi Masaaki <Koyanagi.Masaaki !Atmark! nifty.ne.jp>
- Date: Sat, 03 Mar 2001 14:21:48 -0000
- References: <200101310255.AA00296 !Atmark! kawai-ATX02.imasy.or.jp>
小柳です。こんばんは。
うれしいお知らせです。
Hidemi KAWAI wrote:
>
> こんにちは、川合です。
>
> ここで、みなさんに質問です。C言語用のプリプロセッサで、プリプ
> ロセスのみを機能させられて、フリーで、しかもあまり大きくない、プ
> リプロセッサって無いでしょうか?あったら、ASKAの前にそれで処理す
> ることにして、すぐに#defineや条件コンパイルなどが使えるようにな
> るんですが・・・。ご存知でしたら、是非教えてください。
見つけました!!しかもすぐ目の前に。
lcc を -EP オプションを付けて実行するとプリプロセッサとして
動かすことができます。コンパイルは以下のような手順になります。
lcc -EP -I. -DDEBUG s_world.ask
aska s_world.i s_world.3as
以後はこれまでと同じ。
http://homepage1.nifty.com/dreaming/osask/index.html
の sworld を #define や #include を使ってソース分割をしたので
ぜひ見て下さい。ソースがこんな風に書けます。
---
// "s_world.ask" copyright(C) 2001 M.Koyanagi (小柳雅明)
// 参照ソース "music2.ask" copyright(C) 2000 H.Kawai (川合秀実)
// 「広がる小さな世界」 music by M.Koyanagi (小柳雅明) copyright(C) June
29,1996
// stack & work size
#define STACK_AND_WORK_SIZE 0x2000 /* 8KB */
#include <guigui00.ask>
struct WORK {
LIB_Init lib_init;
..
}
void main(void)
{
LEA(EBX, (int) work->lib_init);
LIBCALL();
}
---
また makeat10 もプリプロセッサを使用するように変更しました。
以下は注意点です。
(1)Shift JIS の漢字コメント
lcc は Shift JIS を考慮していません。
「能」, 「表」などの文字は SJIS では 2バイト目が '\' になるため、
行末がこれらの文字だと次の行とくっついてしまいます。例えば、
A;// これで xx が実行可能
B;// 次にこうする
C;// 最後にこうする
の処理結果が
C;
となってしまいます。
対策としてコメント行の終わりが漢字になる場合は後ろに ' ' スペースを
追加するくせを付けた方が良いです。 また 「漢字」 と "*/" の間にも
スペースを入れましょう。
(2)コメントの入れ子の禁止
lcc -EP のプリプセッサは /* */ の入れ子に対応していません。
/*
A; /* comment */
B; /* comment */
*/
のようにすると処理結果が
B;
*/
となってしまいます。ソースの無効化としては
#if 0
#endif
を使いましょう。makeat10 ではこの置換を行っています。
(base.exe をビルドするのに必要な init.ask 内では特にたくさん使われて
いました。)
(3)#define の定義は大文字で
#define libcall() DB(0x9a); DD(0); DW(0x00c7)
では libcall() が置換されませんでした。
#define LIBCALL() DB(0x9a); DD(0); DW(0x00c7)
と大文字を使わないと駄目みたいです。
(4)行番号の問題
ヘッダファイルをインクルードすると ASKA の出すエラーの行番号と
.ask の対応する行番号が当然ずれてしまいます。
現状は .i ファイルでエラーの場所を確認してから .ask ファイルの対応する
場所を修正することになります。
-EP オプションの替わりに -E とすれば
# 行番号
という形でオリジナルの .ask ソースの行番号の対応が出力されるのですが、
ASKA が現状ではこの出力を理解できないので使えません。
注意点の中でも(4)の問題は少しやっかいですが、それでも lcc が
ASKA のプリプロセッサとして使えるのは非常に有用だと思います。
pack005s のASKAのアプリケーションでは、ぜひプリプロセッサを使う形での
ソース収録としたいです。私が既存のソース countup4 や boxes01 を
書き換えても良いです。
それにしても私は [OSASK 1428]で
> 残念ながら、そういうのは知らないのですが、最低限のものなら
> Perlで書けばなんとかなるかもしれません。
> #gccは大きすぎですよね。
と書いていて gcc -E でプリプロセッサとして使えるのを知っていたのに、
lcc のオプションをもっと早くチェックするべきでした。
--
小柳 雅明(Koyanagi.Masaaki !Atmark! nifty.ne.jp)
「人の足を止めるのは"絶望"ではなく"諦観"
人の足を進めるのは"希望"ではなく"意志"」
-- ARMS