Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cobj/pplex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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の実装
*
Expand Down Expand Up @@ -767,6 +806,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;
Expand Down
3 changes: 2 additions & 1 deletion tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
3 changes: 2 additions & 1 deletion tests/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
1 change: 1 addition & 0 deletions tests/misc.at
Original file line number Diff line number Diff line change
Expand Up @@ -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])
219 changes: 219 additions & 0 deletions tests/misc.src/fix-subtract.at
Original file line number Diff line number Diff line change
@@ -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