[lipsf に関するテクニカルノウハウ集]


1.機種依存性吸収のために用意されている識別子

　machine.h の中や、make config で生成される config.h の中で
は、各種の識別子が定義されています。これらの識別子は、OS の
違いを吸収するために設けられています。
　自分の環境で、うまくコンパイルできない、どうもおかしな挙動
を示すというような場合には、これらの識別子を定義したり、定義
を取り消したりして調整して下さい。
　各識別子の意味を以下に列挙します。

SYSV
SVR4
BSD4
BSD43	各種 OS の元となるタイプを示します。SYSV, SVR4 は、
	machine.h の後半で、OS 特有の定義のために参照されて
	いますが、BSD4, BSD43 は、参考として定義されているだ
	けなので、実際にはソース中で参照されていません。

OSTYPE	各 OS を表す識別子を定義しています。参考として定義さ
	れているだけなので、実際にはソース中で参照されていま
	せん。

CODEEUC	漢字コードとして、EUC (Extended Unix Code) 漢字を用
	います。未定義の場合は Shift JIS になります。インス
	トール後の man ページや、端末出入力に用いる漢字コー
	ド等に影響します。
	印字ファイルの漢字コードに関しては、コンパイル後に動
	的に変更可能です。
USEMANLANG
	man(1) の参照する検索パス名が、/usr/man/ja_JP.SJIS/
	のように環境変数 LANG で示される文字列を含み、多国語
	対応されています。
SUPPORTSJIS
	cc(1) や man(1) が完全に Shift JIS を正しく扱えます。
	2 byte 目に '\' が来るような漢字に対しても、この '\'
	を meta character として扱いません。
BSDINSTALL
	BSD ライクな install(1) が標準のコマンド検索パス上に
	実装されており、-c (copy) や -s (strip) といったオプ
	ションが使えます。
BSDINSTCMD
	BSD ライクな install(1) のコマンド名が "install" 以
	外の場合、そのコマンド名を定義します。BSDINSTALL を
	定義していない場合は意味を持ちません。
CPP7BIT	cpp(1) が、漢字などの 8bit 文字を通すことができませ
	ん。
CCCOMMAND
	標準として用いるべき c コンパイラのフルパスを定義し
	ます。一部の OS では、BSD 版 cc と SYSV 版 cc が混在
	することがありますので、どちらかに統一しておきましょ
	う。未定義の場合には cc が用いられます。
EXTENDCCOPT
	cc(1) に与えるオプションを定義します。未定義の場合は
	"-O" が指定されます。"-O"(Optimize) に未対応の場合に
	は、ヌルを定義しておきましょう。
CCOUTOPT
	コンパイルのみでリンクをしない場合 (-c オプション指
	定時) に、出力ファイル名を cc(1) に与えるオプション
	を、出力ファイル名の make(1) マクロ付で定義します。
	デフォルトの "-o $@" 以外を必要とする時に指定して下
	さい。
CCLNKOPT
	実行ファイルのリンクをする場合 (-c オプション無指定
	時) に、出力ファイル名を cc(1) に与えるオプションを、
	出力ファイル名の make(1) マクロ付で定義します。デフ
	ォルトの "-o $@" 以外の時に指定して下さい。
USETERMINFO
	端末データベースとして、termcap(5) library の代わり
	に terminfo(5) library を用います。
TERMCAPLIB
	termcap(5) ライブラリとしてリンクしなくてはならない
	ライブラリを定義します。未定義の場合は -ltermcap が
	指定されます。
EXTENDLIB
	その他追加でリンクしなくてはならないライブラリがある
	場合定義します。

FORCEDSTDC
	__STDC__ がプリデファインされていないけれども、プロ
	トタイプ宣言等に ANSI 標準 C の書式を要求する仕様に
	なっている場合に定義します。ANSI 準拠であることが保
	証されている場合、無条件にこれを定義してしまっても特
	に支障ありません。
STRICTSTDC
	モダンタイプのプロトタイプ宣言と、K&R の旧式の関数宣
	言との混在を許さない、頑なな ANSI 標準 C 仕様になっ
	ている場合に定義します。関数の引数の型絡みでエラーが
	大量に出るときに定義して下さい。
