asu ansi2kr Ver 1.3

(C) Masaki Oba 2017
http://www.nabeta.tk/en/
admin@nabeta.tk

What is the "asu ansi2kr"
asu ansi2kr is the ANSI C to K&R C converter(translator) for BDS C and MSX-C

License
2-Clause BSD License
Open source.
ANSI C source.(Support C++ Builder)

Support platforms Download
Download asu ansi2kr for Windows

Download asu ansi2kr for CP/M,MSX-DOS,MSX-DOS2

Function
  1. Convert "int func(int a,char *b);" to "int func(a,b)int a;char *b;".

  2. Convert "  #define ABC" to "#define ABC"

  3. Convert "  //comment" to ""
    Does not convert "abc //abcd"
    -c option disable this function.

  4. Convert Type of C
    Exsample
    Convert "const int" to "int"
    Convert "short int" to "int"
    Convert "unsigned char" to "char"
    Convert "unsigned int" to unsigned
    Convert "short" to "int" (but MSX-C does have "short")

  5. Cut out cast for BDS C.
    (-u option disable this function.)
  6. Convert "a = (int)b;" to "a = b;"

  7. add "#pragma noregalo" for MSX-C.
    (if no use "#pragama noregalo" and CF.COM -t option then may generated program does not work.)

  8. Same line number. source and output file.
    (When no add "#pragma noregalo")

Usage
usage: ansi2kr [-cvupme] inputfile [outputfile]
-c no use C++ comment
-v delete "void"
-u use cast.(no cut cast)
-p out "#pragma noregalo". (for MSX-C)
-m support MSX-C. same -vup option.
-e no output CP/M EOF 0x1a(CP/M File end mark)\n

Example
convert abc.c and display
> ansi2kr abc.c

convert abc.c output.c for BDS C
> ansi2kr abc.c output.c

convert abc.c output.c for MSX-C
> ansi2kr -m abc.c output.c
or
> ansi2kr -c -v -u abc.c output.c
or
> ansi2kr abc.c output.c -m


if compile this source by C++ Builder on Windows
(target Windows)
> bcc32 ansi2kr.c

if compile this source by BDS C
"ansi2kr.exe(or .com) ansi2kr.c bdssrc.c(output filename)" +
#define CPM +
must create blank hedder files. or delete include line.

Compile by BDS C on CP/M
(target CP/M and MSX-DOS and MSX-DOS2)
> ansi2kr ansi2kr.c temp.c
> cc temp.c
> clink temp
> pip ansi2kr.com=temp.com

Compile by BDS C on MSX-DOS
(target CP/M and MSX-DOS and MSX-DOS2)
> ansi2kr ansi2kr.c temp.c
> cc temp.c
> clink temp
> copy temp.com ansi2kr.com

Compile by BDS C on Windows with CP/M program EXEcutor for Win32
(target CP/M and MSX-DOS and MSX-DOS2)
> ansi2kr.exe ansi2kr.c temp.c
> cpm cc temp.c
> cpm clink temp
> copy temp.com ansi2kr.com

if compile this source by MSX-C Ver 1.2 on MSX-DOS2
Important!!! cf "-t" option and ansi2kr "-m" option.
-m or -p option output "#pragma noregalo" to source code.
#define MSXC

> ansi2kr -m ansi2kr.c temp.c
> cf -t temp
> cg -k temp
> m80 =temp/z
> l80 ck,temp,clib/s,crun/s,cend, temp/n/e
> copy temp.com ansi2kr.com

if use for MSX-C
Important!!! must use cf.com "-t" option and ansi2kr "-m" option.
and don't use "#pragma regalo"
if no use cf.com "-t" option or no use "#pragma noregalo"
then some case generated programs does'nt work.

(Japanese)
asu ansi2kr とは何か?

ANSI Cのソースを古いK&R Cのコンパイラ仕様に近づけたソースに変換するトランスレーター(コンバーター)です。
CP/Mで動作するコンパイラのBDS CにANSI C機能を追加するために開発しました。
 BDS Cと機能がよく似ているMSX-Cにも効果があります。
ただ、MSX-Cはコンパイル能力の問題からおすすめしません。
移植時に一度だけ使用する目的では作っていません。(そういう使い方もできますが。)
BDS Cをコンパイルするバッチファイル、サブミットファイル、makeファイルなどに組み込み、コンパイルするたびに毎回使う目的で作りました。
つまり、ANSI C風に書いたソースを正規のソースとして扱い、変換されたK&Rのソースは通常見ることはない使い方を考えています。
そのために、元のソースと変換後のソースの行番号は一致し、ずれないようにしています。
(MSX-Cの場合は一行ずれる場合があります。)
コンパイラが出したエラー行を見て元ソースの修正ができます。
変換能力ですが、asu ansi2krは、ANSI Cで書かれていますが、そのソースをasu ansi2krをかますことによりBDS Cでもコンパイルすることができます。


