†REXXのどろぬま†
作成開始日 2022.01.30
最終更新日 2022.01.30
基本的なINFファイルに関しては、システムが適切なタイトルを付けてオブジェクトを作成してくれるので良いのだが、それ以外の、例えばプログラミング・リファレンスの類はけっこう不便である。そこで、INFファイルからタイトル情報を抜き出して、そのタイトルを付けたINFオブジェクトを生成するスクリプトを作成してみた。
この作業のキモは以下の2点;
@INFファイルからのタイトルの抜き出し、
Aタイトルが重複した場合のリネーム処理
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 /*「コマンド解説書」と表示される */
なお、オブジェクトを作成する際には「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
/* 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