;;; ABSを呼び出す
-;;; casl2 call_abs.casl ../stdlib.casl
+;;; casl2 call_abs.casl ../outa.casl
MAIN START
LAD GR2,0
MLOOP CPA GR2,MLEN
MAIN START
LOOP CALL INL ; GR1に数値、GR2に文字列の長さ
JOV NAN
- JMI BIG
+ CPL GR2,EOF
+ JZE FIN
LD GR2,GR2
JZE FIN
CALL OUTL
JUMP LOOP
-NAN OUT NANMSG,NANLEN
+NAN CPL GR4,NANNUM
+ JNZ OV
+ OUT NANMSG,NANLEN
JUMP LOOP
-BIG OUT BIGMSG,BIGLEN
+OV OUT OVMSG,OVLEN
JUMP LOOP
FIN RET
+EOF DC #FFFF
+OVNUM DC #0001
+OVMSG DC 'Over 65535'
+OVLEN DC 10
+NANNUM DC #FFFF
NANMSG DC 'Not a number'
NANLEN DC 12
-BIGMSG DC 'Over 65535'
-BIGLEN DC 10
END
--- /dev/null
+;;; casl2 call_inl0.casl ../inl.casl
+MAIN START
+ CALL INL ; GR1に数値、GR2に文字列の長さ
+ ST GR1,A
+ RET
+A DS 1
+ END
--- /dev/null
+;;; casl2 inl.casl ../casl2lib/inl.casl ../casl2lib/outl.casl
+MAIN START
+LOOP CALL INL ; GR1に数値、GR2に文字列の長さ
+ JOV NAN
+ JMI BIG
+ CPL GR2,EOF
+ JZE FIN
+ LD GR2,GR2
+ JZE FIN
+ JUMP LOOP
+NAN OUT NANMSG,NANLEN
+ JUMP LOOP
+BIG OUT BIGMSG,BIGLEN
+ JUMP LOOP
+FIN RET
+EOF DC #FFFF
+NANMSG DC 'Not a number'
+NANLEN DC 12
+BIGMSG DC 'Over 65535'
+BIGLEN DC 10
+ END
--- /dev/null
+MAIN START
+ LAD GR1,9999
+ LAD GR2,10
+ CALL MULL ; GR3 <- GR1 * GR2
+ END
-;; casl2 outi_call.casl outi.casl
+;; casl2 call_outa.casl ../outa.casl
MAIN START
LAD GR1,VAL
LAD GR2,0
INL START
PUSH 0,GR3
IN IBUF,ILEN ; 入力文字列を格納
- LAD GR1,IBUF
LD GR2,ILEN
+ CPL GR2,EOF
+ JZE FIN
+ LAD GR1,IBUF
CALL STR2L
JOV FIN
- JMI FIN
LD GR1,GR3
FIN POP GR3
RET
IBUF DS 5
ILEN DS 1
-MAXLEN DC 5
+EOF DC #FFFF
END
;;; 10進数の整数を表す文字列を数値に変換
;;; 数値の範囲は、0から65535
;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
-;;; GR2: 文字列の長さ。最大5けた
+;;; 入力 GR2: 文字列の長さ。最大5けた
;;; 出力 GR3: 数値
-;;; 文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
-;;; 数値以外の場合、OFは1
+;;; 出力 GR4: エラーコード 0:範囲内の数値 #0001:エラー範囲外数値 #FFFF:エラー
;;; 依存プログラム: MULL
STR2L START
PUSH 0,GR1
PUSH 0,GR2
- PUSH 0,GR4
PUSH 0,GR5
PUSH 0,GR6
PUSH 0,GR7
XOR GR3,GR3 ; GR3の初期化
AND GR2,GR2 ; GR2 = 0の場合、OVへジャンプ
JZE OV ; ↓
- CPL GR2,=5 ; GR2 > 5の場合、OVへジャンプ
+ CPL GR2,MAXLEN ; GR2 > MAXLENの場合、OVへジャンプ
JPL OV ; ↓
XOR GR4,GR4 ; GR4: インデックスの初期化
LD GR5,GR1 ; GR5 <- GR1
STOL LD GR1,GR5 ; GR1に、入力文字列中の次の桁を格納
ADDL GR1,GR4 ; ↓
LD GR1,0,GR1 ; ↓
- LD GR7,ZERO ; GR1 < '0'の場合、FINへジャンプ
+ LD GR7,ZERO ; GR1 < '0'の場合、NANへジャンプ
CPL GR1,GR7 ; ↓
- JMI FIN ; ↓
- LD GR7,NINE ; GR1 > '9'の場合、FINへジャンプ
+ JMI NAN ; ↓
+ LD GR7,NINE ; GR1 > '9'の場合、NANへジャンプ
CPL GR7,GR1 ; ↓
- JMI FIN ; ↓
+ JMI NAN ; ↓
SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換
- ADDL GR3,GR1
- JOV FIN
+ ADDL GR3,GR1 ; GR3 <- GR1
+ JOV OV ; 足し算の結果がオーバーフローの場合、OVへジャンプ
LAD GR4,1,GR4 ; GR4 <- GR4 + 1
CPL GR4,GR6 ; GR4 = GR6の場合、ループ脱出
JZE FIN ; ↓
-MUL10 LAD GR2,10 ; GR2:10進数の 10
+MUL10 LD GR2,BASE ; GR2:BASE
LD GR1,GR3 ; GR1 <- GR3
CALL MULL ; MULLを呼び出し、GR3 <- GR1 * GR2
+ JOV OV ; MULLのオーバーフロー時はOVにジャンプ
JUMP STOL ; ループ終端
-OV LAD GR7,1 ; オーバーフロー発生
+NAN LAD GR4,#FFFF ; GR4 <- #FFFF
+ JUMP SETOV ; SETOVへ無条件ジャンプ
+OV LAD GR4,1 ; GR4 <- 1
+SETOV LAD GR7,1 ; 強制オーバーフロー
SRL GR7,1 ; ↓
FIN POP GR7
POP GR6
POP GR5
- POP GR4
POP GR2
POP GR1
RET
ZERO DC '0'
NINE DC '9'
+MAXLEN DC 5
+BASE DC 10
END
--- /dev/null
+# autotest.mk > test_template > Define.mk
+# 自動テスト用の変数、マクロ定義
+
+ifndef DEFINE_INCLUDED
+DEFINE_INCLUDED = 1
+
+# シェルコマンドをデバッグするときは、DEBUGSH変数を設定してmakeを実行する
+# 例: DEBUGSH=1 make
+ifdef DEBUGSH
+ SHELL := /bin/sh -x
+endif
+
+# 現在の日時
+DATE = $(shell date +"%F %T")
+
+# Makefile
+MAKEFILE := Makefile
+
+######################################################################
+# コマンド
+######################################################################
+
+CAT := cat
+CHMOD := chmod
+CP := cp
+DEV_NULL := /dev/null
+DIFF := diff -c
+ECHO := echo
+EXPR := expr
+FILE := file -b -e ascii
+FIND := find
+GREP := grep
+LINECOUNT := wc -l
+LN := ln -s
+MKDIR := mkdir -p
+MV := mv
+PRINTF := printf
+REALPATH := realpath
+SED := sed
+TEST := test
+TIME := time
+TR := tr
+VALGRIND := valgrind
+VALGRIND_LOGFILE := _valgrind.log
+VALGRINDFLAG := -q --leak-check=full --show-leak-kinds=all --log-file=$(VALGRIND_LOGFILE)
+VALGRIND_CMDLOGFILE := valgrind.log
+
+######################################################################
+# テストグループとテストでの共通マクロ
+######################################################################
+
+# chk_var_null: 引数がNULLの場合、エラー
+# 用例: $(call chk_var_null,var)
+define chk_var_null
+ $(if $1,,$(error NULL argument))
+endef
+
+# chk_file_ext: 指定されたファイルが実在する場合、エラー
+# 用例: $(call chk_file_ext,file)
+define chk_file_ext
+ $(if $(wildcard $1),$(error $1 exists in $(CURDIR)))
+endef
+
+# 指定したディレクトリーを作成
+# 引数は、ディレクトリー名
+# 用例: $(call create_dir,name)
+define create_dir
+ $(call chk_var_null,$1)
+ $(call chk_file_ext,$1)
+ $(MKDIR) $1
+endef
+
+
+# ファイル1からファイル2への相対パス
+# 引数は、ファイル名1、ファイル名2
+# 用例: $(call rel_to,file1,file2)
+define rel_to
+ $(strip $(shell $(REALPATH) --relative-to=$1 $2))
+endef
+
+# テストディレクトリーのMakefileを作成
+# 引数は、Makefile名、依存ファイル群
+# 用例: $(call create_makefile,file,list_include_file)
+define create_makefile
+ $(RM) $1
+ $(foreach infile,$2,$(ECHO) "include ../$(infile)" >>$1; )
+ $(if $(filter $(SRC),c),$(call puts_cmd_c,$1))
+endef
+
+# C言語の関数をテストするための設定を、指定されたファイルに出力
+# 引数は、ファイル名
+# 用例: $(call puts_cmd_c,file)
+define puts_cmd_c
+ $(ECHO) >>$1
+ $(ECHO) "CC := gcc" >>$1
+ $(ECHO) "CFLAGS := -Wall" >>$1
+ $(ECHO) >>$1
+ $(ECHO) ".INTERMEDIATE:" "$$""(CMD_FILE)" >>$1
+ $(ECHO) >>$1
+ $(ECHO) "CMDSRC_FILE := cmd.c" >>$1
+ $(ECHO) "TESTTARGET_FILES := # Set test target files" >>$1
+ $(ECHO) >>$1
+ $(ECHO) "$$""(CMD_FILE):" "$$""(CMDSRC_FILE)" "$$""(TESTTARGET_FILES)" >>$1
+ $(ECHO) " ""$$""(CC)" "$$""(CFLAGS)" "-o" "$$""@" "$$""^" >>$1
+endef
+
+######################################################################
+# テストグループのディレクトリー
+######################################################################
+
+# テストグループとテストの変数を定義したMakefile
+DEFINE_FILE := Define.mk
+
+# テストのターゲットを定義したMakefile
+TEST_MAKEFILE := Test.mk
+
+# テストグループのMakefileとしてコピーされるファイル
+GROUP_MAKEFILE := Group.mk
+
+# DEFINE_FILEの相対パス
+DEFINE_FILE_REL = $(call rel_to,$(GROUPDIR),$(DEFINE_FILE))
+
+# TEST_MAKEFILEの相対パス
+TEST_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(TEST_MAKEFILE))
+
+# GROUP_MAKEFILEの相対パス
+GROUP_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(GROUP_MAKEFILE))
+
+######################################################################
+# テストのディレクトリー
+######################################################################
+
+# テストコマンドファイル
+CMD_FILE := cmd
+
+# valgrindテストコマンドファイル
+VALGRIND_CMD_FILE := cmd_valgrind
+
+# テスト説明ファイル
+DESC_FILE := desc.txt
+
+# テスト想定ファイル
+TEST0_FILE := 0.txt
+
+# テスト結果ファイル
+TEST1_FILE := 1.txt
+
+# テストの、想定結果と結果の差分ファイル
+DIFF_FILE := diff.log
+
+# テストエラーファイル
+ERR_FILE := err.log
+
+# テストログファイル
+LOG_FILE := summary.log
+
+# 実行時間ファイル
+TIME_FILE := time.log
+
+# valgrindによるメモリーチェックファイル
+VALGRIND_FILE := valgrind.log
+
+# テスト詳細レポートファイル
+DETAIL_FILE := detail.log
+
+# テストの結果として作成されるファイル群
+TEST_RES_FILES := $(TEST1_FILE) $(DIFF_FILE) $(ERR_FILE) $(LOG_FILE) $(DETAIL_FILE) $(TIME_FILE)
+
+endif
--- /dev/null
+# autotest.mk > template > Group.mk
+# テストグループのMakefile
+#
+# オペレーター
+# make : すべてのテストを実行し、結果をログファイルに出力
+# make check : ↓
+# make checkall : すべてのテストを実行し、結果と実行時間をログファイルに出力
+# make time : すべてのテストを実行し、実行時間をログファイルに出力
+# make create : TESTNAMEで指定されたテストを新規に作成
+# make clean : すべてのテストで、"make" で生成されたファイルをクリア
+# make time-clean: すべてのテストで、実行時間のログファイルをクリア
+# make valgrind: すべてのテストで、valgrindによるメモリリークチェックを実行する
+# make valgrind-clean: すべてのテストで、valgrindのログファイルをクリア
+
+include Define.mk
+
+verbose ?= 1
+
+######################################################################
+# テストグループのディレクトリー
+######################################################################
+
+# グループディレクトリー
+GROUP_DIR := $(CURDIR)
+
+# グループ名。ディレクトリ名から取得
+GROUP := $(notdir $(GROUP_DIR))
+
+# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー
+TESTS := $(notdir $(shell $(FIND) . -maxdepth 1 -name "[^A-Z.]*" -type d))
+
+# テストグループログファイル
+GROUP_LOG_FILE := $(shell $(ECHO) $(GROUP) | $(TR) '[a-z]' '[A-Z]').log
+
+# テストグループレポートファイル
+GROUP_REPORT_FILE := Summary.log
+
+# テストグループ実行時間ファイル
+GROUP_TIME_FILE := $(shell echo $(GROUP) | $(TR) '[a-z]' '[A-Z]')_time.log
+
+# テストグループvalgrindファイル
+GROUP_VALGRIND_FILE := $(shell echo $(GROUP) | $(TR) '[a-z]' '[A-Z]')_valgrind.log
+
+# グループで、テスト結果として作成されるファイル群
+GROUP_RES_FILES := $(GROUP_LOG_FILE) $(GROUP_REPORT_FILE) $(GROUP_TIME_FILE) $(GROUP_VALGRIND_FILE)
+
+# テストごとのログファイル
+TEST_LOG_FILES := $(foreach test,$(TESTS),$(test)/$(LOG_FILE))
+
+######################################################################
+# テストグループのマクロ
+######################################################################
+
+# テストごとのファイルをグループファイルに出力
+# 引数は、テストのリスト、グループファイル、テストファイル
+# 用例: $(call group_log,files_test_log,file_group_log)
+define group_log
+ $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $(words $1) tests')
+ $(foreach target,$1,$(call group_log_each,$(target),$2))
+endef
+
+# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル
+# 用例: $(call group_log_each,file_test_log,file_group_log)
+define group_log_each
+ $(ECHO) $(dir $1) >>$2;
+ if $(TEST) -s $1; then $(CAT) $1 >>$2; else $(ECHO) $(dir $1)": no log" >>$2; fi
+ $(ECHO) >>$2;
+endef
+
+# 成功したテストの数。テストグループログファイルから取得
+SUCCESS_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | $(LINECOUNT))
+
+# 失敗したテストの数。テストグループログファイルから取得
+FAIL_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | $(LINECOUNT))
+
+# すべてのテストの数
+ALL_TEST = $(shell $(EXPR) $(SUCCESS_TEST) + $(FAIL_TEST))
+
+# テストごとの実行時間ファイル
+TEST_TIME_FILES := $(foreach test,$(TESTS),$(test)/$(TIME_FILE))
+
+# テストごとのvalgrindファイル
+TEST_VALGRIND_FILES := $(foreach test,$(TESTS),$(test)/$(VALGRIND_FILE))
+
+# テストの結果を、グループログファイルを元にレポート。
+# 引数は、グループ名、グループログファイル、グループレポートファイル
+# 用例: $(call group_report,name,file_log,file_report)
+define group_report
+ $(ECHO) '$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in $(GROUP_DIR)/$2' >$3
+ if $(TEST) $(FAIL_TEST) -eq 0; then $(ECHO) "$1: All tests are succeeded." >>$3; fi
+endef
+
+# リストで指定したディレクトリーでmakeを実行
+# 用例: $(call make_targets,list_dir,target)
+define make_targets
+ $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $2';)
+ $(foreach dir,$1,$(call make_target_each,$(dir),$2))
+endef
+
+# 指定したディレクトリーでmakeを実行
+# 用例: $(call make_target_each,tests,target)
+define make_target_each
+ $(MAKE) $2 -sC $1;
+endef
+
+.PHONY: check checkall time valgrind create clean time-clean valgrind-clean
+
+check checkall: clean $(GROUP_REPORT_FILE)
+ @$(CAT) $(GROUP_REPORT_FILE)
+ @(if $(TEST) $(FAIL_TEST) -gt 0; then $(GREP) 'Failure' $(GROUP_LOG_FILE); fi)
+ @exit $(FAIL_TEST)
+
+time: time-clean $(GROUP_TIME_FILE)
+ @$(CAT) $(GROUP_TIME_FILE)
+
+create:
+ @$(call create_dir,$(TEST))
+ @$(call create_makefile,$(TEST)/$(MAKEFILE),$(MAKEFILES))
+
+clean:
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_RES_FILES);
+
+time-clean:
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_TIME_FILE);
+
+valgrind:
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_RES_FILES);
+
+valgrind-clean:
+ @$(call make_targets,$(TESTS),$@)
+ @$(RM) $(GROUP_VALGRIND_FILE);
+
+$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE)
+ @$(call group_report,$(GROUP),$^,$@)
+
+$(GROUP_LOG_FILE): $(TEST_LOG_FILES)
+ @$(call group_log,$^,$@)
+
+$(TEST_LOG_FILES):
+ @$(MAKE) $(MAKECMDGOALS) -sC $(dir $@) NODISP=1
+
+$(GROUP_TIME_FILE): $(TEST_TIME_FILES)
+ @$(call group_log,$^,$@)
+
+$(TEST_TIME_FILES):
+ @$(MAKE) time -sC $(dir $@)
+
+$(GROUP_VALGRIND_FILE): $(TEST_VALGRIND_FILES)
+ @$(call group_log,$^,$@)
+
+$(TEST_VALGRIND_FILES):
+ @$(MAKE) time -sC $(dir $@)
--- /dev/null
+# autotest.mk > test_template > Test.mk
+# 自動テスト用のMakefile
+#
+# 要: Define.mk
+#
+# オペレーター
+# make : CMDの標準出力をTEST1_FILEに保存したあと、TEST0_FILEとの差分を比較し、結果をLOG_FILEに出力
+# make check : ↓
+# make set : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない
+# make reset : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き
+# make time : CMDの実行にかかった時間をTIME_FILEに保存し、出力
+# make time-clean: "make time" で作成されたファイルをクリア
+# make valgrind: valgrind CMDの標準出力をVARGRIND_FILEに保存
+# make clean : "make" で作成されたファイルをクリア
+# make all-clean: "make" と "make set" で作成されたファイルをクリア
+
+######################################################################
+# マクロ
+######################################################################
+# 指定されたファイルをチェックし、空の場合は削除
+# 引数は、対象ファイル
+# 用例: $(call rm_null,file_target)
+define rm_null
+ if test ! -s $1; then $(RM) $1; fi
+endef
+
+# 説明ファイルの内容を、指定されたファイルに出力
+# 引数は、出力ファイル
+# 用例: $(call desc_log,file_out)
+define desc_log
+ if test -s $(DESC_FILE); then $(CAT) $(DESC_FILE) >>$1; fi
+endef
+
+# テスト実行の経過時間を、指定されたファイルに出力して表示
+# 引数は、テスト名、コマンドファイル、出力ファイル
+# 用例: $(call time_cmd,file_cmd,file_out)
+define time_cmd
+ if test ! -x $1; then $(CHMOD) u+x $1; fi
+ ($(TIME) ./$1 1>$(DEV_NULL) 2>$(DEV_NULL)) 2>&1 | $(GREP) '^real' >$2
+endef
+
+VALGRIND_CMD = $(strip $(shell if test -s $(VALGRIND_CMD_FILE); then $(CAT) $(VALGRIND_CMD_FILE); elif test "`$(FILE) $(CMD_FILE)`" = "data"; then $(CAT) $(CMD_FILE); else $(PRINTF) "./$(CMD_FILE)"; fi))
+
+# valgrindによるメモリーチェック結果を、指定されたファイルに出力して表示
+# 引数は、テスト名、コマンドファイル、出力ファイル
+# 用例: $(call valgrind_cmd,file_cmd,file_out)
+define valgrind_cmd
+ -$(VALGRIND) $(VALGRINDFLAG) $(VALGRIND_CMD) 1>/dev/null 2>&1
+endef
+
+# テスト実行コマンド
+# コマンドファイルを実行し、標準出力を指定されたファイルに保存。
+# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。
+# 引数は、コマンドファイル、出力ファイル、エラーファイル
+# 用例: $(call exec_cmd,file_cmd,file_out,file_err)
+define exec_cmd
+ if test ! -x $1; then $(CHMOD) u+x $1; fi
+ ./$1 >>$2 2>$3
+ if test -s $3; then $(CAT) $3 >>$2; fi
+ $(MV) $2 $2.tmp && $(SED) -e "s%$(CURDIR)%\$$PWD%g" $2.tmp >$2 && $(RM) $2.tmp
+ $(call rm_null,$3)
+endef
+
+# 2つのファイルを比較し、差分ファイルを作成
+# 引数は、2ファイルのリスト、差分ファイル
+# 用例: $(call diff_files,files,file_out)
+define diff_files
+ $(DIFF) $1 >$2 2>&1
+ $(call rm_null,$2)
+endef
+
+# 差分ファイルの内容をログファイルに出力
+# 引数は、テスト名、差分ファイル、ログファイル
+# 用例: $(call test_log,name,file_diff,file_log)
+define test_log
+ $(call desc_log,$3)
+ if test ! -s $2; then RES=Success; else RES=Failure; fi; $(ECHO) "$1: Test $$RES $(DATE)" >>$3
+ $(ECHO) "Details in $(CURDIR)/$(DETAIL_FILE)" >>$3
+endef
+
+# NODISPが設定されていない時は、ログファイルを表示
+# 引数は、ログファイル
+# 用例: $(call disp_test_log,file_log)
+define disp_test_log
+ $(if $(NODISP),,$(CAT) $1)
+endef
+
+# ファイル群から、ファイル名とファイルの内容を指定されたファイルに出力
+# 引数は、対象ファイル群、出力ファイル
+# 用例: $(call report_files,list_file_target,file_out)
+define report_files
+ $(foreach tfile,$1,$(call report_file,$(tfile),$2))
+endef
+
+# ファイル名とファイルの内容を指定されたファイルに出力
+# 引数は、対象ファイル、出力ファイル
+# 用例: $(call report_file,file_target,file_out)
+define report_file
+ $(call chk_var_null,$1)
+ if test -s $1; then $(ECHO) "== $1 ==" >>$2; $(call echo_hr,$2); cat $1 >>$2; $(call echo_hr,$2); $(ECHO) >>$2; fi
+endef
+
+define echo_hr
+ $(ECHO) "----------------------------------------------------------------------" >>$1
+endef
+
+# テスト名。カレントディレクトリー名から取得
+TEST = $(notdir $(CURDIR))
+
+# コマンドファイルのソース
+CMDSRC_FILE ?= $(CMD_FILE)
+
+.PHONY: check set reset clean all-clean time time-clean valgrind valgrind-clean
+
+check: clean $(DETAIL_FILE)
+ @$(call disp_test_log,$(LOG_FILE))
+
+checkall: clean $(DETAIL_FILE) $(TIME_FILE)
+ @$(CAT) $(TIME_FILE) >>$(LOG_FILE)
+ @$(call disp_test_log,$(LOG_FILE))
+
+set: $(CMD_FILE)
+ @$(call chk_file_ext,$(TEST0_FILE))
+ @-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE))
+ @$(CAT) $(TEST0_FILE)
+
+reset: all-clean $(CMD_FILE)
+ @-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE))
+ @$(CAT) $(TEST0_FILE)
+
+clean:
+ @$(RM) $(TEST_RES_FILES) $(TIME_FILE) $(VALGRIND_LOGFILE) $(VALGRIND_CMDLOGFILE) core
+
+all-clean: clean
+ @$(RM) $(TEST0_FILE)
+
+time: time-clean $(TIME_FILE)
+ @$(CAT) $(TIME_FILE)
+
+time-clean:
+ @$(RM) $(TIME_FILE)
+
+valgrind: valgrind-clean $(VALGRIND_LOGFILE) $(VALGRIND_CMDLOGFILE)
+ if test -s $(VALGRIND_LOGFILE); then $(ECHO) $(CURDIR) && $(CAT) $(VALGRIND_LOGFILE); else $(RM) $(VALGRIND_LOGFILE); fi
+
+$(VALGRIND_CMDLOGFILE): $(VALGRIND_LOGFILE)
+ @$(PRINTF) "$(VALGRIND) $(VALGRINDFLAG) $(VALGRIND_CMD)\n" | $(CAT) - $(VALGRIND_LOGFILE) >$(VALGRIND_CMDLOGFILE)
+
+valgrind-clean:
+ @$(RM) $(VALGRIND_LOGFILE)
+
+$(TEST1_FILE): $(CMD_FILE)
+ @-$(call exec_cmd,$^,$@,$(ERR_FILE))
+
+$(DIFF_FILE): $(TEST0_FILE) $(TEST1_FILE)
+ @-$(call diff_files,$^,$@)
+
+$(LOG_FILE): $(DIFF_FILE)
+ @$(call test_log,$(TEST),$^,$@)
+
+$(DETAIL_FILE): $(LOG_FILE)
+ @$(call report_files,$(LOG_FILE) $(CMDSRC_FILE) $(TEST0_FILE) $(ERR_FILE) $(DIFF_FILE) $(TEST1_FILE),$@)
+
+$(TIME_FILE): $(CMD_FILE)
+ @$(call time_cmd,$^,$@)
+
+$(VALGRIND_LOGFILE): $(CMD_FILE)
+ $(call valgrind_cmd,$^,$@)
--- /dev/null
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
--- /dev/null
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+casl2 -M640 ../../as/sample/call_inl.casl ../../as/inl.casl ../../as/outl.casl <input.txt
--- /dev/null
+== summary.log ==
+----------------------------------------------------------------------
+inl1: Test Success 2026-06-18 18:07:57
+Details in /Users/kazubito/2026_06/casl2lib/test/inl1/detail.log
+----------------------------------------------------------------------
+
+== cmd ==
+----------------------------------------------------------------------
+casl2 -M640 ../../as/sample/call_inl.casl ../../as/inl.casl ../../as/outl.casl <input.txt
+----------------------------------------------------------------------
+
+== 0.txt ==
+----------------------------------------------------------------------
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
+----------------------------------------------------------------------
+
+== 1.txt ==
+----------------------------------------------------------------------
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
+----------------------------------------------------------------------
+
--- /dev/null
+0
+1
+32768
+65535
+65536
+90000
+123456
+-1
+a
+123a
+123456a
--- /dev/null
+inl1: Test Success 2026-06-18 18:07:57
+Details in /Users/kazubito/2026_06/casl2lib/test/inl1/detail.log