2019/07/27(土)デバッグメモ


デバッグメモ

このサイトを作る際に見つけた、公式ヘルプの不具合関連。
あとで修正したいと思っている、または修正されるまで書いておく感じのメモ。

ttpmacro.exe システム関係

ttmparse.c ユーザ変数の最大値について

変数 の見栄えを調整していて 変数の最大値設定 との整合性に疑問が出たのでメモ。
前提条件
変数の最大値設定 に書いた内容で、ソースコードは見つけた時点でも次のとおり。

https://osdn.net/projects/ttssh2/scm/svn/blobs/head/trunk/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
変数 に書いたシステム変数を整理すると、以下の通り。
データ型システム変数の数設定されている数備考
整数型4(256+4)
文字列型20(256+20)
ラベル0512
整数型配列0256
文字列型配列1256ユーザ変数としては 255 個?
疑問点
文字列型配列の数が、定義より一つ少ない?
// 変数の個数を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+1)

こんな感じに直してもいいんだろうか?
というか、文字列型配列は、ユーザ変数とは別空間として定義?
自分の知ってる #define の使い方とは微妙に違っていて、正しいのかどうかもわからない……
(LONG) は、引数の名前として LONG にしている? LONG 型(4バイトの符号付整数)を指定できる?
long なのに short にも満たない値として利用している?

結局のところ、ヘタに手を付けたくない感じ。

見つけた日:2019年7月27日
公開した日:2019年7月27日

2019/8/5 追記:
検証は簡単なのだからと、検証マクロを作って実行してみました。
やっぱり文字列型配列だけ1つ少なかったです。
記述するのは簡単だけど、開発環境 (Visual Studio) が無いので動作検証ができない。
フリーの開発環境 MinGW が使えるようなので、時間があればやっておきたい。

コマンド関係

filereadln 読み込み対象ファイルの文字コード

気づいた時点で filereadln には書いていた内容の転記。

Tera Term バージョン 4.102 より、マクロファイルのエンコーディングとして UTF-8 および UTF-16 (いずれも BOM の有無はチェック) に対応しているものの、filereadln はどちらにも未対応のため、対象ファイルが UTF-8 または UTF-16 の場合に文字化けする件。
※ Tera Term バージョン 4.103 にて確認。

これは CSV ファイルの内容を listbox で選択できたらいいなと。
具体的には UTF-8 の csv ファイルを filereadln で読み込んで strsplit で分割後、strdim として指定できる形式で外部ファイルとして include できるように変換しファイルを作成 → include したら listbox で選択……という回りくどいことをやろうとして日本語が文字化けしたので気づいた*1

CSV が Shift JIS なら問題ないものの、どうせなら ttl と同じ文字コードで統一したくなって挫折。

ついでに書くと、UTF-8 は文字のバイト数が可変だからなのか他の文字コード変換ツールへ渡しても一部文字化けしたりするので厄介。
対処法がちょっとわからず。

今のところ、対象ファイルの文字コードが Shift JIS なら問題ないことは分かっているので、回避するまでもなさそう。
でも、Windows 10 のメモ帳でさえ UTF-8 での保存がデフォルトになってきた現在、CSV の文字コードを気にするのはちょっと面倒かも。

見つけた日:2019年7月
公開した日:2019年7月27日

fileconcate コマンドの result 内容

いくつかの条件で、正常系/異常系の result 値を確認してみた。

まずは正常系。
result に入る値(正常系)
指定内容<file1> の指定<file2> の指定result の値備考
Text同士a.txtb.txt0正常系確認
b.txta.txt0a.txt を b.txt に追記
次に異常系
result に入る値(異常系まとめ)
指定内容<file1> の指定<file2> の指定result の値備考
存在するText同士a.txta.txt2同名の場合
b.txtb.txt2同名の場合
存在するDir同士a.dirb.dir3ディレクトリの場合
a.dira.dir2同名ディレクトリの場合
b.dirb.dir2同名ディレクトリの場合
存在する テキスト x ディレクトリa.dirb.txt3テキストとディレクトリの場合
b.txta.dir0ディレクトリをテキストに入れる場合は 0 が戻る
対象が両方存在しないa.txtb.txt0b.txt が作られる
a.txta.txt2
b.txtb.txt2
指定不備 1:a.txta.txt-1
a.txt:b.txt-2
指定不備 2a:.txta.txt3
a.txtb:.txt0
さて、どうしたもんだろう。

以下、纏める前の情報の列記
ファイルが存在する場合の組み合わせ (正常系)
result に入る値(正常系)
指定内容<file1> の指定<file2> の指定result の値備考
Text同士a.txtb.txt0正常系確認
b.txta.txt0a.txt を b.txt に追記
ファイルが存在する場合の組み合わせ (異常系)
result に入る値
指定内容<file1> の指定<file2> の指定result の値備考
Text同士a.txta.txt2同名の場合
b.txtb.txt2同名の場合
Dir同士a.dirb.dir3ディレクトリの場合
a.dira.dir2同名ディレクトリの場合
b.dirb.dir2同名ディレクトリの場合
Text x Dira.dirb.txt3テキストとディレクトリの場合
b.txta.dir0ディレクトリをテキストに入れる場合は 0 が戻る
;; 対象が存在する場合 (text のみ)
fileconcat 'a.txt' 'b.txt'	; result 0
messagebox result 'result'

fileconcat 'a.txt' 'a.txt'	; result 2
messagebox result 'result'

fileconcat 'b.txt' 'b.txt'	; result 2
messagebox result 'result'

;; 対象が存在する場合 (dir のみ)
fileconcat 'a.dir' 'a.dir'	; result 2
messagebox result 'result'

fileconcat 'a.dir' 'b.dir'	; result 3
messagebox result 'result'

fileconcat 'b.dir' 'b.dir'	; result 2
messagebox result 'result'

;; 対象が存在する場合 (text x dir)
fileconcat 'a.dir' 'b.txt'	; result 3
messagebox result 'result'

fileconcat 'b.txt' 'a.dir'	; result 0
messagebox result 'result'
ファイル・ディレクトリが存在しない場合の組み合わせ (異常系)
result に入る値
指定内容<file1> の指定<file2> の指定result の値備考
対象が両方存在しないa.txtb.txt0
a.txta.txt2
b.txtb.txt2
;; 対象が存在しない場合
;fileconcat 'a.txt' 'b.txt'	; result 0
;messagebox result 'result'

;fileconcat 'a.txt' 'a.txt'	; result 2
;messagebox result 'result'

;fileconcat 'b.txt' 'b.txt'	; result 2
;messagebox result 'result'
ファイル指定の間違い (異常系)
result に入る値
指定内容<file1> の指定<file2> の指定result の値備考
指定不備 1:a.txta.txt-1
a.txt:b.txt-2
指定不備 2a:.txta.txt3
a.txtb:.txt0
fileconcat ':a.txt' 'b.txt'	; result -1
messagebox result 'result'

fileconcat 'a.txt' ':b.txt'	; result -2
messagebox result 'result'

fileconcat 'a:.txt' 'b.txt'	; result 3
messagebox result 'result'

fileconcat 'a.txt' 'b:.txt'	; result 0
messagebox result 'result'

見つけた日:2019年8月
公開した日:2019年8月24日

*1 : 当初は 「include したファイルって変数に確保できるんかな。まぁテストしてから公開だし、やってみるか」程度の認識だったので、意外なところで躓いた感じ。