-

LIBRARIES PUBLIC DOCUMENT LIBDOS2

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

LIBDOS2 HI-TECH C及びMSX-DOS2用IOライブラリ


HI-TECH Cに付いてくる標準ライブラリ(libc.lib)は、MSX-DOS2においてはサブディレクトリやその他環境をサポートしていません。

このライブラリ(libdos2.lib)は特にMSX-DOS2のために書かれ、サブディレクトリやその他環境を充分にサポートしています。

Obtaining LIBDOS2

LIBDOS2の入手

ここからlibdos2.pmaをダウンロードし、lhext.comで解凍してください。

この配布物にはライブラリ(libdos2.lib)、ソース(*.as, *.c) 、ドキュメント(このファイル)が含まれます。

LIBDOS2の使用

libdos2を使用するためには、まずlibc.libのあるディレクトリにlibdos2.libを置き、Cコンパイラを"-ldos2"オプション的を付けて使用します。

浮動小数点数をサポートしたい時には、同様にしてlibdos2.lib("-lf ldos2")として、その前にlibf.libをリンクしてください。 libdos2.libは完全なCライブラリでなく、libc.libからいくつかの関数がまだ必要なことに注意してください。普通は、コンパイラドライバ(cc.comなど)が自動的にlibc.libをスキャンするようにリンカに指示するので、気にすることはありせんが libdos2をリンクしたプログラムはMSX-DOS2でしか動きません。DOS1/DOS2の両方で動かすためには、多くの関数の書き換えが必要ですが、DOS2のみのバージョンの方がコンパクト です。もちろん、あなたのプログラムを2つのバージョンにするのも、簡単にできます。

ドキュメント

ほとんどの関数はHI-TECH Cに付いてくるドキュメントで記述されています。libdos2の動きとHI-TECH Cドキュメントの内容と違いのある部分を、不完全かもしれませんが以下にリスト化しました。

引数としてファイル名を取る関数では、'/'をパスセパレータとして使えます。MSX-DOS2にファイル名を渡す前にlibdos2が代替物として働くからです。 このような代替は以下のように直接的な適用も可能です??

int _flip(char *d, char *s, unsigned int n);

sからdに多くともn文字をコピーする時、'/'は'\\'に置き換えられます??

_getargs()関数と_glob()関数はコマンドラインにおいて、ワイルドカード拡張拡張を意図していますが、直接的に使うことも可能なので、詳細はglob.asやgetargs.cを参照してください。

open()関数はモード引数として、元々のlibc.libにあるものと同じ値をとります。これに加えて、ビットたんい、もしくはO_INHERと共に DOS2コールの _FORK (0x60)で作られた子プロセスの継承可能なハンドルを作ることができます。 マクロであるO_INHER は、unixio.hの中でO_RDONLY, O_WRONLYやO_RDWRと共に定義されています。

ヘッダファイルdirent.hはディレクトリを読むためのいくつかの関数定義を含んでいます。これらの関数はPOSIX標準に従っています。

DIR * opendir (char * name);

与えられた名前でディレクトリを開き、NULLを返し、操作が失敗するとerrnoを設定し、malloc()でメモリ割り当てを行います。

struct dirent * readdir (DIR * dir);

dirディレクトリからエントリを1つ呼び出す、構造体direntは実際にはファイル情報ブロックで、dirent.hで定義されています。 しかし、もしもポータブルなプログラムを書きたいなら、d_name[]のみを使うべきです。これはNAME_MAX文の文字が終端のゼロの前につく文字列です。 readdir()は同じディレクトリに対する次のreaddir()呼び出しで上書きされます。

int closedir (DIR * dir);

dirディレクトリを閉じ、free()と関連づけられたストレージをfree()で解放します。

void rewinddir (DIR * dir);

dirディレクトリでポインタをリセットし、readdir()の次の呼び出しは最初のディレクトリエントリを返します

その他のディレクトリを操作する関数はsys.hで定義されています。

int chdir (char * name);
int mkdir (char * name);
int getcwd (int drive);
int rmdir (char * name);

これらの関数はHI-TECH Cドキュメントに従います。mkdir()やgetcwd()はPOSIXの対応するものとは、違ったやり方の呼び出しをします。

getenv()関数は、固定ストレージのポインタというより、malloc()されたばかりの文字列へのポインタを返します。free()を使うことができますがら他のシステムに対してポータブルではありません。libdos2はchar ** environを提供しません。

バグレポートやコメント、改善提案があったらArnold Metselaarまで送ってください