古いことをしようとはしていないかも

HTML5のソフトを作るためにやっています。
WebMSXというMSXエミュレーターはHTML5でMSXのプログラムを動かせます。
BDS CでMSXのプログラムを作ってホームページで動かす。
最終的には最新の環境であるHTML5がターゲットなので考えようによっては古いことをしようとはしていないかも。
むしろ新しいかも。
Javaはホームページ上の言語から消えたし(GWTとかはあるけど)、flashも消えつつあるし、できればC言語でHTML5のソフトを作りたい。
ある程度はグラフィックなども対応させて。
しかしBDS CはANSI C対応ではない。
そこでasu ansi2krを作りました。

機能
1.ANSI Cの関数の宣言、定義部分をK&R Cに書き換えます。
"int func(int a,char *b);" を、"int func(a,b)int a;char *b;"に変換します。

2.ANSI Cの#define などの#に続く文をK&R Cに書き換えます。
#の前の行頭の空白を削除します。
K&R では#は行頭である必要があります。

3.C++のコメントの // にも一部対応します。(-cオプションで禁止可)
行頭もしくは行頭の空白に続くC++コメントのみに対応しています。
"//abcd" の行を、空行にします。ただし、"abc //abcd" は変換しません。

4.BDS C、MSX-Cコンパイルできる型に変換します。
例えば
const int を intに、
short int を intに、
unsigned charを、charに、
unsigned intを、unsignedに、
short(単独)をintに。(MSX-Cにはshortはありますが)
BDS C、MSX-C向けに手作業でこれらを変換する必要がなくなりソースの互換性が高まります。

5.BDS Cはキャストがエラーになるので、キャストを取り除きます。
(-uオプションで禁止可)
"a = (int)b;" を、"a = b;"に変換します。

