2019/07/19(金)変数の最大値設定


変数の個数設定

改版履歴を読んでいて沸いた、ふとした疑問。
2006.8.4 (Ver 4.43)
いくつかの変数がシステム変数に使われていたので、ユーザが使えるマクロ変数が256個になるようにした。
いくつかの変数がシステム変数に使われていた。
この「いくつか」って、いくつ?

結論

結論から書くと、027#k27p1.2.3 に書いてあるシステム変数の数を示している。

具体的には、次のソースコードに記載されている。
teraterm/ttpmacro/ttmparse.c
#define MaxNumOfIntVar (LONG)(256+4)
#define MaxNumOfStrVar (LONG)(256+20)
#define MaxNumOfLabVar (LONG)512
#define MaxNumOfIntAryVar (LONG)256
#define MaxNumOfStrAryVar (LONG)256
これを表に起こしたものが、下記。
データ型システム変数の数総数
整数型4(256+4)
文字列型20(256+20)
ラベル0512
整数型配列0256
文字列型配列0256

調査メモ

以下、調査メモ。

変数の内容

該当ソース

teraterm\ttpmacro\ttmparse.c
// 変数の個数を128->256、ラベルの個数を256->512へ拡張した。(2006.2.1 yutaka)
// 変数の個数を、InitTTL で作っているシステム変数の分だけ追加した。(2006.7.26 maya)
#define MaxNumOfIntVar (LONG)(128*2+3)
#define MaxNumOfStrVar (LONG)(128*2+19)
#define MaxNumOfLabVar (LONG)256*2
所感
C 言語は、何とか教科書を見ながら読むことができるレベル。

#define は、マクロと呼ばれる機能で数値の置き換えで利用すると。

Tera Term だと、マクロではなく定数として使われてますね。
あと、引数名が LONG になっている?
LONG で型を指定している?

MaxNumOfIntVar は、整数型変数の最大値かな?
MaxNumOfStrVar は、文字型変数の最大値と思われる。
MaxNumOfLabVar は、きっとラベルの最大値だろう。

コメント内容から、システムが利用している整数型変数が 3 で、文字列型変数が 19 あるんだろうけど……

027 を参照すると、整数型は paramcnt / result / timeout / mtimeout の4つじゃないかな?
文字列型変数は inputstr / matchstr / groupmatchstr1~9 / param1~9 なので、(9 * 2) + 2 = 20 な気がする。

ん~。
ヘルプの改版履歴を追ってみる。
整数型変数追加バージョン備考
paramcnt2012.05.31 (Ver 4.74)
result不明おそらくオープンソース化する前から利用されている
timeout2007.1.22 (Ver 4.50)に「ttermpro.exeに "/timeout=" オプションを追加した。」記載あり
mtimeout2009.3.22 (Ver 4.62)
整数型 / 文字列型ともに、変数の個数を拡張したのが 2006 年。
上記の追加時期を考えると、paramcnt を追加したときに、整数型変数の数を変更していなかった感じ。

では、文字列型変数は?
文字列型変数追加バージョン備考
inputstr不明おそらくオープンソース化する前から利用されている
matchstr2005.10.7 (Ver 4.21)
groupmatchstr1~92005.10.21 (Ver 4.22)
param1~9不明2008.1.15 (Ver 4.57) にて「マクロのコマンドラインパラメータに param4 から param9 を追加した。」の記載あり
文字列変数の数と追加時期とのつじつまが、微妙に合わない。
なにこれ?

一応関係あるかなと思った文字列型配列 params の追加は 2016.08.31 (Ver 4.92) になっていた。
ただ、配列だしなぁ……。

ふむ。
InitTTL で作っているシステム変数の数え方……と書いてあるので、ソースを読めば分かるかも。
シンプルに InitTTL で検索する。
次の項目がヒット。

teraterm\ttpmacro\ttl.c
BOOL InitTTL(HWND HWin)
{
	int i;
	TStrVal Dir;

	HMainWin = HWin;

	if (! InitVar()) return FALSE;
	LockVar();

	// System variables
	NewIntVar("result",0);
	NewIntVar("timeout",0);
	NewIntVar("mtimeout",0);    // ミリ秒単位のタイムアウト用 (2009.1.23 maya)
	NewStrVar("inputstr","");
	NewStrVar("matchstr","");   // for 'waitregex' command (2005.10.7 yutaka)
	NewStrVar("groupmatchstr1","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr2","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr3","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr4","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr5","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr6","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr7","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr8","");   // for 'waitregex' command (2005.10.15 yutaka)
	NewStrVar("groupmatchstr9","");   // for 'waitregex' command (2005.10.15 yutaka)

	NewStrVar("param2",Param2);
	NewStrVar("param3",Param3);
	NewStrVar("param4",Param4);
	NewStrVar("param5",Param5);
	NewStrVar("param6",Param6);
	NewStrVar("param7",Param7);
	NewStrVar("param8",Param8);
	NewStrVar("param9",Param9);

	ParseAgain = FALSE;
	IfNest = 0;
	ElseFlag = 0;
	EndIfFlag = 0;
あ~、これか~!

NewIntVar は result / timeout / mtimeout の 3 個。
NewStrVar は inputstr / matchstr / groupmatchstr1~9 / param2~9 の 19 個。

更新履歴を見れば
2012.05.31 (Ver 4.74)
変数に"paramcnt"(引数の個数)、"param1"(マクロファイル名)を追加した。
とある。

【仮説】
2009年の mtimeout 追加時は、履歴記載なしで数を増やしたが、2012年の追加時は InitTTL ではない場所でシステム変数を増やしたので、それぞれ1個ずつ少なく計上されているのではないだろうか。

では、paramcnt と param1 は、どこで定義されてるんだ?
……ソースを検索すれども出てこない。

ん~。悩むより Subversion のコミット履歴を見てみますかね。
https://osdn.net/projects/ttssh2/scm/svn/commits/4901#fd-trunk/teraterm/ttpmacro/ttl.c

ん~~~?!??!?!?

revision 4900 → 4901 において、差分は明確に上記カウントが修正されていることが表示されている。
謎だ。

僕がダウンロードしたソースが古いものなのか?
もしくはどこかでデグレードしたのか?

……ソースコード ttl.c のタイムスタンプは 2009/3/13 1:58 になっていた。
僕がダウンロードしたソースが古いらしい。


リビジョン 4975 の時点では、追加されている。
https://osdn.net/projects/ttssh2/scm/svn/blobs/4957/tags/teraterm-4_74/teraterm/ttpmacro/ttl.c
これが 2012-05-02 16:35:33 になっている。

なんで2009年のソースコードなんてダウンロードしてたんだろう?
自身では、最新版のつもりだったんだけどな。


まぁ、今回はバージョン差分が主題ではないので、本来知りたかった内容を調べてみる。


https://osdn.net/projects/ttssh2/scm/svn/blobs/7769/tags/teraterm-4_103/teraterm/ttpmacro/ttmparse.c
// 変数の個数を128->256、ラベルの個数を256->512へ拡張した。(2006.2.1 yutaka)
// 変数の個数を、InitTTL で作っているシステム変数の分だけ追加した。(2006.7.26 maya)
#define MaxNumOfIntVar (LONG)(256+4)
#define MaxNumOfStrVar (LONG)(256+20)
#define MaxNumOfLabVar (LONG)512
#define MaxNumOfIntAryVar (LONG)256
#define MaxNumOfStrAryVar (LONG)256