NOVOID	void 型を用いることができません。
NOUID_T	uid_t, gid_t が <sys/types.h> で定義されていません。
DECLERRLIST
	大域変数 sys_errlist[] が <stdio.h> または <errno.h>
	の中で宣言されており、ソースリスト中で改めて宣言する
	必要がありません。
PWNEEDERROR
	/lib/libPW.a をリンクする際に、大域変数 Error[] をソ
	ース中に用意しなくてはなりません。
NOERRNO	大域変数 errno が <errno.h> の中で宣言されていません。
NOFILEMODE
	ファイルモードを示す定数 S_IRUSR, S_IWUSR 等が <sys/
	stat.h> の中で定義されていません。
NOUNISTDH
	<unistd.h> が存在しません。
NOSTDLIBH
	<stdlib.h> が存在しません。
USESELECTH
	関数 select(2) を利用する際に必要な構造体 fd_set が、
	<sys/select.h> の中で定義されています。
USETIMEH
	構造体 tm が、<sys/types.h> や <sys/time.h> を参照す
	るだけでは定義されず、<time.h> が必要です。
USESTDARGH
	可変引数を扱う va_list 型が <stdarg.h> の中で定義さ
	れています。
USETERMIO
	端末インタフェースとして、termio 構造体を用います。
USETERMIOS
	端末インタフェースとして、termios 構造体を用います。
	USETERMIO, USETERMIOS 共に未定義の場合には sgttyb
	構造体を用います。
USEDIRECT
	構造体 dirent の代わりに direct を用います。

NOSELECT
	低レベル入出力関数 select(2) を使うことができません。
NOVSPRINTF
	書式付出力関数 vsprintf(3) を使うことができません。
NOTERMVAR
	termcap(5) ライブラリ内に PC, ospeed, BC, UP といっ
	た大域変数が用意されていません。
USEGETWD
	カレントディレクトリ検査関数として、getcwd(3) を用い
	られず、代わりに getwd(3) を用います。

SENSEPERSEC
	1 秒間にキー入力を関知する回数を指定します。端末通信
	速度の遅い場合に定義すると良いでしょう。デフォルトは
	50 回です。
WAITKEYPAD
	ESC キーコードの入力を受けてから待つ時間です。端末通
	信速度の遅い場合に定義すると良いでしょう。デフォルト
	は 360ms です。
WAITMETA
	META キーコードの入力を受けてから待つ時間です。端末
	通信速度の遅い場合に定義すると良いでしょう。デフォル
	トは 60ms です。余り長くすると、META キーのオートリ
	ピートが効かなくなります。


2.printcap の記述

　lipsf のマニュアルには、/etc/printcap への設定例として、古
典的 な BSD タイプでのフルパス名が記述されていますが、OS に
よってはこれらのパス名は異なります。
　各 OS で実際にどういうパス名が使われているかは、その OS で
lpd(8) や printcap(5) のマニュアルを参照して調べて下さい。

　ここでは、幾つかの OS について、マニュアルに書かれていない
printcap の記述例を挙げておきます。

SunOS
NEWS-OS
	マニュアルの記述のとおり

FreeBSD
NetBSD
	:lp=/dev/lpt0:sh:sf:mx#0:\
	:sd=/var/spool/output/lipsf:\
	:lf=/usr/log/lipsf-errs:

Linux
	:lp=/dev/lp0:sh:sf:mx#0:\
	:sd=/var/spool/lpd/lipsf:\
	:lf=/var/spool/lpd/lipsf-errs:

　その他の OS でも、基本的には lp, sd, lf の 3 つのエントリ
の内容だけ書換えれば大丈夫です。
　lp はデバイスファイルですので、正しいフルパス名を調べる必
要がありますが、sd, lf の二つに関してはそう重要でもありませ
ん。
　sd は、そういうパス名のディレクトリが作られていれば大丈夫
ですし、lf に至っては、そういうパス名のファイルを作成出来る
ようになってさえいればファイルは自動的に作られます。

　sh, sf, mx は、必ずマニュアルのとおり記述しておいて下さい。
特に mx#0 という記述がない場合、大きなデータを印字することが
出来なくなってしまいます。
　テキスト印字なのでそう大きなデータになることは余り考えにく
いのですが、おまじないだと思って記述しておきましょう。