6.オプションによりMSX-Cの#pragma noregalo をソースの先頭に挿入できます。
先頭行が空行またはコメントの場合は以降の行がずれないように挿入します。
(MSX-Cでは、#pragama noregalo と、cfの-tオプションを使わないと作ったプログラムが誤動作することが多いです。)

7.変換後のソースは元ソースと行番号が一致してずれないのでコンパイル時のエラー行から元ソースの修正に即入れてコンパイル毎に使える。
(MSX-Cでは一行だけずれる場合があります。)
(行番号が大きくずれてしまう変換ではコンパイル毎の使用は無理で移植時に一回使うぐらいの使い方しかできない。)

ソースについて
ANSI Cで書かれているので、極わずかな変更により多くのOSで動作すると思います。
HI-TECH C Ver3.09(CP/M)は、元々コンパイルできていたのですがバージョンアップに伴いソースが大きくなり、"Too many temporary labels"というエラーが出てコンパイルできなくなりました。
HI-TECH Cは大きなソース(といっても1200行ぐらいですが)になるとコンパイルできないようです。
ソースを分割すればコンパイルできるとは思いますがCP/M版はBDS Cで作れているのでする予定はありません。
MSX-C Ver 1.2にも対応していますが、asu ansi2krで-mオプションを付けて変換しMSX-CのCF.COMに-tオプションをつける必要があります。
 それをしない場合、MSX-C Ver 1.2では変換せずに元のソースのまま出力するバイナリを生成すると思います。

実行ファイルのターゲット
2017年3月18日現在、
1.C++ BuilderでコンパイルしたWindows版、
2.BDS CでコンパイルしたCP/M、MSX-DOS、MSX-DOS2版
3.MSX-C Ver 1.2でコンパイルした階層ディレクトリ対応のMSX-DOS2専用版
の三つ存在します。
BDS CとMSX-Cは直接ANSI Cのソースをコンパイルできないため、すでにコンパイルされたasu ansi2krで変換したソースをコンパイルします。

旧バージョンにあったHI-TECH C(CP/M)でコンパイルしたCP/M、MSX-DOS、MSX-DOS2版はソースの肥大化に(といってもまだ小さいですが)HI-TECH Cがついてこれずコンパイルできなくなっため無くなりました。


注意点
完全にANSI Cになるわけではありません。
主に関数の宣言、定義部分を変更するだけです。
条件コンパイル(#defineなど)はノーチェックで変換しています。
コメント部分か否かもノーチェックで変換しています。
そのため、変換させるためには特定の記述にしたがっている必要があります。
変換するソースからincludeされるファイルは変換しません。
(#include は無視します。)
ただしincludeファイルのファイル名を指定して変換することはできます。

関数宣言部の変換条件
1.行頭(第一カラム)から始まっている。
2.行を分けずに一行で書いてある。

C++コメントの変換条件
1.行頭(第一カラム)から始まっているか行頭の空白(連続可)の後から始まっている。

変換の禁止について

関数宣言部の変換の禁止
・部分的に変換させないようにするには、行頭にスペースでも置けばいいです。
・全体的に変換しないようにするには、最初から変換かけなければよい。

C++コメントの変換の禁止
・全体的に変換しないようにするには、-c オプションを付ける

キャストを取り除く変換の禁止
・全体的に変換しないようにするには -u オプションを付けます。

CP/M EOFの出力の禁止
-e オプションで、CP/Mのファイルの終端マークの0x1aの出力を禁止します。
出力しても困ることは滅多にないと思いますが、テキストファイルをCP/M以外で合体したときに
ゴミ(0x1a)が途中に入ることはあります。
そして、続きがあってもCP/Mでは0x1aの部分まででファイルは終わりと解釈されるかも知れません。


BDS Cについて

型の区別は厳密ではなくキャストは不要というかできません。
そのため、asu ansi2krではBDS Cのためにキャストの記述を取り除きます。
アセンブリ言語でコンパイラが作られているので使えるメモリが多いからかメモリが足りないからコンパイルできないというエラーはでにくいです。
他のCP/MやMSX-DOSのCコンパイラでコンパイルできない複雑な式、大きな関数、大きなソースもBDS Cならコンパイルできることが多いです。
int a=2;のような変数の宣言と同時の初期化ができません。
static int a;のようなstatic変数は使えません。
区別できる関数名は8文字までで大文字小文字の区別はしません。
MSX-C同様に、long、foat、doubleは使えません。
作ったプログラムはCP/Mで動く代わりにMSX-DOS2の階層ディレクトリを扱えません。
最適化は甘いと思います。
BDS CはCP/MまたはMSX-DOS上で動作するCコンパイラの中ではおそらく最もコンパイル速度が高速です。
現在はオープンソースのパブリックドメインになっています。
新規参入者も自由に使えます。
今でも公式ホームページがありそこで配布されています。
コンパイラのソースは公開されていますがC言語ではなく8080アセンブリ言語で書かれていて他のOSへの移植は困難です。



MSX-Cについて

MSX-Cはコンパイラの能力の問題からソースは正しいのにエラーを出してコンパイルできないことがよく起こります。
式を分解したり関数を分けたりソースファイルを分けたりすることでコンパイルできるようになります。
またMSX-Cは区別できる関数名が6文字と短すぎるのでコンパイルには関数名を縮めないといけないことがあります。
また関数名は大文字と小文字を区別しません。
BDS C同様にlong、float、doubleは使えません。
MSX-C Ver 1.2ではMSX-DOS2では階層ディレクトリを扱うプログラムが作れます。
char型とint型とchar *の区別が厳密です。
cf.com に -tオプションをつけて、ソースに"#pragma noregalo"を書かないと正常動作しないプログラムを生成することがよくあります。
BDS Cよりも最適化が効きますがその代償として型の区別が厳密で、誤動作するプログラムを生成する場合があり、実用として使うには型の区別をある程度ゆるくするオプション(cf.comの-t)とレジスタ変数の最適化を禁止(#pragma noregalo)をする必要があると思います。
ただし、MSX-C固有の機能を熟知してよくチェックしながら使うなら最適化をフル発揮しながら使うことは可能だと思います。
どこを最適化したら問題でどこを最適化したら問題ないかはMSX-Cは判断できません。
プログラマーが自己責任でレジスタ変数の最適化をしていい場所といけない場所を#pragma noregalo と#pragma regaloで指定する仕様になっています。
もし最適化よりも安全確実を望むなら、ソースの先頭に#pragma noregalo を書きます。
asu ansi2krの-mオプションと-pオプションは#pragma noregaloを自動で挿入します。
またデフォルトではintとchar *間の変換ができないため誤動作することがあります。
そのためにcf.com の-tオプションが必要です。
コンパイル速度はMSXturboRを使っても低速です。
MSX-Cは厳しいライセンスのまま販売を終了しています。
新規参入者は合法的に使うことが難しいかも知れません。
最終の合法の配布は「MSX MAGAZINE永久保存版3」という書籍で、付録CD-ROMのMSXエミュレーターの中にMSX-C Ver 1.2が入っています。
作成したバイナリの配布も許可を取らないといけないのかも知れませんが当時の問い合わせ先はなくなっています。

BDS CとMSXとHTML5のプログラム

BDS CはMSXライブラリとソース付きのサンプルプログラムが公開されています。
MSX-DOS上のMSXライブラリだけではなく、OSとしてのMSX-BASIC上のMSXライブラリもあります。
しかしながら、サンプルプログラムがK&R Cだと魅力が半減してしまいます。
BDS CをANSI C化する必要があると考え、asu ansi2krを作成しました。
MSXプログラムはHTML5で動くMSXエミュレーターを使うとHTML5ソフトになり自分のサイトにもMSXプログラムを載せられます。
BDS CはMSX-DOSを必要としないMSXライブラリもあるためMSX-DOSを添付する必要がないプログラムが作れて便利です。


HI-TECH C(CP/M)とBDS Cの比較

BDS Cはパブリックドメインになりソースも公開されました。
HI-TECH C(CP/M)はフリーソフトとなり本家サイトで配布していましたが現在は本家サイトからの配布がないどころか一切の記述がありません。
第三者による二次配布のものは現在も配布されています。
HI-TECH C(CP/M)のはフリーになりましたが当時公表されたライセンスの文は短く詳しいライセンス内容は分かりません。
HI-TECH C(CP/M)のフリー版はクローズドソースで、起動後の初期化ルーチンのソースもないため、CP/M、MSX-DOS以外のOSで動くプログラムを作ることが困難もしくはできません。
例えば、MSX-BASIC上で動くプログラムをHI-TECH C(CP/M)のフリー版で作ることは困難もしくはできません。
市販版のHI-TECH CのZ80版は現在販売されていないため入手できません。
HI-TECH CはANSI Cで、long、float、doubleにも対応し、BDS Cが持っている数々の制限がありません。
関数は大文字小文字を区別し長い関数名も区別できます。
20文字ぐらいまでは確認しましたが多分31文字まで?
しかしHI-TECH Cは小さいソースしかコンパイルできないようです。
BDS CはHI-TECH Cがコンパイルできない大きなソースもコンパイルできます。
asu ansi2krをWindowsからCP/M、MSX-DOSに移植する際、HI-TECH Cではソースの大きさからエラーになったのでBDS Cを使いました。
(MSX-Cでもコンパイルできました。)
それでもソースを分割する手間を惜しまなければHI-TECH Cも使えると思います。
HI-TECH Cが現在手も足も出ない分野はCP/M、MSX-DOS以外の環境(例えばMSX-BASIC上のプログラム)で、BDS Cの出番になると思います。


本物のANSI Cコンパイラに勝てない点
BDS C及びMSX-Cは数々の制限があり、ANSI C以前にK&Rすら完全には対応していません。
テキスト・テキスト変換のトランスレーターをかますぐらいでは解決できない問題も多いです。
列挙すればきりがないですが主な重要な点を書きます。
・区別できる関数名の長さの制限と大文字小文字の区別。
BDS Cは区別できる関数名の長さは8文字までで大文字小文字の区別はしません。
MSX-Cは区別できる関数名の長さは6文字までで大文字小文字の区別はしません。
ANSI Cでは区別できる関数名は31文字までで大文字小文字の区別をします。
コンパイラだけの問題だけではなくリンカ、そして使っていればアセンブラの影響も受けます。

・使用できる型
BDS C、MSX-Cともint(16ビット)、符号なしchar、unsigned(16ビット)だけ使えます。
signed char(符号付きchar)、long、float、doubleなどは使えません。

・宣言と同時の初期化
BDS Cは、"int a=2;"のような記述はできません。
MSX-Cはできます。

・static変数
BDS Cは、"static int a;"のような記述はできません。
MSX-Cはできます。

・メモリ不足によるコンパイルエラー
MSX-Cはメモリ消費が多く大き目の関数や複雑な式のコンパイルができません。
その場合、関数を細かく分けたり式を分解して記述しなおす必要があります。
BDS Cはそういう傾向はなくだいたい大丈夫ですがそれでもMS-DOSやWindowsで動くコンパイラと比べるとコンパイルできる関数の最大サイズは小さいです。

・ターゲットでの実行時のメモリ空間
BDS CとMSX-Cが対応するZ80/8080 CPUでは64Kb(65536バイト)のメモリ空間しかないため小さいプログラムしか作れません。
これはコンパイラ以前にターゲットのCPUを変えないと解決しません。

http://www.nabeta.tk
admin@nabeta.tk
Masaki Oba
9 Apr 2017