MH のどうでもいいような趣味の講座


「MH 中級者以上向け〜どうでもいい(笑)ような趣味の講座」
 ◎Appendix 1: MH フォーマット組込関数
MH フォーマットの組込関数は、その引数の渡し方等によって
[表A1-1] 組込関数とその書式例
引数 解説 書式例
---- 引数を取らない %(func)
literal 数値や文字列を直接与える %(func 1234)
%(func strings)
comp
date
addr
メールヘッダの内容 %(func {subject})
%(func {date})
%(func {from})
expr 関数の入れ子や判別文などの 結果を引数として与える %(func (func2))
%(func (func2{comp}))
%(func %<{reply-to}%|%{from}%>)
などと、書式でいくつかの種類に分類できる。 以下、MH-6.8.3 の man mh-format(5) を参考に、個々の関数について 紹介する。


引数を持たない組込関数

[表A1-2] 引数を持たない組込関数
関数名戻り値内容
msg整数そのメッセージの番号を返す
cur整数そのメッセージがカレントである(=1)か否か(=0)を返す
size整数そのメッセージのサイズを返す
strlen整数str レジスタの長さ(bytes)を返す
width整数出力バッファのサイズ(bytes)を返す
charleft整数出力バッファの残りbytesを返す
timenow整数UNIX epoch (1970年1月1日0:00(GMT))からの秒を返す
me文字列ユーザのメールボックス名 (実質上はアカウント名) を返す

補足説明
msg
最もよく使われる関数であろう。そのメッセージの番号を返す。 MH ではそのメッセージのファイル名はメッセージ番号で与えられているので、 つまりは、そのファイル名(数字ではあるが)を返すことになる
cur
cursole ではなくて、current 関数である。位置情報は、 そのメールフォルダの .mh_sequence ファイルを参照する

引数が literal な組込関数

[表A1-3] 引数が literal な組込関数
関数名戻り値内容
eq真偽num レジスタが arg と等しい (num == arg)
ne真偽num レジスタが arg と等しくない (num != arg)
gt真偽num レジスタが arg より大きい (num > arg)
match真偽str レジスタが arg を含む
amatch真偽str レジスタが arg で始まる
plus整数arg に num レジスタを加える
minus整数arg から num レジスタを減ずる
divide整数num レジスタを arg で割る
modulo整数num レジスタを arg で割った余り
num整数num レジスタに arg を入れる
lit文字列str レジスタに arg を入れる
getenv文字列str レジスタに arg の環境変数を入れる
profile文字列str レジスタに MH profile での指定値を入れる

補足説明
minus
「%(minus arg)」は、「num - arg」でなくて 「arg - num」であるので注意
modulo
MH.6.8 では、「%02(year{date})」という形で、数値を直接文字列的に 操作することが出来なくなったので、
%(void(year{date}))%02(modulo 100)
という操作で西暦の下2桁を表示するのに、この関数はしばしば用いられる
lit
引数を直接 str レジスタに入れるこの lit 関数は、例えば「%(lit)」という 形式で、str レジスタのクリアにもしばしば使用される
profile
環境変数の読込が getenv であるのに対し、profile は MH の環境変数設定ファイルである ~/.mh_profile の 設定値を読込むものである。
例えば、~/.mh_profile で「Path: Mail」と 指定してある場合、「%(profile path)」で「Mail」が str レジスタに入る

引数が expr な組込関数

[表A1-4] 引数が expr な組込関数
関数名戻り値内容
nonzero真偽num レジスタが 0 でない
zero真偽num レジスタが 0 である
null真偽str レジスタが 空 である
nonnull真偽str レジスタが 空 でない
voidなしstr レジスタか num レジスタをセットする
trimなしstr レジスタの後ろの空白を切り詰める
putstr----str レジスタを表示
putstrf----str レジスタを固定幅で表示
putnum----num レジスタを表示
putnumf----num レジスタを固定幅で表示

補足説明
void
これもよく用いる関数である。画面への出力をせずに str もしくは num レジスタに値を入れる際に用いられる

引数が comp な組込関数

引数が comp というのは、component、つまり「メールヘッダの中身」という 意味である。

[表A1-5] 引数が comp (component) な組込関数
関数名戻り値内容
comp文字列str レジスタにメールヘッダの内容を入れる
compval整数num レジスタにメールヘッダの内容をアスキー整数化して入れる "atoi(comp)"

補足説明
compval
例えば、ML からのメールのヘッダに、 「X-Ml-Count: 000125」とかいう ML での通算メール番号がつくような場合、 「%06(compval{X-Ml-Count})」などとして、このメール番号を num レジスタに 入れることが出来る

引数が date な組込関数

これも上記した 引数が comp な組込関数の一種であるが、 date を表す文字列に限られるものである。

