From 316e286dfaf06e7d01dc6dfbea52220fb7f58201 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 8 Nov 2024 06:50:32 +0000 Subject: [PATCH 1/3] fix: subtarct of pic 9 --- cobj/pplex.c | 6 +++--- .../opensourcecobol/libcobj/data/CobolNumericField.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cobj/pplex.c b/cobj/pplex.c index bffa4e5a..3be62fbb 100644 --- a/cobj/pplex.c +++ b/cobj/pplex.c @@ -379,7 +379,7 @@ typedef unsigned int flex_uint32_t; * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ -#define YY_START (((yy_start) - 1) / 2) +#define YY_START (((yy_start)-1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) @@ -2632,8 +2632,8 @@ YY_DECL { default: YY_FATAL_ERROR("fatal flex scanner internal error--no action found"); } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ + } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java index 9f9ec0c0..2746621d 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java @@ -767,6 +767,9 @@ private static int displaySubInt(CobolDataStorage data, int firstDataIndex, int /* perform subtraction */ byte val = data.getByte(sp); + if (val >= 0x70) { + val -= 0x40; + } data.setByte(sp, (byte) (val - (i + carry))); if (val - (i + carry) < '0') { carry = 1; From d9e5c9e7636b38dbc46efcea31f4be1565163260 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 8 Nov 2024 08:07:13 +0000 Subject: [PATCH 2/3] [Add]: add tests --- tests/Makefile.am | 3 +- tests/Makefile.in | 3 +- tests/misc.at | 1 + tests/misc.src/fix-subtract.at | 219 +++++++++++++++++++++++++++++++++ 4 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 tests/misc.src/fix-subtract.at diff --git a/tests/Makefile.am b/tests/Makefile.am index d175cf00..484aee23 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -222,7 +222,8 @@ misc_DEPENDENCIES = \ misc.src/fserial-variable.at \ misc.src/file-handler-japanese.at \ misc.src/perform-until-div.at \ - misc.src/search-occurs-depending.at + misc.src/search-occurs-depending.at \ + misc.src/fix-subtract.at EXTRA_DIST = $(srcdir)/package.m4 \ $(TESTS) \ diff --git a/tests/Makefile.in b/tests/Makefile.in index c8d0c140..3ed18bdd 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -761,7 +761,8 @@ misc_DEPENDENCIES = \ misc.src/fserial-variable.at \ misc.src/file-handler-japanese.at \ misc.src/perform-until-div.at \ - misc.src/search-occurs-depending.at + misc.src/search-occurs-depending.at \ + misc.src/fix-subtract.at EXTRA_DIST = $(srcdir)/package.m4 \ $(TESTS) \ diff --git a/tests/misc.at b/tests/misc.at index d3a4da6e..93fa8085 100644 --- a/tests/misc.at +++ b/tests/misc.at @@ -52,3 +52,4 @@ m4_include([fserial-variable.at]) m4_include([file-handler-japanese.at]) m4_include([perform-until-div.at]) m4_include([search-occurs-depending.at]) +m4_include([fix-subtract.at]) diff --git a/tests/misc.src/fix-subtract.at b/tests/misc.src/fix-subtract.at new file mode 100644 index 00000000..a1937fde --- /dev/null +++ b/tests/misc.src/fix-subtract.at @@ -0,0 +1,219 @@ +AT_SETUP([fix subtract]) + +AT_DATA([prog.cbl], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. prog. + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 NUM-REC. + 03 NUM-VAL PIC S9(2). + + PROCEDURE DIVISION. + MOVE -2 TO NUM-VAL. + ADD 1 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -2 TO NUM-VAL. + ADD 3 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -2 TO NUM-VAL. + SUBTRACT -1 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -2 TO NUM-VAL. + SUBTRACT -3 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD 4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD 5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD 6 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD -4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD -5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + ADD -6 TO NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** + MOVE -5 TO NUM-VAL. + SUBTRACT 4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + SUBTRACT 5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + SUBTRACT 6 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + SUBTRACT -4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + SUBTRACT -5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE -5 TO NUM-VAL. + SUBTRACT -6 FROM NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** + MOVE 0 TO NUM-VAL. + ADD 4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + ADD 5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + ADD 6 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + ADD -4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + ADD -5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + ADD -6 TO NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** + MOVE 0 TO NUM-VAL. + SUBTRACT 4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + SUBTRACT 5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + SUBTRACT 6 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + SUBTRACT -4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + SUBTRACT -5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 0 TO NUM-VAL. + SUBTRACT -6 FROM NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** + MOVE 5 TO NUM-VAL. + ADD 4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + ADD 5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + ADD 6 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + ADD -4 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + ADD -5 TO NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + ADD -6 TO NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** + MOVE 5 TO NUM-VAL. + SUBTRACT 4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + SUBTRACT 5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + SUBTRACT 6 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + SUBTRACT -4 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + SUBTRACT -5 FROM NUM-VAL. + DISPLAY NUM-VAL. + + MOVE 5 TO NUM-VAL. + SUBTRACT -6 FROM NUM-VAL. + DISPLAY NUM-VAL. + ****************************************************************** +]) + +AT_CHECK([${COBJ} prog.cbl]) +AT_CHECK([java prog], [0], +[-01 ++01 +-01 ++01 +-01 +-00 ++01 +-09 +-10 +-11 +-09 +-10 +-11 +-01 +-00 ++01 ++04 ++05 ++06 +-04 +-05 +-06 +-04 +-05 +-06 ++04 ++05 ++06 ++09 ++10 ++11 ++01 ++00 +-01 ++01 ++00 +-01 ++09 ++10 ++11 +]) + +AT_CLEANUP + From 82879c12c89e72c125efe31f2a0a98e860279445 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Sun, 10 Nov 2024 18:47:59 +0000 Subject: [PATCH 3/3] fix: convert negative 0 to positive 0 --- .../libcobj/data/CobolNumericField.java | 39 +++++++++++++++++++ tests/misc.src/fix-subtract.at | 4 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java index 2746621d..8cefebec 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java @@ -691,10 +691,49 @@ private int addInt(int in, int opt) { } } + if (this.isPositiveZeroOrNegativeZero()) { + sign = 1; + } + this.putSign(sign); return 0; } + /** + * このフィールドが正のゼロまたは負のゼロであるかどうかを判定する + */ + private boolean isPositiveZeroOrNegativeZero() { + int signIndex; + CobolFieldAttribute attr = this.getAttribute(); + if (attr.isFlagHaveSign() && !attr.isFlagSignSeparate()) { + if (attr.isFlagSignLeading()) { + signIndex = 0; + } else { + signIndex = this.getSize() - 1; + } + } else { + signIndex = -1000; + } + + CobolDataStorage data = this.getDataStorage(); + int size = this.getFieldSize(); + int firstDataIndex = this.getFirstDataIndex(); + for (int i = 0; i < size; ++i) { + int index = firstDataIndex + i; + byte value = data.getByte(index); + if (index == signIndex) { + if (value != 0x30 && value != 0x70) { + return false; + } + } else { + if (value != 0x30) { + return false; + } + } + } + return true; + } + /** * libcob/numeric.cのdisplay_add_intの実装 * diff --git a/tests/misc.src/fix-subtract.at b/tests/misc.src/fix-subtract.at index a1937fde..3824dfd9 100644 --- a/tests/misc.src/fix-subtract.at +++ b/tests/misc.src/fix-subtract.at @@ -178,7 +178,7 @@ AT_CHECK([java prog], [0], -01 +01 -01 --00 ++00 +01 -09 -10 @@ -187,7 +187,7 @@ AT_CHECK([java prog], [0], -10 -11 -01 --00 ++00 +01 +04 +05