]> j8takagi.net git repositories - casl2lib.git/commitdiff
inl.caslなどの修正 master
authorj8takagi <j8takagi@nifty.com>
Thu, 16 Jul 2026 06:03:21 +0000 (15:03 +0900)
committerj8takagi <j8takagi@nifty.com>
Thu, 16 Jul 2026 06:03:21 +0000 (15:03 +0900)
https://claude.ai/chat/a24e368a-2a83-425d-9c6b-7c1bd950e4fd

19 files changed:
.gitignore [new file with mode: 0644]
as/sample/call_abs.casl
as/sample/call_inl.casl
as/sample/call_inl0.casl [new file with mode: 0644]
as/sample/call_inl1.casl [new file with mode: 0644]
as/sample/call_mull1.casl [new file with mode: 0644]
as/sample/call_outa.casl
as/src/inl.casl
as/src/str2l.casl
test/Define.mk [new file with mode: 0644]
test/Makefile [new file with mode: 0644]
test/Test.mk [new file with mode: 0644]
test/inl1/0.txt [new file with mode: 0644]
test/inl1/1.txt [new file with mode: 0644]
test/inl1/Makefile [new file with mode: 0644]
test/inl1/cmd [new file with mode: 0755]
test/inl1/detail.log [new file with mode: 0644]
test/inl1/input.txt [new file with mode: 0644]
test/inl1/summary.log [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..5761abc
--- /dev/null
@@ -0,0 +1 @@
+*.o
index 476e902d76b0807ae45a70fb631eb8286bf8c7bb..96a21a2a5b29504c53d1f88de16583d8a7958ec2 100644 (file)
@@ -1,5 +1,5 @@
 ;;; ABSを呼び出す
-;;; casl2 call_abs.casl ../stdlib.casl
+;;; casl2 call_abs.casl ../outa.casl
 MAIN    START
         LAD     GR2,0
 MLOOP   CPA     GR2,MLEN
index 6c770fad77484857e9c3cce8ec97f68326b0030a..aca44fd15d78b6878acfba4bcff3f6914c16ffa8 100644 (file)
@@ -2,18 +2,24 @@
 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
diff --git a/as/sample/call_inl0.casl b/as/sample/call_inl0.casl
new file mode 100644 (file)
index 0000000..fd16c85
--- /dev/null
@@ -0,0 +1,7 @@
+;;; casl2 call_inl0.casl ../inl.casl
+MAIN    START
+        CALL    INL             ; GR1に数値、GR2に文字列の長さ
+        ST      GR1,A
+        RET
+A       DS      1
+        END
diff --git a/as/sample/call_inl1.casl b/as/sample/call_inl1.casl
new file mode 100644 (file)
index 0000000..be507a7
--- /dev/null
@@ -0,0 +1,21 @@
+;;; 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
diff --git a/as/sample/call_mull1.casl b/as/sample/call_mull1.casl
new file mode 100644 (file)
index 0000000..46f9ac8
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN    START
+        LAD     GR1,9999
+        LAD     GR2,10
+        CALL    MULL            ; GR3 <- GR1 * GR2
+        END
index b2aaf05172b25b42048c5084f411947bc0d4c438..be444fd867832a290063de827444dbdf2db5ce61 100644 (file)
@@ -1,4 +1,4 @@
-;; casl2 outi_call.casl outi.casl
+;; casl2 call_outa.casl ../outa.casl
 MAIN    START
         LAD     GR1,VAL
         LAD     GR2,0
index 5e13109698480ed90366e092ae26e22d38c8572d..1969577594fe5eb140c715013835a339783cb674 100644 (file)
@@ -7,15 +7,16 @@
 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
index dec0b9d2974845e47622bfba14ef3c4556de8a2e..73a4fb5753129912f5f85c805db321b92bc28e9c 100644 (file)
@@ -1,22 +1,20 @@
 ;;; 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
@@ -25,31 +23,36 @@ STR2L   START
 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
diff --git a/test/Define.mk b/test/Define.mk
new file mode 100644 (file)
index 0000000..74f4c33
--- /dev/null
@@ -0,0 +1,169 @@
+# 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
diff --git a/test/Makefile b/test/Makefile
new file mode 100644 (file)
index 0000000..d143c7e
--- /dev/null
@@ -0,0 +1,155 @@
+# 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 $@)
diff --git a/test/Test.mk b/test/Test.mk
new file mode 100644 (file)
index 0000000..e8a3135
--- /dev/null
@@ -0,0 +1,168 @@
+# 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,$^,$@)
diff --git a/test/inl1/0.txt b/test/inl1/0.txt
new file mode 100644 (file)
index 0000000..624f9a8
--- /dev/null
@@ -0,0 +1,11 @@
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
diff --git a/test/inl1/1.txt b/test/inl1/1.txt
new file mode 100644 (file)
index 0000000..624f9a8
--- /dev/null
@@ -0,0 +1,11 @@
+0
+1
+32768
+65535
+Over 65535
+Over 65535
+Over 65535
+Not a number
+Not a number
+Not a number
+Over 65535
diff --git a/test/inl1/Makefile b/test/inl1/Makefile
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/test/inl1/cmd b/test/inl1/cmd
new file mode 100755 (executable)
index 0000000..c367412
--- /dev/null
@@ -0,0 +1 @@
+casl2 -M640 ../../as/sample/call_inl.casl ../../as/inl.casl ../../as/outl.casl <input.txt
diff --git a/test/inl1/detail.log b/test/inl1/detail.log
new file mode 100644 (file)
index 0000000..f478b05
--- /dev/null
@@ -0,0 +1,41 @@
+== 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
+----------------------------------------------------------------------
+
diff --git a/test/inl1/input.txt b/test/inl1/input.txt
new file mode 100644 (file)
index 0000000..498d8e2
--- /dev/null
@@ -0,0 +1,11 @@
+0
+1
+32768
+65535
+65536
+90000
+123456
+-1
+a
+123a
+123456a
diff --git a/test/inl1/summary.log b/test/inl1/summary.log
new file mode 100644 (file)
index 0000000..ef8ca82
--- /dev/null
@@ -0,0 +1,2 @@
+inl1: Test Success 2026-06-18 18:07:57
+Details in /Users/kazubito/2026_06/casl2lib/test/inl1/detail.log