†REXXのどろぬま†

INFファイルのタイトルの取得

作成開始日 2022.01.30
最終更新日 2022.01.30

OS/2のヘルプファイルであるINFファイルは、ファイル名が短くて、中身となかなか一致しない。「CMDREF.INF」や「REXX.INF」は判りやすいが、「A3AA3MST.INF」が「ネットワーク管理者のタスク」なんて言うのは絶対に判らない。

基本的なINFファイルに関しては、システムが適切なタイトルを付けてオブジェクトを作成してくれるので良いのだが、それ以外の、例えばプログラミング・リファレンスの類はけっこう不便である。そこで、INFファイルからタイトル情報を抜き出して、そのタイトルを付けたINFオブジェクトを生成するスクリプトを作成してみた。

この作業のキモは以下の2点;
@INFファイルからのタイトルの抜き出し、
Aタイトルが重複した場合のリネーム処理

●INFファイルからタイトルを抜き出す

このうち、@のタイトル情報は、単純に108バイト目から格納されていて、ヌル文字(00)が終端になっていた。IPFの仕様をきちんと調べたわけではないが、一応、今回処理したINFファイルに関しては、すべて正常に取得できたようだ。完全な経験則。
inf='c:\os2\book\cmdref.inf';		/* 例としてOS/2コマンド・リファレンス */
rc=stream(inf,'C','Open Read');
rc=stream(inf,'C','seek =108');		/* 108byte目がタイトルの先頭 */
title='';
Do Forever
  ch=charin(inf);
  if c2d(ch)=0 then leave;		/* ヌル文字(00)でターミネイト */
  title=title||ch;
End
rc=stream(inf,'C','close');
say title				/*「コマンド解説書」と表示される */

●オブジェクト名の重複対策

また、AはPMのプログラミング・ガイド(1〜5)や、WPSのプログラミング・ガイド(1〜3)などのように、ファイルは異なるのにタイトルが同じINFファイルが存在する場合を想定している。タイトルが重複したら連番(2〜)を振って、重複しなくなるまでループさせる。

なお、オブジェクトを作成する際には「SysCreateObject」関数を使用するが、この関数の第5引数で、重複時の処理を指定する。この第5引数に「F」を指定すると、重複時にはオブジェクトが作成されず、戻値が0となる(成功時には1)。

exe='exename=c:\os2\view.exe;';
prm='parameters=c:\books2\wps2.inf';	/* 例としてWPS Programming Ref.の第2巻 */

num=1					/* 連番カウンタの初期化 */
objname=title				/* titleは上記の方法で取得する*/
Do Forever
  rc=SysCreateObject('WPProgram', objname, '<WP_DESKTOP>', exe||prm, 'F');
  If rc=1 then leave		/* オブジェクト作成に成功したら脱出 */
  num=num+1
  objname=title||' '||num	/* オブジェクト名が重複した場合は連番を付加 */
End
say objname

●INFオブジェクトの一括作成

以下の例では、C:\OS2\BOOKディレクトリの中の全INFファイルのオブジェクトをデスクトップ上に作成している。なお、ループを300回回している箇所が2箇所あるが、これは本来Foreverとすべきところ。が、Foreverはコードにミスがあった場合、無限ループに陥る危険があるので、敢えて300とした。実際、タイトルが300文字を超えることも、連番が300を超えることないだろうし。
/* make INF object with inf-title */
Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
Call SysLoadFuncs

bookshelf='c:\os2\book\*.inf'		/* 代表的なINFファイルの格納場所 */

rc=sysfiletree(bookshelf,'infs','FO')	/* 必要ならサブディレクトリ検索も指定 */
Do i=1 to infs.0
  inf=inf.i

  /* タイトルの抽出 */
  rc=stream(inf,'C','Open Read');
  rc=stream(inf,'C','seek =108');	/* 108byte目がタイトルの先頭 */
  title='';
  Do 300				/* 実質Forever */
    ch=charin(inf)
    if c2d(ch)=0 then leave		/* ヌル文字が終端 */
    title=title||ch;
  End
  rc=stream(inf,'C','close');

  /* INFオブジェクトの作成 */
  loc='<WP_DESKTOP>'			/* デスクトップ上に作成 */
  exe='exename=c:\os2\view.exe;'
  prm='parameters='||inf

  num=1
  objname=title
  Do 300				/* オブジェクト名の重複対策ループ */
    rc=SysCreateObject('WPProgram', objname, loc, exe||prm, 'F');
    If rc=1 then leave
    num=num+1
    objname=title||' '||num
  End
  say '***' objname
End


【REXXのどろぬま目次】 【ホーム】