

                                                                        


















                        LSI C-86 Ver.3.30 試食版
                                    
                          ユーザーズマニュアル











                      エル・エス・アイ ジャパン(株)
                    〒151 東京都渋谷区千駄ヶ谷 1-8-14
                    TEL(03)3404-1319  FAX(03)3478-0576











                            1991 年 8 月 1 日













                                                                        




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル








                             第1章  設置方法




この章では、本コンパイラを使用する前にやらなければならない設置作業につい
て説明します。すでに誰かが設置を終えていれば、この章を読む必要はありませ
ん。

必要な作業は次の3つです。

  + アーカイブを展開すること(これはすでに実行しているはずですね:-)。

  + 展開したパッケージから日常使うファイルだけを集めてあなたのシステムに
    組み込むこと。

  + あなたの環境や好みに合わせて、コンパイラのパラメタを調整すること。こ
    れは、コンフィギュレーションファイルや環境変数を設定することによって
    おこないます。


1.1  日常使用するディスクの作成



パッケージを展開すると次のようなディレクトリ構成になります。

    bin\                    実行ファイル
        lcc.exe             コンパイラドライバ
        cpp.exe             プリプロセッサ
        cf.exe              パーサ
        cg86.exe            コードジェネレータ
        r86.exe             アセンブラ
        lld.exe             リンカ
        _lcc                コンフィギュレーションファイル
        prof.exe            プロファイラ
        ip86.exe            プロファイラ用のツール
        oar.exe             ライブラリアン
        make.exe            プログラムメインテナ
        makedef             デフォルトルールファイル
        merc.exe            アセンブラ出力にCを混ぜるツール
        libr.exe            ライブラリコンパイラドライバ
    include\                ヘッダファイル
        sys\
    lib\                    ライブラリファイル
        s\
            cdos.obj        初期設定ルーチン
            cpro.obj        プロファイラ用初期設定ルーチン
            expand.obj      ワイルドカードの処理を簡略化する
            noexpand.obj    ワイルドカードの処理をやめる


                                 - 1 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


            tinymain.obj    クォートなどの処理をやめる
            knjlib.lib      日本語処理関数
            mathlib.lib     数学関数
            intlib.lib      整数のみのprintf/scanf
            doslib.lib      上記以外のライブラリ関数
    src\
        bin\                付属プログラムのソースコード
        lib\                ライブラリのソースコード
    man\                    オンラインマニュアル

ディレクトリbin にはコンパイラやツールなどの実行形式のプログラムファイル
やコンフィギュレーションファイルを格納してあります。 includeディレクトリ
とサブディレクトリsysにはヘッダファイルが収められています。libは標準ライ
ブラリが配置されているディレクトリです。実際のライブラリファイルはサブデ
ィレクトリsの中にあります。srcディレクトリにはツールやライブラリのソース
コードがあります。サブディレクトリbinにはlcc(コンパイラドライバ)や make(
プログラム保守ツール )  などの付属プログラムのソースコードを収めてありま
す。標準ライブラリのうち、スタートアップルーチンのソースコードはサブディ
レクトリlibにあります。ディレクトリmanにはオンラインマニュアルを格納して
います。

コンパイラの実行に必要なのはこれらのうちディレクトリbin,  include, libの
中身全部です。

ソースプログラムを作成してコンパイルするためには、本パッケージに含まれて
いるファイル以外にMS-DOSシステムとエディタが必要となります。エディタはど
んなものを使ってもかまいません。あなたが使い慣れているものを用意してくだ
さい。


1.2  環境の設定



次にコンパイラが動作する上での環境を設定しなくてはなりません。ここでいう
環境とは、コンパイラ本体、ヘッダ、ライブラリの存在するディレクトリ等の情
報のことです。これらは、環境変数PATHと、_lccファイルによって設定します。

まず、CONFIG.SYSファイルには

    FILES=20 (あるいは20以上の値)

という設定を忘れないでください。これを忘れると、コンパイル中にプリプロセ
ッサcppが

    can't open filename.h

というエラーを表示してコンパイルを中断してしまうことがあります。

環境変数PATHは、実行可能なコマンドがどのディレクトリにあるかをMS-DOSに知
らせる変数です。コンパイルのためには、少なくともlcc.exe、lld.exeが存在す
るディレクトリをこの変数に登録しなければなりません。

また、環境変数TZは、コンパイラ自体の実行には関係ありませんが、LSI C-86を
使って作成したプログラムを正しく動作させるために必要です。ライブラリ関数
のうち、時間関数は環境変数TZを参照し、現在のシステムの時間と世界標準時と


                                 - 2 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


の時間差を計算します。日本で使用する場合は

    set TZ=JST-9

としておきます。

_lccは、コンパイラの省略時オプションを登録するファイルです。はじめは下の
例の設定を少し変更するだけでよいでしょう。しばらくしてこの標準設定に不満
がでてきたら、 lccのオプションの説明をよく読んだ上で設定値を決めてくださ
い。

以下に例を示します。

    A>set
    COMSPEC=A:\COMMAND.COM
    PATH=A:\;A:\LSIC86\BIN
    TZ=JST-9

    A>type _lcc
    # LSI C-86 compiler's configuration file
    -DLSI_C
    -XA:\LSIC86\BIN -LA:\LSIC86\LIB -IA:\LSIC86\INCLUDE -T -O
    -acdos.obj $LSICOPTS
    &#Command line argument will be inserted here
    -lknjlib -ldoslib -v

この設定では、コンパイラをディレクトリA:\LSIC86\BIN に置くことを仮定して
います。-X, -L, -I, -Tはそれぞれ、コンパイラ本体、ライブラリ、ヘッダ、作
業用ファイルを置くディレクトリを指定するオプション、-Oは最適化を実行すオ
プション、-aは初期設定モジュールの名前を、-lは使用するライブラリを名前を
指定するオプション、 -vはコンパイルの過程を表示するオプションです。&はコ
マンドラインで入力されたパラメタをここで展開する指示です。# から改行まで
はコメントです。$は指定された環境変数の内容をそこに展開します。






                             第2章  操作方法




この章では、コンパイラの操作方法について説明します。はじめに基本的な使い
方を述べ、次に詳細な説明をします。内容は以下のとおりです。

 1. コンパイラの基本的な機能

 2. コンパイラドライバlccの使い方

 3. その他のコマンドの使い方

 4. プログラムの実行方法




                                 - 3 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




2.1  基本的な機能



この節では、コンパイラの基本的な機能だけを説明します。詳しい説明は次節以
降にあります。


2.1.1  単一プログラムのコンパイル



ここでは、単一のファイルからなるプログラムのコンパイル方法を説明します。
KernighanとRitchieの本にでている一番初めのプログラムを例にとることにしま
しょう。 このプログラムhello.cをまずエディタで作成する必要があります。次
のように打ってください。

    #include <stdio.h>
    main()
    {
            printf("hello, world\n");
    }

このプログラムをコンパイルするには、次のコマンドを入力します(A>は MS-DOS
のプロンプトです)。

    A>lcc hello.c

するとコンパイラが働きはじめ、 しばらくのちに(入力の間違いがなければ) 実
行可能な形式のプログラムhello.exeが作成されるはずです。 これを実行してみ
ましょう。

    A>hello

と入力してください。コンソールに

    hello, world

という文字が表示されるはずです。

この一連の作業がうまくいかない場合は、前章の設置作業に問題がなかったかど
うかを調べてください。必要なファイルはそろっているか、また環境変数が正し
く設定されているかどうか、_lccが間違っていないか検査してください。


2.1.2  複数モジュールからなるプログラムのコンパイル



現実のプログラムは複数のモジュール ( ファイル)に分割されているのが普通で
す。ここではその場合のコンパイル手順を説明します。

いま、x.c, y.c, z.cの3つのモジュールがあり、これをコンパイルしてprog.exe
という実行形式プログラムを作成するものとしましょう。これは、次のコマンド


                                 - 4 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


で実現できます。

    lcc -o prog.exe x.c y.c z.c

すると、x.cがコンパイルされてx.objが作られ、y.cからy.objが、z.cからz.obj
が作られます。そしてエラーがなければリンカが呼び出されてx.obj, y.obj, z.
objを結合し、prog.exeを作ります。

上の例ではすべてのモジュールをコンパイルしましたが、ひとつのモジュールだ
けをコンパイルして、リンクすることもできます。たとえば今y.c を変更したと
しましょう。y.cだけコンパイルし、3つのオブジェクトをリンクするには

    lcc -o prog.exe x.obj y.c z.obj

というコマンドで実現できます。

また、-cオプションを指定すると、コンパイルだけおこない、リンクは実行しま
せん。したがって、上のコマンドは

    lcc -c y.c
    lcc -o prog.exe x.obj y.obj z.obj

というコマンド列と同じです。

なお、本コンパイラに付属しているmakeというツールを使うと、分割されたプロ
グラムのコンパイルを簡単におこなうことができます。


2.2  lccの操作



lcc はCコンパイラ、アセンブラ、リンカを呼び出して、Cソースプログラムを実
行可能形式にするものです。lccコマンドは次のような形式をしています。

    lcc [オプション...][ソースファイル名...]

ソースファイルには、C言語(拡張子.cを持つファイル)、アセンブリ言語 ( 拡張
子.a86(r86) 、.p86(r86)、あるいは.asm(MASM)を持つファイル)、オブジェクト
(拡張子.objを持つファイル)の3種類のファイルを指定できます。 ファイルはふ
たつ以上書くこともでき、それらはまとめてリンクされます。

lcc はまずこれらのファイルをコンパイルまたはアセンブルし、それぞれのオブ
ジェクトを作ります。アセンブリ言語ファイルは、その拡張子が.a86または.p86
ならばcppを実行した後にr86(本パッケージ中に付属しているアセンブラ)によっ
て、.asmならばMASMによってアセンブルされます。

エラーがなければすべてのオブジェクトをリンクし、ひとつの実行可能形式ファ
イル(拡張子.exe)を生成します。.exeファイルには一番はじめのソースファイル
と同じ名前がつけられます(作成されるファイル名は-o オプションで変更できま
す)。

もしもエラーがあると、オブジェクトの生成までは実行されますが、リンクはさ
れません。エラーメッセージは標準出力に出していますので、MS-DOSのリダイレ
クト``>''によってこれをファイルにとることもできます。



                                 - 5 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


オプションには次のものがあります。これらのうち、ディレクトリ名を指定する
必要があるものは、 最後の\は付けても付けなくてもかまいません。また、ディ
レクトリの区切り文字は\と/のどちらでもかまいません。アルファベットの大文
字と小文字とは異なったものとして認識されますので注意してください。

@file
    ファイルfileからコマンドラインパラメタを読み込みます。file中には、オ
    プションやソースファイル名を空白または改行で区切って記述します。この
    オプションは

        lcc -o foo.exe @files @libs -m

    のように、途中にあったり、2回以上現れたりしてもかまいませんが、 ネス
    トは許されません。つまり、fileの中では@オプションは使用できません。

-a[file]
    fileを初期化ルーチンに指定します。このファイルは、-Lオプションで指定
    したディレクトリの中になくてはなりません。-aとfileのあいだにはスペー
    スがあってはなりません。

    file が空のとき (-aのみの指定)は、初期化ルーチンはないものとみなしま
    す。

-c
    オブジェクトファイルを作成したあと、リンクを実行しません。コンパイル
    するファイルがひとつだけの場合は、-oオプションでオブジェクトファイル
    の名前を指定することができます。

-cn
    コメントのネストを許します。

-cs, -cu
    -csはchar型が符号付き(signed)であることを指定します。-cuはchar型が符
    号なし(unsigned)であることを指定します。省略時は、符号なしになってい
    ます。

-DNAME[=value]
    NAMEというマクロを定義します。C言語のソースプログラムの1番上に

        #define NAME value

    という行があるのと同じです。

    ただし、=valueが省略されたときは、

        #define NAME 1

    と同じです。

-g
    デバッグ用の情報( 行番号情報 ) をオブジェクトに埋め込みます。 これは
    Microsoft社のSYMDEBで利用できます。

-h
    スタックオーバーフローを検査するコードを生成します。作成したプログラ
    ムの実行速度は遅くなります。


                                 - 6 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



-Idir
    #include 文で指定したファイルを探すディレクトリのリストにdirを加えま
    す。複数の-Iオプションを指定してもかまいません。そのときは指定された
    すべてのディレクトリをさがします。

-j[X]
    エラーメッセージを何語で表示するかを選択するオプションです。

        -j0
            英語で表示します。

        -j, -j1
            日本語で表示します。

    このオプションがないときは-j0を指定したのと同じ状態になっています。

-kX
    リンカにオプションXを渡します。たとえば、 スタックの大きさを設定する
    にはこのオプションを使い、以下のようにします。

        lcc foo.c -k'-s 5000'

    この例は、 foo.cをコンパイルして、スタックの大きさを0x5000バイトに設
    定しています(-s 5000はlldのオプションです)。

-llibrary
    リンク時に、ライブラリlibraryを探索します。ファイルlibraryは、-Lオプ
    ションで指定したディレクトリ中にあるものとみなされます。 また、 拡張
    子.objを明記することにより、ライブラリディレクトリ中にあるオブジェク
    トファイルを結合することもできます。

    リンカは、このオプションに出会った時点ですぐに未解決シンボルを探索し
    ます。したがって、このオプションを書く順番には意味があります。オブジ
    ェクトファイルより先に指定しても、希望する結果は得られませんので注意
    してください。

-Ldir
    ライブラリを探すディレクトリのリストにdirを加えます。ディレクトリdir
    の中には、各メモリモデルに対応したS、P、D、Lのサブディレクトリがなく
    てはなりません。実際のライブラリはこのサブディレクトリに入れてくださ
    い。

-m
    リンケージマップファイルを作成します。

-mX
    メモリモデルを指定します。 Xにはs、p、d、lのいずれかを指定してくださ
    い。省略時は、Sモデルを選択します(-ms)。

-mslink, -nomslink
    -mslinkオプションは、リンカとしてMicrosoft社のMS-LINK を使用すること
    を宣言します。-nomslinkオプションは、リンカとして標準のlldを使用する
    ことを宣言します。このオプションは、-kオプションよりも先に指定しなく
    てはなりません。 これらの指定がなければ、 リンカとして lldを使用しま
    す。


                                 - 7 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



-nN
    連続して検出するエラーの数の上限をN(Nは10進数)に設定します。設定した
    以上のエラーを検出すると、そのファイルのコンパイルを中止します。デフ
    ォルトのNは20です。

-noconf
    コンフィギュレーションファイルを無効にします。このオプションはコマン
    ドラインの一番先頭に書かなくてはなりません。それ以外の位置に書いた場
    合はエラーとなります。

-O, -O0
    -Oを指定すると、コンパイラは最適化を行ないます。-O0を指定すると、 コ
    ンパイラは最適化をやめます。これらのオプションが省略されると、最適化
    は行ないません。

-o file
    出力ファイルの名前をfileとします。通常、これは実行可能ファイルの名前
    となりますが、-cオプションが指定されているときはオブジェクトファイル
    の名前に、また-Sオプションが指定されている時はアセンブリ言語ファイル
    の名前になります。

-p
    プロファイラのためのコードを生成します。プロファイラはプログラムの実
    行状況を検査するためのユーティリティで、プログラムのどの部分を何回実
    行したかを報告します。

-S, -SC
    これらのオプションは、 各C言語ファイルに対して、アセンブリ言語ファイ
    ル(.a86)を生成します。アセンブルとリンクはおこないません。

    -SCは、生成したアセンブリ言語ファイルにCのソースコードをコメントの形
    式で埋め込みます。

    生成されたファイルは、Microsoft社のアセンブラMASM ではアセンブルでき
    ません。付属のr86を用いてください。

-Tdir
    コンパイラの作業用ファイルをディレクトリdirに作ります。RAMディスクな
    どの高速アクセスのできる装置があれば、そのディレクトリを指定するとコ
    ンパイル速度が向上します。省略時はカレントディレクトリを使用します。

-v[X]
    コンパイル中の表示をするかどうかを指定します。

    -v, -v0
        何も表示しません。

    -v1
        内部で実行しているコマンドを表示します。

    -v2
        コード生成時に現在処理中の関数名を表示します。

    このオプションがないときには、 -v0を指定したのと同じ状態になっていま
    す。


                                 - 8 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



-w[X]
    警告(Warning)メッセージが出たときの扱いを指定します。

    -w, -w0
        警告メッセージを表示せず、コンパイルを続行します。

    -w1
        警告メッセージを表示し、コンパイルを続行します。

    -w2
        警告メッセージを表示し、コンパイルを中止します。

    -wi
        宣言されていない関数を使用しているときに報告される警告メッセージ
        を抑制します。

    このオプションがないときには、-w1 を指定したのと同じ状態になっていま
    す。なお、エラーが検出されたときは、本オプションの指定には関係なくコ
    ンパイルを中止します。

-Xdir
    コンパイラの内部コマンド (cf.exe、cg86.exeなど)をdirから探します。こ
    のオプションがなければ、環境変数PATH中のディレクトリをさがします。

-y[X]
    拡張文字セットの取り扱いを指示します。lccは通常、 文字列の中身をシフ
    ト化 JISコードの列として扱うため、(そのままでは)それ以外の体系のコー
    ド(たとえばIBM-PCのハートマーク等)が文字列に現れた時に正しく処理がで
    きません。 このようなときには、 このオプションを指定する必要がありま
    す。

    -y
        すべての文字コードを1バイト文字として扱います。

    -y0
        日本語コード(MS漢字コード)として処理します。

    -y1
        中国語および台湾語コードとして処理します。

    -y2
        韓国語コードとして処理します。

    このオプションがないときには -y0  を指定したのと同じ状態になっていま
    す。

-z
    いっさいの処理を行なわず、内部で実行されるコマンドを表示します。

lcc はコマンドラインにあたえられた文字列を順番に解析していきます。文字列
がオプションならば対応する上述の処理をします。オプションでない場合には、
それはソースファイルの名前と考え、その時点で指定されているオプションを使
ってコンパイルを実行します。たとえば、

    lcc -c a.c -S b.c -p


                                 - 9 -                                  




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



というコマンドをあたえたとします。a.cは、-cが指定されていますので、 アセ
ンブルまで実行されてオブジェクトファイル a.objが作成されます。これに対し
てb.cをコンパイルするときには-Sが有効ですから、b.cはアセンブリ言語ファイ
ルb.a86にコンパイルされます。lccが最後に指定されている-pを認識するときに
はどちらもすでにコンパイルされていますから、プロファイラのためのコードは
生成されません。このように、オプションとソースファイルを指定する順番には
注意が必要です。


2.3  コンフィギュレーション



上に示したように、lccは数多くのオプションを持っています。 これらを毎回指
定しなければならないのは大変なので、操作を簡単にするために省略時のオプシ
ョンをファイルや環境変数からあたえられるようになっています。

ここでは、 lccを簡単に使用するためのコンフィギュレーションファイルについ
て説明します。


2.3.1  コンフィギュレーションファイル_lcc



lccは起動時に、まずカレントディレクトリ、次に環境変数PATH に設定されてい
るディレクトリを順に探し、_lccを見つけると、このファイルの中からコマンド
を読み込みます。このファイル_lccをコンフィギュレーションファイルと呼び、
デフォルトのオプションやいつも使用するライブラリ等を記述しておきます。

標準設定を記述した _lccはlcc.exeと同じディレクトリに置いておきます。そし
て特別な設定でコンパイルしたいときには、カレントディレクトリに専用の_lcc
を作成するのがよいでしょう。そうすれば、ふだんは標準設定の_lccを使ってコ
ンパイルでき、特定のディレクトリでコンパイルするときだけ、専用の_lccによ
るコンパイルになります。


2.3.2  _lccの記法



コンフィギュレーションファイル_lccには次のものを記述することができます。

 1. コメント

    #が現れるとlccはそこから行末までを無視します。したがって# に続いてコ
    メントを書くことができます。

 2. オプション

    上述したlccのオプションのうち、@を除くすべてのものを記述することがで
    きます。オプションとオプションの間は、空白または改行で区切ります。

 3. コマンドラインの引用記号``&''



                                 - 10 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    &が現れると、その位置にlccのコマンドラインが展開されます。これは、デ
    フォルトのライブラリサーチオプション-lを、ユーザがタイプしたコマンド
    の後に付けてやるために使います。

 4. 環境変数の引用記号``$''

    $ が現れると、続く英数字を環境変数名と解釈し、指定された環境変数に現
    在設定されている値に展開されます。変数名は$TMPのように$ の直後に書い
    てもよいし、${TMP}のように{}で囲んでもかまいません。後者の記法は、変
    数名の直後に英数字を書く場合に便利です。

以下は_lccの例です。

    # LSI C-86 compiler's configuration file

    -DLSI_C
    -X/c/bin -T${TMP} -L/c/lib -I/c/include
    -acdos.obj -w2
    $LCC
    &    #Command line argument will be inserted here
    -lknjlib -ldoslib

この例では、 LSI_C というマクロを1に定義し、コンパイラ本体を/c/binから探
し、作業用ファイルを環境変数TMPに設定されているディレクトリに作り、 ライ
ブラリを/c/libから持ってきて、ヘッダファイルを/c/includeから探し、初期化
ルーチンとしてcdos.objを指定し、警告メッセージが表示されたときはコンパイ
ルを中断し、 環境変数LCCに定義されているオプションを読み、ライブラリとし
てknjlib.libとdoslib.libを探索するように指示しています。

上で述べたように、lccのオプションとソースファイル(ここではコマンドライン
の引用記号&)を指定する順番には注意が必要です。一般的には、ライブラリの指
定(-l)は&の後ろ、それ以外は&の前に置くのがよいでしょう。


2.4  プログラムの実行



ここではLSI Cを使って作成したプログラムの実行に関して説明します。


2.4.1  コマンドラインパラメタ



できあがったプログラムは、名前をタイプすれば実行されます。このとき、コマ
ンドラインにはいくつかのパラメタをかくことができ、それは関数mainにパラメ
タとして渡されます。

このとき渡されるパラメタを利用するためには、main()関数を次のように宣言し
てください。

    int main(int argc, char *argv[])

argcはコマンド名を含む、コマンドラインパラメタの個数を示します。argvはコ
マンドラインパラメタへのポインタを左から順番に格納した配列です。


                                 - 11 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



たとえば、fooというコマンドを

    A>foo bar baz

というふうに実行すると、mainのパラメタargc、argvには次の値がセットされま
す。

    argc    = 3
    argv[0] = "foo.exe"
    argv[1] = "bar"
    argv[2] = "baz"
    argv[3] = NULL

ただし、MS-DOSのバージョンが2.xxのときにはargv[0]には空文字列("") がセッ
トされます。


2.4.2  ワイルドカードの展開



ここでは複数のファイル名とマッチするワイルドカード文字を LSI Cで作成され
たプログラムが扱う方法を説明します。

コマンドラインパラメタにはワイルドカード文字*や?も書くことができ、その時
はマッチするファイルをさがしてそれをパラメタに置き換えます。たとえばカレ
ントディレクトリにfoo.c、bar.c、baz.cの3つのCファイルがあるとき

    A>foo All c files are: *.c

を実行すると、パラメタには次の値がセットされます。

    argc    = 8
    argv[0] = "foo.exe"
    argv[1] = "All"
    argv[2] = "c"
    argv[3] = "files"
    argv[4] = "are:"
    argv[5] = "bar.c"
    argv[6] = "baz.c"
    argv[7] = "foo.c"
    argv[8] = NULL

マッチしたファイル名はアルファベット順に並べかえられます。

ワイルドカードの表記には次のものがあり、これらを任意に組合せて使うことが
できます。

*
     ピリオドを含まない、長さ0文字以上の任意の文字列。

?
     ピリオド以外の任意の1文字。

[...]


                                 - 12 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


     []でくくられたうちのいずれかの1 文字。 a-z のように範囲指定もできま
    す。 たとえば、[a-dv-z]は[abcdvwxyz]と同じ意味で、abcdvwxyzのどれか1
    文字にマッチします。

以上がLSI Cでの標準のワイルドカードを展開するメカニズムです。しかし、 場
合によってはこれほど強力な処理は必要ないかもしれません。  その場合には、
expand.objあるいはnoexpand.objというオブジェクトファイルをリンクすること
によって、ワイルドカードの展開処理を制御することができます。

expand.obj はDIRなどのMS-DOSの標準コマンドと同様のワイルドカードの展開を
します。ワイルドカード文字は*と?だけで、しかも* の後ろには文字を書いても
無視されます。

noexpand.objはワイルドカードをまったく展開しません。*や?は文字としてその
ままプログラムに渡されます。

これらのオブジェクトファイルをリンクするときには、 lccの-lオプションを使
ってください。

    lcc yourprog.c -lnoexpand.obj

この例では、yourprog.cをコンパイルしてnoexpand.objをリンクします。したが
って、作成されたyourprog.exeはコマンドラインパラメタにワイルドカード文字
があっても、それを展開することはなく、文字そのものとしてargvにセットしま
す。


2.4.3  クォート処理



パラメタを'や"でくくることにより、空白や*、?を含む文字列をプログラムに渡
すことができます。

    A>foo 'All c files' "are: *.c"

    argc    = 3
    argv[0] = "foo.exe"
    argv[1] = "All c files"
    argv[2] = "are: *.c"
    argv[3] = NULL

さらに、^によって次の1文字だけをくくることができます。

    A>foo ^  ^' ^" '^ sign means xor.' "He said, ^"I'm Joe.^""

    argc    = 6
    argv[0] = "foo.exe"
    argv[1] = " "
    argv[2] = "'"
    argv[3] = "\""
    argv[4] = "^ sign means xor."
    argv[5] = "He said, \"I'm Joe.\""
    argv[6] = NULL

^は"の中では使えますが、'の中では^文字そのものの意味になります。


                                 - 13 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



クォート処理を実行しないようにしたいときには、tinymain.objをリンクしてく
ださい。ただし、tinymain.objをリンクすると、ワイルドカードの展開も実行し
なくなります。

    lcc yourprog.c -ltinymain.obj


2.4.4  環境変数



main()にはargc、argvの他に、3番目のパラメタとしてenvp が次のように渡され
ます。

    int main(int argc, char *argv[], char *envp[]);

envpはargvと同じく文字列へのポインタの配列ですが、コマンドラインパラメタ
を指すかわりに環境変数を指しています。envpにはargcに対応する環境変数の数
を示すパラメタはありません。   n  個の環境変数が設定されているときには、
envp[n]がNULLになります。たとえば

    COMSPEC=A:\COMMAND.COM
    PATH=C:\;C:\C;A:\
    TZ=JST-9

という環境変数が設定されている場合、envpは次のようになります。

    envp[0] = "COMSPEC=A:\COMMAND.COM"
    envp[1] = "PATH=C:\;C:\C;A:\"
    envp[2] = "TZ=JST-9"
    envp[3] = NULL

また、グローバル変数environはenvp と同様に環境変数のポインタの配列を指し
ています。main()が呼び出されるときには

    main(argc, argv, environ);

と等価です。

グローバル変数 environ はヘッダ <stdlib.h>の中で次のように宣言されていま
す。

    char **environ;

ライブラリ関数putenv()が実行されると、グローバル変数environ の値が変化す
る可能性があります。したがって、環境変数の値を得るときにはgetenv()を使用
し、 環境変数を設定するときにはputenv()を使用してください。environやenvp
の値を直接使用すると、環境変数を正しく扱えない場合があります。









                                 - 14 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル








                          第3章  8086上への実現





この章では、ハードウェアに依存した機能と、データの内部表現、関数呼び出し
などのマシン上での実現方法について説明します。読者は8086の機械語について
の知識があることを前提にしています。アセンブリ言語でC のサブルーチンを書
こうとする方は、本章を参考にしてください。


3.1  far, near



LSI  Cでは、SモデルやPモデルでも大きなデータを取り扱うことができます。こ
のために、キーワードfarが用意されています。また、DモデルやL モデルでの効
率を(多少とも)改善するためにnearキーワードを使うことができます。これらに
は次の3つの使い方があります。

 1. far関数、near関数

        int far foo();

    関数 foo が、CALLF(far CALL)命令で呼び出されるということを示します。
    P、Lモデルではすべての関数は自動的にfar関数となります。

    S、Dモデルでは、この書式によってfar関数を定義することができます。 こ
    のときには、far関数fooは通常の関数と同じくTEXTセグメントに配置されま
    すが、RETのかわりにRETF命令を使って呼び出した関数にリターンします。

        static void near bar();

    関数barはCALL(near CALL)命令で呼び出されます。S、Dモデルではすべての
    関数は自動的にnear関数となります。

    P、Lモデルでは、この書式によってnear関数を定義することができます。関
    数barは、barが定義されているファイルの他の関数と同じく、そのファイル
    名から生成されるセグメント(次節参照)に配置されますが、関数を終了する
    ときに RETF のかわりに RET 命令を使用します。 bar の呼び出しにはnear
    CALL/RETペアが使われますから、コードの大きさ、実行速度ともに効率が多
    少よくなります。

    ただし、near関数は他のモジュール(ファイル)から呼び出すことはできませ
    ん。他のモジュールはすなわち他のセグメントですから、CALL命令では正し
    くコールできず、しかもRET命令では正しくリターンできないからです。 し
    たがって、near関数はstatic関数として定義しなければなりません。

 2. far変数


                                 - 15 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


        int far x;

    変数 x が独立したセグメントに配置されることを示します。 どのモデルで
    も、farをつけないかぎりその変数はnearとみなされます。ひとつのfar変数
    の大きさは、最大64kバイトに制限されています。

 3. farポインタ

        int far *fp;

    ポインタ変数fpが任意のセグメントを指せることを示します。S、Pモデルで
    は、指定のないポインタはすべてnearポインタとなり、D、Lモデルでは、指
    定のないポインタはすべてfarポインタとなります。farポインタは、どのモ
    デルでも使用できます。大きなデータの取り扱いが局所的なものならば、必
    要なポインタだけを明示的にfarと宣言して、Sモデルを使う方が高い効率が
    得られます。

    farポインタ、またはfar変数のアドレスに対してint 型のデータを加減算す
    ると、アドレスのうちオフセットだけが変化します。セグメントも含めて計
    算したいときには、long型のデータを加減算してください。この演算の結果
    は、オフセットが15以下の正規化形式になります。

    次のプログラムは、farポインタを使った例です。

        clear_graphic_memory()
        {
                unsigned i;
                char far *p;

                p = (char far *)0xA8000000;
                for (i = 0; i < 32768; i++)
                        p[i] = 0;
        }

    far ポインタを比較するときは、単に32ビットの無符号正数として扱われま
    す。比較される両者が正規化されていない限り、正しい大小関係は得られま
    せんので注意してください。ポインタに0Lを足せば、正規化されたアドレス
    が得られます。


3.2  セグメント名



コンパイラは、プログラムやデータを下表に示すセグメントに配置します。表中
のxは、そのソースを含んでいるファイルの名前を表します。例えば、 ファイル
foo.cの中のプログラムは、Pモデルでコンパイルするとfoo_TEXTというセグメン
トに配置されます。 また、 表中の n  はセグメントがあらわれた順番を表し、
foo_1_DATA、foo_2_BSSのようになります。

                       セグメント名  グループ名  クラス名
    S, Dのプログラム      TEXT         CGROUP      CODE
    P, Lのプログラム      x_TEXT                   CODE
    初期化されたデータ    DATA         DGROUP      DATA
    未初期化のデータ      BSS          DGROUP      DATA
    farの初期化データ     x_n_DATA                 FAR_DATA


                                 - 16 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    farの未初期化データ   x_n_BSS                  FAR_BSS


3.3  データの内部表現



基本型の内部表現は次の表のとおりです。

              型                     ビット数
    char, signed char, unsigned char    8
    short, unsigned short              16
    int, unsigned int                  16
    long, unsigned long                32
    float                              32 (= 1+8+23)
    double                             64 (= 1+11+52)
    long double                        80 (= 1+15+64)
    near-pointer                       16
    far-pointer                        32

どのデータ型もすべて 2進表現であり、最も低位のバイトが最も小さいアドレス
に配置されます(little endian)。 アドレスの境界合わせは一切おこなわれませ
ん。charは、標準ではunsigned charと同じ型ですが、コンパイラの-csオプショ
ンによってsigned charとすることもできます。符号付きの整数型は負の数を2の
補数で表しています。

浮動小数点型は、 上位から順に符号ビット、指数部、仮数部の3つのフィールド
から構成され、その各ビット数は、上の表中にしるされているとおりです。符号
ビットはどの型も1ビットで、0のときは正、1のときは負を表します。 指数部は
げたをはいており (biased)、0111...111というビットパターンが指数部0を意味
します。仮数部は、float型とdouble型では、先頭の1を省いたケチ表現で、小数
点は一番左にあるものとみなされます。long double型では、先頭の1は省略され
ず、小数点はbit63とbit62の間にあるものとみなされます。

以下に、いくつかの浮動小数点数について各型での内部表現を 16 進数で示しま
す。

             float        double         long double
     0     00000000  0000000000000000  00000000000000000000
     1     3F800000  3FF0000000000000  3FFF8000000000000000
     3     40400000  4008000000000000  4000C000000000000000
    -3     C0400000  C008000000000000  C000C000000000000000
     0.25  3E800000  3FD0000000000000  3FFD8000000000000000

ポインタ型にはnearとfarの2種類があります。nearはSモデルやPモデルでのポイ
ンタ、 far は DモデルやLモデルでのポインタです。nearポインタは、暗黙的に
データセグメントの中を指しており、オフセット16ビットだけを持っています。
farポインタは任意のアドレスを指すことができるので、セグメント16ビット+オ
フセット16ビットの計32ビットを持っています。セグメントが高位、オフセット
が低位です。








                                 - 17 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




3.4  レジスタ割り付け



コンパイラは、記憶クラスがregisterと宣言された変数をレジスタに割り付けま
す。LSI Cでは、これに加えて記憶クラスがauto と宣言された変数もレジスタ割
り付けの対象となります。記憶クラスを省略された局所変数は、autoと解釈され
ますから、レジスタに割り当てられることになります。ある変数をレジスタに割
り当てたくないときはvolatile修飾子を使用してください。volatileを指定した
変数はレジスタ割り付けの対象にはなりません。

コンパイラはひとつの関数をメモリに読み込み、各変数の使われ方を調べ、アド
レスが引用されている変数 (単項の&演算子を適用された変数)をレジスタ割り付
けの対象から除外します。その上で、レジスタAX, BX, CX, DX, SI, DIの内から
最適と思われるレジスタをそれぞれの変数に割り当てます。もし、レジスタに入
り切らなければ、いくつかの変数はメモリ上に配置されます。

変数がレジスタに割り当てられたかどうかによってプログラムの結果に影響をあ
たえることは通常はありません。しかし、setjmp()関数を呼び出している関数の
中でレジスタ変数を使うと、longjmp()関数によって戻ったときに、 その変数が
予期しない値になることがあります。たとえば次のプログラムでは、値3142が表
示されるように思えます。

    jmp_bufenv;

    bar()
    {
            longjmp(env, 1);
    }

    foo()
    {
            int     x;

            x = 1234;
            if (setjmp(env) == 0) {
                    x = 3142;
                    bar();
            }
            printf("%d\n", x);
    }

ところが、 実際に表示されるのは1234です。変数xがコンパイラによって自動的
にレジスタに割り合てられた場合、setjmp()が呼ばれた時点のレジスタの値(xの
値)を保存し、longjmp() がそれを復元するからです。 この問題をさけるため、
setjmp()を呼び出す関数では、すべての局所変数をvolatileと宣言する必要があ
ります。

この問題以外には、レジスタ変数を使う上での制約はいっさいありません。







                                 - 18 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




3.5  関数呼び出しのプロトコル



ここでは、関数のパラメタがいかにして渡され、関数値がどのようにセットされ
るかということについて説明します。アセンブリ言語でサブルーチンを作成する
方は、ここを読んでください。

関数呼び出しには、 SモデルとDモデルではnear CALL命令が、PモデルとLモデル
ではfar CALL命令が使われます。

コンパイラは、関数や外部変数の名前の後ろに_(下線)を付加します。 これは、
アセンブラの予約語と同じつづりになるのを防ぐためです。したがって、アセン
ブリ言語で関数や外部変数を定義する場合は、 その名前の後ろに_をつけなくて
はなりません。

呼び出された関数は、SS, CS, DS, SP, BP, DI, SI, DX, CXレジスタを破壊して
はなりません。必要ならばレジスタをスタックに積まなくてはなりません。

パラメタがスタックに積まれていても、その分は呼ばれた関数ではなく、呼んだ
関数がもとに戻します。したがって関数から戻るのにRET n命令(SPにn を加えて
returnする命令)は使うことができません。普通のRET命令を使ってください。

関数パラメタの受け渡しには、レジスタAX,  BX,  CX, DXとスタックが使われま
す。パラメタがどのレジスタにはいるかは、左から順に各パラメタに次の規則を
適用することによって決定されます。

  + パラメタの型がchar,  unsigned char, signed charまたは1バイトの構造体
    か共用体ならば、AL, BL, CL, DLのうち未使用のものに割り当てます。どれ
    も空いていなければ、スタック上に1ワード取ります。

  + パラメタの型がint, unsigned int, short, unsigned short, near pointer
    または2バイトの構造体か共用体ならば、AX,  BX, CX, DXのうち未使用のも
    のに割り当て、どれも空いていなければ、スタック上に1ワード取ります。

  + パラメタの型がlong,  unsigned long, far pointerまたは4バイトの構造体
    か共用体ならば、BXAX, DXCXペアのうち未使用のものに割り当て、どれも空
    いていなければ、スタック上に2ワード取ります。ここで、BX,  DXが上位、
    AX, CXが下位のワードです。

  + 以上どの規則にもあてはまらない型のパラメタは、スタックに置かれます。
    ただし、 その型のサイズが奇数バイトであるときは1バイト余計に、偶数バ
    イト分確保します。

関数が可変パラメタ関数であるときは、 この規則はあてはまりません。 その際
は、パラメタの受け渡しにはすべてスタックを使います。はじめから全レジスタ
が使用中である、として上の規則を適用したのと同じです。

関数値は、次の規則にしたがってレジスタまたはスタックに割り当てます。

  + 関数の型がchar,  unsigned char, signed charまたは1バイトの構造体か共
    用体ならば、ALレジスタ。

  + 関数の型がint, unsigned int, short, unsigned short, near pointerまた


                                 - 19 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    は2バイトの構造体か共用体ならば、AXレジスタ。

  + 関数の型がlong,  unsigned long, far pointerまたは4バイトの構造体か共
    用体ならば、 BXAX ペアレジスタ。ここで、BXが上位、AXが下位のワードで
    す。

  + 以上のどれでもなければ、スタック上の最後のパラメタがはいっている番地
    の次に入れます。この場所は、呼び出し側が場所を確保しておく必要があり
    ます。

現在のコンパイラでは関数値を入れる場所のアドレスを渡していないため、可変
パラメタ関数はfloat,  double,  long doubleと構造体を返すことができません
(これは将来、改善される予定です)。

以下に例を示します。この例では、SPは関数の入口でのスタックポインタの値を
意味し、関数は、すべてnear CALL 命令で呼ばれる near 関数だと仮定していま
す。したがって、far関数のときには、説明中のSPに対する変位にすべて2を加え
る必要があります。

    char x(int a, char b, char c, char near *d, int e);

    a      = AX
    b      = BL
    c      = CL
    d      = DX
    e      = [SP+2...SP+3]
    return = AL

    long y(int a, long b, char c);

    a      = AX
    b      = DXCX
    c      = BL
    return = BXAX

    float z(double a, int b, float c);

    a      = [SP+2...SP+9]
    b      = AX
    c      = [SP+10...SP+13]
    return = [SP+14...SP+17]

    int fprintf(FILE *fp, char *fmt, ...);

    fp     = [SP+2...SP+3]
    fmt    = [SP+4...SP+5]
    return = AX


3.6  アセンブリ・インライン関数



本コンパイラでは、 アセンブリ言語を C プログラム中にうめこむことができま
す。たった数命令の関数では、CALL命令やRET 命令を実行するオーバーヘッドが
馬鹿にならないので、インライン展開したほうが効率がよくなります。これをア


                                 - 20 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


センブリ・インライン関数と呼び、  次のような関数呼び出しの形式をしていま
す。

    _asm_XXX("\n ...アセンブリ言語の命令列\n", パラメタリスト)

ここで、XXXは任意の英数字の列で、空でもかまいません。第1パラメタには、生
成したいアセンブリ言語の命令を書きます。 2行以上の命令を書く場合は、途中
に\nを挿入してください。コンパイラは、CALL命令を生成するかわりに第1 パラ
メタの文字列をそのまま生成します。それ以外は関数呼び出しと同じ扱いをする
ので、パラメタを渡すことも関数値を返すこともできます。インライン関数の第
2パラメタ以降が、通常の関数パラメタと同様に処理されます。

典型的な例として、ポート入出力をおこなうプログラムを書いてみましょう。

    char    _asm_c(char *);
    char    _asm_cc(char *, char);
    #define inp10()         _asm_c("\n\tIN\tAL,16\n")
    #define outp11(c)       _asm_cc("\n\tOUT\t17,AL\n", c)

    void    put(char c)
    {
            while ((inp10() & 1) == 0)
                    ;
            outp11(c);
    }

このプログラムは、次のようなコードを生成します。

    put_::
            PUSH    CX
            MOV     CL,AL
    _2:
            IN      AL,16
            TEST    AL,1
            JE      _2
            MOV     AL,CL
            OUT     17,AL
            POP     CX
            RET

この例のように、プログラムを読みやすくするため、インライン関数はマクロに
定義してから使うのがよいでしょう。

今の例ではポートの番号が固定されていましたので、今度はポート番号をパラメ
タで渡せるようにこれを改良します。これには、

  + 文字列の一部を変更し、ポート番号をうめこむ

  + DXレジスタでポート番号をわたす

のふたつの方法があります。







                                 - 21 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




3.6.1  ポート番号を文字列にうめこむ



これは、プリプロセッサの機能を使って実現できます。

    char    _asm_c(char *);
    char    _asm_cc(char *, char);
    #define _q_(s)  # s
    #define inp(p)          _asm_c("\n\tIN\tAL," _q_(__eval__(p)))
    #define  outp(p,  c) _asm_cc("\n\tOUT\t" _q_(__eval__(p)) ",AL",  c)

    void    put(char c)
    {
            while ((inp(0x10) & 1) == 0)
                    ;
            outp(0x11, c);
    }

と定義すると、

            outp(0x11, c)

は、プリプロセッサによって次のように展開され、

    _asm_cc("\n\tOUT\t" "17" ",AL", c)

さらに並置された文字列を連結すると、

    _asm_cc("\n\tOUT\t17,AL", c)

となります。inp()も同様です。

アセンブリ言語とC言語では、16進数や8進数の表現が異なりますので、__eval__
マクロによって10進表現に直す必要があることに注意してください。


3.6.2  レジスタでポート番号をわたす



関数の第4パラメタは、DXレジスタに割り当てられます。 これを利用してポート
番号を渡すことができますが、そのためには第2、第3パラメタをスキップしなく
てはなりません。このコンパイラでは、インライン関数の名前を関数パラメタに
書くことによって、パラメタを省略することができます。

    char    _asm_ci();
    char    _asm_cci();
    #define inp(p)  \
        _asm_ci("\n\tIN\tAL,DX", _asm_ci, _asm_ci, _asm_ci, p)
    #define outp(p, c)      \
        _asm_cci("\n\tOUT\tDX,AL", c, _asm_ci, _asm_ci, p)

    void    put(char c)


                                 - 22 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    {
            while ((inp(0x10) & 1) == 0)
                    ;
            outp(0x11, c);
    }


3.7  #pragma



#pragma は、コンパイラに対して指示をあたえる命令です。次のような形式をし
ています。

    #pragma 指令

指令には以下のものがあります。

checksp
     関数の入口でスタックのあふれを検査するコードを生成します。

nochecksp
     checkspの逆で、スタックのあふれを検査するコードを生成しません。

recursive
     省略時の関数モードをrecursiveにします。

nonrec
     省略時の関数モードをnonrecにします。

regalo
     変数へのレジスタ割り付けを解禁します。

noregalo
     変数へのレジスタ割り付けを禁止します。

デフォルトはnochecksp, recursive, regaloです。


3.8  Cとアセンブリ言語の連結の例



この章の最後に、C とアセンブリ言語プログラムの連結の簡単な例を示します。
取り上げるのは、10進数を16進数に変換して表示するプログラムです。

    bar.c:

        #include <stdio.h>
        #include <stdlib.h>
        extern  char    foo(char);
        char    upperflag;
        int     main(int argc, char *argv[])
        {
                int     n;



                                 - 23 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


                n = atoi(argv[1]);
                upperflag = argv[2][0] - 'l';
                putchar(foo(n >> 12));
                putchar(foo(n >> 8));
                putchar(foo(n >> 4));
                putchar(foo(n));
        }

    foo.a86:

        CGROUP  GROUP   TEXT
        TEXT    CSEG

                EXTRN   upperflag_

        foo_::
                AND     AL,00FH
                ADD     AL,090H
                DAA
                ADC     AL,040H
                DAA

                CMP     [upperflag_].B,0
                JNE     _1
                CMP     AL,'A'
                JB      _1
                        ADD     AL,'a'-'A'
                _1:

                RET

このプログラムは、コマンド行から 10進数を与えると、それを 16進数に変換し
て表示します。

アセンブリ言語の部分をMASMで書くと、次のようになります。

    foo.asm:

        CGROUP  GROUP   TEXT

                PUBLIC  foo_
                EXTRN   upperflag_:BYTE

        TEXT    SEGMENT BYTE PUBLIC 'CODE'
                ASSUME  CS:TEXT

        foo_    PROC    NEAR
                AND     AL,00FH
                ADD     AL,090H
                DAA
                ADC     AL,040H
                DAA

                CMP     upperflag_,0
                JNE     _1
                CMP     AL,'A'


                                 - 24 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


                JB      _1
                        ADD     AL,'a'-'A'
                _1:

                RET
        foo_    ENDP
        TEXT    ENDS
                END


3.9  スタックの大きさ



スタックの大きさは、標準ではSモデルとPモデルでは2500バイト、DモデルとLモ
デルでは 5000 バイトになっています。LSI C-86で作成したプログラムの実行に
は、最低でもこの大きさのスタックが必要です。

autoの配列などを多く使用するようなプログラムでは、スタックのサイズに注意
してください。必要な大きさのスタックを確保するためには、

    lcc prog.c -k'-s 2000'

のようにlccの-kオプションを使ってください。また、Microsoft社のLINKを使用
する場合は

    lcc prog.c -mslink -k/STACK:8192

というふうにコマンドをあたえてください。どちらもスタックサイズを8Kバイト
にしています。






                         第4章  コンパチビリティ





本章ではLSI CとANSI Cとの違いを述べ、続いてLSI C Ver 3.3とVer 3.1 との違
いについて述べます。そして最後に、現時点で明らかになっている問題点を挙げ
ます。


4.1  ANSI Cとの違い



ここでは、ANSIによって定義されているC言語の仕様と、LSI Cの仕様との違いを
列挙します。





                                 - 25 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




4.1.1  言語仕様



  + LSI Cではキーワードfar、near、nonrec、recursiveが追加されています。

  + 整数の格上げ(Integral promotion)ルールがANSIの定義とは若干異なってい
    ます。

  +  プリプロセッサはトライグラフシーケンス(??と1文字で特殊記号を表す)を
    サポートしていません

  + wchar_tおよびL'...', L"..."はサポートしていません

  + 可変パラメタ関数はfloar, double, long double, 構造体、共用体を返すこ
    とができません。 正確にいうと、 可変パラメタ関数が返すことができるの
    は、リターン値がレジスタに割り合てられるものだけです。

  + はじめて現れた外部変数や関数の宣言にexternがついている場合、その後の
    同じ変数や関数の宣言・定義にはstaticと指定してもかまいません

  + ANSI規格ではINT_MAXをこえる定数の型はlongになりますが、LSI Cでは値が
    UINT_MAXより小さいか等しい場合にはunsigned intになります

  + 浮動小数点定数はすべてlong double型としてあつかいます


4.1.2  ライブラリ



  + <locale.h>と、その中で定義されているマクロや関数はサポートしていませ
    ん

  + 多バイト文字をあつかう関数群(mblen()など)はサポートしていません


4.2  Ver 3.1との違い



ここではLSI CコンパイラVer 3.1からの変更点を述べます。


4.2.1  言語仕様



  + 関数へのポインタfpを使って関数を呼び出す場合に、fp()と書くことができ
    るようになりました。もちろん、以前の(*fp)()も許されます。

  + 共用体の初期化が可能になりました。

  + 配列や構造体型の自動変数を初期化することができるようになりました。


                                 - 26 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



  + const, volatileをサポートしました。

  +  関数と配列に対して単項 & 演算子を使用することができるようになりまし
    た。

  + 以前はautoと明示した変数は必ずスタックに割り付けられていましたが、こ
    のバージョンからはauto変数もレジスタ割り付けの対象となります。スタッ
    クに割り付けたい場合はvolatileを使ってください。

  + 列挙定数はint を書けるところならどこにでも現れることができるようにな
    りました。

  + ビットフィールドの型はint,  unsigned int, signed intが使用できます。
    以前のようにcharや列挙は使用できなくなりました。また、符号付きのビッ
    トフィールドをサポートしました。

  + #pragma optimize spaceを指定していないときには、グローバル変数やスタ
    ティック変数をワード境界に割り付けるようになりました。

  +  関数に対して far,  nearを明示的に指定することができるようになりまし
    た。


4.2.2  lcc



  + コンフィギュレーションファイルの名前がlsic86.cfgから _lcc になりまし
    た。

  + lccに-Oオプションを指定しなければ、r86はジャンプ命令の最適化を実行し
    なくなりました。

  + -lオプションで.objを明示することによって、ライブラリのディレクトリか
    らオブジェクトファイルを探すようになりました。

  +  Ver 3.1の-bオプション(ライブラリをサーチするディレクトリの指定)は-L
    に変更されました。

  + lccは環境変数LSICOPTSなどを参照しなくなりました。 環境変数を参照した
    いときには、_lccの中で${LSICOPTS}のように明示的に参照してください。

  +  オプションは大文字と小文字を区別するようになりました。 これにともな
    い、-d, -s, -x, -tはそれぞれ大文字になりましたので注意してくだい。

  +  Ver  3.1 ではライブラリを指定する順番がコマンドラインとコンフィギュ
    レーションファイルとでは異なっていましたが、 Ver 3.3では一般的な順番
    になりました。 つまり、 先に指定したライブラリからリンクされていきま
    す。


4.2.3  ライブラリ





                                 - 27 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


  + farstr.libはdoslib.libに統合されたため、なくなりました。

  + 浮動小数点数を表示できないprintf/scanf系関数を集めたintlib.libという
    ライブラリファイルを追加しました。これにともない、浮動小数点数を表示
    できる関数はmathlib.libからdoslib.libに移動しました。

  + いくつかのライブラリ関数は以前のバージョンとは仕様が変更されています
    ので注意してください。


4.2.4  その他



  + ライブラリアンoarと、リンカlldを追加しました。

  + lldがROM化をサポートしますので、ROM化ツールromizeはなくなりました。


4.3  バグ



ここでは、  現時点ですでに明らかになっているバグや問題点について説明しま
す。

  + 構造体の値(r-value)に対してメンバ演算子.を使用することができません。
    たとえば、次のような場合です。

        struct foo {
            int i;
            char c;
        } bar();

        int zod()
        {
            return bar().i;
        }

    関数bar()が返してきた構造体に対する.はエラー(l-value required)になり
    ます。

  +  関数へのnearポインタをfarポインタにキャストすると、CSレジスタのかわ
    りにDSレジスタを使ってしまう場合があります。

  + アセンブラr86は、ひとつのファイルの中でセグメントが64kバイトを越えた
    ときには、正しくないオブジェクトファイルを作ります。このとき、エラー
    を報告しません。特にデータのサイズに注意する必要があります。










                                 - 28 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル








                     第5章  プログラム保守ツールmake




makeは、AT&Tベル研究所でUNIX用に開発されたプログラム保守ツールです。本パ
ッケージに付属しているmakeは、このUNIX版makeの仕様をベースに、いくつかの
機能を追加し、使いやすくしたものです。この章では、その操作方法について説
明します。


5.1  概要



makeの目的は、プログラムの開発過程をスムーズにすることです。プログラムが
単一のソースファイルからできているときには、  コンパイル手順は大変簡単で
す。しかし、プログラムが大きくなってくると、単一のファイルではコンパイル
時間の点などで不利になります。そこで普通はソースを複数のファイルに分割す
るわけですが、今度はコンパイル、リンクの手順が繁雑になり、コンパイルし忘
れ等の問題が起こります。

makeを使えば、このようなトラブルを未然に防ぐことができます。makeは単なる
バッチ処理とは異なり、目的プログラムの作成のために何と何を実行すればよい
かを判断し、最少の手順を生成してくれます。したがって、無駄なコンパイルを
する必要もありませんし、修正されたファイルは間違いなくコンパイルされるの
で安心です。


5.2  基本的な機能



makeを使うには、まずそのための指令をおさめたmakefileという名のファイルを
用意しなくてはなりません。具体的な例をあげて説明しましょう。

いま、a.c, b.c, c.cの3つのモジュールがあり、これらから実行可能プログラム
prog.exeを作りたいとします。a.cとb.cはdefs.hというヘッダを#includeしてお
り、もしdefs.hが変更されたら、a.c、b.cも再コンパイルする必要があります。
また、リンク時には gl というライブラリを指定しなくてはならないとしましょ
う。

このためには、たとえば次のようなmakefileを書けばよいでしょう。

    # a.c, b.c, c.c から prog.exe を作る makefile
    prog.exe : a.obj b.obj c.obj
            lcc -o prog.exe a.obj b.obj c.obj -lgl
    a.obj : a.c defs.h
            lcc -c a.c
    b.obj : b.c defs.h


                                 - 29 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


            lcc -c b.c
    c.obj : c.c
            lcc -c c.c

: で区切られた行は依存記述行 (dependency  line) と呼ばれ、「prog.exeはa.
obj、b.obj、c.objから作られる。その手順は以下の通りである」 という意味を
もっています。 #で始まる行はコメントです。このファイルがあればコンソール
から

    make

とタイプするだけで、自動的に必要なコンパイル、リンクがおこなわれ、エラー
がなければprog.exeができあがります。

さて、上の例は少しばかり長たらしいと感じた人がいるでしょう。 とくに.c か
ら.objをつくるところは単調であり、何とかならないかという気がします。

そこで、makeはいくつかのファイル拡張子を理解して、わかりきったコンパイル
手順を省略することを許しています。このことを利用すると、上の例は次のよう
に短くできます。

    # a.c, b.c, c.c から prog.exe を作る makefile その 2
    prog.exe : a.obj b.obj c.obj
            lcc -o prog.exe a.obj b.obj c.obj -lgl
    a.obj b.obj : defs.h

このmakefileでは、a.obj,  b.obj, c.objを作る手順が省略されています。make
はこのようなとき、ディレクトリの中にa.c,  b.c, c.cがあるかどうか調べ、も
しあれば、自動的に``lcc -c a.c''などのコマンドを追加します。

もし、prog.exeが最後にできてからなんの修正もされていなければ、makeは

    'prog.exe' is up to date.

というメッセージを表示してとまります。 しかし、Cのソースが修正されていな
くとも、defs.hが修正されていれば、a.cとb.cがコンパイルされます。

makeにただコマンドだけをあたえると、makefile中の一番はじめにあるターゲッ
トが作られますが、

    make a.obj

のように特定のターゲットを指定してそれを作らせることもできます。

makeはまた、簡単なマクロ機能をサポートしています。この機能を用いると、マ
クロにある文字列を設定し、それをあとで引用することができます。たとえば、
上の例は次のように書けます。

    # a.c, b.c, c.c から prog.exe を作る makefile その 3
    OBJS = a.obj b.obj c.obj
    prog.exe : $(OBJS)
            lcc -o prog.exe $(OBJS) -lgl
    a.obj b.obj : defs.h

マクロの名前は、英字と数字から構成されます(記号も使えますが、 後述する特
殊マクロとかち合うので好ましくありません)。マクロは、


                                 - 30 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



    マクロ名 = マクロ本体

という形式で定義されます。 マクロを引用するには、$のあとにマクロ名を書き
ます。ただし、どこまでがマクロ名かがはっきりしない時( マクロのすぐあとに
英字がくるときなど)は、名前をカッコでくくらなくてはなりません。


5.3  依存記述行



先に述べたように、 make を使うにはまずmakefileを作らなくてはなりません。
makefile の主要部分を占めるのが依存記述行と、 それに付随するコマンド行で
す。その一般形式は次の通りです。

    ターゲット: ソース1 ... ソースn
            コマンド

ここで、コマンドの行の先頭には最低ひとつのタブが必要です。これは「ターゲ
ットはソース1〜ソースnから作成される。その作成手順はコマンドである」とい
うことを意味します。makeはこれを見て、まずターゲットという名のファイルが
存在するかどうかを調べ、もし存在しなければコマンドを実行します。また、フ
ァイルソース1〜ソースnのどれかがターゲットより新しいファイルならば、やは
りコマンドを実行します。さもなければ何もしません。

ソースがどこか他の行でターゲットに指定されているかもしれません。そのとき
は、その行を先に実行します。

ターゲット及びソースは空白で区切って複数書いてもかまいません。依存記述行
は一行に書かなくてはなりませんが、 行の最後に\を置くことによって次の行に
続けて書くことができます。コマンドは複数行指定でき、各コマンド行の前には
タブがひとつ以上必要です。 依存記述行の前にタブを入れてはいけません。 ま
た、コロンの前後にはドライブ指定と区別するため、空白が必要です。

    prog.exe : main.obj subr.obj \
                    misc.obj
            lcc -o prog.exe main.obj subr.obj misc.obj
    main.obj : main.c
            lcc -c main.c
    main.obj : defs.h

上の例は、main.cとdefs.hからmain.objを作り、main.obj, subr.obj, misc.obj
からprog.exeを作るものです。main.cまたはdefs.hが変更されたら、main.cがコ
ンパイルされ、リンクが実行されることになります。


5.4  コメント



# で始まる行はコメントで、makeの動作に何の影響もあたえません。これによっ
て、makefileを読みやすくすることができます。コメントは依存記述行の後ろに
も書くことができます。マクロ定義とコマンド行のうしろには書けません。

    # this is a comment.


                                 - 31 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    OBJS = a.obj b.obj c.obj
    prog.exe : $(OBJS)      # making prog.exe from a, b, c
            lcc -o prog.exe $(OBJS)


5.5  表示の抑制



makeは通常、実行中のコマンドをコンソールに表示しますが、コマンド行の1 文
字目に@を書くと、その行については表示されません。

    main.obj : main.c
            @lcc -c main.c

また、makefile中に

    .SILENT:

という行があると、そのmakefile中のすべてのコマンドの表示が抑制されます。


5.6  終了コードの扱い



makeは、コマンドの終了コードを常に検査しています。もし、あるコマンドが失
敗(!= 0)の終了コードを返すと、処理は打ち切られてしまいます。しかし、とき
にはこれを無視して処理を続行してほしいこともあります。そういうときは、終
了コードを無視してほしいコマンド行の先頭に-をつけてください。

    main.obj : main.c
            -lcc -c main.c

また、makefile中に

    .IGNORE:

という行があると、そのmakefile中のすべてのコマンドの終了コードが無視され
ます。


5.7  コマンドインタプリタの扱い



makeは、終了コードを見るためコマンドインタプリタを経由せず直接コマンドを
呼び出しています。このため、パイプやリダイレクトを使っているコマンド行は
うまく処理されません。 このようなときは、コマンド行の先頭に+をつけてくだ
さい。

    main.obj : main.c
            +lcc -c main.c >err

ただし、コマンドに対応する.exe ファイルや.com ファイルが存在しないときに
は、自動的にCOMMAND.COMを呼び出しますので、バッチファイルやdirコマンド等


                                 - 32 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


の組み込みコマンドに+を付ける必要はありません。


5.8  マクロの定義



マクロの定義は次の形式でおこなわれます。

    マクロ名 = マクロ本体

マクロ名は、通常はアルファベットと数字から構成されます。マクロ本体には、
改行文字以外の任意の文字を書くことができます。もし一行に書けないほど長け
れば行の最後に\を置いて次の行に続けることができます。\の前には少なくとも
1文字の空白が必要です。

以下に示すのは、マクロ定義の例です。

    CFLAGS = -DDEBUG
    OBJS = main.obj gram.obj lex.obj parse.obj \
            semantix.obj memory.obj misc.obj

マクロは、依存関係、コマンド、マクロ定義のどの行でも引用できます。マクロ
を引用するには、$のあとにマクロ名を書きます。

    SRC = a:
    TAR = $(SRC)tar\
    LFLAGS = -lgl
    $(TAR)prog.exe : $(SRC)main.obj
            lcc $LFLAGS -o $(TAR)prog.exe $(SRC)main.obj

上の例のように、マクロのあとに空白がないときはどこまでがマクロの名前なの
かわかりません。このようなときは、マクロ名をカッコで囲む必要があります。

makefileの中で定義されていないマクロを引用したときは、makeはそのマクロと
同じ名前の環境変数を探して、その中身におきかえます。もしそのような変数が
定義されていなければ、エラーになります。

以下のマクロはコマンド行の中で特殊な目的に使われます。

$?
     ターゲットより新しいすべてのソース名におきかわります。

$#
     すべてのソース名におきかわります。

$&
     $#と同じですが、拡張子(.より後)が取り除かれています。

$@
     ターゲット名におきかわります。

$*
     $@と同じですが、拡張子が取り除かれています。

$<


                                 - 33 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


     1番左にあるソース名におきかわります。

$>
     $<と同じですが、拡張子が取り除かれています。

$:c
     $?,  $#, $&はふたつ以上の名前に展開されることがあります。それらの間
    には通常空白がはいりますが、 $:の次に文字cを書くと、空白の代りにその
    文字が使われます。

${...}
     ファイルmake.iが作られ、${と}の間の文字列がそこに書き込まれます。そ
    して${から}まではmake.iという文字列におきかわります。 これは応答ファ
    イルを自動的に作成するのに使われます。

たとえば、

    alpha.exe : beta.obj gamma.obj delta.obj
            lcc ${ -o $@ $# -lintlib }

というmakefileを実行すると、コマンドは次のように展開されます。

    lcc @make.i

そしてファイルmake.iの内容は次のようになります。

    -o alpha.exe beta.obj gamma.obj delta.obj -lintlib

MS-DOS のコマンドラインは最大でも127文字までに制限されていますが、lccの@
オプションとmakeの${...}マクロを組み合わせることによって、長いコマンドラ
インをあたえることが可能になります。


5.9  makeの起動



makeコマンドは、次のような形式をしています。

    make [オプション][マクロ名=マクロ本体...] [ターゲット名...]

makeはターゲット名を指定されると、その名前のターゲットを持つ依存記述行を
探して、それを実行します。ターゲット名を省略したときは、makefile中の一番
上に書かれたターゲットを実行します。

makeコマンド行中でも、マクロが定義できます。ただし、= の前後に空白をあけ
てはいけません。また、マクロ本体の中に空白をいれるときは

    make 'CFLAGS=-DDEBUG -DMSDOS'

のように、 マクロ定義全体を ''でくくってやる必要があります。この定義は、
makefile中の定義に優先します。

オプションには以下のものがあります。

-f file


                                 - 34 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


    makeのコマンドを読み込むファイルの名前を指定します。この指定がなけれ
    ばカレントディレクトリのファイルmakefileを読みます。fileが- のときに
    は標準入力からコマンドを入力します。

-i
    実行したコマンドのリターンコードを無視します。.IGNORE を指定したのと
    同じです。

-k
    コマンドを実行中にエラーを検出したときに、終了しないでできるだけ多く
    のターゲットを作成します。

-n
    コマンドを実行せず、ただ実行されるであろうコマンドを表示します。実際
    に始める前に、どのコマンドが実行されるかを確認できます。

-r
    makeの省略時規則を無効にします。つまりmakedefを読み込みません。

-s
    makeは通常現在実行中のコマンドを表示しますが、このオプションを指定す
    ると表示をしなくなります。.SILENTを指定したのと同じです。

-t
    コマンドを実行せず、ターゲットのファイルのタイムスタンプだけを更新し
    ます。

以下はmakeコマンドの例です。

make -n
    依存関係は解析しますがコマンドは何も実行せず、実行する予定のコマンド
    を表示します。

make -f b:filemake CFLAGS=-DDEBUG
    makefileのかわりに b:filemake というファイルから依存関係を読み込みま
    す。また、CFLAGSというマクロを-DDEBUGに定義しています。

make -s main.obj
    main.objというターゲットを実行します。コマンドは表示されません。


5.10  省略時規則



先に述べた通り、ファイルを作成するための規則がどこにも書かれていないとき
には、省略時規則が適用されます。

この規則は、どのようなファイルでもよいというわけではなく、makeがあらかじ
め知っているものに限られます。標準ではmakeは以下の拡張子を理解し、それを
作るための手順を知っています。

    .c  .a86  .asm  .obj  .exe

makeは作成規則のないファイルを見ると、そのファイル名から拡張子を取り除い
たものに上の拡張子を付加してソースファイルの名前とし、それが存在するかど


                                 - 35 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


うかを調べます。もしも存在すれば、生成規則が自動的に追加されます。

実際には makeはこれらの規則を自分自身の中に持たず、makedefという名前のフ
ァイルの中に定義してある規則を初めに読み込むようになっています。こうして
おけばいろいろな言語処理系に対応できるからです。

makedefの中には、 ソースファイルとして考えられるすべての拡張子のリストが
登録されています。これは、次のような形式で定義されます。

    .SUFFIXES: .c .a86 .asm .obj

また、拡張子が.sのファイルをコンパイルして拡張子.tのファイルを作るための
省略時規則は、次のような形式で定義されます。

    .s.t:
            コマンド

これらの規則は別に makedefでなくとも、makefileの中でも定義できます。同じ
拡張子のペアをmakedefとmakefileの両方で定義したときは、makefile の中の定
義が優先されます。

標準のmakedefは次のようになっています。

    #default rules for make
    .SUFFIXES: .obj .a86 .c .y
    YFLAGS =
    CFLAGS =
    AFLAGS =
    .y.c:
            yacc $YFLAGS $<
    .y.obj:
            yacc $YFLAGS $<
            lcc $CFLAGS -c -o $@ $*.c
            del $*.c
    .c.obj:
            lcc $CFLAGS -c -o $@ $<
    .a86.obj:
            r86 $AFLAGS -o $@ $<
    .obj.exe .c.exe .a86.exe:
            lcc $CFLAGS -o $@ $#

省略時規則が適用されるときは、ソースとターゲットは同一のディレクトリにな
くてはなりません。しかし時には、これらを別のディレクトリに置きたいことも
あります。このために、VPATHという疑似ターゲットが用意されています。

    VPATH = ディレクトリ1:ディレクトリ2 ...

という行が makefile 中にあると、省略時規則の適用のさい、ソースファイルは
ターゲットと同じディレクトリだけでなく、この行で指定されたディレクトリも
探します。たとえば、

    VPATH = .:\src

という行があるときには、ソースファイルはターゲットと同じディレクトリ、カ
レントディレクトリ、\srcディレクトリから探されます。ディレクトリ名の最後
には\はつけてもつけなくてもかまいません。


                                 - 36 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル



ここで、ディレクトリの区切りを示す文字:は、A: のようにドライブ名の後につ
く:と混同しやすいので、他の文字に変更することができます。

    VPATHDELIM = c

 とすると、ディレクトリの区切り文字はcになります。

    VPATHDELIM = ;

をmakedefに記述し、;でディレクトリを区切ることをお奨めします。

また、VPATHと同様の効果を持つ.PATHという疑似ターゲットもあります。これは
以前のバージョンのmakeとのコンパチビリティを保つために残してありますが、
できるだけVPATHを使うようにしてください。.PATHは次のように指定します。

    .PATH : ディレクトリ1 ディレクトリ2 ...

ここで、次のmakefileを作成したとします。

    prog.exe : a.obj
            lcc -o $@ a.obj
    .PATH : \src

この例では、 カレントディレクトリにa.cがなければ、\src\a.cを探しに行きま
す。ディレクトリ名の最後には\をつけてもつけなくてもかまいません。


5.11  使用例



最後に、いくつかの例を示します。


5.11.1  例その1



MS-DOSのもとでmakeを使っていて一番困ることは、あまり長いコマンド行を書く
ことができないということです。MS-DOSではコマンド行の長さは127 文字に制限
されており、そのためにリンカのコマンド等はオブジェクトファイルの数が多く
なると応答ファイルを作成しなければなりませんでした。しかし、プログラムの
開発手順をmakefile以外の場所に書くのはあまり好ましくありません。

このような時には、${...}を使えば、応答ファイルの中身をmakefile中に書くこ
とができます。

    # makefile for prog.exe
    prog.exe : alpha.obj beta.obj gamma.obj delta.obj epsilon.obj \
                    zeta.obj eta.obj theta.obj iota.obj kappa.obj \
                    lambda.obj mu.obj nu.obj xi.obj omicron.obj pi.obj \
                    rho.obj sigma.obj tau.obj upsilon.obj phi.obj \
                    khi.obj psi.obj omega.obj
            lcc @${-o $@ $#}



                                 - 37 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


こうしておけば、あとでモジュールが増えても、たった一箇所の変更だけで対応
できます。


5.11.2  例その2



makeは、makefileがなくてもコマンドを実行できます。例えば、ファイルprog.c
が存在するとき

    make prog.exe

というコマンドを実行したとします。これはprog.exeというターゲットを作って
ほしいと言っているわけですが、makefileが存在しないので省略時規則が働き、

    prog.exe : prog.obj
            lcc -o prog.exe prog.obj
    prog.obj : prog.c
            lcc -c prog.c

というmakefileをあたえたのと同じことになります。


5.11.3  例その3



次の例は、前回プリンタに出力してから変更されたプログラムだけをプリントア
ウトします。

    SRCS = a.c b.c c.c d.c
            print : $(SRCS)
            for %i in ( $? ) do print %i
            echo hello >print

print というファイルがプリントアウトした時間を示すために使用されている点
に注意してください。






                         第6章  プロファイラprof




本章ではプロファイラprofについて説明します。








                                 - 38 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル




6.1  プロファイラとは



プログラムを実行したとき、どの文を何回実行したか、また、どれくらいの時間
がかかったかなどのプログラムの実行に関する情報をプロファイル情報といいま
す。プロファイラは、このプロファイル情報を得るためのツールです。

プロファイル情報は主に次のように利用されます。

  + 実行速度向上の指標

    プロファイル情報からプログラムの中で最も多く実行されている部分を求め
    ることができます。その部分を中心に高速化を図れば、プログラムの実行速
    度を大きく向上させることができます。

  + プログラムの論理的な正当性の検証

    プロファイル情報からどの文が実行されたかがわかりますので、if文で期待
    した分岐をしているかどうか、ループを実行した回数が正しいかどうかなど
    の正当性の検証に使用することができます。

プロファイラには2種類があり、計数型と計時型と呼ばれます。 計数型プロファ
イラはプログラムの文や関数が実行された回数を調べます。これに対して、計時
型では文や関数の実行にかかった時間を調べます。 LSI Cは計数型プロファイラ
をサポートしています。


6.2  操作法



ここではプロファイル情報を得るための、lccとprofの操作を説明します。


6.2.1  lccの操作



プロファイル情報を得るためには、lccに-p オプションを指定してプログラムを
コンパイルする必要があります。

lccは-pオプションを見つけると、それより後ろで指定されているCソースプログ
ラムをコンパイルするときに、cg86によって生成されたアセンブリ言語ファイル
にip86を実行します。ip86はcg86の出力ファイルを処理し、分岐を実行するとき
にカウンタを 1増やすコードを挿入します。このコードによってプロファイル情
報を作成するのですが、実行プログラムは多少大きくなり、また実行速度も遅く
なります。開発時やデバッグ時には-pを指定しておき、最終的なプログラムの作
成は-pをはずしてコンパイルし直すのがよいでしょう。

また、ip86はprofが使用する行番号とカウンタの対応表( 拡張子が.sl になりま
す)をソースファイルが存在するディレクトリに作成します。

lcc は-pが指定されているときにはスタートアップモジュールを通常のcdos.obj


                                 - 39 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


からcpro.objに変更します。したがって、プロファイル情報を得たい場合はリン
ク時にも-pを指定する必要があります。-pを指定してコンパイルしたオブジェク
トファイルを-pを指定しないでリンクした場合でも、正常な実行ファイルが生成
されます。しかし、これを実行してもプロファイル情報は得られませんので注意
してください。

cpro.objは、プログラムの終了時にprof.outという名前のプロファイル情報ファ
イルをカレントディレクトリに作成します。


6.2.2  profの操作



profはカレントディレクトリのファイルprof.outからプロファイル情報を得、プ
ログラムの実行結果を標準出力に表示します。

profを実行するときには、カレントディレクトリに注意する必要があります。ま
ず、解析したいprof.outが存在するディレクトリでなければなりません。また、
このディレクトリはコンパイルを実行したディレクトリである必要があります。
この制限は、解析に必要なファイル(prof.out、*.c、*.sl)をprof が確実に見つ
けるためのものです。

profは次のように起動します。

    prof [-f][sourcefile...]

sourcefilesを省略すると、lccの-pオプションを使ってコンパイルされたすべて
のファイルのプロファイル情報を表示します。 sourcefiles  をあたえたときに
は、そのファイルに関する情報だけを表示します。

-fオプションは、ステートメントごとの実行回数のかわりに、関数が呼ばれた回
数のみを表示します。


6.3  実行例



例として「エラトステネスのふるい (sieve.c)」を実行し、そのプロファイル情
報を出力すると次のようになります。

            #include <stdio.h>

            #define SIZE    8190
            #define TRUE    1
            #define FALSE   0

            char flags[SIZE + 1];

          1 void main()
          1 {
          1     unsigned k, i, prime, count, iter;
          1
          1     printf("10 iterations\n");
          1     for (iter = 1; iter <= 10; iter++) {


                                 - 40 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


         10         count = 0;
         10         for (i = 0; i <= SIZE; i++)
      81910             flags[i] = TRUE;
         10         for (i = 0; i <= SIZE; i++)
      81910             if (flags[i]) {
      18990                 prime = i + i + 3;
      18990                 for (k = i + prime; k <= SIZE; k+= prime)
     149990                     flags[k] = FALSE;
      18990                 count++;
      81910             }
         10     }
          1     printf("%d primes\n", count);
          1 }

リストの左端の数字が右側の文が実行された回数を表しています。






                      第7章  ライブラリの作成と保守





この章では、librというプログラムを使って、ライブラリの作成と保守をおこな
う方法を説明します。


7.1  libr



librは一種のコンパイラドライバで、ひとつのファイルにまとめられたライブラ
リモジュールを分解し、それらをコンパイル、ライブラリファイルへの結合とい
った操作を実行します。ここではlibrの操作法を説明します。


7.1.1  ライブラリファイル



一般にライブラリファイルは、 モジュールをコンパイルして.obj ファイルを作
り、 それらをライブラリアンlibで結合して作ります。使われないモジュールが
実行ファイルに含まれないようにするには、できるだけ細かくこれらのモジュー
ルを分ける必要があります。つまり、ひとつのモジュールに関数やサブルーチン
がひとつしか含まれない、という形が理想的といえます。

そのためには各ライブラリ関数をひとつずつ別々のファイルに入れておき、それ
を全部コンパイルしなくてはなりません。しかし、

 1. 関連の強い関数は同じファイルに入れておきたい

 2. ファイルの数が途方もなく多くなり、編集が大変になる


                                 - 41 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


などの理由により、我々はこの方法をとりませんでした。かわりに、ひとつのフ
ァイルに複数のモジュールをおさめ、コンパイルまたはアセンブルのときにだけ
これらを分解してライブラリ形式に変換することにしました。

librはこの仕事をおこなうためのプログラムです。


7.1.2  ライブラリのソースコード



librによって処理されるライブラリのソースは、次のような形式をしています。

    --
            ：
            共通ヘッダ1
            ：
    -module1
            ：
            module1 の本体
            ：
    -module2
            ：
            module2 の本体
            ：
    --
            ：
            共通ヘッダ2
            ：
    -module3
            ：
            module3 の本体
            ：
    -module4
            ：
            module4 の本体
            ：


行頭に-(ハイフン)のある行が、librに対する指令となります。 したがってプロ
グラムの本文では、行頭に-を書いてはいけません。

行頭に -がふたつある行は、それ以降の行が共通ヘッダであることを示します。
共通ヘッダは、 それ以降のモジュールの先頭に付加される行で、 すべてのモジ
ュールで共通に参照される定義をここに書いておきます。- で始まる行がもう一
度現れると、以前の共通ヘッダは忘れられます。

行頭に -がひとつだけある行は、それ以降の行をひとつのモジュールとすること
を示します。-の後に書かれた名前は、そのモジュールのファイル名です。 libr
はこの名前のファイルを新たに作成し、そこに共通ヘッダと本体をコピーして、
コンパイルをおこないます。そしてオブジェクトができると、それをlibr.outと
いう名のライブラリファイルに連結し、いま作成したファイルは消去します。

共通ヘッダやモジュール本体は何回現れてもかまいません。

モジュールは、 C  言語またはアセンブリ言語のどちらで書いてもかまいません


                                 - 42 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


が、librは-の後のファイル名からその言語を判定しますので、Cのモジュールな
ら.cを、アセンブリ言語なら.a86または.p86(cppをかけてからアセンブルする時
の拡張子)をファイル名の最後につけなくてはなりません。

以下に例を示します。

    /*
     *      sample.l - sample library file
     */
    -- C program part
    #include <ctype.h>
    #include <string.h>

    -stolower.c
    char    *stolower(char *s)
    {
            char    *p;

            for (p = s; *p; p++)
                    *p = tolower(*p);
            return (s);
    }

    -stoupper.c
    char    *stoupper(char *s)
    {
            char    *p;

            for (p = s; *p; p++)
                    *p = toupper(*p);
            return (s);
    }

    -- Assembly language part
    CGROUP  GROUP   TEXT
    TEXT    CSEG

    -ror.a86
    ror_::
            push    cx
            mov     cl,bl
            ror     ax,cl
            pop     cx
            ret

    -rol.a86
    rol_::
            push    cx
            mov     cl,bl
            rol     ax,cl
            pop     cx
            ret

この例では、4つのモジュールをもつライブラリを定義しています。ふたつはC、
ふたつはアセンブリ言語で書かれています。



                                 - 43 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


これをlibrにかけると、stolower.c,  stoupper.c, ror.a86, rol.a86の4つのモ
ジュールが順次生成され、コンパイルされます。stolower.cとstoupper.cの先頭
にはふたつの #include文が挿入され、ror.a86とrol.a86の先頭にはGROUP疑似命
令とCSEG疑似命令が挿入されます。


7.1.3  librの操作



librコマンドの形式は次の通りです。

    libr [オプション][lcc オプション] 入力ファイル名

入力ファイルには、ライブラリのソースコードのファイル名を指定します。この
ファイルはどんな名前でもかまいませんが、習慣として.lという拡張子をつけて
います。

librは入力ファイルを読んで、前節で述べたようにひとつひとつのモジュールを
切り出し、コンパイルし、ライブラリファイルに結合します。実際のコンパイル
作業はlccを呼び出しておこない、モジュールの結合はライブラリアンoarでおこ
ないます。したがって、これらは実行可能なディレクトリに入れておかなくては
なりません。

作業用のファイルは、カレントディレクトリ上に作られます。ライブラリファイ
ルはカレントディレクトリにlibr.outという名前で作成されます。

オプションには次のものがあります。

-l
    ライブラリアンとしてoarのかわりにMicrosoft社のLIBを使用します。

-n
    コンパイルやライブラリの作成は実行されず、ただコマンドだけが表示され
    ます。

-o file
    出力するライブラリファイル名をfileにします。このオプションを指定して
    いないときには、出力ファイル名はlibr.outになります。

-s
    librは内部で実行しているlccや oar のコマンドをコンソールに表示します
    が、このオプションが指定されたときは、表示をしません。

-x
    作成したモジュールのソースをコンソールに表示します。

これら以外の'-'で始まるオプションはすべて、lccに渡されます。

上述のリストsample.lからライブラリファイルsample.libを作成するには、次の
コマンドを実行します。

    libr -ms sample.l

ここで、-msはスモールモデルを指定するlccのオプションです。すると、ライブ
ラリファイル libr.outがカレントディレクトリに作成されます。これをsample.


                                 - 44 -                                 




LSI C-86 Ver 3.30 試食版                            ユーザーズマニュアル


libにリネームすればできあがりです。

    ren libr.out sample.lib






                       第8章  コマンドリファレンス




【名前】

    cpp - プリプロセッサ

【書式】

    cpp [-DNAME[=value]] [-Idirectory] [-ofile] [-s] [-w] [inputfile...]

【解説】

    cppはCのプリプロセッサで、コンパイラの第1パスです。cpp は #define や
    #include,  #ifなどのプリプロセッサ命令を処理し、結果を標準出力に書き
    出します。出力先は-oオプションで変更することができます。

    cppはinputfileがあたえられると、それを入力として処理します。複数の入
    力ファイルを指定することもできます。 inputfileの指定がない場合は、標
    準入力から入力します。

【オプション】

    -DNAME[=value]
        NAMEというマクロを定義します。=valueが省略されると=1となります。

    -Idirectory
        #includeされるファイルをディレクトリdirectoryからさがします。 こ
        のオプションは複数指定できます。

    -ofile
        出力を標準出力でなく、fileに書き込みます。

    -s
        出力に#で始まる行番号情報を出しません。

    -w
        警告メッセージを表示しません。

【使用例】

    cpp -I/usr/include -DANSI -otest.out test.c
        この例はtest.cを処理してtest.outに出力します。#includeしているフ
        ァイルはディレクトリ/usr/includeからさがします。また、マクロANSI
        を1に定義しています。


                                 - 45 -                                 




LSI C-86 Reference Manual                                         CPP(1)



【終了コード】

    cpp は正常に終了すると0を返します。エラーを検出すると1を、警告を発生
    すると2を返します。





















































                                 - 46 -                                 




LSI C-86 Reference Manual                                         LCC(1)


【名前】

    lcc - コンパイラドライバ

【書式】

    lcc [@file] [-a[file]] [-c] [-cn] [-cs | -cu] [-DNAME[=value]]  [-g]
    [-h] [-Idir] [-j[X]] [-kX] [-llibrary] [-Ldir] [-m] [-mX] [-mslink |
    -nomslink]  [-nN]  [-noconf]  [-O[0]] [-o file] [-p] [-S[C]] [-Tdir]
    [-v[X]] [-w[X]] [-Xdir] [-y[X]] [-z] sourcefile...

【解説】

    lccはCコンパイラ、アセンブラ、リンカを呼び出して、C ソースプログラム
    を実行可能形式に変換します。

    ソースファイルには拡張子.c を持つC言語ファイル、あるいは拡張子が.a86
    (r86), .p86 (r86), .asm (MASM)であるアセンブリ言語ファイル、さらに拡
    張子が.objのオブジェクトファイルの3種類のファイルを指定できます。 フ
    ァイルはふたつ以上書くこともでき、それらはまとめてリンクされます。

    lcc はまずこれらのファイルをコンパイルまたはアセンブルし、それぞれの
    オブジェクトを作ります。アセンブリ言語ファイルは、その拡張子が.a86ま
    たは.p86ならばcppを実行した後にr86( 本パッケージ中に付属しているアセ
    ンブラ)によって、.asmならばMASMによってアセンブルされます。

    エラーがなければすべてのオブジェクトをリンクし、ひとつの実行可能形式
    ファイル(拡張子.exe)を生成します。.exeファイルには一番はじめのソース
    ファイルと同じ名前がつけられます (作成されるファイル名は-oオプション
    で変更できます)。

    もしもエラーがあると、オブジェクトの生成までは実行されますが、リンク
    はされません。エラーメッセージは標準出力に出していますので、MS-DOSの
    リダイレクト``>''によってこれをファイルにとることもできます。

    オプションで、ディレクトリ名を指定する必要があるものは、最後の\(また
    は/)は付けても付けなくてもかまいません。アルファベットの大文字と小文
    字とは異なったものとして認識されますので注意してください。

    lccはコマンドラインにあたえられた文字列を順番に解析していきます。 文
    字列がオプションならば対応する上述の処理をします。オプションでない場
    合には、それはソースファイルの名前と考え、その時点で指定されているオ
    プションを使ってコンパイルを実行します。たとえば、

        lcc -c a.c -S b.c -p

    というコマンドをあたえたとします。 a.cは、-cが指定されていますので、
    アセンブルまで実行されてオブジェクトファイルa.objが作成されます。 こ
    れに対してb.cをコンパイルするときには-Sが有効ですから、b.cはアセンブ
    リ言語ファイルb.a86にコンパイルされます。lccが最後に指定されている-p
    を認識するときにはどちらもすでにコンパイルされていますから、プロファ
    イラのためのコードは生成されません。このように、オプションとソースフ
    ァイルを指定する順番には注意が必要です。

【オプション】



                                 - 47 -                                 




LSI C-86 Reference Manual                                         LCC(1)


    @file
        ファイル file からコマンドラインパラメタを読み込みます。file中に
        は、オプションやソースファイル名を空白または改行で区切って記述し
        ます。このオプションは

            lcc -o foo.exe @files @libs -m

        のように、途中にあったり、2 回以上現れたりしてもかまいませんが、
        ネストは許されません。 つまり、fileの中では@オプションは使用でき
        ません。

    -a[file]
        fileを初期化ルーチンに指定します。このファイルは、-Lオプションで
        指定したディレクトリの中になくてはなりません。-aとfileのあいだに
        はスペースがあってはなりません。

        fileが空のとき(-aのみの指定)は、初期化ルーチンはないものとみなし
        ます。

    -c
        オブジェクトファイルを作成したあと、リンクを実行しません。コンパ
        イルするファイルがひとつだけの場合は、-oオプションでオブジェクト
        ファイルの名前を指定することができます。

    -cn
        コメントのネストを許します。

    -cs, -cu
        -csはchar型が符号付き(signed)であることを指定します。-cuはchar型
        が符号なし(unsigned)であることを指定します。省略時は、符号なしに
        なっています。

    -DNAME[=value]
        NAMEというマクロを定義します。C言語のソースプログラムの1番上に

            #define NAME value

        という行があるのと同じです。

        ただし、=valueが省略されたときは、

            #define NAME 1

        と同じです。

    -g
        デバッグ用の情報(行番号情報)をオブジェクトに埋め込みます。これは
        Microsoft社のSYMDEBで利用できます。

    -h
        スタックオーバーフローを検査するコードを生成します。作成したプロ
        グラムの実行速度は遅くなります。

    -Idir
        #include文で指定したファイルを探すディレクトリのリストにdir を加
        えます。複数の-Iオプションを指定してもかまいません。そのときは指


                                 - 48 -                                 




LSI C-86 Reference Manual                                         LCC(1)


        定されたすべてのディレクトリをさがします。

    -j[X]
        エラーメッセージを何語で表示するかを選択するオプションです。

            -j0
                英語で表示します。

            -j, -j1
                日本語で表示します。

        このオプションがないときは -j0を指定したのと同じ状態になっていま
        す。

    -kX
        リンカにオプションXを渡します。たとえば、 スタックの大きさを設定
        するにはこのオプションを使い、 以下のようにします。

            lcc foo.c -k'-s 5000'

        この例は、 foo.cをコンパイルして、スタックの大きさを0x5000バイト
        に設定しています(-s 5000はlldのオプションです)。

    -llibrary
        リンク時に、ライブラリlibraryを探索します。ファイルlibraryは、-L
        オプションで指定したディレクトリ中にあるものとみなされます。  ま
        た、拡張子.objを明記することにより、ライブラリディレクトリ中にあ
        るオブジェクトファイルを結合することもできます。

        リンカは、このオプションに出会った時点ですぐに未解決シンボルを探
        索します。 したがって、 このオプションを書く順番には意味がありま
        す。オブジェクトファイルより先に指定しても、希望する結果は得られ
        ませんので注意してください。

    -Ldir
        ライブラリを探すディレクトリのリストに dirを加えます。ディレクト
        リdirの中には、各メモリモデルに対応したS、P、D、L のサブディレク
        トリがなくてはなりません。実際のライブラリはこのサブディレクトリ
        に入れてください。

    -m
        リンケージマップファイルを作成します。

    -mX
        メモリモデルを指定します。 Xにはs、p、d、lのいずれかを指定してく
        ださい。省略時は、Sモデルを選択します(-ms)。

    -mslink, -nomslink
        -mslinkオプションは、リンカとしてMS-LINKを使用する  ことを宣言し
        ます。-nomslinkオプションは、リンカとして標準のlldを使用すること
        を宣言します。このオプションは、-kオプションよりも先に指定しなく
        てはなりません。 これらの指定がなければ、リンカとしてlldを使用し
        ます。

    -nN
        連続して検出するエラーの数の上限をN(Nは10進数)に設定します。設定


                                 - 49 -                                 




LSI C-86 Reference Manual                                         LCC(1)


        した以上のエラーを検出すると、そのファイルのコンパイルを中止しま
        す。デフォルトのNは20です。

    -noconf
        コンフィギュレーションファイルを無効にします。  このオプションは
        コマンドラインの一番先頭に書かなくてはなりません。それ以外の位置
        に書いた場合はエラーとなります。

    -O[0]
        -O を指定すると、 コンパイラは最適化を行ないます。 -O0を指定する
        と、コンパイラは最適化をやめます。これらのオプションが省略される
        と、最適化は行ないません。現バージョンでは、-O0 によって抑制され
        るのはアセンブラr86によるジャンプ命令の最適化だけです。

    -o file
        出力ファイルの名前をfileとします。通常、これは実行可能ファイルの
        名前となりますが、-cオプションが指定されているときはオブジェクト
        ファイルの、また-Sオプションが指定されている時はアセンブリ言語フ
        ァイルの名前になります。

    -p
        プロファイラのためのコードを生成します。プロファイラはプログラム
        の実行状況を検査するためのユーティリティで、プログラムのどの部分
        を何回実行したかを報告します。

    -S[C]
        -S オプションは、各C言語ファイルに対して、アセンブリ言語ファイル
        (.a86)を生成します。アセンブルとリンクはおこないません。

        -SCは、生成したアセンブリ言語ファイルにCのソースコードをコメント
        の形式で埋め込みます。

        生成されたファイルは、MS-DOSの標準アセンブラMASMではアセンブルで
        きません。付属のr86を用いてください。

    -Tdir
        コンパイラの作業用ファイルをディレクトリdirに作ります。RAMディス
        クなどの高速アクセスのできる装置があれば、そのディレクトリを指定
        するとコンパイル速度が向上します。省略時はカレントディレクトリを
        使用します。

    -v[X]
        コンパイル中の表示をするかどうかを指定します。

            -v, -v0
                何も表示しません。

            -v1
                内部で実行しているコマンドを表示します。

            -v2
                コード生成時に現在処理中の関数名を表示します。

        このオプションがないときには、-v0 を指定したのと同じ状態になって
        います。



                                 - 50 -                                 




LSI C-86 Reference Manual                                         LCC(1)


    -w[X]
        警告(Warning)メッセージが出たときの扱いを指定します。

            -w, -w0
                警告メッセージを表示せず、コンパイルを続行します。

            -w1
                警告メッセージを表示し、コンパイルを続行します。

            -w2
                警告メッセージを表示し、コンパイルを中止します。

            -wi
                宣言されていない関数を使用しているときに報告される警告メ
                ッセージを抑制します。

        このオプションがないときには、 -w1を指定したのと同じ状態になって
        います。なお、エラーが検出されたときは、本オプションの指定には関
        係なくコンパイルを中止します。

    -Xdir
        コンパイラの内部コマンド(cf.exe、cg86.exeなど) を dir から探しま
        す。このオプションがなければ、環境変数PATH中のディレクトリをさが
        します。

    -y[X]
        拡張文字セットの取り扱いを指示します。 lccは通常、文字列の中身を
        シフト化JISコードの列として扱うため、(そのままでは) それ以外の体
        系のコード(たとえばIBM-PCのハートマーク等)が文字列に現れた時に正
        しく処理ができません。このようなときには、このオプションを指定す
        る必要があります。

            -y
                すべての文字コードを1バイト文字として扱います。

            -y0
                日本語コード(MS漢字コード)として処理します。

            -y1
                中国語および台湾語コードとして処理します。

            -y2
                韓国語コードとして処理します。

        このオプションがないときには -y0を指定したのと同じ状態になってい
        ます。

    -z
        いっさいの処理を行なわず、内部で実行されるコマンドを表示します。
        このオプションは、環境設定が正しいかどうかを確認するときに使用し
        ます。

【使用例】

    lcc -DDEBUG -T/tmp test.c
        マクロDEBUGを1に定義してtest.cをコンパイルします。コンパイラが作


                                 - 51 -                                 




LSI C-86 Reference Manual                                         LCC(1)


        成する一時ファイルは/tmpディレクトリに置かれます。

    lcc -ml -o foo.exe main.c sub.c -lmathlib
        main.cとsub.cをラージモデルでコンパイルします。 これらはリンカに
        よってひとつににまとめられ、 実行ファイルの名前はfoo.exeになりま
        す。また、リンク時にはmathlib.libが走査されます。

【ファイル】

    _lcc
        _lccにはコンパイラの環境設定を記述します。

【終了コード】

    正常にコンパイルが終了すると0を返します。エラーを検出すると1を返し、
    警告を検出したときは2を返します。










































                                 - 52 -                                 




LSI C-86 Reference Manual                                        LIBR(1)


【名前】

    libr - ライブラリコンパイラ

【書式】

    libr [-l] [-n] [-o file] [-s] [-x] [lcc option...] sourcefile

【解説】

    librは一種のコンパイラドライバで、ひとつのファイルにまとめられたライ
    ブラリモジュールを分解し、それらをコンパイル、ライブラリファイルへの
    結合といった操作を実行します。

    sourcefileにはライブラリのソースコードのファイル名を指定します。この
    ファイルはどんな名前でもかまいませんが、習慣として.lという拡張子をつ
    けています。

    librは入力ファイルを読んで、ひとつひとつのモジュールを切り出し、コン
    パイルし、ライブラリファイルに結合します。実際のコンパイル作業は lcc
    を呼び出しておこない、 モジュールの結合はライブラリアンoarでおこない
    ます。したがって、これらは実行可能なディレクトリに入れておかなくては
    なりません。

    作業用のファイルは、カレントディレクトリ上に作られます。ライブラリフ
    ァイルはカレントディレクトリにlibr.outという名前で作成されます。

【オプション】

    -l
        ライブラリアンとしてoarのかわりにMicrosoft社のLIBを使用します。

    -n
        コンパイルやライブラリの作成は実行されず、ただコマンドだけが表示
        されます。

    -o file
        出力するライブラリファイル名をfileにします。このオプションを指定
        していないときには、出力ファイル名はlibr.outになります。

    -s
        librは内部で実行しているlccやoarのコマンドをコンソールに表示しま
        すが、このオプションが指定されたときは、表示をしません。

    -x
        作成したモジュールのソースをコンソールに表示します。

    これら以外の-で始まるオプションは、すべてlccに渡されます。

【使用例】

    libr -ms libfile.l
        libfile.lからスモールモデルのライブラリを作成します。-msはスモー
        ルモデルを指定するlccのオプションです。 ライブラリファイル libr.
        outはカレントディレクトリに作成されます。



                                 - 53 -                                 




LSI C-86 Reference Manual                                        LIBR(1)


【ファイル】

    libr.out
        -oオプションが指定されていないときに、librによって作成されたライ
        ブラリファイルです。

【終了コード】

    正常に処理が終了したときには0を返します。

【参照】

    lcc(1), oar(1)













































                                 - 54 -                                 




LSI C-86 Reference Manual                                         LLD(1)


【名前】

    lld - リンクローダ

【書式】

    lld  [@file]  [-Fform]  [-I[X]] [-Ldir] [-lfile] [-g] [-M] [-o file]
    [-s hex] [-T[seg] hex] objfile...

【解説】

    lldはMicrosoft Object Module Format 形式のファイルを結合してひとつの
    EXE形式の実行可能ファイル、コアイメージ、あるいはインテルHEX形式のフ
    ァイルを生成します。

【オプション】

    @file
        fileからコマンド行引数を読み込みます。

    -Fform
        出力ファイルの形式をformにします。formは以下のいずれかでなくては
        なりません。

            e
                MS-EXE形式

            c
                COM形式

            h
                インテルHEX形式

        このオプションがあたえられなかったときは、出力ファイルの拡張子か
        ら決定されます。

            .exeのとき
                e

            .comのとき
                c

            .hexのとき
                h

    -I[X]
        名前の大文字、小文字を認識するかどうかを制御します。

            -I, -I1
                大文字、小文字を同一視します。

            -I0
                大文字、小文字を区別します。

        このオプションがないときには、 -I0が指定されたのと同じ状態になっ
        ています。


                                 - 55 -                                 




LSI C-86 Reference Manual                                         LLD(1)



    -Ldir
        ライブラリファイルが存在するディレクトリを指定します。

    -lfile
        ライブラリfileを走査します。.libは省略することができます。

    -g
        行番号情報を生成します。-gを指定すると、 -M も自動的に指定されま
        す。

    -M
        マップファイルを生成します。

    -o file
        出力ファイルの名前をfileとします。このオプションがなければ、最初
        に指定されたオブジェクトファイルと同じベースネームを持つ.exeファ
        イルが作成されます。

    -s hex
        スタックの大きさをhexにします。hexには16進数を指定します。

    -T hex
        最初のセグメントの開始アドレスをhexにします。hexには16進数を指定
        します。

    -Tseg hex
        セグメント segの開始アドレスをhexにします。hexには16進数を指定し
        ます。

【使用例】

    lld -o foo.exe foo.obj bar.obj
        オブジェクトモジュールfoo.objとbar.objを結合し、foo.exe を作成し
        ます。

    lld foo.obj bar.obj
        上の例と同じです。

    lld -o foo.exe bar.obj zot.obj -L/usr/lib/c -lclib
        bar.obj 、zot.objをリンクし、ライブラリ/usr/lib/c/clib.libを検索
        してfoo.exeを作ります。

    lld -Fh -o foo.hex bar.obj zot.obj
        bar.obj、zot.objを連結してfoo.hexというインテルHEXファイルを作り
        ます。

【終了コード】

    正常にリンクが終了すると0を返します。エラーを検出すると1を、ディスク
    がいっぱいのときには2を返します。

【診断メッセージ】

    Address already given: segment
        同一のセグメントsegmentに-Tオプションが2回以上指定されています。


                                 - 56 -                                 




LSI C-86 Reference Manual                                         LLD(1)


        あるいは、SEGMENT指令でアドレスが指定されているのに、さらに-T オ
        プションも指定されています。

    file: Bad module type
        file はr86アセンブラによって作成されたオブジェクトモジュールでは
        ありません。lldはこのファイルを正しくあつかうことができません。

    file: Conflicting class name: segment
        複数モジュール上にある同名のsegmentが、 異なるクラスで宣言されて
        います。

    file: Conflicting combine type: segment
        複数モジュール上にある同名の segmentが、異なる結合タイプで宣言さ
        れています。

    file: Conflicting group definition: segment
        複数モジュール上にある同名のsegmentが、 異なるグループに所属して
        います。

    file: Data before 0x100 (Maybe ORG 100H missing)
        COMファイルを作成しているとき、0x100番地以前にプログラムやデータ
        が発見されました。ORG 100Hを忘れてはいませんか?

    file: Device full
        fileを書込んでいる途中でディスクが一杯になりました。

    file: Invalid object module: reason
        オブジェクトモジュールが予期しない構造になっています。原因として
        は

              + lldの処理できない拡張が行なわれている

              + オブジェクトモジュールファイルがなんらかの原因で破壊され
                た

              +  このオブジェクトを作成した言語処理系またはlldに未知のバ
                グがある

        などが考えられます。

    file: No such file or directory
        fileが見つかりませんでした。

    file: Not a library file
        ライブラリでないファイルを-lオプションに指定しています。

    Out of memory
        シンボルテーブルがあふれました。

    file(segment+offset): Overflow (base): name
        セグメントまたはシンボルnameのベースアドレスは、16ビットにおさま
        りません。プログラム全体の大きさが1Mバイトを越えている可能性があ
        ります。

    file(segment+offset): Overflow (byte): name
        シンボルnameの値は8ビットにおさまりません。


                                 - 57 -                                 




LSI C-86 Reference Manual                                         LLD(1)



    file(segment+offset): Overflow (word): name
        シンボルnameの値は16ビットにおさまりません。セグメントの大きさが
        64Kバイトを越えている可能性があります。

    file: Redefined symbol: name
        file中で定義されているシンボルnameは、他のファイルでも定義されて
        います。

    file(segment+offset): Too far (different segment): name
        相対ジャンプ/コール命令の飛び先のシンボルが、 その命令と同じセグ
        メント /グループに属していません。(注意: MS-LINKはこのエラーを報
        告しません。MS-LINKで通るプログラムでも、lldにかけるとこのエラー
        が表示される可能性があります。   ただし、   実行可能ファイルは、
        MS-LINK と同じものを作りますので、わけがわかっている場合にはこの
        エラーを無視してもかまわないでしょう。できる限りソースプログラム
        を修正することをお薦めしますが…)

    file(segment+offset): Too far (relative byte): name
        相対ジャンプ命令の飛び先が、-128  -  +127 の範囲にはいっていませ
        ん。

    Too small memory
        メモリが足りません。

    file: Undefined symbol: name
        file中で参照されているシンボルnameはどこにも定義がありません。































                                 - 58 -                                 




LSI C-86 Reference Manual                                        MAKE(1)


【名前】

    make - プログラムメインテナ

【書式】

    make  [-f  file]  [-i]  [-k]  [-n]  [-r]  [-s]  [-t] [NAME=value...]
    [target...]

【解説】

    makeはひとつ以上のターゲットを更新するために、makefileに指定されたコ
    マンドを実行します。-fオプションをあたえないときには、コマンドはカレ
    ントディレクトリのファイルmakefileから読み込みます。

【オプション】

    -f file
        makeのコマンドを読み込むファイルの名前を指定します。この指定がな
        ければカレントディレクトリのファイルmakefileを読みます。fileが -
        のときには標準入力からコマンドを入力します。

    -i
        実行したコマンドのリターンコードを無視します。.IGNORE を指定した
        のと同じです。

    -k
        コマンドを実行中にエラーを検出したときに、終了しないでできるだけ
        多くのターゲットを作成します。

    -n
        コマンドを実行せず、ただ実行されるであろうコマンドを表示します。
        実際に始める前に、どのコマンドが実行されるかを確認できます。

    -r
        makeの省略時規則を無効にします。つまりmakedefを読み込みません。

    -s
        makeは通常現在実行中のコマンドを表示しますが、このオプションを指
        定すると表示をしなくなります。.SILENTを指定したのと同じです。

    -t
        コマンドを実行せず、ターゲットのファイルのタイムスタンプだけを更
        新します。

【使用例】

    make -f makeit all
        カレントディレクトリにあるmakeitというファイルから依存関係を読み
        取り、ターゲットallを作成します。

    make -n
        依存関係は解析しますがコマンドは何も実行せず、実行する予定のコマ
        ンドを表示します。

    make -f b:filemake CFLAGS=-DDEBUG


                                 - 59 -                                 




LSI C-86 Reference Manual                                        MAKE(1)


        makefileのかわりにb:filemakeというファイルから依存関係を読み込み
        ます。また、CFLAGSというマクロを-DDEBUGに定義しています。

【ファイル】

    makedef
        デフォルトルールを記述したファイルです。

    makefile
        makeのコマンドを記述したファイルです。-fオプションを指定しないと
        きには、カレントディレクトリのmakefileが使われます。















































                                 - 60 -                                 




LSI C-86 Reference Manual                                        MERC(1)


【名前】

    merc - アセンブラにCのコメントを挿入する

【書式】

    merc [-aA-header] [-cC-header] [-o outputfile] [inputfile...]

【解説】

    mercはlccに-S -gオプションを指定してできたアセンブラのソースに、対応
    するCのソースをコメントの形式で挿入します。lccに-SC オプションが指定
    されると、 lccはmercを呼び出します。したがって、ユーザがmercを直接に
    実行することはほとんどないでしょう。

    mercは入力ファイルとしてinputfile が指定されたときにはそのファイルか
    ら、指定されていないときには標準入力からアセンブリ言語ソースを読み込
    みます。 merc はマージした結果をデフォルトでは標準出力に書き出します
    が、-oオプションによってファイルに出力することもできます。

    mercが入力するファイルにはマージするファイル名と行番号を示す情報が含
    まれていなければなりません。これは次の形式をしています。

        %N ["filename"]

    Numberは行番号を示す10進数です。filenameはソースのファイル名を表し、
    省略可能です。lccを使ってアセンブリ言語ソースを作成するときには、 -g
    オプションを指定してこの情報を生成してください。

【オプション】

    -aA-header
        ファイルをマージするときに、アセンブラソース行の先頭に付加する文
        字列を指定します。デフォルトは空文字列("")です。

    -cC-header
        ファイルをマージするときに、 Cソース行の先頭に付加する文字列を指
        定します。デフォルトはセミコロン(";")です。

    -o file
        出力ファイルの名前を指定します。このオプションを指定していないと
        きは、標準出力に結果を出力します。

【使用例】

    merc -o test.lst test.a86
        test.a86にソースをマージします。ソースファイルの名前はtest.a86の
        中にデバッグ情報として埋め込まれています。出力結果はtest.lstに書
        き込まれます。









                                 - 61 -                                 




LSI C-86 Reference Manual                                         OAR(1)


【名前】

    oar - ライブラリアン

【書式】

    oar [-]d|q|r|t|x[cuv] [g N] library member-file...

【解説】

    oarはlld が参照するライブラリを管理するためのプログラムで、 オブジェ
    クトモジュールの登録、削除、取り出し、一覧表作成などを行ないます。ラ
    イブラリの形式はMicrosoft社のものと互換性があります。

    第1引数には操作を指示するアルファベットを、第2引数には操作の対象とな
    るライブラリの名前を指定します。ライブラリの拡張子を省略すると、.lib
    が自動的に補われます。

    member-file には登録、削除を行ないたいオブジェクトモジュールファイル
    の名前を空白で区切って指定します。拡張子を省略すると、.objが自動的に
    補われます。

    操作には以下のものがあります。

    d
        member-fileをlibraryから削除します。

    q
        member-fileをlibraryに登録しますが、常に最後に追加します。同じ名
        前のメンバがすでにlibraryにある場合は追加しません。rよりも処理時
        間が短いので、メンバをひとつずつ登録していくような場合に向いてい
        ます。また、member-fileとして拡張子が.lib であるファイルを指定す
        ると、そのライブラリを連結します。

    r
        member-fileをlibraryに登録します。すでに、同一の名前を持つメンバ
        がlibraryに存在する場合は置き換えられます。

    t
        libraryの内容の一覧表を標準出力に表示します。

    x
        library の中のmember-fileを取り出します。member-fileの指定がなけ
        れば、すべてのメンバが取り出されます。

【オプション】

    @file
        fileから引数を読み込んでそれを実行します。

    c
        rまたはqコマンドの実行時において、指定したライブラリファイルが存
        在しないとき、'library: created'というメッセージが表示されるのを
        抑制します。ライブラリがすでに存在するときは意味を持ちません。ま
        た、d, t, xコマンドに対して指定しても効果はありません。



                                 - 62 -                                 




LSI C-86 Reference Manual                                         OAR(1)


    g N
        ページサイズNを10進数で指定します。このオプションは、 新しいライ
        ブラリファイルを作成するときだけ効果があります。

    v
        d 、 r、q、xに対して指定すると、現在処理中のファイル名を表示しま
        す。tコマンドに対して指定すると、 個々のオブジェクトモジュールに
        関するより詳しい情報を表示します。

    u
        r コマンドに指定すると、member-fileのうち、libraryよりも変更時刻
        の新しいものだけを登録します。r 以外のコマンドには何の効果も与え
        ません。

【使用例】

    oar tv /usr/lib/c/s/doslib.lib
        /usr/lib/c/s/doslib.lib中のメンバを表示します。

    oar q mathlib.lib sin.obj cos.obj
        mathlib.libにsin.objとcos.objを追加します。

    oar q all.lib doslib.lib mathlib.lib knjlib.lib
        doslib.lib、mathlib.lib、knjlib.libを結合してall.libにします。

    oar r mathlib.lib sin.obj cos.obj
        mathlib.lib中のsin.objとcos.objを置き換えます。

    oar ru mathlib.lib *.obj
        カレントディレクトリにある*.objファイルのうち、mathlib.libよりも
        変更時刻の新しいファイルだけをmathlib.libに登録します。

    oar xv romlib.lib
        romlib.lib の中身を全てカレントディレクトリに取り出します。 作業
        中、そのファイル名が表示されます。

    oar d romlib.lib printf
        romlib.libからprintf.objを削除します。

    oar rcvg 64 newlib.lib *.obj
        ページサイズ64の新しいライブラリファイルnewlib.libを作り、カレン
        トディレクトリのすべての.objファイルを登録します。

    oar qg 64 newlib.lib oldlib.lib
        oldlib.libのページサイズを64に変更した新しいライブラリファイルを
        作ります。新しいライブラリの名前はnewlib.libになります。

    oar r slib.lib @list
        ファイルlist中に列挙されたメンバをslib.libに登録します。この例の
        ように、@fileは引数の途中に書いても構いません。








                                 - 63 -                                 




LSI C-86 Reference Manual                                        PROF(1)


【名前】

    prof - プロファイラ

【書式】

        prof [-f] [sourcefile...]

【解説】

    profはprof.outとソースプログラムを結合し、ソースプログラムの行単位に
    実行回数を記録したリストを作成します。

    sourcfileを省略すると、lccに-pをあたえてコンパイルしたすべてのファイ
    ルのプロファイルを表示します。ソースファイルを指定すると、指定された
    ファイルだけが表示されます。

    profを実行するときには、カレントディレクトリにprof.outが存在しなけれ
    ばなりません。また、このディレクトリはコンパイルを実行したディレクト
    リでなければなりません。

【オプション】

    -f
        オプション-fを指定すると、ステートメントごとの回数を表示するかわ
        りに、関数が呼び出された回数のみを表示します。

【使用例】

    prof -f test.c
        test.cの中の関数が呼び出された回数を表示します。

【診断メッセージ】

    file: No sush file or directory
        期待したディレクトリにファイルfileがありません。

    Too big: prof.out
        ファイルprof.outが大きすぎてメモリに読み込めませんでした。

    Out of memory
        モジュールが多すぎて処理できません。

    No profile about file
        fileのプロファイル情報がありません。file.sl が期待したディレクト
        リに見つからない可能性があります。












                                 - 64 -                                 




LSI C-86 Reference Manual                                         R86(1)


【名前】

    r86 - 8086/80186/80286用アセンブラ

【書式】

    r86  [-m name] [-o outputfile] [-p listfile] [-q] inputfile

【解説】

    r86は8086/80186/80286用のアセンブラです。

    r86 はLSI C-86コンパイラが生成したコードをアセンブルすることを主眼に
    おいて開発されましたので、Microsoft社のMASM のような複雑なアセンブラ
    ではなく、大変単純なものです。しかし、届かない条件ジャンプ命令を自動
    的に長いジャンプ命令に変換するというMASMにはない機能もあります。

    入力ファイルは inputfileで指定します。入力ファイルの拡張子が省略され
    ると、.a86が仮定されます。r86は入力ファイルを読み込んで、 同じディレ
    クトリ上に同じ名前の.objファイルを作成します。これはMicroSoft Object
    Module Format形式になっています。

【オプション】

    -m name
        オブジェクトのモジュール名を name にします。これを省略するとモジ
        ュール名はinputfileになります。

    -o file
        オブジェクトをファイルfileに作ります。これを省略するとオブジェク
        トファイル名はinputfile.objになります。

    -p file
        リスティングをファイルfileに作ります。このオプションがないとリス
        ティングはどこにも作成されません。

    -q
        アセンブル時間が短くなるよう、すべてのジャンプ命令をすべて長い命
        令にします。このオプションがなければ、ジャンプ命令は可能なかぎり
        短い命令にアセンブルされます。

【使用例】

    r86 -p test.lst test
        test.a86をアセンブルし、オブジェクトファイル test.obj を作成しま
        す。 同時にリスティグを test.lst に書き込みます。 モジュール名は
        test(test.a86ではありません)になり、ジャンプ命令はできるだけ短く
        アセンブルされます。

    r86 -m foo -o bar.obj -q zod.a86
        zod.a86をアセンブルします。オブジェクトファイル名はbar.objになり
        ます。ジャンプ命令の最適化は実行せず、モジュール名はfoo になりま
        す。

【終了コード】



                                 - 65 -                                 




LSI C-86 Reference Manual                                         R86(1)


    正常にアセンブルが終了したときには0を返します。エラーを検出すると1を
    返します。

【診断メッセージ】

    0 or more than 2 char
        式の中で使われている文字定数の長さが 0か、3以上です。3文字以上の
        文字定数はDB命令の中でのみ許されています。

    bad number
        数の表記が正しくありません。たとえば、2進数に0か1 以外の数字を使
        用しています。

    bad operand type
        オペランドの型が一致していません。

    can't op
        ここではopは使用できません。

    double defined XXX
        XXXは多重定義されています。

    illegal END
        END命令が予期しない場所にありました。

    illegal align or combine
        アラインタイプかコンバインタイプが正しくありません。以前の宣言と
        一致していない可能性があります。

    illegal class name XXX
        クラス名 XXXは正しくありません。以前の宣言と一致していない可能性
        があります。

    illegal extrn XXX
        以前の宣言と一致していない可能性があります。

    illegal group XXX
        以前の宣言と一致していない可能性があります。

    illegal operand XXX
        以前の宣言と一致していない可能性があります。

    illegal public XXX
        以前の宣言と一致していない可能性があります。

    illegal type
    line detected after END
    missing quote
        文字定数を終了する'や"がありません。

    missing segment information
    missing type information
    operand type doesn't match
    operand unmatch
    overflow ESC value
        ESC命令のイミディエート値が大きすぎます。


                                 - 66 -                                 




LSI C-86 Reference Manual                                         R86(1)



    syntax error
        文法エラーです。

    too long string
        文字列が長すぎます。文字列の長さは最大で127文字までです。

    undefined symbol XXX
        XXXは未定義です。

    unknown opecode XXX
        XXXは正しくない命令です。 命令があるべき場所に命令がありません。
        ラベルの後にコロン(:)を忘れていないか調べてください。

    Warning: byte overflow
        1バイトの値が-256から+255の範囲に入っていません。

【バグ】

    RS 命令のオペランドに大きな数を指定しても、r86は下位16ビットの値しか
    使用しません。したがってRS命令で確保できる最大の大きさは65535 バイト
    です。




































                                 - 67 -                                 




LSI C-86 Reference Manual                                         R86(1)








                      第9章  ライブラリリファレンス





【名前】

    abort - プログラムの異常終了

【書式】

    #include <stdlib.h> or <process.h>
    void abort(void);

【解説】

    abort()はプログラムを異常終了させます。

    abort()は標準エラー出力(stderr)に

        Abnormal program termination

    と表示し、raise(SIGABRT)を実行します。その後、ストリームバッファをフ
    ラッシュせずにプログラムを終了し、 リターンコード 3 を親環境へ渡しま
    す。

    abort()の呼び出しに先立って、signal(3)でSIGABRT に対するハンドラを指
    定しておくことができます。

【リターン値】

    abort()からは決してリターンしません。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    atexit(3), onexit(3), signal(3), raise(3), exit(3), spawn(3)











                                 - 68 -                                 




LSI C-86 Reference Manual                                         ABS(3)


【名前】

    abs, labs - パラメタの絶対値

【書式】

    #include <stdlib.h>
    int abs(int n);
    long labs(long n);

【解説】

    abs(), labs()はパラメタnの絶対値を計算し、その値を返します。

【可搬性】

    abs()
        ANSI, UNIX, MS-DOS, ROM

    labs()
        ANSI, MS-DOS, ROM

【参照】

    fabs(3M)

































                                 - 69 -                                 




LSI C-86 Reference Manual                                      ACCESS(3)


【名前】

    access - ファイル属性の判定

【書式】

    #include <io.h>
    int access(const char *pathname, int mode);

【解説】

    access()はファイルpathnameのモードを見て、modeによってあたえられた条
    件を満たしているかどうかを調べます。modeに指定できる条件は以下の通り
    です。

    00
        ファイルが存在するかどうかのチェック

    02
        ファイルが書き込み可能かどうかのチェック

    04
        ファイルが読み出し可能かどうかのチェック

    06
        ファイルが読み書き可能かどうかのチェック

【リターン値】

    条件を満たしていれば0を返します。満たしていなければerrnoをセットし、
    0以外の値を返します。

【エラー】

    EACCES
        指定した条件を満たしていません

    ENOENT
        pathnameが存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    chmod(3), fstat(3), stat(3)











                                 - 70 -                                 




LSI C-86 Reference Manual                                      ASSERT(3)


【名前】

    assert - 診断用マクロ

【書式】

    #include <assert.h>
    void assert(int expression);

【解説】

    assert()は与えられた条件が成立しているかどうかを調べます。

    expression の値が 0でなければ(真ならば) assert()は何もしません。もし
    expression の値が 0 であると、 assert() は標準エラー出力 (stderr) に
    expression そのものとassert()の呼び出しがあるプログラム中の位置(ソー
    スファイル名と行番号)を表示し、abort(3) によってプログラムの実行を終
    了します。

    NDEBUG というマクロが <assert.h> の#includeの時点で#defineされている
    と、この関数は何もしない関数になります。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    abort(3)





























                                 - 71 -                                 




LSI C-86 Reference Manual                                      ATEXIT(3)


【名前】

    atexit, onexit - プログラム終了時に実行する関数の登録

【書式】

    #include <stdlib.h>
    int atexit(void (*func)(void));
    onexit_t onexit(onexit_t func);

【解説】

    atexit(),  onexit() はプログラム終了時に実行してほしい関数funcを登録
    します。funcは関数へのポインタです。onexit()はatexit()を呼び出します
    ので、登録できる関数の数は両方あわせて32個までです。

    exit(3)の呼び出し、あるいはmain() からのリターンによってプログラムが
    終了するときに、登録された関数が登録されたのとは逆順に実行されます。
    これらの関数にはパラメタは渡されません。

    onexit_t型は関数へのポインタで、<stdlib.h>で定義されています。

【リターン値】

    atexit()は登録できた場合は0を返し、登録できなかった場合は0以外を返し
    ます。

    onexit()は登録できた場合はfuncを返し、登録できなかった場合はNULLを返
    します。

【可搬性】

    atexit()
        ANSI, MS-DOS

    onexit()
        MS-DOS

【参照】

    exit(3)

















                                 - 72 -                                 




LSI C-86 Reference Manual                                        ATOI(3)


【名前】

    atoi, atol, atof - 文字列から数値への変換

【書式】

    #include <stdlib.h>
    int atoi(const char *s);
    long atol(const char *s);
    #include <stdlib.h> or <math.h>
    double atof(const char *s);

【解説】

    atoi(),  atol(), atof()は、sで示される文字列を整数または浮動小数点数
    に変換します。まず、先行する空白文字が読み飛ばされます。次に負符号が
    あるかどうかが調べられ、さらに数字でない文字につきあたるまで文字列は
    スキャンされます。

【リターン値】

    変換された値を返します。数字がない場合は0を返します。

【エラー】

    ERANGE
        変換しようとした数値が表現できる範囲をこえています(atof()のみ)

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    ecvt(3), fcvt(3), gcvt(3), strtol(3), strtoul(3), strtod(3)

【バグ】

    atoi(), atol()はオーバーフローを検出しません。オーバーフローが発生し
    たときのリターン値は未定義です。


















                                 - 73 -                                 




LSI C-86 Reference Manual                                        BDOS(3)


【名前】

    bdos - MS-DOSシステムコールの実行

【書式】

    #include <dos.h>
    char bdos(char funcno, int dx, char al);

【解説】

    bdos()はMS-DOSシステムコールを実行します。

    パラメタfuncnoには機能番号、dxにはレジスタDXにセットするパラメタ、al
    にはレジスタALにセットするパラメタを渡します。MS-DOSから戻ってきた時
    のALレジスタの内容が関数の値となります。

【リターン値】

    ALレジスタの内容を返します。

【可搬性】

    MS-DOS

【参照】

    intdos(3)






























                                 - 74 -                                 




LSI C-86 Reference Manual                                     BSEARCH(3)


【名前】

    bsearch - データの探索

【書式】

    #include <stdlib.h> or <search.h>
    void  *bsearch(const  void  *key,   const void *base,  size_t nmemb,
    size_t size, int (*compar)(const void *x, const void *y));

【解説】

    bsearch()は2分探索をおこないます。sizeバイトの要素がnmemb 個並んだ配
    列 baseの中にあるkeyと等しい要素を探し、そのアドレスを返します。比較
    にはcomparが指している関数を用います。

    baseが指している配列は昇順にソートされていなければなりません。

    comparの指している関数は、2つのポインタ(xとy)を引数として、 次の値を
    返さなくてはなりません。

        *x > *yの時 正
        *x = *yの時 0
        *x < *yの時 負
【使用例】

    次のプログラムは int型オブジェクトの配列の先頭アドレス(z)と要素数(n)
    を使って、配列内のオブジェクトから特定のデータ(key)を捜します。

        #include <stdlib.h>

        int     compare(const void *x, const void *y)
        {
                return (*(const int *)x - *(const int *)y);
        }

        void    foo(int key, int z[], int n)
        {
                bsearch(&key, z, n, sizeof(int), compare);
        }

【リターン値】

    見つかった要素のアドレスを返します。見つからなかったときはNULLを返し
    ます。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    qsort(3)





                                 - 75 -                                 




LSI C-86 Reference Manual                                        BTOM(3)


【名前】

    btom, mtob - 文字数とバイト数の変換

【書式】

    #include <jstring.h>
    int btom(const char *s, int n);
    int mtob(const char *s, int n);

【解説】

    btom()は1バイトコードと2バイトコードがまざった文字列sの初めのnバイト
    中の文字数を数えます。

    mtob()は1バイトコードと2バイトコードがまざった文字列sの初めのn文字の
    バイト数を数えます。

【リターン値】

    btom()は文字数を返します。

    mtob()はバイト数を返します。

【可搬性】

    MS-DOS, ROM

【参照】

    chkctype(3), nthctype(3)



























                                 - 76 -                                 




LSI C-86 Reference Manual                                       CGETS(3)


【名前】

    cgets - コンソールからの文字列の入力

【書式】

    #include <conio.h>
    char *cgets(char *s);

【解説】

    cgets()はコンソールから文字列を入力し、その文字列をsに格納します。

    cgets()を呼ぶ前に、s[0] には入力される最大文字数をセットしておかなけ
    ればなりません。 cgets() は実際に入力された文字数を s[1]にセットしま
    す。入力された文字列はs[2]から格納されますから、文字配列s は少なくと
    もs[0]+2の大きさが必要です。

    cgets()はCR/LFに出会うか、またはs[0]-1文字を入力するとその処理を終了
    します。CR/LFはsには格納されません。そして、入力された文字列の最後に
    ナル文字('_0')を加えます。

【リターン値】

    入力された文字列へのポインタ、つまり&s[2]を返します。

【可搬性】

    MS-DOS

【参照】

    cputs(3)

























                                 - 77 -                                 




LSI C-86 Reference Manual                                       CHDIR(3)


【名前】

    chdir - カレントディレクトリの移動

【書式】

    #include <direct.h>
    int chdir(const char *pathname);

【解説】

    chdir()はカレントディレクトリをpathnameに変更します。

    chdir() は、どのドライブのカレントディレクトリでも変更できますが、カ
    レントドライブそのものを変更することはできません。

【リターン値】

    成功すれば0を返します。失敗すれば0以外の値を返し、errno をセットしま
    す。

【エラー】

    ENOENT
        パスが見つかりません

【可搬性】

    UNIX, MS-DOS

【参照】

    getcwd(3), mkdir(3), rmdir(3)

























                                 - 78 -                                 




LSI C-86 Reference Manual                                    CHKCTYPE(3)


【名前】

    chkctype, nthctype - 文字種の判定

【書式】

    #include <jctype.h>
    int chkctype(char c, int type);
    int nthctype(const char *p, int n);

【解説】

    chkctype() は1バイトコード/2バイトコードのまじっている文字列を走査す
    るのに使います。この関数は文字cと状態変数typeをもらって、 次のいずれ
    かの値を返します。

    CT_ANK
        cは1バイトコードです

    CT_KJ1
        cは2バイトコードの1バイト目です

    CT_KJ2
        cは2バイトコードの2バイト目です

    CT_ILGL
        不正なコードが2バイト目にありました

    chkctype()  の返す値は次の呼び出しのときの状態変数として渡してくださ
    い。

    nthctype()は1バイトコード/2バイトコードのまじっている文字列pのうち、
    n文字目の種別をchkctype()と同様に返します。

【可搬性】

    MS-DOS, ROM

【参照】

    ctype(3), iskana(3)

















                                 - 79 -                                 




LSI C-86 Reference Manual                                       CHMOD(3)


【名前】

    chmod - ファイル属性の設定

【書式】

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <io.h>
    int chmod(const char *pathname, int mode);

【解説】

    chmod() はファイルpathnameのモードをmodeに変更します。modeには以下の
    指定ができます。

    S_IWRITE
        書き込み可能

    S_IREAD
        読み出し可能(リードオンリーファイル)

    S_IREAD | S_IWRITE
        読み書き可能

    ただし、MS-DOSではファイルを読み出し禁止にはできませんので、S_IWRITE
    とS_IREAD | S_IWRITEとは等価になります。

【リターン値】

    変更に成功したときは0を返します。失敗したときには 0 以外の値を返し、
    errnoをセットします。

【エラー】

    ENOENT
        ファイルが存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    access(3), umask(3)













                                 - 80 -                                 




LSI C-86 Reference Manual                                      CHSIZE(3)


【名前】

    chsize - ファイルの大きさの変更

【書式】

    #include <io.h>
    int chsize(int fd, long size);

【解説】

    chsize()はfdで示されるファイルの大きさをsizeに変更します。

    ファイルを大きくするときにはファイルの最後に 0で初期化されたデータを
    追加します。小さくするときには短くなった部分は切り捨てられますので注
    意してください。

    ファイルfdは書き込み可でオープンされていなければなりません。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、-1を返します。

【エラー】

    EACCES
        リードオンリーファイルです。またはディスクに残り容量がありません

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    MS-DOS

【参照】

    truncate(3), filelength(3), open(3), creat(3)




















                                 - 81 -                                 




LSI C-86 Reference Manual                                    CLEARERR(3)


【名前】

    clearerr - エラー状態のクリア

【書式】

    #include <stdio.h>
    void clearerr(FILE *fp);

【解説】

    clearerr()はファイルポインタfpで指定されるファイルのエラーであるとい
    う状態とEOFであるという状態をクリアします。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    ferror(3), feof(3)





































                                 - 82 -                                 




LSI C-86 Reference Manual                                       CLOSE(3)


【名前】

    close - ファイルのクローズ

【書式】

    #include <io.h>
    int close(int fd);

【解説】

    close()はファイルハンドルfdで示されるファイルをクローズし、 そのハン
    ドルを他のファイルに使用できるように解放します。

【リターン値】

    成功した場合には0を返します。失敗したときには-1を返してerrnoにエラー
    の種類をセットします。

【エラー】

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    open(3), creat(3)



























                                 - 83 -                                 




LSI C-86 Reference Manual                                     CPRINTF(3)


【名前】

    cprintf, cscanf - 書式つき入出力変換

【書式】

    #include <conio.h>
    int cprintf(const char *format,...);
    int cscanf(const char *format, ...);

【解説】

    cprintf()はprintf(3)と同じ機能を持つ関数ですが、出力先はコンソールで
    す。formatについての詳細はprintf(3)を参照してください。

    cscanf()はscanf(3)と同じ機能を持つ関数ですが、入力はコンソールからと
    られます。formatについての詳細はscanf(3)を参照してください。

【リターン値】

    cprintf() は出力された文字数を返します。 エラーのときにはEOFを返しま
    す。

    cscanf()は正常に変換され、代入されたパラメタの数を返します。エラーま
    たはEOFのときにはEOFを返します。

【可搬性】

    MS-DOS

【参照】

    printf(3), scanf(3)

























                                 - 84 -                                 




LSI C-86 Reference Manual                                       CPUTS(3)


【名前】

    cputs - コンソールへの文字列の出力

【書式】

    #include <conio.h>
    void cputs(const char *s);

【解説】

    cputs()はコンソールに文字列sを出力します。'\n'のCR/LF への展開はされ
    ません。

【可搬性】

    MS-DOS

【参照】

    cgets(3)





































                                 - 85 -                                 




LSI C-86 Reference Manual                                       CREAT(3)


【名前】

    creat - 新しいファイルの作成

【書式】

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <io.h>
    int creat(const char *path, int mode);

【解説】

    creat() はpathで指定されたファイルをアクセス許可mode(umask(3)参照)で
    作成し、書き込みモードでオープンします。

    すでにpathで示されるファイルが存在するときにはファイル長は0 となり、
    そのファイルの内容は失われます。

        creat(path, mode);

    は

        open(path, O_CREAT | O_TRUNC | O_WRONLY, mode);

    と等価です。

    modeはpathで指定したファイルが存在しないときに使用され、ファイルの保
    護モードを指定します。<sys/stat.h>で定義されている定数を使って次のよ
    うに指定します。

    S_IWRITE
        書き込み可

    S_IREAD
        読み出し可(リードオンリーファイルを作ります)

    S_IREAD | S_IWRITE
        読み書き可

    MS-DOS ではライトオンリーのファイルは作成できませんので、 S_IWRITEと
    S_IREAD | S_IWRITEとは同じ意味となり、いずれもリードライト可能なファ
    イルになります。

    modeの値は実際に使用される前にumask(3)で設定されている値でマスクされ
    ます。詳しくはumask(3)を参照してください。

【リターン値】

    正常終了するとファイルハンドル(負でない整数値)を返します。エラーを検
    出すると-1を返し、エラーの種類をerrnoにセットします。

【エラー】

    EACCES
        アクセスが拒否されました( リードオンリーのファイルやディレクトリ


                                 - 86 -                                 




LSI C-86 Reference Manual                                       CREAT(3)


        だった)

    EMFILE
        オープンされているファイルの数が多すぎます

    ENOENT
        pathの先行するパス名が存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    open(3), close(3), umask(3)

【バグ】

    unixのman(マニュアル)では「creat()はopen()によってもはや『時代遅れ』
    となった」 とされています。したがって、creat()のかわりにopen()を使用
    するのが望ましいでしょう。





































                                 - 87 -                                 




LSI C-86 Reference Manual                                       CTIME(3)


【名前】

    localtime, gmtime, asctime, ctime, mktime, difftime - 時刻データの変
    換

【書式】

    #include <time.h>
    struct tm *localtime(const time_t *t);
    struct tm *gmtime(const time_t *t);
    char *asctime(const struct tm *tm);
    char *ctime(const time_t *t);
    time_t mktime(struct tm *tm);
    double difftime(time_t t1, time_t t2);

【解説】

    これらの関数は時刻データの変換をおこないます。

    localtime()はtの指すtime_t型の時刻(UTCでの1970/1/1 00:00:00 からの通
    算秒数 ) をstruct tm型に変換し、そのアドレスを返します。返される構造
    体の内容はUTCではなく、ローカルタイムです。struct tmは<time.h>で以下
    のように定義されています。

        struct  tm {
                int  tm_sec;    /* 秒(0-59) */
                int  tm_min;    /* 分(0-59) */
                int  tm_hour;   /* 時(0-23) */
                int  tm_mday;   /* 日(1-31) */
                int  tm_mon;    /* 月(0-11) */
                int  tm_year;   /* 西暦年-1900 */
                int  tm_wday;   /* 曜日(0-6) */
                int  tm_yday;   /* 通算日数(0-365) */
                int  tm_isdst;  /* サマータイムフラグ */
        };

    tm_isdstフィールドは、サマータイムを実施中ならば0 以外の値がセットさ
    れます。

    gmtime()   は時刻をローカルタイムでなく   UTC   で表現する点を除いて
    localtime()とほぼ同様の働きをします。

    asctime()はtmの指すstruct tm型の時刻データを、次のような26バイトの文
    字列に変換します。

        Wed Feb 17 20:14:04 1988\n\0

    ctime()はtの指すtime_t型の時刻データを、asctime()と同じ26 バイトの文
    字列に変換します。これは、

        asctime(localtime(t));

    と同じです。

    mktime() はtmの指すstruct tm型の時刻データを、time_t型に変換して返し
    ます。この値はstime(3)に渡して時刻設定に使うことができます。


                                 - 88 -                                 




LSI C-86 Reference Manual                                       CTIME(3)



    difftime()はtime_t型の時刻データの差を返します。t1 - t2 の値を秒単位
    にスケーリングして返します。

【リターン値】

    localtime(), gmtime()は変換されたstruct tm型データのアドレスを返しま
    す。

    asctime(), ctime()は変換された文字列の先頭アドレスを返します。

    mktime()はtime_t型の時刻を返します。

    difftime()はdouble型で表現された秒単位の差を返します。

【可搬性】

    mktime()
        ANSI, MS-DOS

    上記以外
        ANSI, UNIX, MS-DOS

【参照】

    TZ(3), time(3)

【バグ】

    localtime(),  gmtime(), asctime(), ctime()は内部に持っているstaticな
    文字配列のアドレスを返します。したがってこれらを続けて呼ぶと、以前の
    データは破壊されます。


























                                 - 89 -                                 




LSI C-86 Reference Manual                                       CTYPE(3)


【名前】

    ctype,   isalpha,   isupper,  islower,  isdigit,  isspace,  isalnum,
    iscntrl,  isgraph,  isprint,  ispunct,  isxdigit,  isascii, iscsymf,
    iscsym - 文字種の判定

【書式】

    #include <ctype.h>
    int isalpha(char c);
    int isupper(char c);
    int islower(char c);
    int isdigit(char c);
    int isspace(char c);
    int isalnum(char c);
    int iscntrl(char c);
    int isgraph(char c);
    int isprint(char c);
    int ispunct(char c);
    int isxdigit(char c);
    int isascii(char c);
    int iscsymf(char c);
    int iscsym(char c);

【解説】

    is...マクロは文字cがそれぞれ以下の条件を満足するかどうかテストし、条
    件を満たすならば0以外の値を、満たさなければ0を返します。

    isalpha()
        アルファベット('A' - 'Z', 'a' - 'z')かどうか

    isupper()
        英大文字('A' - 'Z')かどうか

    islower()
        英小文字('a' - 'z')かどうか

    isdigit()
        数字('0' - '9')かどうか

    isspace()
        空白文字(スペース、水平タブ'\t'、改行'\n'、復帰 '\r' 、 改ページ
        '\f'、垂直タブ'\v')かどうか

    isalnum()
        アルファベットまたは数字かどうか

    iscntrl()
        コントロール文字(0x00 - 0x1F、0x7F)かどうか

    isgraph()
        スペースを除く印字できる文字かどうか

    isprint()
        印字できる文字かどうか


                                 - 90 -                                 




LSI C-86 Reference Manual                                       CTYPE(3)



    ispunct()
        区切り文字 (アルファベット、数字及びスペースをのぞく印字できる文
        字)かどうか

    isxdigit()
        16 進数用の文字(数字、'A' - 'F', 'a' - 'f')かどうか

    isascii()
        アスキー文字(0x00 - 0x7F)かどうか

    iscsymf()
        Cの識別子の1文字目(アルファベットもしくは'_')かどうか

    iscsym()
        Cの識別子の2文字目以降(アルファベット、数字もしくは'_')かどうか

    これらは関数ではなく、<ctype.h> でパラメタ付きマクロとしてインプリメ
    ントされています。

【可搬性】

    isascii()
        UNIX, MS-DOS, ROM

    iscsymf()
        MS-DOS, ROM

    iscsym()
        MS-DOS, ROM

    上記以外
        ANSI, UNIX, MS-DOS, ROM

























                                 - 91 -                                 




LSI C-86 Reference Manual                                          DI(3)


【名前】

    di, ei - 割り込み禁止・許可

【書式】

    #include <machine.h>
    void di(void);
    void ei(void);

【解説】

    di()は8086のCLI命令を実行し、割り込みを禁止します。

    ei()は8086のSTI命令を実行し、割り込みを許可します。

【可搬性】

    MS-DOS, ROM







































                                 - 92 -                                 




LSI C-86 Reference Manual                                         DIV(3)


【名前】

    div, ldiv - 整数除算

【書式】

    #include <stdlib.h>
    div_t div(int num, int denom);
    ldiv_t ldiv(long num, long denom);

【解説】

    div(),  ldiv()はnumをdenomで割った商と余りを求めます。結果は、それぞ
    れdiv_t=, ldiv_t 型の構造体で返します。

    div_t, ldiv_t型構造体は<stdlib.h>の中で次のように定義されています。

        typedef struct  {
                int     quot;    /* 商   */
                int     rem;     /* 余り */
        }       div_t;

        typedef struct  {
                long    quot;    /* 商   */
                long    rem;     /* 余り */
        }       ldiv_t;

    商の符号はnumとdenomの符号が同じときには正、異なるときには負になりま
    す。余りの符号はnumの符号と同じになります。

【リターン値】

    div()は商と余りをdiv_t型構造体に代入して返します。

    ldiv()は商と余りをldiv_t型構造体に代入して返します。

【可搬性】

    ANSI, MS-DOS, ROM



















                                 - 93 -                                 




LSI C-86 Reference Manual                               _DOS_ALLOCMEM(3)


【名前】

    _dos_allocmem, _dos_freemem, _dos_setblock - MS-DOSメモリ管理

【書式】

    #include <dos.h>
    unsigned _dos_allocmem(unsigned size, unsigned *seg);
    unsigned _dos_freemem(unsigned seg);
    unsigned  _dos_setblock(unsigned  size,   unsigned  seg,    unsigned
    *maxsize);

【解説】

    _dos_allocmem() はMS-DOSシステムコール0x48によってsizeパラグラフのメ
    モリブロックを割り当てます。成功すると*segにそのセグメントディスクリ
    プタをセットします。失敗すると*segには割り当て可能な最大のパラグラフ
    数をセットします。

    _dos_freemem()は_dos_allocmem()によって割り当てられたsegで示されるメ
    モリブロックを解放します。MS-DOSシステムコール0x49を実行します。

    _dos_setblock()はMS-DOSシステムコール0x4Aを実行し、_dos_allocmem()に
    よって割り当てられたseg で示されるメモリブロックのパラグラフサイズを
    sizeに変更します。失敗すると*maxsizeに使用可能な最大のパラグラフ数を
    セットします。

【リターン値】

    それぞれ、成功すると0を返します。失敗するとerrnoをセットし、MS-DOSの
    エラーコードを返します。

【エラー】

    ENOMEM
        メモリが不足しました

    ENOMEM
        MCB が破壊されています

    ENOMEM
        セグメントディスクリプタが不正です

【可搬性】

    MS-DOS

【参照】

    malloc(3)








                                 - 94 -                                 




LSI C-86 Reference Manual                                  _DOS_CLOSE(3)


【名前】

    _dos_close - ファイルのクローズ

【書式】

    #include <dos.h>
    unsigned _dos_close(int handle);

【解説】

    _dos_close()はMS-DOSシステムコール0x3Eによってhandleで示されるファイ
    ルをクローズします。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    EBADF
        ファイルハンドルhandleが無効です

【可搬性】

    MS-DOS

【参照】

    _dos_open(3), _dos_creat(3), _dos_creatnew(3), close(3)



























                                 - 95 -                                 




LSI C-86 Reference Manual                                  _DOS_CREAT(3)


【名前】

    _dos_creat, _dos_creatnew - ファイルの作成

【書式】

    #include <dos.h>
    unsigned _dos_creat(const char *path, unsigned attr, int *handle);
    unsigned  _dos_creatnew(const  char  *path,   unsigned  attr,    int
    *handle);

【解説】

    _dos_creat()はMS-DOSシステムコールの0x3Cを実行し、pathで指定した長さ
    0 の新たなファイルを作成します。attrは作成されるファイルの属性を指定
    し、<dos.h>で定義されている次の値を論理和してあたえます。

    _A_NORMAL
        通常のファイル

    _A_RDONLY
        読み出し専用ファイル

    _A_HIDDEN
        隠しファイル

    _A_SYSTEM
        システムファイル

    ファイルの作成に成功すると*handle にファイルハンドルをセットします。
    作成されたファイルは読み書きともに可能でオープンされます。すでに同名
    のファイルが存在している場合には、 長さは0になりますがファイルの属性
    は変化しません。

    _dos_creatnew()はMS-DOSシステムコール0x5Bを実行します。 パラメタのあ
    つかいは_dos_creat()と同様ですが、すでにファイルpathが存在していると
    きには失敗します。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットしてMS-DOSのエラーコー
    ドを返します。

【エラー】

    ENOENT
        先行するパスが存在しません

    EMFILE
        オープンされているファイルが多すぎます

    EACCES
        書き込み禁止ファイルが存在します

    EACCES
        ルートディレクトリに空きがありません


                                 - 96 -                                 




LSI C-86 Reference Manual                                  _DOS_CREAT(3)



    EEXIST
        同名のファイルがすでに存在します

【可搬性】

    MS-DOS

【参照】

    _dos_close(3), _dos_open(3), creat(3)















































                                 - 97 -                                 




LSI C-86 Reference Manual                              _DOS_FINDFIRST(3)


【名前】

    _dos_findfirst, _dos_findnext - ファイルの検索

【書式】

    #include <dos.h>
    unsigned  _dos_findfirst(const  char  *path,  unsigned attr,  struct
    find_t *buffer);
    unsigned _dos_findnext(struct find_t *buffer);

【解説】

    _dos_findfirst()はMS-DOSシステムコール0x4Eを実行し、pathとattrに一致
    する最初のファイルを探します。

    pathには検索したいファイル名を指定します。MS-DOSのワイルドカード文字
    ('*', '?')を使用できます。

    attrには検索したいファイルの属性を<dos.h> で定義されている次の値を論
    理和してあたえます。

    _A_NORMAL
        通常のファイル

    _A_HIDDEN
        隠しファイル

    _A_SYSTEM
        システムファイル

    _A_VOLID
        ボリュームID

    _A_SUBDIR
        サブディレクトリ

    最初に一致したファイルの情報は *bufferにセットされます。find_t型構造
    体は<dos.h>で次のように定義されています。

        struct  find_t  {
                char    reserved[21];
                char    attrib;        /* 属性           */
                unsigned wr_time;      /* 修正時刻       */
                unsigned wr_date;      /* 修正日付       */
                long    size;          /* ファイルサイズ */
                char    name[13];      /* ファイル名     */
        };

    _dos_findnext()はMS-DOSシステムコール0x4Fによって_dos_findfirst() で
    指定したファイルの検索を続行します。bufferは_dos_findfirst()によって
    正しく設定されていなければなりません。次に一致するファイルを見つける
    と、*bufferにはそのファイルの情報がセットされます。

【リターン値】



                                 - 98 -                                 




LSI C-86 Reference Manual                              _DOS_FINDFIRST(3)


    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    ENOENT
        ファイルがありません

【可搬性】

    MS-DOS















































                                 - 99 -                                 




LSI C-86 Reference Manual                                _DOS_GETDATE(3)


【名前】

    _dos_getdate, _dos_setdate - 日付の取得・設定

【書式】

    #include <dos.h>
    void _dos_getdate(struct dosdate_t *date);
    unsigned _dos_setdate(struct dosdate_t *date);

【解説】

    _dos_getdate()はMS-DOSシステムコール0x2Aを実行し、システムの現在の日
    付を得て *dateにセットします。dosdate_t型構造体は<dos.h>で次のように
    定義されています。

        struct  dosdate_t       {
                unsigned char   day;       /* 日(1-31)        */
                unsigned char   month;     /* 月(1-12)        */
                unsigned int    year;      /* 年(1980-2099)   */
                unsigned char   dayofweek; /* 曜日(0:日曜...) */
        };

    _dos_getdate()はMS-DOSシステムコール0x2Bを実行し、システムの現在の日
    付を*dateで示される値に変更します。メンバdayofweekは無視されます。

【リターン値】

    _dos_setdate()は、成功すると0を返します。失敗するとerrnoをセットし、
    MS-DOS のエラーコードを返します。

【エラー】

    EINVAL
        パラメタが不正です

【可搬性】

    MS-DOS

【参照】

    _dos_gettime(3)















                                - 100 -                                 




LSI C-86 Reference Manual                            _DOS_GETDISKFREE(3)


【名前】

    _dos_getdiskfree - ディスクの残り容量の取得

【書式】

    #include <dos.h>
    unsigned   _dos_getdiskfree(unsigned   device,    struct  diskfree_t
    *diskspace);

【解説】

    _dos_getdiskfree()はMS-DOSシステムコール0x36を実行し、ディスクドライ
    ブdeviceの情報を得ます。deviceはカレントドライブは0、A:は1、B:は2...
    と指定します。得られた情報は*diskspaceにセットされます。

    diskfree_t型構造体は<dos.h>で次のように定義されています。

        struct  diskfree_t      {
                unsigned     total_clusters;    /*    総クラスタ数    */
                unsigned   avail_clusters;   /*   使用可能クラスタ数  */
                unsigned sectors_per_cluster; /*  クラスタあたりのセクタ
        数 */
                unsigned  bytes_per_sector; /* セクタあたりのバイト数 */
        };

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    EINVAL
        パラメタが不正です

【可搬性】

    MS-DOS

【参照】

    _dos_getdrive(3)















                                - 101 -                                 




LSI C-86 Reference Manual                               _DOS_GETDRIVE(3)


【名前】

    _dos_getdrive, _dos_setdrive - カレントドライブの取得・設定

【書式】

    #include <dos.h>
    void _dos_getdrive(unsigned *drive);
    void _dos_setdrive(unsigned drivenum, unsigned *drives);

【解説】

    _dos_getdrive()は、MS-DOSのシステムコール0x19を実行し、 カレントドラ
    イブ番号を取得して*driveにセットします。A:は1、B:は2...となります。

    _dos_setdrive() は、MS-DOSシステムコール0x0Eを実行し、カレントドライ
    ブをパラメタdrivenumに渡されたものにします。A:は1、B:は2... のように
    指定します。 *drivesにはシステムに接続されているドライブ数がセットさ
    れます。

【可搬性】

    MS-DOS

【参照】

    _dos_getdiskfree(3)































                                - 102 -                                 




LSI C-86 Reference Manual                            _DOS_GETFILEATTR(3)


【名前】

    _dos_getfileattr, _dos_setfileattr - ファイル属性の取得・設定

【書式】

    #include <dos.h>
    unsigned _dos_getfileattr(const char *path, unsigned *attr);
    unsigned _dos_setfileattr(const char *path, unsigned attr);

【解説】

    _dos_getfileattr()はMS-DOSシステムコール0x43を実行し、ファイルpathの
    属性を得て*attrへセットします。

    attrは以下の値の論理和になっており、<dos.h>で定義されています。

    _A_NORMAL
        通常のファイル

    _A_RDONLY
        読み出し専用ファイル

    _A_HIDDEN
        隠しファイル

    _A_SYSTEM
        システムファイル

    _A_VOLID
        ボリュームID

    _A_SUBDIR
        サブディレクトリ

    _A_ARCH
        アーカイブ

    _dos_setfileattr()はMS-DOSシステムコール0x43を実行し、pathで示される
    ファイルの属性をattrに変更します。attrは上記の値を論理和してあたえま
    す。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    ENOENT
        ファイルがありません

    EACCES
        ファイルが書き込み禁止です

【可搬性】


                                - 103 -                                 




LSI C-86 Reference Manual                            _DOS_GETFILEATTR(3)



    MS-DOS
























































                                - 104 -                                 




LSI C-86 Reference Manual                               _DOS_GETFTIME(3)


【名前】

    _dos_getftime, _dos_setftime - ファイルのタイムスタンプの取得・設定

【書式】

    #include <dos.h>
    unsigned _dos_getftime(int handle, unsigned *date, unsigned *time);
    unsigned _dos_setftime(int handle, unsigned date, unsigned time);

【解説】

    _dos_getftime()はMS-DOSシステムコール0x57を実行し、handle で示される
    ファイルが最後に更新された日時を取得し*date, *timeにセットします。

    dos_setftime()はMS-DOSシステムコール0x57を実行し、handleで示されるフ
    ァイルの更新日時を*date, *timeにセットされている値に変更します。

    日付を表すワードは次のように構成されています。

    ビット0 - 4
        日(1 - 31)

    ビット5 - 8
        月(1 - 12)

    ビット9 - 15
        年(1980 - 2099)

    時刻を表すワードは次のように構成されています。

    ビット0 - 4
        秒/2(0 - 29)

    ビット5 - 10
        分(0 - 59)

    ビット11 - 15
        時(0 - 23)

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    EBADF
        ファイルハンドルhandleが無効です

【可搬性】

    MS-DOS





                                - 105 -                                 




LSI C-86 Reference Manual                                _DOS_GETTIME(3)


【名前】

    _dos_gettime, _dos_settime - システムの現在の時刻の取得・設定

【書式】

    #include <dos.h>
    void _dos_gettime(struct dostime_t *time);
    unsigned _dos_settime(struct dostime_t *time);

【解説】

    _dos_gettime()はMS-DOSシステムコール0x2Cを実行し、システムの現在の時
    刻を得て *timeにセットします。dostime_t型構造体は<dos.h>で次のように
    定義されています。

        struct  dostime_t       {
                unsigned char hour;    /* 時(0-23) */
                unsigned char minute;  /* 分(0-59) */
                unsigned char second;  /* 秒(0-59) */
                unsigned char hsecond; /* 1/100秒(0-99) */
        };

    _dos_settime()はMS-DOSシステムコール0x2Dを実行し、システムの現在の時
    刻を*timeが示す値にします。

【リターン値】

    _dos_settime()は、成功すると0を返します。失敗するとerrnoをセットし、
    MS-DOSのエラーコードを返します。

【エラー】

    EINVAL
        パラメタが不正です

【可搬性】

    MS-DOS

【参照】

    _dos_getdate(3)















                                - 106 -                                 




LSI C-86 Reference Manual                                _DOS_GETVECT(3)


【名前】

    _dos_getvect, _dos_setvect - 割り込みベクタの取得・設定

【書式】

    #include <dos.h>
    void (far *_dos_getvect(unsigned intnum))();
    void _dos_setvect(unsigned intnum, void (far *handler)());

【解説】

    _dos_getvect()はMS-DOSシステムコール0x35を実行し、intnumで示される割
    り込みベクタの内容をfarポインタとして返します。

    _dos_setvect()はMS-DOSシステムコール0x25を実行し、intnumで示される割
    り込みベクタをhandlerに設定します。

【可搬性】

    MS-DOS

【バグ】

    _dos_setvect()で設定するハンドラは8086のIRET命令で終了しなければなり
    ません。したがって、この関数でインストールできるのはアセンブリ言語で
    書かれたサブルーチンに限定されます。































                                - 107 -                                 




LSI C-86 Reference Manual                                   _DOS_KEEP(3)


【名前】

    _dos_keep - プログラムの常駐終了

【書式】

    #include <dos.h>
    void _dos_keep(unsigned retcode, unsigned memsize);

【解説】

    _dos_keep()はMS-DOSシステムコール0x31を実行し、 プログラムを常駐終了
    させます。 このとき、 プログラムのメモリサイズを memsizeパラグラフに
    し、親プロセスにretcodeの下位バイトを終了コードとして返します。

【リターン値】

    この関数からは決してリターンしません。

【可搬性】

    MS-DOS

【バグ】

    常駐時のメモリサイズを計算する簡単な方法はありません。
































                                - 108 -                                 




LSI C-86 Reference Manual                                   _DOS_OPEN(3)


【名前】

    _dos_open - ファイルのオープン

【書式】

    #include <dos.h>
    #include <fcntl.h>
    unsigned _dos_open(const char *path, unsigned mode, int *handle);

【解説】

    _dos_open()はMS-DOSシステムコール0x3Dを実行し、path で示されるファイ
    ルをアクセスモード modeでオープンします。modeは<dos.h>とfcntl.h>で定
    義されている次の値を論理和してあたえます。

    O_RDONLY
        読み出しのみ可

    O_WRONLY
        書き込みのみ可

    O_RDWR
        読み書き共に可

    SH_COMPAT
        互換モード

    SH_DENYRW
        共有して読み書きとも不可

    SH_DENYWR
        共有して書き込み不可

    SH_DENYRD
        共有して読み出し不可

    SH_DENYNONE
        共有して読み書きとも可

    O_NOINHERIT
        子プロセスに継承しません

    オープンされたファイルハンドルは*handleにセットされます。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    EINVAL
        パラメタが不正です

    EINVAL


                                - 109 -                                 




LSI C-86 Reference Manual                                   _DOS_OPEN(3)


        ファイルシェアリング機能が使用できません

    ENOENT
        ファイルがありません

    EMFILE
        オープンされているファイルが多すぎます

    EACCES
        アクセスできません(pathがディレクトリでした。 あるいはファイルが
        書き込み禁止でした)

【可搬性】

    MS-DOS

【参照】

    _dos_creat(3), _dos_close(3)







































                                - 110 -                                 




LSI C-86 Reference Manual                                   _DOS_READ(3)


【名前】

    _dos_read - ファイルの読み出し

【書式】

    #include <dos.h>
    unsigned _dos_read(int handle, void far *buf, unsigned cnt, unsigned
    *bytes);

【解説】

    _dos_read() はMS-DOSシステムコール0x3Fを実行し、handleで示されるファ
    イルからbufで示されるデータバッファへcntバイトだけ読み出します。実際
    に読み出されたバイト数が*bytesにセットされます。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットして、 MS-DOS のエラー
    コードを返します。

【エラー】

    EBADF
        ファイルハンドルhandleが不正です

    EACCES
        ファイルが読み出し不可でオープンされています

【可搬性】

    MS-DOS

【参照】

    _dos_write(3), _dos_open(3)






















                                - 111 -                                 




LSI C-86 Reference Manual                                  _DOS_WRITE(3)


【名前】

    _dos_write - ファイルの書き込み

【書式】

    #include <dos.h>
    unsigned _dos_write(int handle,  const void far *buf,  unsigned cnt,
    unsigned *bytes);

【解説】

    _dos_write()はMS-DOSシステムコール0x40 を実行し、データバッファbufか
    ら cntで示されるバイト数をファイルhandleに書き込みます。実際に書き込
    まれたバイト数を*bytesにセットします。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、MS-DOSのエラーコー
    ドを返します。

【エラー】

    EBADF
        ファイルハンドルhandleが不正です

    EACCES
        ファイルは書き込み不可でオープンされています

    EACCES
        ファイルは書き込み禁止です

【可搬性】

    MS-DOS

【参照】

    _dos_open(3), _dos_read(3)



















                                - 112 -                                 




LSI C-86 Reference Manual                                   DOSEXTERR(3)


【名前】

    dosexterr - 拡張エラー情報の取得

【書式】

    #include <dos.h>
    int dosexterr(struct DOSERROR *buffer);

【解説】

    dosexterr()はシステムコール0x59によってMS-DOS の拡張エラーコードを得
    ます。得られたレジスタの値は*bufferにセットされます。

    DOSERROR型構造体は<dos.h>で次のように定義されています。

        struct  DOSERROR {
                int  exterror; /* 拡張エラーコード(AX)   */
                char class;    /* エラークラス(BH)       */
                char action;   /* 推奨される訂正措置(BL) */
                char locus;    /* エラーの発生箇所(CH)   */
        };

    buffer がNULLの場合には、得られた値は捨てられます。AXレジスタの値(拡
    張エラーコード)だけが必要な場合にNULLをあたえます。

【リターン値】

    MS-DOSがセットしたAXレジスタの値を返します。

【可搬性】

    MS-DOS

【参照】

    MS-DOS Programmer's Referrence





















                                - 113 -                                 




LSI C-86 Reference Manual                                         DUP(3)


【名前】

    dup, dup2 - ファイルハンドルの複製

【書式】

    #include <io.h>
    int dup(int fd);
    int dup2(int oldfd, int newfd);

【解説】

    dup(), dup2()はファイルハンドルをコピーします。

    dup()はすでにオープンされているハンドルfdをコピーし、 新しいハンドル
    を返します。

    dup2()はすでにオープンされているハンドルoldfdを新しいハンドルnewfdに
    コピーします。 newfd がすでにオープンされていれば、 先にクローズしま
    す。

【リターン値】

    dup(), dup2()は新しいハンドルを返します。コピーに失敗したときはerrno
    をセットし、-1を返します。

【エラー】

    EMFILE
        オープンされているファイルが多すぎます

    EBADF
        ファイルハンドルが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    open(3), creat(3), close(3)

















                                - 114 -                                 




LSI C-86 Reference Manual                                        ECVT(3)


【名前】

    ecvt, fcvt, gcvt - 浮動小数点数から文字列への変換

【書式】

    #include <stdlib.h>
    char *ecvt(double val, int prec, int *decpt, int *sign);
    char *fcvt(double val, int prec, int *decpt, int *sign);
    char *gcvt(double val, int prec, char *buf);

【解説】

    ecvt(), fcvt(), gcvt()は、浮動小数点数valを文字列に変換します。

    ecvt()はvalをprec桁の文字列に変換します。変換結果がprec 桁をこえる場
    合には丸めが実行され、 たりない場合には末尾に'0'を加えてprec桁にしま
    す。文字列の終端にはナル文字('\0')を付加します。

    変換された文字列は数字だけで構成されており、符号や小数点は含んでいま
    せん。valueが0.0または正のときには*signには0をセットし、負のときには
    0 でない値をセットします。 *decpt は文字列のどこに小数点があるかを示
    し、 文字列の先頭から数えた小数点の位置です。0は文字列の直前を示し、
    負の場合は文字列の左側にあることを示します。

    fcvt()はprecが小数点以下の桁数を指定すること以外はecvt()と同じです。

    gcvt()はvalを文字列に変換し、bufが指している領域へ格納します。buf に
    は変換後の文字列を格納するのに十分な大きさを確保しておかなければなり
    ません。precで変換の有効桁数を指定します。

    gcvt() は printf(3) の %g変換とよく似た動作をします。valの値によって
    [-]ddd.ddd形式と[-]d.ddde[+|-]dd形式とを切り換えます。小数部の末尾に
    0が続く場合、その0は削除されます。小数部に数字がない場合には小数点は
    付加されません。

【リターン値】

    ecvt(), fcvt()は内部の文字列バッファの先頭アドレスを返します。

    gcvt()はパラメタbufをそのまま返します。

【可搬性】

    UNIX, MS-DOS, ROM

【参照】

    atof(3), strtod(3), printf(3)

【バグ】

    ecvt()とfcvt()が変換された文字列を格納するバッファは互いに共有してい
    る内部の静的領域です。したがってecvt(), fcvt()の呼び出しは以前のバッ
    ファの内容を書き換えます。



                                - 115 -                                 




LSI C-86 Reference Manual                                     ENVIRON(3)


【名前】

    environ, getenv, putenv - 環境変数の取得・設定

【書式】

    #include <stdlib.h>
    char **environ;
    char *getenv(const char *name);
    int putenv(const char *env);

【解説】

    グローバル変数  environ   は環境変数のリストの先頭を保持しています。
    main()の3番目のパラメタとしてenvpがあり、これはenvironがそのまま渡さ
    れます。 しかし、putenv()はenvironを変更することがありますので、envp
    を使用するよりもenvironを参照する方が望ましいでしょう。

    getenv()は現在の環境のリストを探索してnameという名前の環境変数の値を
    返します。環境変数はMS-DOSのSETコマンドで設定されたものか、 putenv()
    によって設定されたものです。

    putenv()はenvで指定される環境変数を登録します。envが指す文字列は

        NAME=value

    の形をしていなければなりません。 ただし、valueは省略することができま
    す。

    putenv()によって登録された環境変数はspawn(3)やexec(3) によって生成さ
    れた子プロセスに渡されます。

    putenv()を実行したプロセスが終了したときにはputenv()によって設定され
    た環境変数は消滅します。putenv()によって親プロセスの環境変数を変化さ
    せることはできません。

【リターン値】

    getenv()は環境変数の値を返します。もし、nameという変数が見つからなか
    ったときはNULLを返します。

    putenv() は正常に処理が実行されたときには0を、失敗したときには-1を返
    します。

【可搬性】

    getenv()
        ANSI, UNIX, MS-DOS

    putenv()
        UNIX, MS-DOS

【参照】

    spawn(3), exec(3)



                                - 116 -                                 




LSI C-86 Reference Manual                                         EOF(3)


【名前】

    eof - ファイルの終りの判定

【書式】

    #include <io.h>
    int eof(int fd);

【解説】

    eof()はファイルハンドルfd のリードライト位置がファイルの終端に達して
    いるかどうかを判定します。

【リターン値】

    ファイルの終端に達しているときには 0以外の値を返します。終端でなけれ
    ば0を返します。エラーを検出するとerrnoをセットし、-1を返します。

【エラー】

    EBADF
        fdが無効です

【可搬性】

    MS-DOS































                                - 117 -                                 




LSI C-86 Reference Manual                                       ERRNO(3)


【名前】

    errno, sys_errlist, sys_nerr - エラーを示すグローバル変数

【書式】

    #include <errno.h>
    extern int errno;
    extern char *sys_errlist[];
    extern int sys_nerr;

【解説】

    errno   はプログラムの実行時にライブラリ関数が検出したエラーを示しま
    す。

    errno はプログラムの実行を開始した時点で0に初期化されます。0はエラー
    がないことを示しています。なんらかのエラーが発生したときにはその種類
    にしたがって<errno.h>に定義されているエラー番号がセットされます。 続
    いて別のエラーが発生すると errno  には新たなエラー番号がセットされま
    す。このため、正確にエラーの種類を調べたい場合には、ライブラリ関数を
    コールした直後にerrnoを調べるようにしてください。

    また、 errno を0に再初期化するライブラリ関数はありません。再初期化は
    ユーザが実行して下さい。

    sys_errlistはエラーメッセージへのポインタの配列です。errnoを配列のイ
    ンデックスとして用いれば、エラー番号に対応するメッセージを得ることが
    できます。

    しかし、        エラーメッセージの文字列を求めるライブラリ関数として
    strerror(3)が用意されています。strerror(3)はANSIで定義されている標準
    関数ですから移植性の点からもstrerror(3) を利用するほうが望ましいと考
    えられます。

    sys_nerrは定義されているエラーが何種類あるかを示しています。

    errnoが表すエラー番号には以下のものがあります。

    E2BIG
        パラメタが長すぎる

    EACCES
        アクセスの否定 (ディスクが一杯、リードオンリーファイルへの書き込
        みetc.)

    EBADF
        無効なファイル番号

    EDOM
        パラメタが定義域にない

    EEXIST
        すでにファイルが存在する

    EINVAL


                                - 118 -                                 




LSI C-86 Reference Manual                                       ERRNO(3)


        パラメタが無効

    EMFILE
        オープンされているファイルが多すぎる

    ENODEV
        デバイス名が無効

    ENOENT
        パス名が無効

    ENOEXEC
        不正なフォーマット

    ENOMEM
        メモリが足りない

    ERANGE
        結果が範囲を越えた

    EXDEV
        同一デバイスではない

【可搬性】

    errno
        ANSI, UNIX, MS-DOS, ROM

    sys_errlist
        UNIX, MS-DOS, ROM

    sys_nerr
        UNIX, MS-DOS, ROM

【参照】

    strerror(3)





















                                - 119 -                                 




LSI C-86 Reference Manual                                        EXEC(3)


【名前】

    exec, execl, execlp, execv, execvp, execle, execlpe, execve, execvpe
    - プロセスの実行

【書式】

    #include <stdlib.h> or <process.h>
    int execl(const char *prog, ...);
    int execlp(const char *prog, ...);
    int execv(const char *prog, const char *const argv[]);
    int execvp(const char *prog, const char *const argv[]);
    int execle(const char *prog, ..., char *envp[]);
    int execlpe(const char *prog, ..., char *envp[]);
    int execve(const char *prog,  const char *const argv[],  const  char
    *const envp[]);
    int execvpe(const char *prog,  const char *const argv[],  const char
    *const envp[]);

【解説】

    exec(3) 一族の関数である execl(),   execlp(),   execv(),   execvp(),
    execle(),  execlpe(), execve(), execvpe() は、子プロセスを生成して実
    行します。ただしspawn(3)とは異なり、制御は戻ってきません。

    文字列progには実行すべきファイル名を与えます。ファイル名が拡張子を持
    たない場合には、execはまず.comを探し、次に.exeを探します。

    起動されるプログラムには、パラメタを渡すことができます。パラメタは文
    字列、  すなわち  char 型へのポインタでなくてはいけません。 execl(),
    execlp(), execle(), execlpe()では、第2パラメタ以降にパラメタを並べて
    渡します。execv(), execvp(), execve(), execvpe()では、文字型へのポイ
    ンタの配列argv の中にパラメタを設定します。 パラメタの終わりの印とし
    て、最後に必ずNULLを渡してください。コマンドラインの長さはMS-DOSによ
    って128文字までに制限されています。

    また、execle(),  execlpe(), execve(), execvpe() 関数には、環境変数文
    字列の配列envpを渡すことができます。

    execl(), execv(), execle(), execve()は、指定されたパス名のファイルを
    探して、    見つからなかったときにはプログラムの実行をあきらめます。
    execlp(), execvp(), execlpe(), execvpe()は、指定されたファイルが見つ
    からなかったときには環境変数 PATH 中のディレクトリを順に探しにいきま
    す。

    以上をまとめると、関数名のexecに続く文字で関数の動作を規定することが
    できます。

    l
        コマンドラインパラメタを並べて渡します

    v
        コマンドラインパラメタを配列で渡します

    p
        環境変数PATHを使って実行ファイルを探します


                                - 120 -                                 




LSI C-86 Reference Manual                                        EXEC(3)



    e
        子プロセスに環境変数の配列を渡します

    execを呼び出したときにオープンされていたファイルは、子プロセスが実行
    を開始したときにもオープンされたままになっています。必要であればexec
    を呼び出す前にファイルをクローズしてください。

【使用例】

    次の例はプログラムfoo.exeを起動して、bar,  zodというパラメタを与えま
    す。

        execl("foo.exe", "foo.exe", "bar", "zod", NULL);

    ここで

        char *argv[4];
        argv[0] = "foo.exe";
        argv[1] = "bar";
        argv[2] = "zod";
        argv[3] = NULL;

    となっている場合、次のexecv()の呼び出しは上記のexecl()の呼び出しと等
    価です。

        execv("foo.exe", argv);

【環境変数】

    PATH
        プログラムのサーチパスを指定します

【リターン値】

    プログラムの実行に成功したときは、制御は戻ってきません。実行に失敗し
    たときはerrnoをセットして-1を返します。

【エラー】

    ENOENT
        プログラムが見つかりません

    E2BIG
        コマンドラインが長すぎます

    ENOMEM
        プログラムの実行に必要な空きメモリがありません

    ENOEXEC
        progが実行可能フォーマットではありません

【可搬性】

    UNIX, MS-DOS



                                - 121 -                                 




LSI C-86 Reference Manual                                        EXEC(3)


【参照】

    abort(3), environ(3), exit(3), spawn(3)

【バグ】

    子プロセスに環境を渡す関数(execle(), execlpe(), execve(), execvpe())
    においては環境変数``COMSPEC=...''を必ず与えてください。 これを忘れる
    と MS-DOSがCOMMAND.COMをリロードできずに暴走する可能性があります。こ
    れはMS-DOSの制限です。
















































                                - 122 -                                 




LSI C-86 Reference Manual                                        EXIT(3)


【名前】

    exit - プログラムの終了

【書式】

    #include <stdlib.h> or <process.h>
    void exit(int n);

【解説】

    exit()はプログラムの実行を終了させます。

    exit()は、まずatexit(3)またはonexit(3)によって登録された関数を登録と
    は逆順に実行します。次にオープンされているすべてのファイルをクローズ
    し、プログラムを呼び出した親環境へ制御を移します。

    パラメタnはプログラムのリターンコードで、MS-DOS上ではIF ERRORLEVELに
    よってこの値を調べることができます。プログラムがspawn(3)から呼び出さ
    れていれば、n の値がspawn(3) の関数値となります。 正常終了のときには
    EXIT_SUCCESSを、異常終了のときにはEXIT_FAILUREをexit()に渡すことがで
    きます。 一般的にnの値が0のときは正常終了を、0以外のときは異常終了を
    表します。

【リターン値】

    exit()からは決してリターンしません。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    abort(3), atexit(3), onexit(3), spawn(3)























                                - 123 -                                 




LSI C-86 Reference Manual                                        EXP(3M)


【名前】

    exp, log, log10, pow - 指数・対数関数

【書式】

    #include <math.h>
    double exp(double x);
    double log(double x);
    double log10(double x);
    double pow(double x, double y);

【解説】

    exp()はe(自然対数の底)のx乗を返します。

    log()はxの自然対数(eを底とする対数)の値を返します。

    log10()はxの常用対数(10を底とする対数)の値を返します。

    pow()はxのy乗を返します。

【エラー】

    EDOM
        パラメタが定義域を超えています

    ERANGE
        結果が正確に表現できません

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    matherr(3)





















                                - 124 -                                 




LSI C-86 Reference Manual                                       FABS(3M)


【名前】

    fabs, fmod - 絶対値と剰余

【書式】

    #include <math.h>
    double fabs(double x);
    double fmod(double x, double y);

【解説】

    fabs()はxの絶対値を返します。

    fmod()はxをyで割った剰余を返します。これはx-i*yの値です。ここでiは整
    数で、結果はxと同じ符号を持ち、絶対値はyよりも小さくなります。yが0の
    ときにはfmod()は0を返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM





































                                - 125 -                                 




LSI C-86 Reference Manual                                   FARMALLOC(3)


【名前】

    farmalloc, farcalloc, farrealloc, farfree, farcoreleft - farメモリ管
    理

【書式】

    #include <dos.h>
    void far *farmalloc(unsigned long size);
    void far *farcalloc(unsigned long nelem, unsigned long size);
    void far *farrealloc(void far *fp, unsigned long size);
    void farfree(void far *fp);
    unsigned long farcoreleft(void);

【解説】

    farmalloc(),  farcalloc(), farrealloc(), farfree(), farcoreleft() は
    farヒープのメモリ管理を実行します。

    farmalloc()はsizeバイトのメモリをfarヒープから割り当てます。 size は
    unsigned long型ですから、64kバイトをこえるメモリ領域を一度に割り当て
    ることができます。割り当てられたメモリ領域はクリアされません。

    farcalloc()は、ひとつがsizeバイトの大きさを持つオブジェクトnelem個を
    格納できるだけのメモリを farヒープから割り当てます。割り当てられたメ
    モリ領域はゼロ・クリアされます。

    farrealloc()は、fpによって示されるfar ヒープから割り当てられたメモリ
    の大きさを size バイトに変更します。 fp はfarmalloc(),  farcalloc(),
    farrealloc()によって得られたポインタでなければなりません。fpにNULLを
    指定するとfarmalloc(size)と等価で、size バイトの領域を新たに確保しま
    す。sizeに0を指定するとfarfree(fp)と同じ動作をし、fpが指す領域を開放
    したうえで値NULLを返します。

    farrealloc()が返したポインタは、パラメタとしてあたえたポインタfpとは
    異なる場合があります。farrealloc()は領域を大きくしようとして失敗する
    と、新たな領域を確保してそこへのポインタを返します。このとき、もとの
    領域の内容は新たに確保された領域へコピーされます。

    farfree()はfpが示すfarヒープを開放します。パラメタfpによってあたえら
    れるポインタは、farmalloc(), farcalloc(), farrealloc()によって割り合
    てられたものでなければなりません。

    farcoreleft() は呼び出された時点で一度に割り当てることができる最大の
    バイト数を返します。しかし、farcoreleft() が返した大きさを確保するこ
    とができるとは限りません。実際に確保される領域の大きさは、指定された
    sizeとヒープ管理関数が使用する作業領域(ヘッダ)の大きさを加えたものと
    なるためです。

【リターン値】

    farmalloc(),  farcalloc(),はメモリを割り当てることができたときにはそ
    の領域への farポインタを返します。割り当てに失敗すると値NULLを返しま
    す。

    farrealloc()は再割り当てされたメモリへのポインタを返します。再割り当


                                - 126 -                                 




LSI C-86 Reference Manual                                   FARMALLOC(3)


    てできなかったときには値NULLを返します。

    farcoreleft()は一度に割り当て可能な最大のバイト数を返します。

【エラー】

    ENOMEM
        メモリコントロールブロックが破壊されています

    ENOMEM
        メモリが不足しています

    ENOMEM
        指定されたメモリセグメントが不正です

【可搬性】

    MS-DOS

【参照】

    malloc(3)




































                                - 127 -                                 




LSI C-86 Reference Manual                                      FARSTR(3)


【名前】

    farstr, far_memset, far_setmem, far_memcpy, far_memmove, far_movmem,
    far_memcmp,  far_memchr,   far_memccpy,   far_memicmp,   far_strcpy,
    far_strncpy,   far_strcmp,   far_strncmp,  far_strcat,  far_strncat,
    far_strlen,   far_strchr,   far_strrchr,   far_strstr,   far_strspn,
    far_strcspn,   far_strpbrk,   far_strtok,  far_stpcpy,  far_strcmpi,
    far_stricmp,  far_strncmpi,  far_strnicmp,  far_strdup,  far_strlwr,
    far_strupr, far_strrev, far_strset, far_strnset - far 文字列の処理

【書式】

    #include <farstr.h>
    void far *far_memset(void far *addr, char byte, size_t cnt);
    void far *far_setmem(void far *addr, size_t cnt, char byte);
    void far *far_memcpy(void far *dst,  const void  far  *src,   size_t
    cnt);
    void  far  *far_memmove(void far *dst,  const void far *src,  size_t
    cnt);
    void far *far_movmem(const void far *src,  void  far  *dst,   size_t
    cnt);
    int far_memcmp(const void far *addr1,  const void far *addr2, size_t
    n);
    void far *far_memchr(const void far *addr, char byte, size_t cnt);
    void far *far_memccpy(void far *dest,  void far *src, char c, size_t
    n);
    int far_memicmp(void far *addr1, void far *addr2, size_t n);
    char far *far_strcpy(char far *s, const char far *t);
    char far *far_strncpy(char far *s, const char far *t, size_t n);
    int far_strcmp(const char far *s, const char far *t);
    int far_strncmp(const char far *s, const char far *t, size_t n);
    char far *far_strcat(char far *s, const char far *t);
    char far *far_strncat(char far *s, const char far *t, size_t n);
    size_t far_strlen(const char far *s);
    char far *far_strchr(const char far *s, char c);
    char far *far_strrchr(const char far *s, char c);
    char far *far_strstr(const char far *s, const char far *t);
    size_t far_strspn(const char far *s, const char far *t);
    size_t far_strcspn(const char far *s, const char far *t);
    char far *far_strpbrk(const char far *s, const char far *t);
    char far *far_strtok(char far *s, const char far *t);
    char far *far_stpcpy(char far *s, const char far *t);
    int far_strcmpi(const char far *s, const char far *t);
    int far_stricmp(const char far *s, const char far *t);
    int far_strncmpi(const char far *s, const char far *t, size_t n);
    int far_strnicmp(const char far *s, const char far *t, size_t n);
    char far *far_strdup(const char far *s);
    char far *far_strlwr(char far *s);
    char far *far_strupr(char far *s);
    char far *far_strrev(char far *s);
    char far *far_strset(char far *s, char c);
    char far *far_strnset(char far *s, char c, size_t n);

【解説】

    これらは 8086の1Mバイトのメモリ空間すべてを扱うことができるfar文字列


                                - 128 -                                 




LSI C-86 Reference Manual                                      FARSTR(3)


    処理関数です。

    これらは通常の文字列処理関数の名前の頭にfar_がつき、パラメタや関数値
    にあらわれるポインタがfarポインタに変更されただけで、 各関数の処理の
    内容は同じです。 したがって、 たとえば far_memset() の動作に関しては
    memset(3)の説明を参照してください。

    void far *は「farにあるオブジェクトへのポインタ」という意味で、 この
    ポインタは8086の1Mバイトのメモリ空間すべてをポイントすることができま
    す。 これらの関数を利用すれば、SモデルやPモデルのプログラムでも64kバ
    イトのセグメント境界の外にあるデータを処理することが可能です。  ただ
    し、一度に扱うことができるデータの量は依然として64k バイトに制限され
    ていますので注意してください。

【リターン値】

    関数が返す値については、それぞれのベースとなっている関数の記述を参考
    にしてください。

【可搬性】

    far_strdup()
        MS-DOS

    上記以外
        MS-DOS, ROM
































                                - 129 -                                 




LSI C-86 Reference Manual                                      FCLOSE(3)


【名前】

    fclose, fcloseall - ファイルのクローズ

【書式】

    #include <stdio.h>
    int fclose(FILE *fp);
    int fcloseall(void);

【解説】

    fclose()はファイルポインタfpで指定されたファイルをクローズします。出
    力モードのファイルの場合、ファイルバッファに残っている内容は自動的に
    ファイルに書き込まれます。tmpfile(3)を使って作成したファイルをクロー
    ズした場合、そのファイルはfclose()によって削除されます。

    fcloseall() は、標準入出力以外の現在オープンされているファイルをすべ
    てクローズします。     tmpfile(3)     によって作成されたファイルは、
    fcloseall()によってクローズされた後に削除されます。

    fclose(),  fcloseallではfopen(3), freopen(3)でオープンしたファイルの
    みをクローズすることができます。低レベル入出力ファイルにはclose(3)を
    使ってください。

【リターン値】

    fclose()はクローズに成功した場合は0を返します。失敗した場合は値EOFを
    返します。

    fcloseall()はクローズされたファイルの数を返します。失敗すると値EOFを
    返します。

【可搬性】

    fclose()
        ANSI, UNIX, MS-DOS

    fcloseall()
        MS-DOS

【参照】

    fopen(3), freopen(3), close(3), fflush(3)














                                - 130 -                                 




LSI C-86 Reference Manual                                        FEOF(3)


【名前】

    feof - ファイルの終わりの判定

【書式】

    #include <stdio.h>
    int feof(FILE *fp);

【解説】

    feof()はファイルポインタfpで指定されるファイルが終わりに到達している
    かを調べます。

【リターン値】

    ファイルが終わりに到達している場合は 0以外の値を返し、そうでない場合
    は0を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    clearerr(3)
































                                - 131 -                                 




LSI C-86 Reference Manual                                      FERROR(3)


【名前】

    ferror - エラーの判定

【書式】

    #include <stdio.h>
    int ferror(FILE *fp);

【解説】

    ferror()はファイルポインタfpで指定されるファイルにエラーが起こったか
    どうか調べます。

【リターン値】

    ファイルにエラーが起こっている場合は0以外の値を返し、 そうでない場合
    は0を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    clearerr(3)
































                                - 132 -                                 




LSI C-86 Reference Manual                                      FFLUSH(3)


【名前】

    fflush, flushall - ストリームのフラッシュ

【書式】

    #include <stdio.h>
    int fflush(FILE *fp);
    int flushall(void);

【解説】

    fflush()はファイルポインタfpで指定されるファイルが出力用にオープンさ
    れていると、ストリームのバッファにたまっているデータをすべて出力しま
    す。入力用にオープンされている場合はストリームのバッファの内容をクリ
    アします。

    flushall()は現在オープンされているすべてのファイルのストリームバッフ
    ァをfflush()のようにフラッシュします。

【リターン値】

    fflush()は、成功した場合は0を返します。失敗した場合はEOFを返します。

    flushall()は、成功した場合は出力されたファイルの数を返します。失敗し
    た場合はEOFを返します。

【可搬性】

    fflush()
        ANSI, UNIX, MS-DOS

    flushall()
        MS-DOS

【参照】

    fclose(3), setbuf(3)




















                                - 133 -                                 




LSI C-86 Reference Manual                                     FGETPOS(3)


【名前】

    fgetpos, fsetpos - リードライト位置の取得・設定

【書式】

    #include <stdio.h>
    int fgetpos(FILE *fp, fpos_t *ptr);
    int fsetpos(FILE *fp, const fpos_t *ptr);

【解説】

    fgetpos() はファイルポインタfpで指定されるファイルの現在のリードライ
    ト位置を取得し、*ptrに記録します。

    fsetpos()はファイルポインタfp で指定されるファイルのリードライト位置
    を*ptrにします。

    fgetpos()によって記録されたリードライト位置に移動するときにfsetpos()
    を使用します。

    fpos_tは<stdio.h>で定義されています。

【リターン値】

    成功した場合には0を返し、失敗したときは0以外の値を返します。

【可搬性】

    ANSI, MS-DOS

【参照】

    fseek(3), ftell(3), rewind(3)
























                                - 134 -                                 




LSI C-86 Reference Manual                                  FILELENGTH(3)


【名前】

    filelength - ファイルの大きさの取得

【書式】

    #include <io.h>
    long filelength(int fd);

【解説】

    filelength() はファイルハンドル fdで示されるファイルの大きさを返しま
    す。

【リターン値】

    ファイルの長さをバイト数で返します。失敗するとerrnoをセットし、-1Lを
    返します。

【エラー】

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    MS-DOS

【参照】

    chsize(3), stat(3), fstat(3)



























                                - 135 -                                 




LSI C-86 Reference Manual                                      FILENO(3)


【名前】

    fileno - ファイルハンドルの取得

【書式】

    #include <stdio.h>
    int fileno(FILE *fp);

【解説】

    fileno()はファイルポインタfpに結び付けられているファイルハンドルを返
    します。

【可搬性】

    UNIX, MS-DOS









































                                - 136 -                                 




LSI C-86 Reference Manual                                       FOPEN(3)


【名前】

    fopen, fdopen - ファイルのオープン

【書式】

    #include <stdio.h>
    FILE *fopen(const char *filename, const char *mode);
    FILE *fdopen(int fd, const char *mode);

【解説】

    fopen()はfilename で示されるファイルを高レベル入出力用にオープンしま
    す。

    fdopen()はハンドルfdを高レベル入出力用のファイルポインタに結びつけま
    す。

    文字列modeは、次のうちの1つでなければなりません。

    "r"
        テキストファイルを入力モードでオープンします

    "w"
        新しいテキストファイルを作り、出力モードでオープンします。すでに
        同じ名前のファイルがある場合はその内容は捨てられます

    "a"
        テキストファイルを追加・出力モードでオープンします。ファイルがな
        い場合は新たにファイルを作ります

    "rb"
        バイナリファイルを入力モードでオープンします

    "wb"
        新しいバイナリファイルを作り、出力モードでオープンします。すでに
        同じ名前のファイルがある場合はその内容は捨てられます

    "ab"
        バイナリファイルを追加・出力モードでオープンします。ファイルがな
        い場合は新たにファイルを作ります

    "r+"
        テキストファイルを入出力モードでオープンします

    "w+"
        新しいテキストファイルを作り、入出力モードでオープンします。すで
        に同じ名前のファイルがある場合はその内容は捨てられます

    "a+"
        テキストファイルを追加・入出力モードでオープンします。ファイルが
        ない場合は新たにファイルを作ります

    "r+b"
        バイナリファイルを入出力モードでオープンします



                                - 137 -                                 




LSI C-86 Reference Manual                                       FOPEN(3)


    "w+b"
        新しいバイナリファイルを作り、入出力モードでオープンします。すで
        に同じ名前のファイルがある場合はその内容は捨てられます

    "a+b"
        バイナリファイルを追加・入出力モードでオープンします。ファイルが
        ない場合は新たにファイルを作ります

    テキストファイルとしてオープンされた場合、入力時には'\r'は読み飛ばさ
    れ、'\x1A'に出合うとファイルの終わりと見なします。また出力時には'\n'
    の前に'\r'が挿入されます。

    バイナリファイルとしてオープンされた場合には、入力時も出力時もいっさ
    い変換はおこなわれません。

    入力モードでは読み込みだけ、出力モードでは書き込みだけ、入出力モード
    では読み書きの両方が許されます。

    モード"a", "ab", "a+", "a+b"でオープンした場合には、書き込みの直前に
    必ず EOFにシークします。したがって、このモードではデータの追加のみが
    可能で、元のデータをオーバーライトすることはできません。

【リターン値】

    成功するとFILE型へのポインタ(ファイルポインタ)を返します。失敗すると
    値NULLを返します。

【可搬性】

    fopen()
        ANSI, UNIX, MS-DOS

    fdopen()
        UNIX, MS-DOS

【参照】

    freopen(3), fclose(3), open(3), creat(3)




















                                - 138 -                                 




LSI C-86 Reference Manual                                      FP_OFF(3)


【名前】

    FP_OFF, FP_SEG, MK_FP - farポインタの分解・合成

【書式】

    #include <dos.h>
    unsigned FP_OFF(void far *farptr);
    unsigned FP_SEG(void far *farptr);
    void far *MK_FP(unsigned seg, unsigned off);

【解説】

    FP_OFF()  は far ポインタ farptr のオフセット値を取り出して、 それを
    unsigned型として返します。

    FP_SEG()  は far ポインタ farptr のセグメント値を取り出して、 それを
    unsigned型として返します。

    MK_FP()はunsigned型のセグメント値segとオフセット値offからfarポインタ
    を作り出し、それを返します。

    これらは<dos.h>でマクロとして定義されています。

【リターン値】

    FP_OFF(), FP_SEGはそれぞれunsigned型のオフセット値、セグメント値を返
    します。

    MK_FP()はfarポインタを返します。

【可搬性】

    MS-DOS, ROM
























                                - 139 -                                 




LSI C-86 Reference Manual                                   _FPRESET(3M)


【名前】

    _fpreset, _control87, _clear87, _status87 - 数値演算コプロセッサの制
    御

【書式】

    #include <float.h>
    void _fpreset(void);
    unsigned _control87(unsigned new, unsigned mask);
    unsigned _clear87(void);
    unsigned _status87(void);

【解説】

    _fpreset(),  _control87(), _clear87(), _status87()は数値演算コプロセ
    ッサを制御します。

    _fpreset()はコプロセッサをリセットし、初期化します。

    _control87()はコプロセッサのコントロールワードを設定します。maskに 1
    が設定されているビットだけがnewによって変更されます。

    _clear87()はコプロセッサのステータスをクリアします。エラー状態のリセ
    ットに使います。

    _status87()はコプロセッサのステータスワードを返します。

【リターン値】

    _control87()は以前の設定値を返します。

    _clear87()は以前のステータスワードを返します。

    _status87()は現在のステータスワードを返します。

【可搬性】

    MS-DOS, ROM



















                                - 140 -                                 




LSI C-86 Reference Manual                                       FREAD(3)


【名前】

    fread, fwrite - ストリームとの配列の入出力

【書式】

    #include <stdio.h>
    int fread(void *ptr, size_t size, size_t nelem, FILE *fp);
    int fwrite(const void *ptr, size_t size, size_t nelem, FILE *fp);

【解説】

    fread()はファイルポインタfpで示されるファイルからptr番地へsizeバイト
    ずつnelem個読み込みます。ファイルから配列へ読み込む場合に使います。

    fwrite() はファイルポインタfpで指定されるファイルへptr番地からsizeバ
    イトずつnelem個分出力します。 ファイルへ配列のデータを出力する場合に
    使います。

【リターン値】

    fread() は入力したブロック数を返します。もしsizeまたはnelemが0の場合
    は値0を返します。

    fwrite()は出力したブロック数を返します。もしsizeまたはnelemが0の場合
    は値0を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    read(3), write(3)
























                                - 141 -                                 




LSI C-86 Reference Manual                                     FREOPEN(3)


【名前】

    freopen, fdreopen - ファイルの再オープン

【書式】

    #include <stdio.h>
    FILE *freopen(const char *filename, const char *mode, FILE *fp);
    FILE *fdreopen(int fd, const char *mode, FILE *fp);

【解説】

    freopen()はfopen(3)と同様にfilename で示されるファイルをオープンしま
    すが、ファイルポインタを指定できる点が異なっています。

    fdreopen() もfdopen(3)と同様にハンドルfdを高レベル入出力用のファイル
    ポインタに結びつけますが、使用するファイルポインタを指定することがで
    きます。

    freopen(),  fdreopen()はそのファイルポインタがすでにオープンされてい
    れば一旦クローズしてからオープンしますが、クローズに失敗しても無視し
    てオープンします。

    文字列modeはfopen(3)と同じく、次のうちのいずれか1 つでなければなりま
    せん。

    "r"
        テキストファイルを入力モードでオープンします

    "w"
        新しいテキストファイルを作り、出力モードでオープンします。すでに
        同じ名前のファイルがある場合はその内容は捨てられます

    "a"
        テキストファイルを追加・出力モードでオープンします。ファイルがな
        い場合は新たにファイルを作ります

    "rb"
        バイナリファイルを入力モードでオープンします

    "wb"
        新しいバイナリファイルを作り、出力モードでオープンします。すでに
        同じ名前のファイルがある場合はその内容は捨てられます

    "ab"
        バイナリファイルを追加・出力モードでオープンします。ファイルがな
        い場合は新たにファイルを作ります

    "r+"
        テキストファイルを入出力モードでオープンします

    "w+"
        新しいテキストファイルを作り、入出力モードでオープンします。すで
        に同じ名前のファイルがある場合はその内容は捨てられます

    "a+"


                                - 142 -                                 




LSI C-86 Reference Manual                                     FREOPEN(3)


        テキストファイルを追加・入出力モードでオープンします。ファイルが
        ない場合は新たにファイルを作ります

    "r+b"
        バイナリファイルを入出力モードでオープンします

    "w+b"
        新しいバイナリファイルを作り、入出力モードでオープンします。すで
        に同じ名前のファイルがある場合はその内容は捨てられます

    "a+b"
        バイナリファイルを追加・入出力モードでオープンします。ファイルが
        ない場合は新たにファイルを作ります

    テキストファイルとしてオープンされた場合、入力時には'\r'は読み飛ばさ
    れ、'\x1A'に当たるとファイルの終わりと見なします。また出力時には'\n'
    の前に'\r'が挿入されます。

    バイナリファイルとしてオープンされた場合には、入力時も出力時もいっさ
    い変換はおこなわれません。

    入力モードでは読み込みだけ、出力モードでは書き込みだけ、入出力モード
    では読み書きの両方が許されます。

    モード"a", "ab", "a+", "a+b"でオープンした場合には、書き込みの直前に
    必ず EOFにシークします。したがって、このモードではデータの追加のみが
    可能で、元のデータをオーバーライトすることはできません。

【リターン値】

    成功するとパラメタfpをそのまま返します。失敗すると値NULLを返します。

【可搬性】

    freopen()
        ANSI, UNIX, MS-DOS

    fdreopen()
        MS-DOS

【参照】

    fopen(3), fclose(3), open(3), creat(3)















                                - 143 -                                 




LSI C-86 Reference Manual                                      FREXP(3M)


【名前】

    frexp, ldexp, modf - 仮数部と小数部の分解・合成

【書式】

    #include <math.h>
    double frexp(double x, int *p);
    double ldexp(double x, int p);
    double modf(double x, double *ip);

【解説】

    frexp()はxを仮数部と指数部に分け、指数部を*pに代入し、仮数部を返しま
    す。以下の関係が成り立ちます。

        frexp(x, p)*pow(2, *p)=x

    ldexp()は仮数部xと指数部pを合成して、その値を返します。 以下の関係が
    成り立ちます。

        ldexp(x, p)=x*pow(2, p)

    modf()はxを整数部と小数部に分け、整数部を*ipに代入し、小数部を返しま
    す。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    rint(3M)

























                                - 144 -                                 




LSI C-86 Reference Manual                                       FSEEK(3)


【名前】

    fseek - ファイルのリードライト位置の変更

【書式】

    #include <stdio.h>
    int fseek(FILE *fp, long offset, int ptrname);

【解説】

    fseek() はファイルポインタfpで示されるファイルの次のリードライト位置
    を変更します。新しい位置はptrnameが示す場所からoffset バイトだけ前あ
    るいは後になります。

    ptrname の値は<stdio.h>で定義されている次の3種類の指定方法のうちひと
    つを選択できます。

    SEEK_SET
        ファイルの先頭からの絶対位置

    SEEK_CUR
        現在の位置からの相対位置

    SEEK_END
        ファイルの最後からの相対位置

【リターン値】

    成功した場合は0を返し、失敗したときは0以外の値を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    ftell(3), rewind(3), lseek(3)

【バグ】

    テキストモードのファイルに対して

        fseek(fp, 0L, SEEK_END);

    を実行したとき、 ファイルの最後に '\x1A' があると、 現在の位置はその
    '\x1A'の前になります。これは、最後に'\x1A'を持つファイルの後ろにデー
    タを追加したとき、それが'\x1A'の後ろに入ると好ましくないからです。

    バイナリモードのファイルではこのようなことはありません。








                                - 145 -                                 




LSI C-86 Reference Manual                                     FSETBIN(3)


【名前】

    fsetbin, fsettext - ストリームのモードの変更

【書式】

    #include <stdio.h>
    void fsetbin(FILE *fp);
    void fsettext(FILE *fp);

【解説】

    fsetbin()はfpで示されるファイルをバイナリモードに変更します。

    fsettext()は逆にテキストモードに変更します。

    どちらも<stdio.h>でマクロ定義されています。

【可搬性】

    MS-DOS

【参照】

    fopen(3), freopen(3)

































                                - 146 -                                 




LSI C-86 Reference Manual                                       FSTAT(3)


【名前】

    fstat - ファイル情報の取得

【書式】

    #include <sys/types.h>
    #include <sys/stat.h>
    int fstat(int fd, struct stat *sbuf);

【解説】

    fstat()はfdで指定されるファイルに関する情報をsbufが指すstruct stat型
    構造体に格納します。struct stat型は<sys/stat.h>で定義されています。

    MS-DOS 環境下ではstruct statのうちの以下のフィールドのみが意味をもち
    ます。

    st_mode
        ファイルのモード

    st_dev
        fdがファイルのときにはドライブ番号、デバイスのときにはfd

    st_rdev
        st_devと同じ

    st_nlink
        常に1

    st_size
        ファイルのサイズ

    st_mtime
        ファイルが最後に修正された時刻

    st_atime
        st_mtimeと同じ

    st_ctime
        st_mtimeと同じ

    st_mtime,  st_atime, st_ctimeはすべてtime_t型です。詳細はtime(3)を参
    照してください。

    st_modeをS_IFMTでマスクすると、次の情報が得られます。

    S_IFCHR
        キャラクタデバイス

    S_IFREG
        通常のファイル

    st_modeにはユーザのアクセス許可ビットも示されます。

    S_IREAD


                                - 147 -                                 




LSI C-86 Reference Manual                                       FSTAT(3)


        読み出し許可

    S_IWRITE
        書き込み許可

    fstat()では実行許可(S_IEXEC)は取得できません。

【リターン値】

    成功したときには0を返します。失敗したときにはerrnoをセットして0 以外
    の値を返します。

【エラー】

    EBADF
        ファイルハンドルが不正です

【可搬性】

    UNIX, MS-DOS

【参照】

    stat(3), time(3)


































                                - 148 -                                 




LSI C-86 Reference Manual                                       FTELL(4)


【名前】

    ftell - ファイルのリードライト位置の取得

【書式】

    #include <stdio.h>
    long ftell(FILE *fp);

【解説】

    ftell() はファイルポインタfpで指定されるファイルの現在の位置を返しま
    す。

【リターン値】

    現在のリードライト位置のファイルの先頭からのオフセットを返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    fseek(3), rewind(3), tell(3)

































                                - 149 -                                 




LSI C-86 Reference Manual                                       FTIME(3)


【名前】

    ftime - 現在の時刻の取得

【書式】

    #include <sys/types.h>
    #include <sys/timeb.h>
    void ftime(struct timeb *buffer);

【解説】

    ftime()は現在の時刻を得て*bufferにセットします。

    struct timebは<sys/timeb.h>で次のように定義されています。

        struct  timeb   {
                time_t          time;     /* 現在の時刻(秒) */
                unsigned short  millitm;  /* 1秒未満の時刻(ミリ秒) */
                short           timezone; /* UTCとの差(分) */
                short           dstflag;  /* サマータイムフラグ */
        };

【可搬性】

    UNIX, MS-DOS

【参照】

    TZ(3), time(3), timezone(3)




























                                - 150 -                                 




LSI C-86 Reference Manual                                        GETC(3)


【名前】

    getc, fgetc, getchar, fgetchar - ストリームからの1文字の入力

【書式】

    #include <stdio.h>
    int getc(FILE *fp);
    int fgetc(FILE *fp);
    int getchar(void);
    int fgetchar(void);

【解説】

    getc(), fgetc()はファイルポインタfpで示されるファイルから1文字を入力
    します。

    getchar(), fgetchar()は標準入力(stdin)から1文字入力します。

    getc(), getchar()はマクロとして定義されています。

    これらはcharではなくint型の値を返すことに注意してください。

【リターン値】

    入力した1文字を返します。ファイルの終りに到達した時には、値EOFを返し
    ます。エラーを検出した場合にもEOFを返しますので、EOFかエラーかの判定
    はfeof(3), ferror(3)を使ってください。

【可搬性】

    getc()
        ANSI, UNIX, MS-DOS

    fgetc()
        ANSI, UNIX, MS-DOS

    getchar()
        ANSI, UNIX, MS-DOS

    fgetchar()
        MS-DOS

【参照】

    putc(3), feof(3), ferror(3)












                                - 151 -                                 




LSI C-86 Reference Manual                                       GETCH(3)


【名前】

    getch, getche - コンソールからの1文字入力

【書式】

    #include <conio.h>
    char getch(void);
    char getche(void);

【解説】

    getch()はコンソールから1文字入力します。この文字はエコーバックされま
    せん。

    getche()はコンソールから 1 文字入力します。 この文字はコンソールにエ
    コーバックされます。

    どちらもCtrl-Cをデータとして入力することができます。

【リターン値】

    入力された文字を返します。

【可搬性】

    MS-DOS

【参照】

    kbhit(3), ungetch(3), putch(3)

【バグ】

    getche()で入力した文字をungetch(3)し、さらにgetche()を使用すると、そ
    の文字はコンソールに2回エコーバックされることになります。






















                                - 152 -                                 




LSI C-86 Reference Manual                                      GETCWD(3)


【名前】

    getcwd - カレントディレクトリの取得

【書式】

    #include <direct.h>
    char *getcwd(char *buf, int maxbuf);

【解説】

    getcwd() はカレントディレクトリのフルパス名を取得して、bufが指すメモ
    リにセットして返します。maxbufはパス名の長さの上限をあたえます。得ら
    れたパス名の長さがmaxbufをこえるとエラーになります。

    bufにはNULLを指定することもでき、そのときはmalloc(3)によってヒープ領
    域から必要なメモリが確保されます。

【リターン値】

    成功すると得られたパス名のアドレス(bufがNULLでなければbufの値、 NULL
    のときは malloc(3)によって確保されたメモリのアドレス) を返します。失
    敗したときはerrnoをセットし、NULLを返します。

【エラー】

    ENODEV
        ドライブ名が不正です

    ERANGE
        得られたパス名がmaxbufをこえています

    ENOMEM
        malloc(3)に失敗しました

【可搬性】

    UNIX, MS-DOS

【参照】

    chdir(3), mkdir(3), rmdir(3), malloc(3)
















                                - 153 -                                 




LSI C-86 Reference Manual                                      GETPID(3)


【名前】

    getpid - プロセスIDの取得

【書式】

    #include <process.h>
    int getpid(void);

【解説】

    getpid()はプロセスIDを返します。

    プロセスIDはそのプロセスのPSP(Program Segment Prefix) のセグメント値
    です。

【可搬性】

    UNIX, MS-DOS







































                                - 154 -                                 




LSI C-86 Reference Manual                                        GETS(3)


【名前】

    gets, fgets - ストリームからの文字列の入力

【書式】

    #include <stdio.h>
    char *gets(char *s);
    char *fgets(char *s, int n, FILE *fp);

【解説】

    gets() は標準入力(stdin)から1行を入力し、sで示されるバッファにしまい
    ます。ただし、文字列sの最後には改行文字'\n'はセットされず、 捨てられ
    ます。

    fgets() は標準入力の代わりにファイルポインタfpで指定されるファイルか
    ら入力し、改行文字もふくめて高々n- 1文字しか読み込みません。この関数
    は、改行文字を捨てないでsの最後にセットします。

    どちらの関数も文字列sの最後にはナル文字('\0')をセットします。

【リターン値】

    成功するとパラメタsをそのまま返します。 ファイルの終わりに到達した場
    合には値 NULL を返します。また、エラーの場合にもNULLを返しますので、
    EOFかエラーかの判定にはfeof(3), ferror(3)を使用してください。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    puts(3), feof(3), ferror(3)

【バグ】

    gets(s)とfgets(s,  32767, stdin)は同じ動作をしないので注意してくださ
    い。


















                                - 155 -                                 




LSI C-86 Reference Manual                                        GETW(3)


【名前】

    getw - ストリームからのワードの入力

【書式】

    #include <stdio.h>
    int getw(FILE *fp);

【解説】

    getw()はファイルポインタfpで指定されているファイルから、1ワード(2 バ
    イト)のデータを入力します。

【リターン値】

    入力した1ワード(2バイト)の値を返します。ファイルの終わりに到達した場
    合は値EOFを返します。また、エラーの場合にもEOFを返します。

    ただし、EOFは入力データとしても現れることがありますので、EOFかエラー
    かの判定にはfeof(3), ferror(3)を使用してください。

【可搬性】

    UNIX, MS-DOS

【参照】

    putw(3), ferror(3), feof(3)





























                                - 156 -                                 




LSI C-86 Reference Manual                                      GFTIME(3)


【名前】

    gftime - ファイルの時刻情報の取得

【書式】

    #include <io.h>
    int gftime(const char *pathname, time_t times[2]);

【解説】

    gftime()は、pathname の示すファイルの時刻情報を取り出します。 時刻は
    times[0] とtimes[1]の両方にセットされます。時刻の表現はtime(3)と同じ
    です。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、-1を返します。

【エラー】

    EACCES
        pathnameはディレクトリです

    EMFILE
        オープンされているファイルの数が多すぎます

    ENOENT
        pathnameで示されるファイル、あるいは先行するパス名が存在しません

【可搬性】

    MS-DOS

【参照】

    utime(3), time(3)





















                                - 157 -                                 




LSI C-86 Reference Manual                                    _HARDERR(3)


【名前】

    _harderr, _hardresume, _hardretn - MS-DOS致命的エラーの制御

【書式】

    #include <dos.h>
    void _harderr(int (far *handler)());
    void _hardresume(int result);
    void _hardretn(int error);

【解説】

    _harderr()は 致命的エラー(INT 24H)ハンドラとして関数handler をインス
    トールします。

    ハンドラは次のように記述します。

        int  far handler(unsigned deverror,  unsigned errcode,  unsigned
        far *devhdr);
    パラメタはINT 24H ハンドラが呼び出されたときに MS-DOS から渡される値
    で、deverrorはAX, errcodeはDI, devhdrはBP:SIに対応しています。パラメ
    タが持つ意味についてはMS-DOSのマニュアルを参照してください。

    ハンドラは_hardresume(), _hardretn()を使うか、あるいはreturn文で終了
    してください。

    _hardresume() またはreturn文を使用してハンドラを終了するときには制御
    はMS-DOSに移ります。resultはMS-DOSが取るべき動作を指示します。result
    には次の4種類があります。

    _HARDERR_IGNORE
        エラーを無視します

    _HARDERR_RETRY
        リトライします

    _HARDERR_ABORT
        プロセスを終了します

    _HARDERR_FAIL
        システムコールを失敗させます

    return文によるハンドラの終了も_hardresume()と同じ意味を持ちます。

        return result;

    と

        _herdresume(result);

    とは等価です。

    _hardretn()でハンドラを終了すると、制御はMS-DOSではなく、 直接アプリ
    ケーションに移ります。 _hardretn()はシステムコールを失敗させ、致命的
    エラーを検出したシステムコールの直後の位置に戻ります。


                                - 158 -                                 




LSI C-86 Reference Manual                                    _HARDERR(3)



【可搬性】

    MS-DOS

【参照】

    MS-DOS Programmer's Referrence


















































                                - 159 -                                 




LSI C-86 Reference Manual                                 HYPERBOLIC(3M)


【名前】

    sinh, cosh, tanh - 双曲線関数

【書式】

    #include <math.h>
    double sinh(double x);
    double cosh(double x);
    double tanh(double x);

【解説】

    これらは双曲線関数です。それぞれ次の値を返します。

        sinh(x) = (exp(x) - exp(-x)) / 2
        cosh(x) = (exp(x) + exp(-x)) / 2
        tanh(x) = sinh(x) / cosh(x)
【エラー】

    EDOM
        パラメタが定義域を超えています

    ERANGE
        結果が正確に表現できません

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    exp(3), matherr(3)

























                                - 160 -                                 




LSI C-86 Reference Manual                                         INP(3)


【名前】

    inp, inpw, inp8, inp8w - ポートからの入力

【書式】

    #include <machine.h> or <conio.h>
    char inp(int port);
    unsigned inpw(int port);
    char inp8(int port);
    unsigned inp8w(int port);

【解説】

    これらの関数は8086のポートから1バイトまたは1ワードのデータを入力し、
    その値を返します(8086のIN命令を実行します)。

    inp(), inp8()はportで示される入力ポートから1バイトのデータを入力して
    その値を返します。

    inpw(), inpw8()はportで示される入力ポートから1ワードのデータを入力し
    てその値を返します。

    inp8(), inp8w()でのポート番号は0から255までの定数式(コンパイル時に値
    のわかる式)でなければなりません。これは8086の即値IN 命令を生成するた
    めに必要な条件です。

    inp(),  inpw()は0から65535まで任意のポート番号を指定でき、任意の式を
    書くことができますが、inp8(),  inp8w()に比べると少しプログラムが大き
    くなります。

【リターン値】

    入力されたデータを返します。

【可搬性】

    MS-DOS, ROM

【参照】

    outp(3)
















                                - 161 -                                 




LSI C-86 Reference Manual                                       INT86(3)


【名前】

    int86, int86x, int86y - 8086のソフトウェア割り込みの実行

【書式】

    #include <dos.h>
    int int86(int intno, union REGS *in, union REGS *out);
    int int86x(int intno,  union REGS *in, union REGS *out, struct SREGS
    *seg);
    int int86y(int intno, union REGS *in, union REGS *out);

【解説】

    これらの関数は 8086のINT命令を実行します。パラメタintnoがINT命令のベ
    クタ番号として使われます。INT命令の実行に先立ってin の指している共用
    体の中身がレジスタにセットされ、 戻ってきたときのレジスタの値がoutの
    指している共用体へセットされます。

    int86()ではAX,  BX, CX, DX, SI, DI, BPのレジスタをセットし、値を得る
    ことができます。DS, ESレジスタは設定できません。

    int86x()ではint86()の機能に加えてDS, ES レジスタを設定できます。これ
    はsegが指す構造体の中にセットしなくてはなりません。 戻ってきたときの
    セグメントレジスタの値はsegに得られます。

    int86y()ではinの指している共用体の中にAX,  BX,  CX,  DX, SI, DI, BP,
    DS,   ESレジスタが設定でき、戻ってきたときの同じレジスタセットの値が
    outが指している共用体の中に得られます。

    int86(), int86x(), int86y()は戻ってきたときのフラグレジスタの値をout
    が指している共用体中のflagsフィールドに格納します。また、cflagフィー
    ルドにはCarryフラグの値によって0か0以外を設定します。

【リターン値】

    戻ってきたときのAXレジスタの値を返します。

【可搬性】

    MS-DOS, ROM

【参照】

    intdos(3), segread(3)













                                - 162 -                                 




LSI C-86 Reference Manual                                      INTDOS(3)


【名前】

    intdos, intdosx, intdosy - MS-DOSシステムコールの実行

【書式】

    #include <dos.h>
    int intdos(union REGS *in, union REGS *out);
    int intdosx(union REGS *in, union REGS *out, struct SREGS *seg);
    int intdosy(union REGS *in, union REGS *out);

【解説】

    これらの関数はMS-DOSシステムコールを実行します。呼び出しに先立ってin
    の指している共用体の中身がレジスタにセットされ、システムから戻ってき
    たときのレジスタの値がoutの指している共用体へセットされます。

    intdos()ではAX, BX, CX, DX, SI, DI, BPのレジスタをセットし、値を得る
    ことができます。DS, ESレジスタは設定できません。

    intdosx()ではintdos()の機能に加えてDS, ES レジスタを設定できます。こ
    れはsegの指す構造体の中にセットしなくてはなりません。 戻ってきたとき
    のセグメントレジスタの値はsegに得られます。

    intdosy()ではinの指している共用体の中にAX,  BX,  CX, DX, SI, DI, BP,
    DS, ESレジスタを設定でき、システムから戻ってきたときの同じレジスタセ
    ットの値がoutが指している共用体の中に得られます。

    intdos(), intdosx(), intdosy()はシステムから戻ってきたときのフラグレ
    ジスタの値をoutが指している共用体中のflagsフィールドに格納します。ま
    た、 cflagフィールドにはキャリーフラグの値によって0か0以外を設定しま
    す。システムコールの実行がエラーを検出したときにはflags & 1が1になっ
    たうえcflagが0以外になり、errno には対応するエラー番号がセットされま
    す。

【リターン値】

    システムから戻ってきたときのAXレジスタの値を返します。

【可搬性】

    MS-DOS

【参照】

    bdos(3), segread(3)












                                - 163 -                                 




LSI C-86 Reference Manual                                      ISATTY(3)


【名前】

    isatty - キャラクタデバイスの判定

【書式】

    #include <io.h>
    int isatty(int fd);

【解説】

    isatty()はファイルハンドルfdがキャラクタデバイスかどうかを調べます。
    キャラクタデバイスとは、コンソール、プリンタ、シリアルポート等のディ
    スク装置以外の入出力装置のことです。

【リターン値】

    fdがキャラクタデバイスであれば0以外の値を返します。そうでなければ0を
    返します。

【可搬性】

    UNIX, MS-DOS



































                                - 164 -                                 




LSI C-86 Reference Manual                                      ISKANA(3)


【名前】

    iskana,  iskpun,  iskmoji, isalkana, ispnkana, isalnmkana, isprkana,
    isgrkana, iskanji, iskanji2 - 文字コードの判定

【書式】

    #include <jctype.h>
    int iskana(char c);
    int iskpun(char c);
    int iskmoji(char c);
    int isalkana(char c);
    int ispnkana(char c);
    int isalnmkana(char c);
    int isprkana(char c);
    int isgrkana(char c);
    int iskanji(char c);
    int iskanji2(char c);

【解説】

    これらは1バイトの文字コードcが以下のそれぞれの条件を満たすかどうかを
    判定し、満たすなら0でない値を、そうでなければ0を返します。

    iskana()
        カタカナのコード(0xA1 <= c <= 0xDF) かどうか

    iskpun()
        カタカナの区切り文字(0xA1 <= c <= 0xA6) かどうか

    iskmoji()
        カタカナの文字(0xA7 <= c <= 0xDF) かどうか

    isalkana()
        アルファベットまたはカタカナかどうか。これは

            (isalpha(c) || iskana(c))

        と同じです

    ispnkana()
        ASCIIまたはカタカナの区切り文字かどうか。これは

            (ispunct(c) || iskpun(c))

        と同じです

    isalnmkana()
        アルファベット、数字またはカタカナかどうか。これは

            (isalnum(c) || iskana(c))

        と同じです

    isprkana()
        印字可能なASCII文字あるいはカタカナかどうか。これは


                                - 165 -                                 




LSI C-86 Reference Manual                                      ISKANA(3)



            (isprint(c) || iskana(c))

        と同じです

    isgrkana()
        目に見えるASCII文字あるいはカタカナかどうか。これは

            (isgraph(c) || iskana(c))

        と同じです

    iskanji()
        シフト JIS コードの1バイト目(0x81 <= c <= 0x9F あるいは0xE0 <= c
        <= 0xFC) かどうか

    iskanji2()
        シフトJISコードの2バイト目(0x40 <= c <= 0x7E あるいは0x80  <=  c
        <= 0xFC) かどうか

    これらは<jctype.h>でマクロとして定義されています。

【可搬性】

    MS-DOS, ROM

【参照】

    ctype(3), jiszen(3)





























                                - 166 -                                 




LSI C-86 Reference Manual                                        ITOA(3)


【名前】

    itoa, ltoa, ultoa - 整数の文字列への変換

【書式】

    #include <stdlib.h>
    char *itoa(int val, char *buf, int radix);
    char *ltoa(long val, char *buf, int radix);
    char *ultoa(unsigned long val, char *buf, int radix);

【解説】

    itoa(), ltoa(), ultoa()はvalを文字列に変換してbufに格納します。radix
    には2から36までの整数で変換の基数を指定します。

    itoa()とltoa()はradixが10のときにはvalを符号付き数として扱います。そ
    れ以外では符号なし数として扱います。

    ultoa()はvalを符号なし数として扱います。

【可搬性】

    MS-DOS, ROM

【リターン値】

    bufに渡された値をそのまま返します。






























                                - 167 -                                 




LSI C-86 Reference Manual                                      JISZEN(3)


【名前】

    jiszen, jisl0, jisl1, jisl2, jisalpha, jisupper, jislower, jisdigit,
    jiskata, jishira, jiskigou, jisspace - 2バイト文字コードの判定

【書式】

    #include <jctype.h>
    int jiszen(unsigned short c);
    int jisl0(unsigned short c);
    int jisl1(unsigned short c);
    int jisl2(unsigned short c);
    int jisalpha(unsigned short c);
    int jisupper(unsigned short c);
    int jislower(unsigned short c);
    int jisdigit(unsigned short c);
    int jiskata(unsigned short c);
    int jishira(unsigned short c);
    int jiskigou(unsigned short c);
    int jisspace(unsigned short c);

【解説】

    これらは2バイトの文字コード(シフトJIS) cが以下のそれぞれのクラスに属
    するかどうかを判定し、属するなら0でない値を、そうでなければ0を返しま
    す。 2バイトコードは1バイト目が上位バイト、2バイト目が下位バイトには
    いっていなければなりません。

    jiszen()
        全角文字(0x8140 <= c <= 0xEFFC) かどうか

    jisl0()
        漢字以外の文字(0x8140 <= c <= 0x889E) かどうか

    jisl1()
        JIS第1水準(0x889F <= c <= 0x9872) かどうか

    jisl2()
        JIS第2水準(0x989F <= c <= 0xEA9E) かどうか

    jisalpha()
        全角英字かどうか

    jisupper()
        全角英大文字かどうか

    jislower()
        全角英小文字かどうか

    jisdigit()
        全角数字かどうか

    jiskata()
        全角カタカナかどうか

    jishira()


                                - 168 -                                 




LSI C-86 Reference Manual                                      JISZEN(3)


        全角ひらがなかどうか

    jiskigou()
        全角句読点かどうか

    jisspace()
        全角のスペースかどうか

【可搬性】

    MS-DOS, ROM

【参照】

    ctype(3), iskana(3)











































                                - 169 -                                 




LSI C-86 Reference Manual                                     JSTRADV(3)


【名前】

    jstradv - 文字へのポインタの更新

【書式】

    #include <jstring.h>
    char *jstradv(const char *s, int n);

【解説】

    jstradv()は文字へのポインタsを、n文字分進めた位置を返します。 これは
    (s + mtob(s, n))と同じです。

【リターン値】

    更新されたポインタを返します。

【可搬性】

    MS-DOS, ROM

【参照】

    mtob(3)

































                                - 170 -                                 




LSI C-86 Reference Manual                                     JSTRCHR(3)


【名前】

    jstrchr, jstrrchr - 文字列中の文字の検索

【書式】

    #include <jstring.h>
    char *jstrchr(const char *s, unsigned short c);
    char *jstrrchr(const char *s, unsigned short c);

【解説】

    jstrchr()はstrchr(3)と同様に、文字列s中の文字cを先頭から探し、はじめ
    て見つかった位置を返します。

    jstrrchr()はstrrchr(3)と同様に後ろから探し、はじめて見つかった位置を
    返します。

【リターン値】

    どちらも見つかったときはその位置を返し、見つからなかったときはNULLを
    返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strchr(3), strrchr(3)




























                                - 171 -                                 




LSI C-86 Reference Manual                                     JSTRCMP(3)


【名前】

    jstrcmp, jstrncmp - 文字列の比較

【書式】

    #include <jstring.h>
    int jstrcmp(const char *s, const char *t);
    int jstrncmp(const char *s, const char *t, size_t n);

【解説】

    jstrcmp()はstrcmp(3)と同様に、日本語文字列sとtを比較し、大小を返しま
    す。 等しいかどうかの判定ならばstrcmp(3)で十分ですが、日本語文字列の
    大小が問題になるときは、全角文字を1文字として比較してくれるjstrcmp()
    が必要です。

    文字コードの大小関係は次のようになります。

        ASCII文字 < カタカナ < 全角文字

    jstrncmp()はjstrcmp()と同様ですが、たかだかn文字しか比較しません。

【リターン値】

    s > tの時は正の値を
    s = tの時は0を
    s < tの時は負の値を返します。
【可搬性】

    MS-DOS, ROM

【参照】

    strcmp(3), strncpm(3)























                                - 172 -                                 




LSI C-86 Reference Manual                                     JSTRLEN(3)


【名前】

    jstrlen - 文字列の長さの測定

【書式】

    #include <jstring.h>
    int jstrlen(const char *s);

【解説】

    jstrlen()は1バイトコードと2バイトコードが混在する文字列s中の総文字数
    を返します。

【可搬性】

    MS-DOS, ROM

【参照】

    mtob(3), strlen(3)





































                                - 173 -                                 




LSI C-86 Reference Manual                                   JSTRMATCH(3)


【名前】

    jstrmatch - 文字列の検索

【書式】

    #include <jstring.h>
    char *jstrmatch(const char *s, const char *t);

【解説】

    jstrmatch()はstrpbrk(3)と同様に、文字列sを文字列t に含まれる各文字で
    検索します。s, tには全角文字が使用できます。

【リターン値】

    文字列sを先頭から検索してtのどれかの文字と最初に一致した文字へのポイ
    ンタを返します。ない場合はNULLを返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strpbrk(3)
































                                - 174 -                                 




LSI C-86 Reference Manual                                    JSTRNCAT(3)


【名前】

    jstrncat - 文字列の連結

【書式】

    #include <jstring.h>
    char *jstrncat(char *s, const char *t, size_t n);

【解説】

    jstrncat() はstrncat(3)と同様に、文字列sの後ろに文字列tを最大n文字付
    加します。全角文字も1文字と数えます。最後には必ずナル文字('\0') を付
    けます。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strncat(3)
































                                - 175 -                                 




LSI C-86 Reference Manual                                    JSTRNCPY(3)


【名前】

    jstrncpy - 文字列のコピー

【書式】

    #include <jstring.h>
    char *jstrncpy(char *s, const char *t, size_t n);

【解説】

    jstrncpy() はstrncpy(3)と同様に、tをsに最大n文字コピーします。全角文
    字も1文字と数えます。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strncpy(3)

































                                - 176 -                                 




LSI C-86 Reference Manual                                     jstrrev(3)


【名前】

    jstrrev - 文字列の並びを逆にする

【書式】

    #include <jstring.h>
    char *jstrrev(char *s);

【解説】

    jstrrev()はstrrev(3)と同様に、1バイトコードと2バイトコードが混在する
    文字列sを文字単位で並びかたを逆にします。

    jstrrev()は与えられた文字列を直接書き換えますので注意してください。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strrev(3)































                                - 177 -                                 




LSI C-86 Reference Manual                                    JSTRSKIP(3)


【名前】

    jstrskip - 文字列の長さの測定

【書式】

    #include <jstring.h>
    char *jstrskip(const char *s, const char *t);

【解説】

    jstrskip()はstrspn(3)と同じく、文字列sの中で文字列t に含まれない文字
    を探します。s, tともに全角文字が使用できます。

【リターン値】

    文字列sの中の文字列tに含まれない最初の文字の位置を返します。そのよう
    な文字が見つからなければ、sの最後のナル文字('\0')の位置を返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strspn(3)
































                                - 178 -                                 




LSI C-86 Reference Manual                                     JSTRSTR(3)


【名前】

    jstrstr - 部分文字列の検索

【書式】

    #include <jstring.h>
    char *jstrstr(const char *s, const char *t);

【解説】

    jstrstr()はstrstr(3)と同様に、文字列sの中に文字列tが含まれているかど
    うかを調べ、あればそのアドレスを返します。s, tには全角文字を使うこと
    ができます。

【リターン値】

    見つかったときはそのアドレスを返し、見つからなかったときはNULLを返し
    ます。

【可搬性】

    MS-DOS, ROM

【参照】

    strstr(3)































                                - 179 -                                 




LSI C-86 Reference Manual                                     JSTRTOK(3)


【名前】

    jstrtok - 文字列のトークンへの分解

【書式】

    #include <jstring.h>
    char *jstrtok(char *s, const char *t);

【解説】

    jstrtok()はstrtok(3)と同様に、文字列sを文字列tの各文字をデリミタとし
    て、文字列sを区切ります。s, tともに全角文字が使用できます。

    詳しくはstrtok(3)を参照してください。

【リターン値】

    区切られたトークンへのポインタを返します。トークンがない場合はNULLを
    返します。

【可搬性】

    MS-DOS, ROM

【参照】

    strtok(3)






























                                - 180 -                                 




LSI C-86 Reference Manual                                    JTOLOWER(3)


【名前】

    jtolower,  jtoupper, jtohira, jtokata, hantozen, zentohan, jmstojis,
    jistojms, mstojis, jistoms - 2バイト文字コードの変換

【書式】

    #include <jctype.h>
    unsigned short jtolower(unsigned short c);
    unsigned short jtoupper(unsigned short c);
    unsigned short jtohira(unsigned short c);
    unsigned short jtokata(unsigned short c);
    unsigned short hantozen(unsigned short c);
    unsigned short zentohan(unsigned short c);
    unsigned short jmstojis(unsigned short c);
    unsigned short jistojms(unsigned short c);
    unsigned short mstojis(unsigned short c);
    unsigned short jistoms(unsigned short c);

【解説】

    jtolower() はcが全角の英大文字のとき対応する小文字に変換して返し、そ
    れ以外の文字はそのまま返します。

    jtoupper()はcが全角の英小文字のとき対応する大文字に変換して返し、 そ
    れ以外の文字はそのまま返します。

    jtohira()はcが全角のカタカナのとき対応するひらがなに変換して返し、そ
    れ以外の文字はそのまま返します。

    jtokata()はcが全角のひらがなのとき対応するカタカナに変換して返し、そ
    れ以外の文字はそのまま返します。

    hantozen() は半角文字 c を対応する全角文字に変換して返します。 c  は
    isprint()を満足しなければなりません。

    zentohan()は全角文字cを対応する半角文字に変換して返します。cに対応す
    る半角文字は、isprint()を満足しなければなりません。

    jmstojis()はシフトJISコードcを対応するJISコードに変換して返します。

    jistojms()はJISコードcを対応するシフトJISコードに変換して返します。

    jmstojis(), jistojms()はそれぞれmstojis(), jistoms()の別名です。

【可搬性】

    MS-DOS, ROM

【参照】

    ctype(3), iskana(3), jiszen(3), toupper(3), tolower(3)






                                - 181 -                                 




LSI C-86 Reference Manual                                       KBHIT(3)


【名前】

    kbhit - コンソールのステータスチェック

【書式】

    #include <conio.h>
    int kbhit(void);

【解説】

    kbhit() はコンソールにキー入力があるかどうかを調べます。入力されてい
    る文字は、getch(3), getche(3)で入力してください。

【リターン値】

    キーが入力されていれば0以外の値を、されていなければ0を返します。

【可搬性】

    MS-DOS

【参照】

    getch(3), ungetch(3)

































                                - 182 -                                 




LSI C-86 Reference Manual                                       LSEEK(3)


【名前】

    lseek - リードライト位置の設定

【書式】

    #include <io.h>
    #include <stdio.h>
    long lseek(int fd, long offset, int ptrname);

【解説】

    lseek()はファイルハンドルfd で示されるファイルの次のリードライト位置
    を変更します。 新しい位置はptrnameが示す場所からoffsetバイトだけ前あ
    るいは後になります。

    ptrnameの値は<stdio.h>で定義されている次の3 種類の指定方法のうちひと
    つを選択できます。

    SEEK_SET
        ファイルの先頭からの絶対位置

    SEEK_CUR
        現在の位置からの相対位置

    SEEK_END
        ファイルの最後からの相対位置

【リターン値】

    成功すると新しいリードライト位置のファイルの先頭からのオフセットを返
    します。失敗すると-1Lを返してerrnoをセットします。

【エラー】

    EINVAL
        ptrnameが不正です

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    tell(3)










                                - 183 -                                 




LSI C-86 Reference Manual                                      MALLOC(3)


【名前】

    malloc, calloc, realloc, free - 高レベルメモリ管理

【書式】

    #include <stdlib.h> or <malloc.h>
    void *malloc(size_t n);
    void *calloc(unsigned int nelem, size_t elsize);
    void *realloc(void *ptr, size_t size);
    void free(void *p);

【解説】

    malloc(), calloc(), realloc(), free() は高レベルのメモリ管理をおこな
    う関数です。

    malloc() はnバイトのメモリ・ブロックをヒープ領域から切り出し、切り出
    されたブロックの先頭へのポインタを関数の値として返します。もし、ヒー
    プ領域に十分なメモリがない時には、NULLを返します。割り当てられたメモ
    リ領域はクリアされません。

    calloc()はサイズがelsizeバイトのメモリ・ブロックをnelem 個分確保しま
    す。確保された領域はゼロ・クリアされます。

    realloc()はmalloc(),  calloc(),  realloc()で確保したメモリのサイズを
    size バイトに変更します。可能ならばptr番地にsizeバイトのメモリを確保
    します。ptr番地に十分な空きがない場合は新たな場所にsize バイトのメモ
    リを確保し、ptr番地の内容をコピーしたのちptrを解放します。

    realloc()のptrにNULLを指定するとmalloc(size)と等価で、sizeバイトの領
    域を新たに確保します。 size に0を指定するとfree(ptr)と同じ動作をし、
    ptrが指す領域を開放したうえで値NULLを返します。

    free()はpが示すメモリ・ブロックを解放します。pはmalloc(),  calloc(),
    realloc()によって割り付けられたポインタでなければなりません。

【リターン値】

    malloc(), calloc()は確保されたメモリ・ブロックへのポインタを返し、確
    保できない場合はNULLを返します。

    realloc() は再割り当てされたメモリ・ブロックへのポインタを返します。
    再割り当てできなかったときには値NULLを返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    farmalloc(3), sbrk(3)






                                - 184 -                                 




LSI C-86 Reference Manual                                    MATHERR(3M)


【名前】

    matherr, _matherr - 数学関数例外ハンドラ

【書式】

    #include <math.h>
    int matherr(struct exception *x);
    double _matherr(int type,  char *name,  double *arg1,  double *arg2,
    double r);

【解説】

    matherr() は数学関数の実行で発生したエラーを処理するユーザ定義の関数
    です。

    struct exception型の構造体は<math.h>で次に示すように定義されており、
    エラーの種類、発生した関数名、そのパラメタ、デフォルトの関数値が格納
    されています。

        struct  exception {
                int     type;   /* エラーの種類 */
                char    *name;  /* 関数名 */
                double  arg1;   /* 第1パラメタ */
                double  arg2;   /* 第2パラメタ */
                double  retval; /* 関数値 */
        };

    エラーの種類は<math.h>で定義されています。

    DOMAIN
        パラメタが定義域に存在しません

    SING
        関数の特異点です

    OVERFLOW
        オーバーフローしました

    UNDERFLOW
        アンダーフローしました

    TLOSS
        全体的に桁落ちしました

    PLOSS
        部分的に桁落ちしました

    アプリケーションが独自のmatherr()を用意しておけば、 エラーからの回復
    処理を実行することができます。必要な処理を実行した後にmatherr()が1を
    返すとエラーメッセージは表示されず、errnoも変更されません。matherr()
    が 0 を返したときにはerrnoにはEDOMあるいはERANGEがセットされます。ま
    た、typeがDOMAIN,  SING, TLOSSのときには対応するエラーメッセージが標
    準エラー出力(stderr)に表示されます。

    _matherr()  は数学関数から呼び出され、  matherr()   を呼び出します。


                                - 185 -                                 




LSI C-86 Reference Manual                                    MATHERR(3M)


    matherr()が0を返してくるとstderrにエラーメッセージを表示するのはこの
    関数です。 したがって、数学関数をROM化するときには_matherr()をご自分
    で必ず用意してください。

【リターン値】

    エラーを処理できたときには0以外を返し、処理できなかったときには0を返
    します。

【エラー】

    EDOM
        パラメタが定義域を超えています

    ERANGE
        結果が正確に表現できません

【可搬性】

    UNIX, MS-DOS, ROM

【参照】

    trig(3M), hyperbolic(3M), exp(3M)


































                                - 186 -                                 




LSI C-86 Reference Manual                                         MAX(3)


【名前】

    max, min - パラメタの大小選択

【書式】

    #include <stdlib.h>
    int max(int x, int y);
    int min(int x, int y);

【解説】

    max()は2つのint型パラメタxとyのうちの大きい方の値を返します。

    min()は2つのint型パラメタxとyのうちの小さい方の値を返します。

【可搬性】

    MS-DOS, ROM

【バグ】

    max(), min()は関数でありマクロではありません。したがって、max、minと
    いう名前を外部名(staticでない名前)として使用することはできません。特
    に関数名として使用すると、他のライブラリ関数が正しく動作しなくなるこ
    とがあります。
































                                - 187 -                                 




LSI C-86 Reference Manual                                     MEMCCPY(3)


【名前】

    memccpy - メモリ内データのコピー

【書式】

    #include <string.h> or <memory.h>
    void *memccpy(void *dest, const void *src, char c, size_t n);

【解説】

    memccpy()は文字cをコピーするか、あるいはnバイトをコピーするまでsrcか
    らdestへメモリをコピーします。

    memccpy()はdestとsrcの領域が重なっている場合には、正しくコピーできな
    いことがあります。

【リターン値】

    文字cまでをコピーしたときにはdestのcの次の文字を指すポインタを返しま
    す。それ以外はNULLを返します。

【可搬性】

    UNIX, MS-DOS, ROM

【参照】

    memcpy(3)





























                                - 188 -                                 




LSI C-86 Reference Manual                                      MEMCHR(3)


【名前】

    memchr - メモリ内データの検索

【書式】

    #include <string.h> or <memory.h>
    void *memchr(const void *addr, char byte, size_t count);

【解説】

    memchr()はaddr番地から連続するcountバイトのメモリ・ブロックをbyte で
    検索します。

【リターン値】

    addr番地から順に検索してbyteとはじめて一致したアドレスを返します。見
    つからなかった場合はNULLを返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM




































                                - 189 -                                 




LSI C-86 Reference Manual                                      MEMCMP(3)


【名前】

    memcmp, memicmp - メモリ・ブロックの比較

【書式】

    #include <string.h> or <memory.h>
    int memcmp(const void *addr1, const void *addr2, size_t n);
    int memicmp(const void *addr1, const void *addr2, size_t n);

【解説】

    memcmp(), memicmp()はaddr1番地とaddr2番地のメモリブロックの最初のnバ
    イトを比較します。

    memicmp()は大文字と小文字の区別をしません。

【リターン値】

    addr1 > addr2 の時は正の値を、
    addr1 = addr2 の時は0を、
    addr1 < addr2 の時は負の値を返します。
【可搬性】

    memcmp()
        ANSI, UNIX, MS-DOS, ROM

    memicmp()
        MS-DOS, ROM





























                                - 190 -                                 




LSI C-86 Reference Manual                                      MEMCPY(3)


【名前】

    memcpy, memmove, movmem - メモリブロックのコピー

【書式】

    #include <string.h> or <memory.h>
    void *memcpy(void *dest, const void *source, size_t count);
    void *memmove(void *dest, const void *source, size_t count);
    #include <string.h>
    void *movmem(const void *source, void *dest, size_t count);

【解説】

    memcpy(), memmove(), movmem()はsource番地から連続するcountバイトのメ
    モリブロックをdest番地へ転送します。

    memcpy()はdestとsourceの領域が重なっている場合には、正しくコピーでき
    ないことがあります。

    memmove()はdestとsourceの領域が重なっていても正しくコピーします。

    movmem()はmemcpy()を呼び出すマクロとして定義されています。

【リターン値】

    パラメタdestの値をそのまま返します。

【可搬性】

    memcpy()
        ANSI, UNIX, MS-DOS, ROM

    memmove()
        ANSI, MS-DOS, ROM

    movmem()
        MS-DOS, ROM

【参照】

    memccpy(3)
















                                - 191 -                                 




LSI C-86 Reference Manual                                      MEMSET(3)


【名前】

    memset, setmem - メモリへのデータのセット

【書式】

    #include <string.h> or <memory.h>
    void *memset(void *addr, char byte, size_t count);
    #include <string.h>
    void *setmem(void *addr, size_t count, char byte);

【解説】

    memset(),  setmem()はaddr番地から連続するcountバイトのメモリ・ブロッ
    クにbyteを書き込みます。

    setmem()は、memset()を呼び出すマクロとして定義されています。

【リターン値】

    パラメタaddrの値をそのまま返します。

【可搬性】

    memset()
        ANSI, UNIX, MS-DOS, ROM

    setmem()
        MS-DOS, ROM





























                                - 192 -                                 




LSI C-86 Reference Manual                                       MKDIR(3)


【名前】

    mkdir - ディレクトリの作成

【書式】

    #include <direct.h>
    int mkdir(const char *pathname);

【解説】

    mkdir() は新しいディレクトリpathnameを作成します。pathnameはすでに存
    在するパス名と新たに作成するディレクトリ名で構成します。

【リターン値】

    成功すれば0を返します。失敗すればerrnoをセットし、0 以外の値を返しま
    す。

【エラー】

    ENOENT
        先行するパス名が見つかりません

    EACCES
        すでに同名のファイルまたはディレクトリが存在します。またはルート
        ディレクトリに空き領域がありません

【可搬性】

    MS-DOS

【参照】

    chdir(3), rmdir(3), getcwd(3)























                                - 193 -                                 




LSI C-86 Reference Manual                                      MKTEMP(3)


【名前】

    mktemp - 新しいファイル名の作成

【書式】

    #include <io.h>
    char *mktemp(char *template);

【解説】

    mktemp()はtemplateをもとに、新しいファイル名を作成します。

    templateは``baseXXXXXX''の形であたえます。ユーザが設定したbaseに続く
    文字Xは、mktemp()によって書き換えられます。

    mktemp()は6つのXのうち最初のXを英数字に書き換え、残りのXをプロセスを
    識別するための数字に書き換えます。最初のXはまず'0'になり、続く呼び出
    しでは'a' - 'z'が使われます。

    mktemp()は新しいファイル名を作り出すだけで、ファイルをオープンするこ
    とはありません。また、mktemp()によって得られたファイルをオープンした
    場合、そのファイルは自動的に消去されることもありません。

【リターン値】

    新しい名前を作成できたときには template を返します。失敗したときには
    NULLを返します。

【可搬性】

    UNIX, MS-DOS

【参照】

    tempnam(3), tmpnam(3), tmpfile(3)






















                                - 194 -                                 




LSI C-86 Reference Manual                                    MOVEDATA(3)


【名前】

    movedata - メモリブロックのコピー

【書式】

    #include <string.h> or <memory.h>
    void movedata(unsigned srcseg,  unsigned srcoff,   unsigned  dstseg,
    unsigned dstoff, size_t nbytes);

【解説】

    movedata()はnbytesのデータをsrcseg:srcoffからdstseg:dstoffへコピーし
    ます。

    farデータを移動するときに使用します。

【可搬性】

    MS-DOS, ROM






































                                - 195 -                                 




LSI C-86 Reference Manual                                  _NULLCHECK(3)


【名前】

    _nullcheck - NULLポインタチェック

【書式】

    int _nullcheck(void);

【解説】

    _nullcheck()はプログラム終了時に呼び出され、NULLポインタを使った代入
    が実行されたかどうかを判定します。そのおそれがある場合には、ランタイ
    ムライブラリは

        NULL pointer assignment

    と標準エラー出力 (stderr)に表示し、終了コード1でプログラムを終了しま
    す。

    このチェックをしたくないときには、  次のプログラムをリンクしてくださ
    い。

        int     _nullcheck(void)
        {
                return (0);
        }

【リターン値】

    チェックに成功すると0を返します。失敗したときには0以外を返します。

【可搬性】

    MS-DOS
























                                - 196 -                                 




LSI C-86 Reference Manual                                        OPEN(3)


【名前】

    open - ファイルのオープン

【書式】

    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <io.h>
    int open(const char *path, int oflag [ , int mode ] );

【解説】

    open()はpathで示されるファイルをオープンします。パラメタoflag はオー
    プンされたファイルに対して許される操作の種類を指定します。 oflagは以
    下に示すフラグを論理和したものをあたえます。ただし、最初の3 つのフラ
    グはこのうちひとつしか指定できません。

    O_RDONLY
        読み出しのみ可

    O_WRONLY
        書き込みのみ可

    O_RDWR
        読み書き共に可

    O_BINARY
        バイナリモードでオープンします

    O_APPEND
        このフラグがセットされていると、書き込みを実行する直前にファイル
        ポインタはファイルの最後にシークします

    O_CREAT
        すでにファイルが存在する場合、このフラグは効果を持ちません。ファ
        イルが存在しない場合には新たなファイルを作成します。現在のファイ
        ルモード生成マスクの 1になっているビットに対応するmodeのビットが
        クリアされたものが、作成されたファイルのモードになります

    O_TRUNC
        ファイルがすでに存在する場合、ファイル長は0 に切りつめられます。
        ファイルモードは変りません

    O_EXCL
        O_EXCL がO_CREATと共に指定されている場合、すでにファイルが存在し
        ているときにはopen()は失敗します

    modeはO_CREATを指定して新たなファイルを作成するときに必要となり、 フ
    ァイルの保護モードを指定します。<sys/stat.h>で定義されている定数を使
    って次のように指定します。

    S_IWRITE
        書き込み可



                                - 197 -                                 




LSI C-86 Reference Manual                                        OPEN(3)


    S_IREAD
        読み出し可(リードオンリーファイルを作ります)

    S_IREAD | S_IWRITE
        読み書き可

    MS-DOS ではライトオンリーのファイルは作成できませんので、 S_IWRITEと
    S_IREAD | S_IWRITEとは同じ意味となり、いずれもリードライト可能なファ
    イルになります。

    modeの値は実際に使用される前にumask(3)で設定されている値でマスクされ
    ます。詳しくはumask(3)を参照してください。

【リターン値】

    正常終了するとファイルハンドル(負でない整数値)を返します。エラーを検
    出すると-1を返し、エラーの種類をerrnoにセットします。

【エラー】

    EACCES
        アクセスが拒否されました( リードオンリーのファイルを O_WRONLY や
        O_RDWRでオープンしようとした。またはpathがディレクトリだった)

    EEXIST
        O_CREATとO_EXCLが指定されているとき、ファイルがすでに存在します

    EINVAL
        アクセスコードが無効です

    EMFILE
        オープンされているファイルの数が多すぎます

    ENOENT
        O_CREAT が指定されておらず、しかもpathで示されるファイルが存在し
        ません

    ENOENT
        pathの先行するパス名が存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    close(3), creat(3), umask(3)











                                - 198 -                                 




LSI C-86 Reference Manual                                        OUTP(3)


【名前】

    outp, outpw, outp8, outp8w - ポートへの出力

【書式】

    #include <machine.h> or <conio.h>
    char outp(int port, char c);
    unsigned outpw(int port, int c);
    char outp8(int port, char c);
    unsigned outp8w(int port, int c);

【解説】

    これらの関数は8086のポートへ1バイトまたは1ワードのデータを出力します
    (8086のOUT命令を実行します)。

    outp(), outp8()はportで示されるポートへcの値をバイトで出力します。

    outpw(), outpw8()はportで示されるポートへcの値をワードで出力します。

    outp8(),  outp8wでは指定できるポート番号が0から255までに限られ、また
    portは定数式(コンパイル時に値のわかる式)でなければなりません。これは
    8086の即値OUT命令を生成するために必要な条件です。

    outp(),  outpw()は0から65535まで任意のポート番号を指定でき、任意の式
    を書くことができますが、outp8(),  outp8w()に比べると少しプログラムが
    大きくなります。

【リターン値】

    出力した値(cの値)を返します。

【可搬性】

    MS-DOS, ROM

【参照】

    inp(3)


















                                - 199 -                                 




LSI C-86 Reference Manual                                      PERROR(3)


【名前】

    perror - エラーメッセージの表示

【書式】

    #include <stdio.h>
    void perror(const char *s);

【解説】

    perror()はsとともに errno に対応するエラーメッセージを標準エラー出力
    (stderr)に出力します。これは次の文と等価です。

        fprintf(stderr, "%s: %s\n", s, strerror(errno));

    s がNULLであるか空文字列("")を指しているときにはエラーメッセージだけ
    を出力します。

    MS-DOSで使用していない値がerrno に設定されている場合には空文字列を表
    示します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    errno(3), strerror(3)





























                                - 200 -                                 




LSI C-86 Reference Manual                                      PRINTF(3)


【名前】

    printf, fprintf, sprintf - 書式つき出力変換

【書式】

    #include <stdio.h>
    int printf(const char *format, ...);
    int fprintf(FILE *fp, const char *format, ...);
    int sprintf(char *buf, const char *format, ...);

【解説】

    printf() は標準出力(stdout)へ、fprintf()はパラメタfpで示されるファイ
    ルへ、そしてsprintf()はbufで示される文字型配列へformatで指定した書式
    で続くパラメタを変換し、出力します。

    printf()は制御文字列(format)を走査して、'%' 以外の文字はそのまま出力
    し、 '%'であれば続く変換仕様に従って対応するパラメタを変換して出力し
    ます。この変換はナル文字('\0')に出会うまで続きます。

    変換仕様とパラメタは、型および個数が一致しなくてはいけません。もしも
    これらが一致しないと、おかしな結果が得られることがあります。

    変換仕様は以下の形式をとります。

        %[flag][width][.[precision]][type]conversion

    flagは変換仕様を修飾し、以下のものが指定できます。

    -
        左づめ出力

    +
        符号付き数の変換で正の場合+、負の場合-を出力します

    ' '(空白)
        符号付き数の変換で正の場合' '、負の場合-を出力します

    #
        このフラグを指定すると、

         1. o変換では最初の数字は必ず0になります

                printf("%#o", 10); -> 012

         2. x,  X変換では、パラメタが0でなければそれぞれ0x, 0Xがつけられ
            ます

                printf("%#02x", 10); ->0x0a

         3. e,  E, f, g, G変換では出力には必ず小数点がつきます。また、g,
            G変換では最後に続く0の列も出力されます

                printf("%#g", 10.0); -> 10.0000



                                - 201 -                                 




LSI C-86 Reference Manual                                      PRINTF(3)


        これら以外の変換では#フラグは無視されます。

    +と' 'が同時に指定された場合、+が優先されます。 どれも指定されなかっ
    たときは右づめになり、数の出力においてはゼロまたは正の場合は符号はな
    く、 負の場合-が付加されます。これらflagはどのような順番に何度現れて
    もかまいません。

    widthは出力されるフィールド幅を指定する数字の列です。 変換された値の
    文字数がフィールド幅に満たないときは、 右づめの場合には空白もしくは0
    が左側につめられ、左づめの場合(flagで-を指定した場合) には空白が右側
    につめられます。widthの先頭の文字が0の場合、 つめられる文字は 0 とな
    り、それ以外は空白です。

    フィールド幅指定が省略された場合は変換された値がそのまま出力されま
    す。変換された値の文字数がフィールド幅を越えた場合は、フィールド幅指
    定が省略された場合と同じです。 また、フィールド幅に0を指定した場合は
    幅指定が省略されたとみなされます。

    フィールド幅は変数や式であたえることもできます。widthに * を指定する
    と、対応するint型のパラメタの値が使われます。

    precisionは精度を指定します。precisionは変換の型によって扱いが異なり
    ます。d, o, u, x, X変換では出力される最小の桁数を示し、省略時は1とみ
    なされます。e, E, f変換では小数点以下の桁数を示し、省略時は6とみなさ
    れます。g, G変換では有効桁数を示し、省略時は6とみなされます。s変換で
    は出力される文字列の長さを示し、  省略時は文字列全体の大きさとなりま
    す。 c変換ではprecisionは効果を持ちません。.(ピリオド)のみが現れた場
    合は、prescisionは0が指定されたとみなされます。precisionの指定による
    動作の詳細はconversionを参照してください。

    このフィールドもwidthフィールドと同様に*指定によって変数や式であたえ
    ることができます。

    typeは変換に使用される型を決定します。以下のものが指定できます。

    h
        d,  o,  u, x, X変換時に、対応するパラメタの型がshort intもしくは
        unsigned short int型であることを示します

    l
        d, o, u, x, X変換時に、対応するパラメタの型がlong intもしくはint
        unsigned long int型であることを示します

    L
        e, E, f, g, G変換時に、対応するパラメタの型がlong double型である
        ことを示します

    F
        p変換時にfarポインタであることを示します

    N
        p変換時にnearポインタであることを示します

    typeが省略された場合、d, o, u, x, X変換ではintもしくはunsigned int型
    のパラメタを取るものと仮定します。また、e,  E, f, g, G変換ではdouble
    型を取るものと仮定します。float型はdouble 型に自動的に変換されて呼び


                                - 202 -                                 




LSI C-86 Reference Manual                                      PRINTF(3)


    出しが実行されますので、 float型とdouble型の判別のための文字はありま
    せん。h,  l, Lはどのような順番に何回現れてもかまいませんが、最後に現
    れた文字が有効になります。変換と無関係の型が指定された場合にはtypeが
    省略されたとみなします。

    conversionは変換の形式を決定する文字で、省略できません。以下のものが
    指定できます。

    d, i, o, u, x, X
        int 型(short,  long を含む) のパラメタを、符号付き10進数(d, i)、
        符号なし8進数(o)、符号なし10進数(u)、符号なし16進数(x,  X)に変換
        して出力します。10-15を表すためにx変換では小文字のa  -  f を使用
        し、X変換ではA - Fを使用します。

        precision は出力される最小の桁数を指定します。もし変換された値の
        文字数がprecision よりも小さい場合は、 先頭に 0 がつめられます。
        precision が 0 のときは、 値が 0 であればその0は出力されません。
        precisionが省略された時には1が指定されたとみなされます

    c
        char型のパラメタを取り出して出力します。precision は効果を持ちま
        せん

    s
        パラメタをchar *として取り出し、そのポインタが指す文字列を出力し
        ます。文字列は終わりを示すナル文字('\0')の直前まで出力されるか、
        またはprecisionで示される長さだけ出力されます。precisionが省略さ
        れた場合は文字列全体が出力されます

    n
        パラメタを int *として取り出し、そのポインタが指す変数にこれまで
        に出力された文字数を代入します。  この変換はなにも出力しません。
        precisionは効果を持ちません

    p
        パラメタをポインタとして取り出して出力します

    e, E
        浮動小数点数を[-]d.ddde[+-]dd の形式で出力します。小数点の前に 1
        桁のゼロでない数字があり、 小数点以下にprecisionで指定した桁数の
        数字が続きます。 precision が省略された時には 6 とみなされます。
        precisionに0を指定した場合は小数点は出力されません。値は出力され
        ている桁あるいは最大有効桁で四捨五入されます。 指数部はe変換の場
        合はeで、E変換の場合はEで始ります。次に符号が出力され、 指数が少
        なくとも2桁出力されます

    f
        浮動小数点数を [-]ddd.ddd の形式で出力します。小数点以下の桁数は
        precisionで指定した数で、省略時には6とみなされます。precision が
        0の場合には小数点は出力されません。四捨五入はe,  E変換と同様に実
        行されます。小数点の前には少なくとも1桁の数字が出力されます。

    g, G
        浮動小数点数をf変換、またはe変換(gが指定されているとき。G が指定
        されていれば E変換)して出力します。precisionは有効桁数を指定しま
        す。指数部が-4より小さい場合、もしくはprecision より大きい場合に


                                - 203 -                                 




LSI C-86 Reference Manual                                      PRINTF(3)


        e, E変換され、それ以外ではf変換されます。数字の最後に続く0の列は
        出力されません。また、小数点以下に数値が存在する時のみ小数点が出
        力されます。

    浮動小数点数の変換ではパラメタの値が無限大の場合には"infinity"と出力
    されます。 上記以外の変換仕様は無視され、%の次の文字からそのまま出力
    されます。したがって制御文字列中に%%と書けば、%自身が出力されます。

    printf()一族はライブラリファイルdoslib.libとintlib.libの両方に含まれ
    ています。intlib.libに含まれているprintf()には、浮動小数点数の表示機
    能(f,  e, E, g, G)がありません。これは、浮動小数点数の表示を必要とし
    ない多くのプログラムにムダな浮動小数点演算パッケージをリンクしないよ
    うにして、作成した実行ファイルを小さくするために用意しました。こちら
    のprintf()を使う場合には、次のようにintlib.libをライブラリとして指定
    してください。

        lcc prog.c -lintlib

【リターン値】

    出力された文字数を返します。出力エラーが生じた時は-1を返します。

    sprintf()では最後に置かれるナル文字('\0')の数は含みません。

【可搬性】

    sprintf()
        ANSI, UNIX, MS-DOS, ROM

    それ以外
        ANSI, UNIX, MS-DOS

【参照】

    scanf(3), vprintf(3)

【バグ】

    sprintf()はbufに変換結果が入るだけの余裕があるかどうかのチェックはし
    ません。bufには十分な領域を取っておいてください。


















                                - 204 -                                 




LSI C-86 Reference Manual                                        PUTC(3)


【名前】

    putc, fputc, putchar, fputchar - ストリームへの1文字の出力

【書式】

    #include <stdio.h>
    int putc(char c, FILE *fp);
    int fputc(char c, FILE *fp);
    int putchar(char c);
    int fputchar(char c);

【解説】

    putc(), fputc()はファイルポインタfpで示されるファイルに文字cを書き出
    します。

    putchar(), fputchar()は文字cを標準出力(stdout)に書き出します。

    putc()とputchar()はマクロとして定義されています。

【リターン値】

    書き込みに成功した場合は出力した文字を返します。  そうでない場合は値
    EOFを返します。

【可搬性】

    putc()
        ANSI, UNIX, MS-DOS

    fput()
        ANSI, UNIX, MS-DOS

    putchar()
        ANSI, UNIX, MS-DOS

    fputchar()
        MS-DOS

【参照】

    getc(3)















                                - 205 -                                 




LSI C-86 Reference Manual                                       PUTCH(3)


【名前】

    putch - コンソールへの1文字出力

【書式】

    #include <conio.h>
    char putch(char c);

【解説】

    putch()はコンソールに文字cを出力します。

【リターン値】

    出力された文字を返します。

【可搬性】

    MS-DOS

【参照】

    getch(3), getche(3)

【バグ】

    0xFFを出力することはできません。






























                                - 206 -                                 




LSI C-86 Reference Manual                                        PUTS(3)


【名前】

    puts, fputs - ストリームへの文字列の出力

【書式】

    #include <stdio.h>
    int puts(const char *s);
    int fputs(const char *s, FILE *fp);

【解説】

    puts()はsで示される文字列を、標準出力 (stdout) に出力し、 そのあとに
    '\n'を出力します。

    fputs()は文字列sをファイルポインタfpが示すファイルに出力します。'\n'
    は付加されません。

    どちらの関数も、文字列の終わりを示すナル文字('\0')は出力しません。

【リターン値】

    出力が成功した場合は0を返し、失敗した場合は0以外の値を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    gets(3)

【バグ】

    puts(s)とfputs(s, stdout)は同じ動作をしないので注意してください。























                                - 207 -                                 




LSI C-86 Reference Manual                                        PUTW(3)


【名前】

    putw - ストリームへのワードの出力

【書式】

    #include <stdio.h>
    int putw(int w, FILE *fp);

【解説】

    putw() はファイルポインタfpで指定されているファイルへ、1ワード(2バイ
    ト)のデータwを出力します。

【リターン値】

    成功した場合はwを返します。失敗した場合はEOFを返します。ただしw の値
    がEOFの場合もありますから、エラーの判定にはferror(3)を使用してくださ
    い。

【可搬性】

    UNIX, MS-DOS

【参照】

    getw(3), ferror(3)































                                - 208 -                                 




LSI C-86 Reference Manual                                       QSORT(3)


【名前】

    qsort - データのソート

【書式】

    #include <stdlib.h> or <search.h>
    void qsort(void *base,  size_t nel, size_t width, int(*compar)(const
    void *x, const void *y));

【解説】

    qsort()はデータを昇順に並べ換えます。baseはデータの先頭アドレス、nel
    はソートするデータの個数、 widthはデータの各要素の大きさをバイト数で
    表したもの、comparは比較関数へのポインタです。

    comparの指している関数は、2つのポインタ(xとy)を引数として、 次の値を
    返さなくてはなりません。

        *x > *yの時 正
        *x = *yの時 0
        *x < *yの時 負
【使用例】

    次のプログラムは int型オブジェクトの配列の先頭アドレス(z)と要素数(n)
    を使って、配列内のオブジェクトを昇順に並べ換えます。

        #include <stdlib.h>

        int     compare(const void *x, const void *y)
        {
                return (*(const int *)x - *(const int *)y);
        }

        void    foo(int z[], int n)
        {
                qsort(z, n, sizeof(int), compare);
        }

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    bsearch(3)












                                - 209 -                                 




LSI C-86 Reference Manual                                       RAISE(3)


【名前】

    raise - ソフトウェアシグナルの発生

【書式】

    #include <signal.h>
    int raise(int sig);

【解説】

    raise()  はプログラムにシグナル  sig を送ります。 sig の値については
    signal(3)を参照してください。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットして0 以外の値を返しま
    す。

【エラー】

    EINVAL
        パラメタが不正です

【可搬性】

    ANSI, MS-DOS

【参照】

    signal(3), abort(3)



























                                - 210 -                                 




LSI C-86 Reference Manual                                        RAND(3)


【名前】

    rand, srand - 乱数の発生

【書式】

    #include <stdlib.h>
    int rand(void);
    void srand(unsigned int seed);

【解説】

    rand()は0から32767の乱数を発生します。

    srand() は乱数発生の初期化をおこないます。変数seedの値によって異なる
    乱数列が作られます。seedに同じ値を与えれば、必ず同じ乱数列が得られま
    す。

【リターン値】

    rand()は乱数値を返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

































                                - 211 -                                 




LSI C-86 Reference Manual                                        READ(3)


【名前】

    read - ファイルの読み出し

【書式】

    #include <io.h>
    int read(int fd, void *buf, int n);

【解説】

    read()はファイルハンドルfdで示されるファイルの内容を最大n バイト読み
    出して、bufで指されるメモリバッファへ書き込みます。

    読み出し動作はファイルの現在のリードライト位置から開始します。読み出
    し操作が完了すると、リードライト位置は実際に読み出されたデータのバイ
    ト数だけ進められます。

【リターン値】

    実際にメモリ上に読み込まれたファイル内容のバイト数を返します。ファイ
    ルの終わりに到達した場合には 0 を返します。 エラーを検出すると-1を返
    し、errnoにエラーの種類をセットします。

【エラー】

    EACCES
        アクセスが拒否されました

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    creat(3), open(3), write(3), close(3)

【バグ】

    read()は、実際には32Kバイト以上を一度に読み出すことが可能です。 この
    場合にはread()のリターン値をunsigned intとして使用しなければなりませ
    ん。 ただし、エラーを示す-1はunsigned intの65535と区別がつきませんの
    で、read() が読み出すことができる最大のバイト数は 65534 に制限されま
    す。











                                - 212 -                                 




LSI C-86 Reference Manual                                      RENAME(3)


【名前】

    rename - ファイル名の変更

【書式】

    #include <io.h> or <stdio.h>
    int rename(const char *oldname, const char *newname);

【解説】

    rename()はファイルoldnameの名前をnewnameに変更します。オープンされて
    いるファイルは一旦クローズしてから名前を変更しなければなりません。

【リターン値】

    成功した場合は0を返し、失敗した場合は0以外の値を返します。

【エラー】

    EACCES
        newnameがすでに存在します

    ENOENT
        oldnameが見つかりません

    EXDEV
        異なるデバイスに移そうとしました

【可搬性】

    ANSI, UNIX, MS-DOS


























                                - 213 -                                 




LSI C-86 Reference Manual                                      REWIND(3)


【名前】

    rewind - ファイルのリードライト位置のリセット

【書式】

    #include <stdio.h>
    void rewind(FILE *fp);

【解説】

    rewind()はファイルポインタfpで指定されるファイルの現在の位置をファイ
    ルの先頭へ移動します。

        fseek(fp, 0L, SEEK_SET);

    と同じです。

    rewind()はEOFインジケータとエラーインジケータをクリアします。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    fseek(3), ftell(3)































                                - 214 -                                 




LSI C-86 Reference Manual                                       RINT(3M)


【名前】

    ceil, floor - 整数値への丸め

【書式】

    #include <math.h>
    double ceil(double x);
    double floor(double x);

【解説】

    ceil()はxより小さくない最小の整数を返します。

    floor()はxより大きくない最大の整数を返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM







































                                - 215 -                                 




LSI C-86 Reference Manual                                       RMDIR(3)


【名前】

    rmdir - ディレクトリの削除

【書式】

    #include <direct.h>
    int rmdir(const char *pathname);

【解説】

    rmdir()はディレクトリpathnameを削除します。

    pathnameで指定されるディレクトリは空でなくてはなりません。また、カレ
    ントディレクトリあるいはルートディレクトリであってはなりません。

【リターン値】

    成功すれば 0を返します。失敗すればerrnoをセットし、0以外の値を返しま
    す。

【エラー】

    ENOENT
        先行するパスが存在しません。あるいはディレクトリが存在しません

    EACCES
        ディレクトリが空ではありません

    EACCES
        ルートディレクトリあるいはカレントディレクトリが指定されました

    EACCES
        ディレクトリの形式が不正です

【可搬性】

    UNIX, MS-DOS

【参照】

    chdir(3), mkdir(3), getcwd(3)
















                                - 216 -                                 




LSI C-86 Reference Manual                                       RMTMP(3)


【名前】

    rmtmp - テンポラリファイルの削除

【書式】

    #include <stdio.h>
    int rmtmp(void);

【解説】

    rmtmp() は tmpfile(3) によって生成したすべてのテンポラリファイルをク
    ローズして削除します。

    tmpfile(3)を実行したディレクトリで実行しなければなりません。

【リターン値】

    クローズ、削除されたファイルの数を返します。

【可搬性】

    MS-DOS

【参照】

    tmpfile(3)































                                - 217 -                                 




LSI C-86 Reference Manual                                       _ROTL(3)


【名前】

    _rotl, _rotr, _lrotl, _lrotr - 整数のローテート

【書式】

    #include <stdlib.h>
    unsigned int _rotl(unsigned int val, char cnt);
    unsigned int _rotr(unsigned int val, char cnt);
    unsigned long _lrotl(unsigned long val, int cnt);
    unsigned long _lrotr(unsigned long val, int cnt);

【解説】

    _rotl(), _lrotl()はvalをcnt回だけ左にローテートします。

    _rotr(), _lrotr()はvalをcnt回だけ右にローテートします。

【可搬性】

    MS-DOS, ROM





































                                - 218 -                                 




LSI C-86 Reference Manual                                        SBRK(3)


【名前】

    sbrk - 低レベルメモリ管理

【書式】

    #include <stdlib.h> or <malloc.h>
    void *sbrk(size_t n);

【解説】

    sbrk()は低レベルのメモリ管理をおこないます。

    sbrk() はnバイトのメモリ・ブロックを割り当て、そのブロックへのポイン
    タを返します。

【リターン値】

    確保されたメモリ・ブロックへのポインタを返します。  確保できない場合
    は、-1を返します。

【可搬性】

    UNIX, MS-DOS

【参照】

    malloc(3)






























                                - 219 -                                 




LSI C-86 Reference Manual                                       SCANF(3)


【名前】

    scanf, fscanf, sscanf - 書式つき入力変換

【書式】

    #include <stdio.h>
    int scanf(const char *format, ...);
    int fscanf(FILE *fp, const char *format, ...);
    int sscanf(const char *buf, const char *format, ...);

【解説】

    scanf(),  fscanf(), sscanf()は書式付き入力関数で、制御文字列formatに
    従って入力を変換します。scanf()は標準入力から、fscanf()はfp で示され
    るファイルから、 sscanf() は bufで示される文字列から入力を取り出しま
    す。

    制御文字列中の変換仕様に従い入力を変換し、対応するパラメタをポインタ
    として取り出し、そこへ変換されたオブジェクトを格納します。したがって
    パラメタはポインタでなければならない点に注意してください。

    printf(3)と同じく、変換仕様とパラメタは型、 個数ともに一致しなくては
    なりません。一致しないとおかしな結果が得られることがあります。

    制御文字列 formatは%ではじまる変換仕様と通常の文字で構成されます。通
    常の文字は入力された文字と一致しなければならず、一致していなければそ
    の時点で入力処理を終了し、リターンします。ただし、制御文字列中の空白
    文字は読みとばされ、入力文字とのマッチング対象にはなりません。

    変換仕様は次の形式をとります。

        %[*][width][type]conversion

    *は代入禁止文字と呼ばれます。 省略された場合は対応するパラメタが示す
    アドレスに変換されたオブジェクトを代入しますが、代入禁止が指定されて
    いると入力の変換は実行されますがパラメタの取り出しも代入も実行されま
    せん。

    width は変換される入力の最大の文字数を指定します。省略された場合は可
    能な限り変換されます。もしwidth 文字だけ入力しきらないうちに変換不可
    能な文字を入力した場合は、その時点で変換は打ち切られます。widthに0を
    指定した場合は、省略されたとみなします。

    typeは対応するパラメタの型を示します。d, u, o, x, X, i変換において省
    略された場合は intもしくはunsigned int型であり、hの場合はshort intも
    しくはunsigned short int型、lの場合はlong int型もしくはunsigned long
    int型となります。p変換ではtypeにfarポインタを示すF、nearポインタを示
    すNを使用することができます。e, E, f, g, G変換では省略時はfloat型、l
    の場合はdouble型、Lの場合はlong double型を示します。h,  l, L, F, Nは
    どのような順番に何回現れてもかまいませんが、最後に現れたものが有効に
    なります。また、e, E, f, g, G変換に対するhのような無意味な指定は、指
    定が省略されたとみなされます。

    conversionは変換の形式を決定する文字で、省略できません。以下のものが
    指定できます。


                                - 220 -                                 




LSI C-86 Reference Manual                                       SCANF(3)



    d, u, o, x, X, i
        dは符号付き10進、uは符号なし10進、oは符号なし8進、x, Xは符号なし
        16進の入力です。まず先行する空白文字をスキップし、入力変換を開始
        します。widthは空白をスキップした後で有効になります。x,  o変換で
        は、それぞれ 0x(あるいは0X), 0が先頭に付いていても正しく変換され
        ます。u, o, x, X変換の入力に-が付いていてはいけません。

        i変換は入力をintに変換し、パラメタint * が指す変数に代入します。
        入力文字列の先頭が0のときには8進数として変換し、0xまたは0Xのとき
        には16進数として変換します。それ以外のときには10進数として変換し
        ます

    s
        文字列を入力します。対応するパラメタはchar *として取り出され、そ
        こには入力された文字列と文字列の終了を示すナル文字('\0')が格納さ
        れます。パラメタは文字列を格納するのに十分な大きさを持っていなけ
        ればなりません。その変換においてはまず先行する空白文字が読み捨て
        られ、次の文字から格納を開始します。そして次に空白文字に出会った
        時に入力を終了します。その空白文字は入力されません

    c
        1 文字を入力します。対応するパラメタはchar *として取り出され、入
        力された 1文字が格納されます。空白文字の読みとばしはおこないませ
        んので、次の空白文字以外の文字を読みたい場合には%1s を用いてくだ
        さい。 フィールド幅(width)を指定した場合は、取り出されたchar *を
        インクリメントしながらc変換をwidth回繰り返します。これはs 変換と
        同様にフィールド幅だけの文字を入力しますが、最後を示すナル文字を
        格納しない点が異なります。また、そのときのパラメタは文字配列への
        ポインタでなければなりません。

    [...]
        s 変換と同様に文字列を入力しますが、最初の空白文字の読みとばしは
        せず、また入力は[...]で示される文字が続く間だけ読まれます。 それ
        以外の文字に出会った時に終了します。

        [...]は次のような表記が許されます。

            [ABC012]
                ABC012のうちのどれかの文字

            [A-Fa-f0-9]
                16進数字

        また、[の直後に^が現われると、その後ろで定義したもの以外という意
        味になります。

            [^A-Z]
                大文字のAからZ以外の文字

        先頭以外の位置に現われた^は文字としての^自体を表します。

            [^,.^]
                ,.^以外の文字

            [_^$]


                                - 221 -                                 




LSI C-86 Reference Manual                                       SCANF(3)


                _^$のうちどれかの文字

        パラメタはchar *としてとられ、入力終了時にはナル文字が加えられま
        す

    n
        n変換はこれまでに入力された文字数を対応するパラメタint *が指す変
        数に代入します。この変換はscanf()が返す値には含まれません。

    p
        ポインタ値を入力し、パラメタが指しているアドレスに格納します

    e, E, f, g, G
        浮動小数点数を入力します。対応するパラメタは浮動小数点型へのポイ
        ンタでなければなりません。  浮動小数点数のフォーマットは自由で、
        printf(3)のe,  E, f, g, G 変換で出力したものはいずれも入力可能で
        す。

    x,  e, gは大文字で書くことも可能ですが、大文字、小文字の違いはありま
    せん。   変換が正しくない入力文字により終了した場合は、   その文字は
    ungetc(3)されて読んでいない状態に戻されます。また、 後続する空白文字
    も読み込みません。

    scanf() 一族はライブラリファイルdoslib.libとintlib.libの両方に含まれ
    ています。intlib.libに含まれているscanf()には、 浮動小数点数の表示機
    能(f,  e, E, g, G)がありません。これは、浮動小数点数の表示を必要とし
    ない多くのプログラムにムダな浮動小数点演算パッケージをリンクしないよ
    うにして、作成した実行ファイルを小さくするために用意しました。こちら
    の scanf()を使う場合には、次のようにintlib.libをライブラリとして指定
    してください。

        lcc prog.c -lintlib

【リターン値】

    入力変換と代入に成功した変換の数を返します。エラーが生じた時には値-1
    を返します。

【可搬性】

    sscanf()
        ANSI, UNIX, MS-DOS, ROM

    それ以外
        ANSI, UNIX, MS-DOS

【参照】

    printf(3), fprintf(3), sprintf(3)









                                - 222 -                                 




LSI C-86 Reference Manual                                     SEGREAD(3)


【名前】

    segread - セグメントレジスタ値の取得

【書式】

    #include <dos.h>
    int segread(struct SREGS *seg);

【解説】

    segread()はsegが指している構造体の中に8086のCS, SS, DS, ESレジスタの
    値をセットします。

【可搬性】

    MS-DOS, ROM

【参照】

    intdos(3), int86(3)





































                                - 223 -                                 




LSI C-86 Reference Manual                                      SETBUF(3)


【名前】

    setbuf, setvbuf - ストリームバッファの設定

【書式】

    #include <stdio.h>
    void setbuf(FILE *fp, char *buf);
    int setvbuf(FILE *fp, char *buf, int type, size_t size);

【解説】

    setbuf(),  setvbuf()はファイルポインタfpのストリームバッファを設定し
    ます。

    setbuf()は、bufはBUFSIZバイトの大きさをもっているとみなし、 それをバ
    ッファ領域として使用します(BUFSIZは<stdio.h>で定義されています)。buf
    がNULLのときは、バッファリングなしで入出力をおこないます。

    setvbuf() は、bufはsizeバイトの大きさをもっているとみなします。bufが
    NULLのときは、 size バイトの大きさのバッファが自動的に割り当てられま
    す。typeが_IOFBFのときはバッファを使用しますが、_IONBFのときはバッフ
    ァなしで入出力をおこないます。

【リターン値】

    setvbuf()は成功すると0を返します。失敗すると0以外の値を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【バグ】

    _IOLBF(ラインバッファリング)はサポートしていません。

    本ライブラリのインプリメント上の制限により、 setvbuf()で設定できるバ
    ッファの大きさは最大でも32767バイトです。




















                                - 224 -                                 




LSI C-86 Reference Manual                                      SETJMP(3)


【名前】

    setjmp, longjmp - 大域ジャンプ

【書式】

    #include <setjmp.h>
    int setjmp(jmp_buf env);
    void longjmp(jmp_buf env, int val);

【解説】

    setjmp(),  longjmp()は、関数呼び出しが何重にも入れ子になっているとき
    に、いっきに上位の関数に戻るときに使います。

    まずジャンプ先の場所でsetjmp()を呼んでjmp_buf型変数envにその時点の環
    境およびジャンプ先の番地をセーブしておきます。

    そして、 ジャンプしたい場所では、 ジャンプ先の環境がセーブされている
    env をパラメタとしてlongjmp()を呼びます。この時、valにセットした値が
    setjmp()の返す値になります。

    longjmp()を通してsetjmp()からリターンしてきた場合、 レジスタ変数の値
    は不定となりますので注意してください。LSI C-86ではローカル変数はデフ
    ォルトでレジスタ変数となりますので、特に注意が必要です。setjmp()を呼
    び出す関数のローカル変数はvolatile指定をして、レジスタ変数とならない
    ようにしてください。

【使用例】

        jmp_buf env;

        int     val(char **s)
        {
                if (! isdigit(**s)) {
                        fprintf(stderr, "missing number\n");
                        longjmp(env, 1);
                }
                return (strtol(*s, s, 10));
        }

        void    bar(char *s)
        {
                int     v;

                v = val(&s);
                switch (*s++) {
                case '+':       return (v + val(&s));
                case '-':       return (v - val(&s));
                case '*':       return (v * val(&s));
                case '/':       return (v / val(&s));
                default:
                        fprintf(stderr, "illegal operation\n");
                        longjmp(env, 1);
                }
        }


                                - 225 -                                 




LSI C-86 Reference Manual                                      SETJMP(3)



        void    main()
        {
                char    line[80];

                for (;;) {
                        printf(">");
                        gets(line);
                        if (setjmp(env) == 0)
                                printf("%d\n", bar(line));
                }
        }

【リターン値】

    setjmp() は最初に呼ばれた時は、 値0を返します。longjmp()が呼ばれた時
    は、その引数valがsetjmp()の返す値となります。

    ただし、longjmp()でvalに0を渡した場合、setjmp()は1を返します。したが
    ってsetjmp()の最初の呼び出しとlongjmp() によるリターンとを確実に区別
    することができます。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【バグ】

    setjmp(), longjmp()は使い方を誤ると危険ですので、次の2点に注意してく
    ださい。

      + setjmp()を呼ぶ関数は必ずレジスタ割り付けをしないことを指定してく
        ださい

      +  setjmp()を呼んでいる関数がreturnした後にlongjmp()を呼ぶと、プロ
        グラムは暴走してしまいますので絶対に呼ばないでください






















                                - 226 -                                 




LSI C-86 Reference Manual                                      SIGNAL(3)


【名前】

    signal - シグナルハンドラの設定

【書式】

    #include <signal.h>
    void (*signal(int sig, void (*handler)()))();

【解説】

    signal()はシグナルが発生したときにそれを処理するハンドラ関数 handler
    をインストールします。

    handler() はハンドラ関数へのポインタです。シグナルが発生したときにハ
    ンドラ関数がコールされます。handlerをSIG_DFLとしたときには、そのシグ
    ナルが発生したときにプログラム実行は中断されます。SIG_IGN のときには
    そのシグナルは無視され、プログラムの実行は継続されます。

    シグナルの種類sigには次のものがあります。

    SIGABRT
        異常終了

    SIGFPE
        算術エラー

    SIGILL
        不当命令

    SIGINT
        インタラプト(Ctrl-C)

    SIGSEGV
        メモリアクセス違反

    SIGTERM
        終了要求

    ハンドラとなる関数は

        void handler(int sig [ , int subcode ] );

    という形で定義します。sigは上記のうちの1つです。subcodeはsigがSIGFPE
    のときに渡されます。subcodeには次の種類があります。

    FPE_INTDIV0
        整数の0除算をしました

    FPE_INVALID
        不正な演算を実行しました

    FPE_DENORMAL
        デノーマル数を生成しました(結果の値が小さすぎます)

    FPE_ZERODIVIDE


                                - 227 -                                 




LSI C-86 Reference Manual                                      SIGNAL(3)


        浮動小数点の0除算をしました

    FPE_OVERFLOW
        オーバーフローしました

    FPE_UNDERFLOW
        アンダーフローしました

    FPE_INEXACT
        正確に表現できないので近似しました

    FPE_EXPLICITGEN
        raise(3)によってハンドラが起動されました

    シグナルが発生すると、 ハンドラがコールされる前にsignalはSIG_DFLにリ
    ストアされます。その後でハンドラが

        (*handler)(sig [ , subcode ] );

    という形でコールされます。シグナル処理が終了すると、シグナルを検出し
    たところからプログラムの実行が再開されます。

【リターン値】

    signal()は以前に設定されていた handler を返します。 エラーのときには
    errnoをセットし、SIG_ERRを返します。

【エラー】

    EINVAL
        パラメタの値が不正です

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    raise(3), abort(3), matherr(3M)

【バグ】

    本ライブラリでは6種類のシグナルのうち、SIGILL,  SIGSEGV, SIGTERMはサ
    ポートしていません。それらはraise(3)を使うことによって、ソフトウェア
    シグナルとして利用できます。













                                - 228 -                                 




LSI C-86 Reference Manual                                       SPAWN(3)


【名前】

    spawn, spawnl, spawnlp, spawnv, spawnvp, spawnle, spawnlpe, spawnve,
    spawnvpe - 子プロセスの実行

【書式】

    #include <stdlib.h>
    #include <process.h>
    int spawnl(int mode, const char *prog, ...);
    int spawnlp(int mode, const char *prog, ...);
    int spawnv(int mode, const char *prog, const char *const argv[]);
    int spawnvp(int mode, const char *prog, const char *const argv[]);
    int spawnle(int mode, const char *prog, ..., char *envp[]);
    int spawnlpe(int mode, const char *prog, ..., char *envp[]);
    int  spawnve(int mode,  const char *prog,  const char *const argv[],
    const char *const envp[]);
    int spawnvpe(int mode,  const char *prog,  const char *const argv[],
    const char *const envp[]);

【解説】

    spawn(3)一族の関数であるspawnl(),  spawnlp(),  spawnv(),  spawnvp(),
    spawnle(), spawnlpe(), spawnve(), spawnvpe()は、子プロセスを生成して
    実行します。

    modeには<process.h>で定義されている定数P_WAITあるいはP_OVERLAYを指定
    します。P_WAITを指定すると子プロセスの実行が終了するまで親プロセスは
    停止します。  子プロセスが終了すると  spawn からリターンしてきます。
    P_OVERLAYを指定するとexec(3)と等価になります。詳しくはexec(3) を参照
    してください。

    文字列progには実行すべきファイル名を与えます。ファイル名が拡張子を持
    たない場合には、spawnはまず.comを探し、次に.exeを探します。

    起動されるプログラムには、パラメタを渡すことができます。パラメタは文
    字列、すなわちchar型へのポインタでなくてはいけません。

    spawnl(), spawnlp(), spawnle(), spawnlpe() では、第2パラメタ以降にパ
    ラメタを並べて渡します。

    spawnv(),  spawnvp(), spawnve(), spawnvpe() では、パラメタはcharへの
    ポインタの配列argvの中に設定します。

    パラメタの終わりの印として、最後に必ずNULLを渡してください。コマンド
    ラインの長さはMS-DOSによって128文字までに制限されています。

    また、spawnle(), spawnlpe(), spawnve(), spawnvpe()関数には、環境変数
    文字列の配列envpを渡すことができます。

    spawnl(), spawnv(), spawnle(), spawnve()は、指定されたパス名のファイ
    ルを探して、見つからなかったときにはプログラムの実行をあきらめます。
    spawnlp(),  spawnvp(), spawnlpe(), spawnvpe() は、指定されたファイル
    が見つからなかったときには環境変数PATH中のディレクトリを順に探しにい
    きます。



                                - 229 -                                 




LSI C-86 Reference Manual                                       SPAWN(3)


    以上をまとめると、 関数名のspawnに続く文字で関数の動作を規定すること
    ができます。

    l
        コマンドラインパラメタを並べて渡します

    v
        コマンドラインパラメタを配列で渡します

    p
        環境変数PATHを使って実行ファイルを探します

    e
        子プロセスに環境変数の配列を渡します

    spawn を呼び出したときにオープンされていたファイルは、子プロセスが実
    行を開始したときにもオープンされたままになっています。  必要であれば
    spawnを呼び出す前にファイルをクローズしてください。

【使用例】

    次の例はプログラムfoo.exeを起動して、bar,  zodというパラメタを与えま
    す。

        spawnl(P_WAIT, "foo.exe", "foo.exe", "bar", "zod", NULL);

    ここで

        char *argv[4];
        argv[0] = "foo.exe";
        argv[1] = "bar";
        argv[2] = "zod";
        argv[3] = NULL;

    となっている場合、次のspawnv()の呼び出しは上記のspawnl()の呼び出しと
    等価です。

        spawnv(P_WAIT, "foo.exe", argv);

【環境変数】

    PATH
        プログラムのサーチパスを指定します

【リターン値】

    子プロセスの終了コードを返します。実行に失敗したときはerrno をセット
    して-1を返します。

【エラー】

    ENOENT
        プログラムが見つかりません

    E2BIG
        コマンドラインが長すぎます


                                - 230 -                                 




LSI C-86 Reference Manual                                       SPAWN(3)



    ENOMEM
        子プロセスの実行に必要な空きメモリがありません

    EINVAL
        modeに許されない値を渡しました

    ENOEXEC
        progが実行可能フォーマットではありません

【可搬性】

    MS-DOS

【参照】

    abort(3), environ(3), exec(3), exit(3), system(3)

【バグ】

    子プロセスに環境を渡す関数  (spawnle(),    spawnlpe(),    spawnve(),
    spawnvpe())  では、環境変数``COMSPEC=...''を必ずあたえてください。こ
    れをあたえない場合には、MS-DOSがCOMMAND.COM をリロードできずに暴走す
    る可能性があります。これはMS-DOSの制限です。


































                                - 231 -                                 




LSI C-86 Reference Manual                                       SQRT(3M)


【名前】

    sqrt - 平方根

【書式】

    #include <math.h>
    double sqrt(double x);

【解説】

    sqrt()はxの平方根を返します。

【エラー】

    EDOM
        パラメタが定義域を超えています

    ERANGE
        結果が正確に表現できません

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    matherr(3)






























                                - 232 -                                 




LSI C-86 Reference Manual                                  STACKAVAIL(3)


【名前】

    stackavail - スタックの残りバイト数

【書式】

    #include <malloc.h>
    size_t stackavail(void);

【解説】

    スタックのおよその残りバイト数を返します。

【可搬性】

    MS-DOS










































                                - 233 -                                 




LSI C-86 Reference Manual                                        STAT(3)


【名前】

    stat - ファイル情報の取得

【書式】

    #include <sys/types.h>
    #include <sys/stat.h>
    int stat(const char *pathname, struct stat *sbuf);

【解説】

    stat() は pathnameで指定されるファイルに関する情報を得て、sbufが指す
    struct stat型構造体に格納します。struct stat型は<sys/stat.h>で定義さ
    れています。

    MS-DOS環境下ではstruct stat のうちの以下のフィールドのみが意味をもち
    ます。

    st_mode
        ファイルのモード

    st_nlink
        常に1

    st_size
        ファイルのサイズ

    st_mtime
        ファイルが最後に修正された時刻

    st_atime
        st_mtimeと同じ

    st_ctime
        st_mtimeと同じ

    st_mtime,  st_atime, st_ctimeはすべてtime_t型です。詳細はtime(3)を参
    照してください。

    st_modeをS_IFMTでマスクすると、次の情報が得られます。

    S_IFDIR
        ディレクトリファイル

    S_IFREG
        通常のファイル

    st_modeにはユーザのアクセス許可ビットも示されます。

    S_IREAD
        読み出し許可

    S_IWRITE
        書き込み許可



                                - 234 -                                 




LSI C-86 Reference Manual                                        STAT(3)


    S_IEXEC
        実行許可

    実行許可はファイル名が*.EXE,  *.COM, *.BATのとき、またはディレクトリ
    のときにセットされます。

【リターン値】

    成功したときには 0を返します。失敗したときにはerrnoをセットして0以外
    の値を返します。

【エラー】

    ENOENT
        パスが見つかりません

【可搬性】

    UNIX, MS-DOS

【参照】

    fstat(3), time(3)



































                                - 235 -                                 




LSI C-86 Reference Manual                                      STRCAT(3)


【名前】

    strcat, strncat - 文字列の連結

【書式】

    #include <string.h>
    char *strcat(char *s, const char *t);
    char *strncat(char *s, const char *t, size_t n);

【解説】

    strcat()は文字列sの後に文字列tを連結します。sの最後のナル文字 ('\0')
    にtの最初の文字がコピーされ、以降tのナル文字までがコピーされます。

    sの後にはtを連結するのに十分な大きさがなければなりません。

    strncat()は文字列sの後に文字列tを最大n文字連結します。文字列の最後に
    は常にナル文字が付けられます。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM































                                - 236 -                                 




LSI C-86 Reference Manual                                      STRCHR(3)


【名前】

    strchr, strrchr - 文字列中の文字の検索

【書式】

    #include <string.h>
    char *strchr(const char *s, char c);
    char *strrchr(const char *s, char c);

【解説】

    strchr() は文字列sの先頭から文字cを検索します。cにはナル文字('\0')を
    指定することもできます。

    strrchr()は文字列sを後ろから文字cで検索します。cがナル文字の場合は s
    の文字列の終端のナル文字と一致したことになり、 s中の'\0'へのポインタ
    を返します。

【リターン値】

    文字列s内ではじめてcと一致した文字へのポインタを返します。見つからな
    い場合はNULLを返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    strpbrk(3)



























                                - 237 -                                 




LSI C-86 Reference Manual                                      STRCMP(3)


【名前】

    strcmp, strncmp - 文字列の比較

【書式】

    #include <string.h>
    int strcmp(const char *s, const char *t);
    int strncmp(const char *s, const char *t, size_t n);

【解説】

    strcmp()は2つの文字列sとtを辞書的な順序で比較します。

    strncmp()は2つの文字列sとtを辞書的な順序で最大n文字比較します。

【リターン値】

    s > tの時は正の値を、
    s = tの時は0を、
    s < tの時は負の値を返します。
【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    stricmp(3)






























                                - 238 -                                 




LSI C-86 Reference Manual                                      STRCPY(3)


【名前】

    strcpy, strncpy, stpcpy - 文字列のコピー

【書式】

    #include <string.h>
    char *strcpy(char *s, const char *t);
    char *strncpy(char *s, const char *t, size_t n);
    char *stpcpy(char *s, const char *t);

【解説】

    strcpy(), stpcpy()は文字列tをsにコピーします。文字列の終わりはナル文
    字('\0')で認識します。このナル文字もコピーします。sにはtを入れるのに
    十分な大きさがなければなりません。

    strncpy()は文字列tをsに最大nバイトコピーします。文字列tの長さがnバイ
    トより小さい場合はtをコピーして空いた部分にnバイトになるまでナル文字
    を埋めます。また、文字列tがnバイト以上の場合はn バイトだけコピーし、
    ナル文字は付けません。

【リターン値】

    strcpy(), strncpy()はパラメタsの値をそのまま返します。

    stpcpy()はsの最後のナル文字へのポインタを返します。

【可搬性】

    strcpy()
        ANSI, UNIX, MS-DOS, ROM

    strncpy()
        ANSI, UNIX, MS-DOS, ROM

    stpcpy()
        MS-DOS, ROM




















                                - 239 -                                 




LSI C-86 Reference Manual                                      STRDUP(3)


【名前】

    strdup - 文字列の保存

【書式】

    #include <string.h>
    char *strdup(const char *s);

【解説】

    strdup()は文字列sを保存するためのメモリをmalloc(3)を使ってヒープ上に
    確保し、そこに文字列sをコピーします。

【リターン値】

    文字列 sを保存したアドレスを返します。メモリの確保に失敗するとNULLを
    返します。

【可搬性】

    UNIX, MS-DOS

【参照】

    malloc(3)
































                                - 240 -                                 




LSI C-86 Reference Manual                                    STRERROR(3)


【名前】

    strerror - エラーメッセージ文字列の取得

【書式】

    #include <string.h>
    char *strerror(int n);

【解説】

    strerror()はエラーの種類を表す値n に対応するエラーメッセージ文字列へ
    のポインタを返します。

    エラーメッセージ文字列は初期化されたstaticな文字配列ですから、これを
    書き換えてはいけません。

    MS-DOSで使用していない値がnに渡された場合には空文字列を返します。

【可搬性】

    ANSI, MS-DOS, ROM

【参照】

    errno(3)
































                                - 241 -                                 




LSI C-86 Reference Manual                                    STRFTIME(3)


【名前】

    strftime - 時間の文字列への変換

【書式】

    #include <time.h>
    size_t strftime(char *s,  size_t smax, const char *fmt, const struct
    tm *tp);

【解説】

    strftime() はtpが指す構造体であたえられた日付・時間情報をfmtで示され
    る形式に従って変換し、sで指定された文字配列にセットします。

    変換仕様は%プラス1文字で、次のように指定します。

    %a
        曜日の頭3文字(Sun Mon Tue...)

    %A
        曜日(Sunday Monday Tuesday...)

    %b
        月の頭3文字(Jan Feb Mar...)

    %B
        月(January February March...)

    %c
        日時(YY/MM/DD HH:MM:SS)

    %d
        日(01-31)

    %H
        時(24時間制)(00-23)

    %I
        時(12時間制)(01-12)

    %j
        通算日数(001-366)

    %m
        月(01-12)

    %M
        分(00-59)

    %p
        AMあるいはPM

    %S
        秒(00-59)



                                - 242 -                                 




LSI C-86 Reference Manual                                    STRFTIME(3)


    %U
        日曜日からの第n週(00-53)

    %w
        曜日(0-6, 0:日曜日)

    %W
        月曜日からの第n週(00-53）

    %x
        日付(YY/MM/DD)

    %X
        時刻(HH:MM:SS)

    %y
        西暦の下位2桁(00-99)

    %Y
        西暦(1970-)

    %Z
        タイムゾーン(JST...)

    %%
        %

    これら以外の文字はfmtからsにそのままコピーされます。この変換はfmt の
    ナル文字 ('\0')に出会うまで続けられます。sにはナル文字もコピーされま
    す。

    smaxはsに書込むことができる最大文字数を与えます。

【リターン値】

    sに書込まれた文字数(ナル文字は含まない)を返します。smax 文字以上が生
    成されたときには0を返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    TZ(3), time(3)

【バグ】

    %a, %A, %b, %B, %c, %p, %x, %XはANSIの定義ではlocaleによって変換方法
    が変化することになっています。しかし、本ライブラリではlocaleをサポー
    トしていません。







                                - 243 -                                 




LSI C-86 Reference Manual                                     STRICMP(3)


【名前】

    stricmp, strcmpi, strnicmp, strncmpi - 文字列の比較

【書式】

    #include <string.h>
    int stricmp(const char *s, const char *t);
    int strcmpi(const char *s, const char *t);
    int strnicmp(const char *s, const char *t, size_t n);
    int strncmpi(const char *s, const char *t, size_t n);

【解説】

    stricmp(),  strcmpi() は文字列sとtを辞書的な順序で比較します。この比
    較では大文字と小文字の区別をしません。

    strcmpi()はstricmp()を呼び出すマクロとして定義されています。

    strnicmp(),  strncmpi()は文字列sとtを辞書的な順序で最大n文字比較しま
    す。この比較では大文字と小文字の区別をしません。

    strncmpi()はstrnicmp()を呼び出すマクロとして定義されています。

【リターン値】

    s > tの時は正の値を、
    s = tの時は0を、
    s < tの時は負の値を返します。
【可搬性】

    MS-DOS, ROM

【参照】

    strcmp(3)






















                                - 244 -                                 




LSI C-86 Reference Manual                                      STRLEN(3)


【名前】

    strlen - 文字列の長さの測定

【書式】

    #include <string.h>
    size_t strlen(const char *s);

【解説】

    strlen() は文字列 s の長さを測定します。  文字列の終端を示すナル文字
    ('\0')は数えられません。つまり、空文字列("")は長さ0となります。

【リターン値】

    文字列sの長さを返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM





































                                - 245 -                                 




LSI C-86 Reference Manual                                      STRLWR(3)


【名前】

    strlwr, strupr - 文字列の英大文字・英小文字変換

【書式】

    #include <string.h>
    char *strlwr(char *s);
    char *strupr(char *s);

【解説】

    strlwr()は文字列s中のすべての英大文字を英小文字に変換します。

    strupr()は文字列s中のすべての英小文字を英大文字に変換します。

    どちらもあたえられた文字列を直接書き換えますので注意してください。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    MS-DOS, ROM

































                                - 246 -                                 




LSI C-86 Reference Manual                                     STRPBRK(3)


【名前】

    strpbrk - 文字列の検索

【書式】

    #include <string.h>
    char *strpbrk(const char *s, const char *t);

【解説】

    strpbrk() は文字列 s を文字列tに含まれる各文字で検索します。ナル文字
    ('\0')は検索の対象にはなりません。

【リターン値】

    文字列sを先頭から検索してtのどれかの文字と最初に一致した文字へのポイ
    ンタを返します。ない場合はNULLを返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    strchr(3)
































                                - 247 -                                 




LSI C-86 Reference Manual                                      STRREV(3)


【名前】

    strrev - 文字列の並びを逆にする

【書式】

    #include <string.h>
    char *strrev(char *s);

【解説】

    strrev()は文字列sの並びかたを逆にします。

    strrev()はあたえられた文字列を直接書き換えますので注意してください。

【リターン値】

    パラメタsの値をそのまま返します。

【可搬性】

    MS-DOS, ROM




































                                - 248 -                                 




LSI C-86 Reference Manual                                      STRSET(3)


【名前】

    strset, strnset - 文字列へのデータのセット

【書式】

    #include <string.h>
    char *strset(char *s, char c);
    char *strnset(char *s, char c, size_t n);

【解説】

    strset()は文字列sの終端を示すナル文字('\0') までのすべての文字をc に
    します。ナル文字はそのままです。

    strnset() は文字列sの先頭からn文字まで、あるいはナル文字までのすべて
    の文字をcにします。ナル文字はそのままです。

【リターン値】

    パラメタsをそのまま返します。

【可搬性】

    MS-DOS, ROM

































                                - 249 -                                 




LSI C-86 Reference Manual                                      STRSPN(3)


【名前】

    strspn, strcspn - 文字列の長さの測定

【書式】

    #include <string.h>
    size_t strspn(const char *s, const char *t);
    size_t strcspn(const char *s, const char *t);

【解説】

    strspn()は文字列sの先頭から文字列tに含まれない文字までの長さを測定し
    ます。tの終端を示すナル文字('\0')は比較の対象にはなりません。

    strcspn()は文字列sの先頭から文字列tに含まれるいずれかの文字(ナル文字
    を除きます)と一致する文字までの長さを測ります。

【リターン値】

    文字数を返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

































                                - 250 -                                 




LSI C-86 Reference Manual                                      STRSTR(3)


【名前】

    strstr - 部分文字列の検索

【書式】

    #include <string.h>
    char *strstr(const char *s, const char *t);

【解説】

    strstr()は文字列sの中に文字列tが含まれているかどうかを調べ、あればそ
    のアドレスを返します。

【リターン値】

    最初に見つかったアドレスを返します。見つからなかったときはNULLを返し
    ます。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM




































                                - 251 -                                 




LSI C-86 Reference Manual                                      STRTOD(3)


【名前】

    strtod - 文字列から浮動小数点数値への変換

【書式】

    #include <stdlib.h>
    double strtod(const char *s, char **endptr);

【解説】

    strtod()はatof(3)と同様に文字列sを浮動小数点数に変換し、その値を返し
    ます。パラメタの扱いはstrtol(3)と同様です。

    strtod()はまず先行する空白を読み飛ばします。endptrがNULLでなければ、
    変換が終了したときのポインタの値を*endptrに格納します。

【リターン値】

    変換された値を返します。数字がない場合には0を返します。

    オーバーフローが発生したときにはerrnoにERANGEをセットし、 符号にした
    がってHUGE_VAL、-HUGE_VALを返します。

【エラー】

    ERANGE
        変換でオーバーフローが発生しました

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    atof(3), strtol(3)






















                                - 252 -                                 




LSI C-86 Reference Manual                                      STRTOK(3)


【名前】

    strtok - 文字列のトークンへの分解

【書式】

    #include <string.h>
    char *strtok(char *s, const char *t);

【解説】

    strtok() は文字列sを文字列tの各文字をデリミタとして、文字列sを区切り
    ます。先行するデリミタは読みとばされ、文字列s を区切ったデリミタはナ
    ル文字('\0')になります。

    また内部ですすめたポインタをおぼえているので、 sがNULLの場合はそのポ
    インタをもとに文字列を区切ります。

    デリミタとなる文字列tは呼ばれるたびに違っていても問題ありません。

【リターン値】

    区切られたトークンへのポインタを返します。トークンがない場合はNULLを
    返します。

【可搬性】

    ANSI, UNIX, MS-DOS, ROM






























                                - 253 -                                 




LSI C-86 Reference Manual                                      STRTOL(3)


【名前】

    strtol, strtoul - 文字列から数値への変換

【書式】

    #include <stdlib.h>
    long strtol(const char *s, char **endptr, int base);
    unsigned long strtoul(const char *s, char **endptr, int base);

【解説】

    strtol() は文字列sをlongに変換します。

    strtoul()は文字列sをunsigned longに変換します。

    先行する空白は無視します。endptrがNULLでなければ、変換が終了したとき
    のポインタの値を*endptrに格納します。変換の基数baseが2から36のときに
    は、入力はbase進数と仮定します。

    baseに16を指定したときには文字列は0xあるいは0Xではじまってもかまいま
    せん。

    baseに0を指定すると、文字列 s の内容によって自動的に基数が決定されま
    す。文字列の先頭が0xあるいは0Xのときには16進数として、0であれば8進数
    として、それ以外のときには10進数として解釈されます。

    10以上の数値を表す文字は'A' - 'Z'または'a' - 'z'です。

【リターン値】

    変換された値を返します。数字がない場合には0を返します。

    オーバーフローが発生したときにはerrno にERANGEをセットし、strtol()は
    符号にしたがって LONG_MAX 、LONG_MINを、strtoul()はULONG_MAXを返しま
    す。パラメタが正しくないときにはerrno にEINVALをセットして0 を返しま
    す。

【エラー】

    ERANGE
        変換でオーバーフローが発生しました

    EINVAL
        パラメタが正しくありません

【可搬性】

    strtol()
        ANSI, UNIX, MS-DOS, ROM

    strtoul()
        ANSI, MS-DOS, ROM

【参照】



                                - 254 -                                 




LSI C-86 Reference Manual                                      STRTOL(3)


    atol(3), strtod(3)

























































                                - 255 -                                 




LSI C-86 Reference Manual                                        SWAB(3)


【名前】

    swab - バイトオーダーの入れ換え

【書式】

    #include <stdlib.h>
    void swab(const char *src, char *dst, int n);

【解説】

    swab() は2バイトを一組としてそのバイトの順番を入れ替えながらsrcからn
    バイトのデータをdstへコピーします。

    nは偶数でなければなりません。

【可搬性】

    UNIX, MS-DOS, ROM







































                                - 256 -                                 




LSI C-86 Reference Manual                                      SYSTEM(3)


【名前】

    system - コマンドの実行

【書式】

    #include <stdlib.h> or <process.h>
    int system(const char *string);

【解説】

    system()は文字列 string をオペレーティングシステムのコマンドと見なし
    て、それを実行します。

    そのとき、 環境変数COMSPECが設定されていればその値がコマンドインタプ
    リタの名前となります。COMSPECが設定されていなければ``COMMAND.COM''を
    呼び出します。

【環境変数】

    COMSPEC
        コマンド・インタプリタを指定します

    PATH
        コマンド・インタプリタのサーチパスを指定します

【リターン値】

    コマンド・インタプリタの呼び出しに失敗したときは、-1を返します。成功
    したときはコマンド・インタプリタの終了コードを返します。

【エラー】

    ENOENT
        コマンド・インタプリタが見つかりません

    E2BIG
        コマンドラインが長すぎます

    ENOMEM
        コマンドの実行に必要な空きメモリがありません

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    spawn(3), exit(3)









                                - 257 -                                 




LSI C-86 Reference Manual                                        TELL(3)


【名前】

    tell - リードライト位置の取得

【書式】

    #include <io.h>
    long tell(int fd);

【解説】

    tell()はファイルハンドルfdで示されるファイルの現在のリードライト位置
    を返します。

【リターン値】

    現在のリードライト位置をファイルの先頭からのバイト数で返します。  エ
    ラーを検出すると-1Lを返し、errnoをセットします。

【エラー】

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    lseek(3)

【バグ】

    fd にシーク不可能なデバイスを指定すると、 リターン値は未定義となりま
    す。






















                                - 258 -                                 




LSI C-86 Reference Manual                                     TEMPNAM(3)


【名前】

    tempnam - テンポラリファイル名の作成

【書式】

    #include <stdio.h>
    char *tempnam(const char *dir, const char *prefix);

【解説】

    tempnam() はprefixで始まるユニークなファイル名を生成します。そのとき
    に、環境変数TMPが設定されていてそのディレクトリが存在すれば、 そのデ
    ィレクトリの中にファイル名を生成します。 TMPが設定されていないか存在
    しないディレクトリであれば、  dir で指定されたディレクトリを使用しま
    す。これに失敗すると<stdio.h>で定義されたP_tmpdirを用います。 これに
    も失敗するとカレントディレクトリに生成します。

【環境変数】

    TMP
        ファイル名を作成するときにベースになるディレクトリ名

【リターン値】

    生成されたファイル名の先頭アドレスを返します。すべての試みに失敗する
    とNULLを返します。

【可搬性】

    UNIX, MS-DOS

【参照】

    tmpnam(3), mktemp(3)























                                - 259 -                                 




LSI C-86 Reference Manual                                        TIME(3)


【名前】

    time, clock, stime - 時刻の取得・設定

【書式】

    #include <time.h>
    time_t time(time_t *t);
    clock_t clock(void);
    void stime(const time_t *t);

【解説】

    time()は世界標準時(UTC)における現在の時刻を1970年1月1日午前0時0分0秒
    からの通算秒数で返します。 結果の型は time_t型(実際はlong型)です。も
    し、パラメタtの値がNULLでなければ、結果が*tにも代入されます。

    clock()はパラメタをとらないことを除いて、time()とまったく同じです。

    stime()は*tの内容を、新しく現在の時刻として設定します。 時刻の表現は
    time()の返すものと同様でなくてはなりません。

【リターン値】

    time(), clock()は現在の時刻を返します。

【可搬性】

    time()
        ANSI, UNIX, MS-DOS

    clock()
        ANSI, UNIX, MS-DOS

    stime()
        MS-DOS

【参照】

    TZ(3), ctime(3)


















                                - 260 -                                 




LSI C-86 Reference Manual                                    TIMEZONE(3)


【名前】

    timezone, daylight, tzname - タイムゾーン名

【書式】

    #include <time.h>
    extern long timezone;
    extern int daylight;
    extern char *tzname[2];

【解説】

    timezone は世界標準時(UTC)とローカルタイムとの差を秒単位で表します。
    日本の場合、JSTはUTCよりも9時間進んでいますから、-9 *60 *60 となりま
    す。

    daylightはサマータイムを採用しているときには0以外の値になります。

    tzname はタイムゾーン名を示すポインタの配列です。 tzname[0] は通常の
    ローカルタイムの名称(日本の場合は"JST")を、tzname[1]はサマータイムの
    名称(日本にはありません)を指しています。

    これら3つのグローバル変数は、tzset(3)によって環境変数TZ からセットさ
    れます。

【環境変数】

    TZ
        タイムゾーン名とオフセット

【可搬性】

    UNIX, MS-DOS

【参照】

    TZ(3), tzset(3)




















                                - 261 -                                 




LSI C-86 Reference Manual                                     TMPFILE(3)


【名前】

    tmpfile - テンポラリファイルの作成

【書式】

    #include <stdio.h>
    FILE *tmpfile(void);

【解説】

    tmpfile() はテンポラリファイルをカレントディレクトリに "w+b"モードで
    オープンします。このテンポラリファイルは、クローズされたときかプログ
    ラムが終了するときに自動的に消去されます。

【リターン値】

    オープンされたテンポラリファイルのファイルポインタを返します。ファイ
    ルが作成できなかったときには値NULLを返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    rmtmp(3), tmpname(3), mktemp(3), fclose(3)































                                - 262 -                                 




LSI C-86 Reference Manual                                      TMPNAM(3)


【名前】

    tmpnam - テンポラリファイル名の作成

【書式】

    #include <stdio.h>
    char *tmpnam(char s[L_tmpnam]);

【解説】

    tmpnam()は既存のファイルと重複しない新たなファイル名を作成します。新
    たなファイル名は、<stdio.h>で#defineされている定数P_tmpdirにユニーク
    な数字を連結したものになります。

    sは少なくともL_tmpnamの大きさをもつ配列か、あるいはNULL でなければな
    りません。sがNULLでない場合には、作成されたファイル名はsに格納され、
    sが返されます。sがNULLのときには、ファイル名は内部のstaticな文字配列
    に格納され、そのポインタが返されます。

    tmpnam()はファイル名を作り出すだけで、ファイルをオープンするのではあ
    りません。また、tmpnam()で得られたファイルをオープンした場合、そのフ
    ァイルが自動的に消去さることもありません。ユーザの責任において消去し
    て下さい。

【リターン値】

    作成されたファイル名へのポインタを返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    tmpfile(3), tempnam(3), mktemp(3)

【バグ】

    tmpnam() はライブラリの作成時に<stdio.h>で定義されたP_tmpdirの値をそ
    のコード中に埋めこんでいますので、<stdio.h>中のP_tmpdir を変更しても
    tmpnam()の動作は変化しません。P_tmpdirを変更したいときには、ライブラ
    リを再コンパイルする必要があります。















                                - 263 -                                 




LSI C-86 Reference Manual                                     TOASCII(3)


【名前】

    toascii - アスキー文字への変換

【書式】

    #include <ctype.h>
    int toascii(int c);

【解説】

    toascii()はcの下位7ビット以外を0にして、cをアスキー文字(0x00 - 0x7F)
    にします。

【可搬性】

    UNIX, MS-DOS, ROM

【参照】

    ctype(3), toupper(3), tolower(3)





































                                - 264 -                                 




LSI C-86 Reference Manual                                     TOLOWER(3)


【名前】

    tolower, _tolower - 英小文字への変換

【書式】

    #include <ctype.h>
    char tolower(char c);
    char _tolower(char c);

【解説】

    tolower() はcが英大文字であればcを小文字に変換したものを返し、そうで
    なければcをそのまま返します。

    _tolower()はcを大文字とみなして小文字に変換します。

【可搬性】

    tolower()
        ANSI, UNIX, MS-DOS, ROM

    _tolower()
        UNIX, MS-DOS, ROM

【参照】

    ctype(3), toascii(3), toupper(3)






























                                - 265 -                                 




LSI C-86 Reference Manual                                     TOUPPER(3)


【名前】

    toupper, _toupper - 英大文字への変換

【書式】

    #include <ctype.h>
    char toupper(char c);
    char _toupper(char c);

【解説】

    toupper()はcが英小文字であればcを大文字に変換したものを返し、 そうで
    なければcをそのまま返します。

    _toupper()はcを小文字とみなして大文字に変換します。

【可搬性】

    toupper()
        ANSI, UNIX, MS-DOS, ROM

    _toupper()
        UNIX, MS-DOS, ROM

【参照】

    ctype(3), toascii(3), tolower(3)






























                                - 266 -                                 




LSI C-86 Reference Manual                                       TRIG(3M)


【名前】

    sin, cos, tan, asin, acos, atan, atan2 - 三角関数

【書式】

    #include <math.h>
    double sin(double x);
    double cos(double x);
    double tan(double x);
    double asin(double x);
    double acos(double x);
    double atan(double x);
    double atan2(double y, double x);

【解説】

    これらは三角関数または逆三角関数の値を計算します。角度の単位はラジア
    ンです。

    sin()はxのサインを返します。

    cos()はxのコサインを返します。

    tan()はxのタンジェントを返します。

    asin() はxのアークサイン(sin()の逆関数)を、-PI/2からPI/2までの範囲で
    返します。

    acos()はxのアークコサイン(cos()の逆関数)を、0からPI までの範囲で返し
    ます。

    atan()はxのアークタンジェント(tan()の逆関数) を、-PI/2からPI/2までの
    範囲で返します。

    atan2() はatan(y/x)を計算しますが、atan()と異なり、-PIからPIまでの値
    を返します。xの値が0であってもyが0でなければ正しい値を返します。

【エラー】

    EDOM
        パラメタが定義域を超えています

    ERANGE
        結果が正確に表現できません

【可搬性】

    ANSI, UNIX, MS-DOS, ROM

【参照】

    matherr(3)





                                - 267 -                                 




LSI C-86 Reference Manual                                    TRUNCATE(3)


【名前】

    truncate, ftruncate - ファイルの大きさの変更

【書式】

    #include <io.h>
    int truncate(const char *path, long size);
    int ftruncate(int fd, long size);

【解説】

    truncate()はpathで示されるファイルの大きさをsizeに変更します。

    ftruncate()はfdで示されるファイルの大きさをsizeに変更します。

    ファイルを大きくするときにはファイルの最後に0 で初期化されたデータを
    追加します。小さくするときには短くなった部分は切り捨てられますので注
    意してください。

    ファイルpathは書き込み許可属性を持っていなければなりません。また、フ
    ァイルfdは書き込み可でオープンされていなければなりません。

【リターン値】

    成功すると0を返します。失敗するとerrnoをセットし、-1を返します。

【エラー】

    EACCES
        リードオンリーファイルです。またはディスクに残り容量がありません

    EBADF
        ファイルハンドルfdが無効です

    EMFILE
        オープンされているファイルの数が多すぎます

    ENOENT
        pathで示されるファイルが存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    chsize(3)










                                - 268 -                                 




LSI C-86 Reference Manual                                          TZ(3)


【名前】

    TZ - タイムゾーンを示す環境変数

【解説】

    Unixはシステムの時刻を世界標準時(UTC)で管理しています。時間関数はUTC
    を基準にして各地のローカルな時刻を求めます。そのときに必要な情報を持
    っているのが環境変数TZです。

    TZ はタイムゾーンを定義する環境変数です。TZにはまず3文字のタイムゾー
    ン名を設定します。日本のタイムゾーン名はJST(Japan Standard  Time) で
    す。 つづいてUTC - JSTを時間単位で設定します。日本時間はUTCより9時間
    進んでいますので-9になります。さらに、サマータイム制が採用されている
    ときには、そのタイムゾーン名を3文字で設定します。 日本ではサマータイ
    ム制は採用されていませんのでTZ=JST-9となります。アメリカ東部標準時で
    はサマータイムが採用されているのでTZ=EST5EDTとなります。

    サマータイムのタイムゾーン名が設定されているときにはグローバル変数
    daylight が0ではなくなり、時間関数はサマータイムが採用されている事を
    認識します。設定されていない場合にはdaylightは0になります。

    グローバル変数tznameを使うことによって2 つのタイムゾーン名にアクセス
    することができます。 tznameはchar *の配列で、tzname[0]は標準のタイム
    ゾーン名、tzname[1]はサマータイム時のタイムゾーン名を指しています。

    グローバル変数timezoneはUTC とローカルタイムの差を秒単位で表したもの
    です。 時間関数はこれを使って UTC とローカルタイムの変換をおこないま
    す。

    以上の関係を表すと、次のようになります。

        TZ=JST-9のとき

            tzname[0] = "JST";
            tzname[1] = "";
            timezone = -9L*60L*60L;
            daylight = 0;
        TZ=EST5EDTのとき

            tzname[0] = "EST";
            tzname[1] = "EDT";
            timezone = 5L*60L*60L;
            daylight = 0以外の値;
    これらのグローバル変数はtzset(3)によって環境変数TZからセットされます
    が、各時間関数は自動的にtzset(3)を呼び出しますのでユーザが明示的に呼
    び出す必要はありません。

    環境変数TZが設定されていないときにはtzset(3)はTZ=GMT0 と仮定して各変
    数をセットします。 これでローカルタイムとUTCが同一になりますから、こ
    れまでの関数の動作とコンパチビリティがとれることになります。
    strftime(3)で%Zを使わないかぎりはその違いは表面化しません。

    <time.h>で宣言されている時間関数は次のようにUTC とローカルタイムの変
    換をおこないます。ここに挙げられていない時間関数は変換はおこないませ
    ん。


                                - 269 -                                 




LSI C-86 Reference Manual                                          TZ(3)



    time()
        ローカルタイム(MS-DOS)-> UTC

    clock()
        ローカルタイム(MS-DOS)-> UTC

    ftime()
        ローカルタイム(MS-DOS)-> UTC

    stime()
        UTC ->ローカルタイム(MS-DOS)

    localtime()
        UTC ->ローカルタイム

    ctime()
        UTC ->ローカルタイム

    mktime()
        ローカルタイム->UTC

    時間関数のほかにも UTCとローカルタイムの変換をおこなうライブラリ関数
    があります。それは、 ファイルのタイムスタンプを扱うもので、 stat(3),
    fstat(3),  gftime(3), utime(3)がそうです。MS-DOSのファイルにつけられ
    るタイムスタンプはローカルタイムですから、これらも一貫性を保つために
    時間の変換を次のように実行します。

    stat()
        ローカルタイム(MS-DOS)-> UTC

    fstat()
        ローカルタイム(MS-DOS)-> UTC

    gftime()
        ローカルタイム(MS-DOS)-> UTC

    utime()
        UTC ->ローカルタイム(MS-DOS)

【可搬性】

    UNIX, MS-DOS

【参照】

    time(3),  ctime(3),  timezone(3),  strftime(3),  tzset(3), ftime(3),
    stat(3), fstat(3), gftime(3), utime(3)










                                - 270 -                                 




LSI C-86 Reference Manual                                       TZSET(3)


【名前】

    tzset - 時刻のグローバル変数の初期化

【書式】

    #include <time.h>
    void tzset(void);

【解説】

    tzset() は時間関数群が使用するグローバル変数  timezone,    daylight,
    tznameを初期化します。

    tzset() は時間関数が自動的にコールしますので、ユーザが明示的にコール
    する必要はありません。

【可搬性】

    UNIX, MS-DOS

【参照】

    TZ(3), timezone(3)


































                                - 271 -                                 




LSI C-86 Reference Manual                                       UMASK(3)


【名前】

    umask - ファイルアクセス許可マスクの設定

【書式】

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <io.h>
    int umask(int mode);

【解説】

    umask()はopen(3),  creat(3) で使用されるファイルアクセス許可マスクを
    modeにします。modeの1になっているビットはopen(3), creat(3)で新規作成
    されるファイルのアクセス許可設定をマスクし、無効にします。

    modeに使用できる定数は<sys/stat.h>で次のように定義されています。

    S_IWRITE
        書き込み許可をマスクします

    S_IREAD
        読み出し許可をマスクします

    modeにS_IWRITEをあたえると、それ以降のファイル作成ではS_IWRITEがマス
    クされ、リードオンリーファイルしか作成できなくなります。MS-DOSではラ
    イトオンリーファイルは作成できませんので、S_IREADは無視されます。

    プログラム実行開始時の設定値は022(8 進数)になっています。

【リターン値】

    umask()は以前のファイルアクセス許可マスクの設定値を返します。

【可搬性】

    UNIX, MS-DOS

【参照】

    chmod(3), creat(3), open(3)
















                                - 272 -                                 




LSI C-86 Reference Manual                                      UNGETC(3)


【名前】

    ungetc - ストリームへの1文字のプッシュバック

【書式】

    #include <stdio.h>
    int ungetc(char c, FILE *fp);

【解説】

    ungetc() はファイルポインタfpで示されるファイルへ文字cを戻します。文
    字cを戻すことにより、次にgetc(3)を呼び出した時には文字c が値として得
    られます。

【リターン値】

    戻した1文字を返します。戻せなかったときは値EOFを返します。

【可搬性】

    ANSI, UNIX, MS-DOS

【参照】

    getc(3)
































                                - 273 -                                 




LSI C-86 Reference Manual                                     UNGETCH(3)


【名前】

    ungetch - コンソールへの文字のプッシュバック

【書式】

    #include <conio.h>
    int ungetch(char c);

【解説】

    ungetch()は文字cをコンソールへ戻します。この文字は次のgetch(3)の呼び
    出しで読むことができます。 ungetch() が戻すことができるのは最大1文字
    で、読み込みをせずに続けて2回以上呼び出すとエラーになります。

【リターン値】

    成功するとパラメタcを返します。エラーのときには値EOFを返します。

【可搬性】

    MS-DOS

【参照】

    kbhit(3), getch(3)
































                                - 274 -                                 




LSI C-86 Reference Manual                                      UNLINK(3)


【名前】

    unlink, remove - ファイルの削除

【書式】

    #include <io.h> or <stdio.h>
    int unlink(const char *filename);
    int remove(const char *filename);

【解説】

    unlink(), remove()はfilenameで示されるファイルを削除します。ワイルド
    ・カード文字(*と?)は使用できません。

【リターン値】

    成功した場合は0を返し、失敗した場合は0以外の値を返します。

【エラー】

    EACCES
        filenameはディレクトリです。あるいはリードオンリーファイルです

    ENOENT
        filenameが見つかりません

【可搬性】

    unlink()
        UNIX, MS-DOS

    remove()
        ANSI, MS-DOS
























                                - 275 -                                 




LSI C-86 Reference Manual                                       UTIME(3)


【名前】

    utime - ファイルの時刻情報の設定

【書式】

    #include <io.h>
    int utime(const char *pathname, const time_t times[2]);

【解説】

    utime()は、pathnameが示すファイルの時刻情報をtimes[1] の時刻に変更し
    ます。時刻の表現はtime(3)の返す値と同じです。

    timesにNULLを指定すると、ファイルには現在の時刻が設定されます。

【リターン値】

    成功すれば 0を返します。失敗するとerrnoをセットし、0以外の値を返しま
    す。

【エラー】

    EACCES
        pathnameはディレクトリ、またはリードオンリーファイルです

    EMFILE
        オープンされているファイルの数が多すぎます

    ENOENT
        pathnameで示されるファイル、あるいは先行するパス名が存在しません

【可搬性】

    UNIX, MS-DOS

【参照】

    gftime(3), time(3)

【バグ】

    utime()ではディレクトリの時刻情報を設定することはできません。 これは
    MS-DOSの制限です。














                                - 276 -                                 




LSI C-86 Reference Manual                                      VA_ARG(3)


【名前】

    va_list, va_start, va_arg, va_end - 可変パラメタ関数用マクロ

【書式】

    #include <stdarg.h>
    va_list ap;
    void va_start(va_list ap, rightparm);
    type va_arg(va_list ap, type);
    void va_end(va_list ap);

【解説】

    これらは可変パラメタ関数のパラメタを取り出すためのマクロです。
    va_listは可変パラメタを順次取り出すためのポインタ型です。va_start(),
    va_arg(), va_end()はマクロとして定義されています。

    可変パラメタ関数は次のように宣言します。

        type func(param1, param2, rightparam, ...);

    可変パラメタ関数の中では、 まず va_list 型の変数 ap を宣言し、  次に
    va_start() を呼んでその変数を初期設定します。rightparmには可変パラメ
    タ関数の可変パラメタの部分(...) を除いたパラメタの中で一番右のパラメ
    タを渡します。

    パラメタを取り出すにはva_arg()を使います。va_start()によって初期設定
    されたポインタapと取り出すパラメタの型を渡してva_arg()を呼び出すと、
    その型のパラメタが 1つ取り出されます。va_arg()は呼び出されるごとに、
    左から右へ1つずつパラメタを取り出します。

    一連のパラメタ取り出しが終了した後にva_end()を呼んでください。

【使用例】

        #include <stdarg.h>
        #include <stdio.h>

        void    print(char *format, ...)
        {
                va_list ap;
                char    c, *p;
                int     i;

                va_start(ap, format);
                for (p = format; *p != '\0'; p++) {
                        switch (*p){
                        case 'C':
                                c = va_arg(ap, int);
                                putchar(c);
                                break;
                        case 'I':
                                i = va_arg(ap, int);
                                printf("%d", i);
                                break;


                                - 277 -                                 




LSI C-86 Reference Manual                                      VA_ARG(3)


                        default:
                                putchar(*p);
                        }
                }
                va_end(ap);
        }

【リターン値】

    va_arg()は取り出したパラメタの値を返します。

【可搬性】

    ANSI, MS-DOS, ROM

【参照】

    vprintf(3)

【バグ】

    va_arg()を呼ぶ際に取り出すパラメタの型を指定しますが、可変パラメタ関
    数のパラメタ変換規則に従っていますので注意してください。  たとえば、
    char型のオブジェクトを取り出す場合、これはint 型にひろげられているの
    でva_arg()のtypeはintを指定してください。

        va_list ap;
        char    c;

            ...

                c = va_arg(ap, int);

    その他、 float は double にひろげられますので、 float 型のパラメタは
    va_arg(ap, double)によって取り出す必要があります。

    構造体をva_arg()によって取り出す場合には、ワード境界に整合されている
    ことに注意してください。




















                                - 278 -                                 




LSI C-86 Reference Manual                                     VPRINTF(3)


【名前】

    vprintf, vfprintf, vsprintf - 書式つき出力変換

【書式】

    #include <stdio.h>
    #include <stdarg.h>
    int vprintf(const char *format, va_list arg);
    int vfprintf(FILE *fp, const char *format, va_list arg);
    int vsprintf(char *buf, const char *format, va_list arg);

【解説】

    vprintf(), vfprintf(), vsprintf()は、それぞれ関数名の先頭にvがつかな
    い関数printf(3),  fprintf(3), sprintf(3)と同様の動作をしますが、パラ
    メタのあたえ方が異なります。

    printf(3)一族は可変個のパラメタを要求するのに対し、vprintf(3) 一族は
    va_list型のパラメタひとつだけを必要とします。argはマクロva_start()に
    よって初期化された va_list型の変数でなくてはなりません。または、初期
    化されたあとにva_arg()マクロによって進められていてもかまいません。

    vprintf()一族はライブラリファイルdoslib.libとintlib.lib の両方に含ま
    れています。 intlib.libに含まれているvprintf()には、浮動小数点数の表
    示機能(f,  e, E, g, G)がありません。これは、浮動小数点数の表示を必要
    としない多くのプログラムにムダな浮動小数点演算パッケージをリンクしな
    いようにして、作成した実行ファイルを小さくするために用意しました。こ
    ちらのvprintf()を使う場合には、次のようにintlib.lib をライブラリとし
    て指定してください。

        lcc prog.c -lintlib

【使用例】

    sprintf(3)に似ていますが、文字数の代りに文字列の最後のナル文字('\0')
    のアドレスを返す関数pprintf()は次のように書けます。

        char    *pprintf(char *buf, char *format, ...)
        {
                va_list arg;

                va_start(arg, format);
                buf += vsprintf(buf, format, arg);
                va_end(arg);
                return (buf);
        }

【リターン値】

    出力された文字数を返します。もしエラーがあると-1を返します。

【可搬性】

    vsprintf()
        ANSI, UNIX, MS-DOS, ROM


                                - 279 -                                 




LSI C-86 Reference Manual                                     VPRINTF(3)



    それ以外
        ANSI, UNIX, MS-DOS

【参照】

    printf(3), va_arg(3)

【バグ】

    vsprintf() はbufに変換結果が入るだけの余裕があるかどうかのチェックは
    しません。bufには十分な領域を取っておいてください。














































                                - 280 -                                 




LSI C-86 Reference Manual                                       WRITE(3)


【名前】

    write - ファイルの書き込み

【書式】

    #include <io.h>
    int write(int fd, const void *buf, int n);

【解説】

    write()はbufで示されるメモリバッファの内容を、ファイルハンドルfdで示
    されるファイルにnバイト書き込みます。

    書き込み動作はファイルの現在のリードライト位置から開始します。書き込
    み操作が完了すると、リードライト位置は実際に書き込まれたデータのバイ
    ト数だけ進められます。

【リターン値】

    実際にファイルに書き込まれたデータのバイト数を返します。ディスク容量
    の残りが不足した場合には、n よりも小さい値を返します。エラーを検出す
    ると-1を返し、errnoにエラーの種類をセットします。

【エラー】

    EACCES
        アクセスが拒否されました

    EBADF
        ファイルハンドルfdが無効です

【可搬性】

    UNIX, MS-DOS

【参照】

    creat(3), open(3), read(3), close(3)

【バグ】

    write()は、実際には32Kバイト以上を一度に書き込むことが可能です。この
    場合にはwrite()のリターン値をunsigned int として使用しなければなりま
    せん。 ただし、エラーを示す-1はunsigned intの65535と区別がつきません
    ので、write()が書き込むことができる最大のバイト数は65534に制限されま
    す。











                                - 281 -                                 




LSI C-86 Reference Manual                                     XPRINTF(3)


【名前】

    xprintf - 書式つき出力変換

【書式】

    #include <stdrom.h>
    int xprintf(int (*put1)(char), const char *format, ...);

【解説】

    xprintf()はprintf(3)と同じ機能を持つ関数ですが、1文字出力関数put1 を
    指定することができるため、どんなものへも書式つき出力をおこなうことが
    できます。

    put1 はchar型のパラメタを出力し、エラーが発生したときにはEOFを返す関
    数として作成してください。

    xprintf(3)は'\n'のCR/LFへの展開はおこないません。必要ならばput1 の中
    でユーザが処理してください。

    formatについての詳細はprintf(3)を参照してください。

【使用例】

        #include <stdrom.h>

        int     my_put1(char c)
        {
                cを出力する
                if (エラー)
                        return (EOF);   /* エラーが発生した */
                return (0);             /* 成功 : EOF 以外 */
        }

        void    foo(int i)
        {
                xprintf(my_put1, "foo: i = %d\n", i);
        }

【リターン値】

    出力された文字数を返します。エラーのときにはEOFを返します。

【可搬性】

    MS-DOS, ROM

【参照】

    printf(3), xscanf(3)







                                - 282 -                                 




LSI C-86 Reference Manual                                      XSCANF(3)


【名前】

    xscanf - 書式つき入力変換

【書式】

    #include <stdrom.h>
    int xscanf(int (*get1)(char), const char *format, ...);

【解説】

    xscanf() はscanf(3)と同じ機能を持つ関数ですが、1文字入力関数get1を指
    定することができるため、どんなものからも書式付入力をおこなうことがで
    きます。

    get1はchar型のパラメタが'\0'のときには次の入力文字を返し、'\0'でない
    ときにはその文字をプッシュバックする関数として作成してください。  ま
    た、エラーが発生したときにはEOFを返してください。

    formatについてはscanf(3)の説明を参照してください。

【使用例】

        #include <stdrom.h>

        int     my_get1(char c)
        {
                if (c == '\0')
                        return (次の入力文字);
                cをプッシュバックする
                if (エラー)
                        return (EOF);   /* エラーが発生した */
                return (0);             /* 成功 : EOF 以外 */
        }

        int     bar()
        {
                int     i;

                if (xscanf(my_get1, "%d", &i) == 1)
                        return (i);
                return (-1);
        }

【リターン値】

    正常に変換され、代入されたパラメタの数を返します。エラーまたはEOF の
    ときにはEOFを返します。

【可搬性】

    MS-DOS, ROM

【参照】

    scanf(3), xprintf(3)


                                - 283 -                                 




LSI C-86 Reference Manual                                      XSCANF(3)



【バグ】

    xscanf()はscanf(3)同様に、入力を1文字先読みします。






















































                                - 284 -                                 