[表A1-6] 引数が date な組込関数
関数名戻り値内容
sec整数秒 [0〜59]
min整数分 [0〜59]
hour整数時 [0〜23]
wday整数曜日 [0 (=日曜)〜6 (=土曜)]
day文字列曜日 [Sun〜Sat]
weekday文字列曜日 [Sunday〜Saturday]
sday整数day of the week known?
(0=implicit,-1=unknown) ???
mday整数日 [1〜31]
yday整数日 [1〜366]
(←tw_yday。でも正常に機能してない!?)
mon整数月 (1〜12)
month文字列月 (Jan〜Dec)
lmonth文字列月 (January〜December)
year整数年 (西暦)
zone整数timezone(分) GMTとの差
日本なら 540 (=+9時間)
tzone文字列timezone名
日本なら JST (但し JP パッチをあてたもののみ)
szone整数timezone explicit?
(0=implicit,-1=unknown)
date2localなしローカルtimezone への変換
date2gmtなしGMTへの変換
dst整数季節時間フラグ (in effect?)
採用月=正, 不採用月=0, 無効情報=負 (← tm_isdst)
clock整数UNIX epoch (1970年1月1日0:00(GMT))との差(秒)
rclock整数現時刻との差(秒)
tws文字列 RFC-822表記 の日付
(例「Sat, 15 Mar 1997 11:26:39 +0900」)
pretty文字列日付 (例「Sat, 15 Mar 1997 11:26:39 JST」)
nodate整数date ヘッダが正しく年月日時間等に分解できない

補足説明
sday, dst, szone
私自身が使ったことがないのと、 ソースを読んでもなんだかよく判らない(^^;;)。 誰か教えて下さい(^^;;;;;)
yday
time.h の tw_yday、つまり1月1日を1として、その年で 何日目かを返す関数の筈だが、何故かうちの MH では、うまく 動作しない。ソースを追ってもどこでおかしいのか判らない〜(^^;;) 誰か教えて下さい(^^;;;;;)
tzone
timezone 名を返す関数ではあるが、日本語化パッチを当ててないものは、 JST を認識しない

引数が addr な組込関数

やはりこれも上記した 引数が comp な組込関数の一種であるが、 引数がアドレスを表す文字列(を含む文字列)に限られるものである。

[表A1-7] 引数が addr な組込関数
関数名戻り値内容
proper文字列RFC-822表記
friendly文字列"user-friendly"表記
addr文字列mbox@host もしくは host!mbox 表記*
pers文字列個人名*
note文字列コメント部*
mbox文字列ローカル mailbox*
mymbox整数ユーザのアドレスか否か?
(真=1/偽=0)← Alternate-Mailboxes
host文字列アドレスのホスト部(@以下) *
nohost整数ホスト名の有無 (無=0/有=1) *
type整数ホスト名表記形式から host type を返す *
(0=local/1=network/-1=uucp/2=unknown)
path文字列any leading host route*
ingrp整数address was inside a group*
gname文字列name of group*

*印のものは、そのヘッダに アドレスが複数記述してあっても、 最初のアドレスに対しての値(文字列)のみを返す。

RFC-822 に従うと、From: ヘッダは発信人のアドレスを示し、 このヘッダのフィールドが取り得る正しい形式は、

  1. 「From: addr@ess」
  2. 「From: <addr@ess>」
  3. 「From: FullName <addr@ess>」
  4. 「From: addr@ess (comment)」
の4つのみである。これらに対し、関数によって戻り値 (戻り文字列)が 多少異なる。
[表A1-8] アドレス形式による戻り値の違い
アドレス表記例
関数 addr@ess<addr@ess>FullName <addr@ess>addr@ess (comment)
proper addr@essaddr@essFullName <add@ress>addr@ess (comment)
friendly add@ressadd@ressFullNamecomment
addr addr@essaddr@essaddr@essaddr@ess
pers --------FullName----
note ------------(comment)
mbox addraddraddraddr
host essessessess

引数が addr な組込関数に対して、これらの addr を操作する関数も用意 されている。

[表A1-9] addr 操作組込関数
関数名引数内容
formataddrexpr引数を「,」で分割し、アドレス一覧として str レジスタに入れる
putaddrliteral str レジスタのアドレス一覧を 引数を optional ラベルとして出力。但し num レジスタから行幅情報を取得するので、 予め「%(void (width))」等でセットしておく必要がある

これらの実際の使用例としては、

%(lit)%(formataddr{from})%(formataddr{cc})\
%<(nonnull)%(void(width))%(putaddr cc: )\n%>\
これにより、From: ヘッダと Cc: ヘッダに記載されたアドレス全てを str レジスタ に アドレス一覧として読み込み、それが空でない( %<(nonnull) )ならば、 putaddr 関数の引数である「cc」であるので、 width関数によって与えられた行幅に対して、
Cc: addr@ess, whois@hogehoge
などと言う形で出力される。

補足説明

mymbox
ヘッダ内容の各アドレスと ユーザの mailbox 名・ ~/.mh_profile で指定した Alternate-Mailboxes を比べる。 真を返すのは、どれかのアドレスがマッチした時であるが、 mymbox 関数の引数として与えた comp ヘッダ自体が存在しない時にも 真を返してしまうので、必要ならば、この判別を行なう前に null 関数等で 更にチェックしておけばよい
path
使ったことがないので私は知りません(^^;;)。誰か教えて下さい(^^;;;)
ingrp, gname
これも使ったことがないので私は知りません(^^;;)。誰か教えて下さい(^^;;;)

© Haruhisa Hayashi 1992,1997
気まぐれにより個々のファイル名を変えてしまう可能性もありますので、 Link/Bookmark される場合は、 %7Ehayashi/internet/mh_guide.html にお願いします。
目次へ 第0章へ 第1章へ 第2章へ 第3章へ
直接このファイルに飛んで来た場合… フレーム版メニューへ
by はやし はるひさ hayashi あっとまーく laic.u-hyogo.学術.日本