Skip to content

Commit 8f2e0b6

Browse files
Fix add statements and subtract statements (#546)
1 parent 9b756ac commit 8f2e0b6

File tree

6 files changed

+269
-5
lines changed

6 files changed

+269
-5
lines changed

cobj/pplex.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ typedef unsigned int flex_uint32_t;
379379
* to BEGIN to return to the state. The YYSTATE alias is for lex
380380
* compatibility.
381381
*/
382-
#define YY_START (((yy_start) - 1) / 2)
382+
#define YY_START (((yy_start)-1) / 2)
383383
#define YYSTATE YY_START
384384
/* Action number for EOF rule of a given start state. */
385385
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
@@ -2632,8 +2632,8 @@ YY_DECL {
26322632
default:
26332633
YY_FATAL_ERROR("fatal flex scanner internal error--no action found");
26342634
} /* end of action switch */
2635-
} /* end of scanning one token */
2636-
} /* end of user's declarations */
2635+
} /* end of scanning one token */
2636+
} /* end of user's declarations */
26372637
} /* end of yylex */
26382638

26392639
/* yy_get_next_buffer - try to read in a new buffer

libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/data/CobolNumericField.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,10 +691,49 @@ private int addInt(int in, int opt) {
691691
}
692692
}
693693

694+
if (this.isPositiveZeroOrNegativeZero()) {
695+
sign = 1;
696+
}
697+
694698
this.putSign(sign);
695699
return 0;
696700
}
697701

702+
/**
703+
* このフィールドが正のゼロまたは負のゼロであるかどうかを判定する
704+
*/
705+
private boolean isPositiveZeroOrNegativeZero() {
706+
int signIndex;
707+
CobolFieldAttribute attr = this.getAttribute();
708+
if (attr.isFlagHaveSign() && !attr.isFlagSignSeparate()) {
709+
if (attr.isFlagSignLeading()) {
710+
signIndex = 0;
711+
} else {
712+
signIndex = this.getSize() - 1;
713+
}
714+
} else {
715+
signIndex = -1000;
716+
}
717+
718+
CobolDataStorage data = this.getDataStorage();
719+
int size = this.getFieldSize();
720+
int firstDataIndex = this.getFirstDataIndex();
721+
for (int i = 0; i < size; ++i) {
722+
int index = firstDataIndex + i;
723+
byte value = data.getByte(index);
724+
if (index == signIndex) {
725+
if (value != 0x30 && value != 0x70) {
726+
return false;
727+
}
728+
} else {
729+
if (value != 0x30) {
730+
return false;
731+
}
732+
}
733+
}
734+
return true;
735+
}
736+
698737
/**
699738
* libcob/numeric.cのdisplay_add_intの実装
700739
*
@@ -767,6 +806,9 @@ private static int displaySubInt(CobolDataStorage data, int firstDataIndex, int
767806

768807
/* perform subtraction */
769808
byte val = data.getByte(sp);
809+
if (val >= 0x70) {
810+
val -= 0x40;
811+
}
770812
data.setByte(sp, (byte) (val - (i + carry)));
771813
if (val - (i + carry) < '0') {
772814
carry = 1;

tests/Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ misc_DEPENDENCIES = \
222222
misc.src/fserial-variable.at \
223223
misc.src/file-handler-japanese.at \
224224
misc.src/perform-until-div.at \
225-
misc.src/search-occurs-depending.at
225+
misc.src/search-occurs-depending.at \
226+
misc.src/fix-subtract.at
226227

227228
EXTRA_DIST = $(srcdir)/package.m4 \
228229
$(TESTS) \

tests/Makefile.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,8 @@ misc_DEPENDENCIES = \
761761
misc.src/fserial-variable.at \
762762
misc.src/file-handler-japanese.at \
763763
misc.src/perform-until-div.at \
764-
misc.src/search-occurs-depending.at
764+
misc.src/search-occurs-depending.at \
765+
misc.src/fix-subtract.at
765766

766767
EXTRA_DIST = $(srcdir)/package.m4 \
767768
$(TESTS) \

tests/misc.at

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ m4_include([fserial-variable.at])
5252
m4_include([file-handler-japanese.at])
5353
m4_include([perform-until-div.at])
5454
m4_include([search-occurs-depending.at])
55+
m4_include([fix-subtract.at])

tests/misc.src/fix-subtract.at

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
AT_SETUP([fix subtract])
2+
3+
AT_DATA([prog.cbl], [
4+
IDENTIFICATION DIVISION.
5+
PROGRAM-ID. prog.
6+
DATA DIVISION.
7+
WORKING-STORAGE SECTION.
8+
01 NUM-REC.
9+
03 NUM-VAL PIC S9(2).
10+
11+
PROCEDURE DIVISION.
12+
MOVE -2 TO NUM-VAL.
13+
ADD 1 TO NUM-VAL.
14+
DISPLAY NUM-VAL.
15+
16+
MOVE -2 TO NUM-VAL.
17+
ADD 3 TO NUM-VAL.
18+
DISPLAY NUM-VAL.
19+
20+
MOVE -2 TO NUM-VAL.
21+
SUBTRACT -1 FROM NUM-VAL.
22+
DISPLAY NUM-VAL.
23+
24+
MOVE -2 TO NUM-VAL.
25+
SUBTRACT -3 FROM NUM-VAL.
26+
DISPLAY NUM-VAL.
27+
28+
MOVE -5 TO NUM-VAL.
29+
ADD 4 TO NUM-VAL.
30+
DISPLAY NUM-VAL.
31+
32+
MOVE -5 TO NUM-VAL.
33+
ADD 5 TO NUM-VAL.
34+
DISPLAY NUM-VAL.
35+
36+
MOVE -5 TO NUM-VAL.
37+
ADD 6 TO NUM-VAL.
38+
DISPLAY NUM-VAL.
39+
40+
MOVE -5 TO NUM-VAL.
41+
ADD -4 TO NUM-VAL.
42+
DISPLAY NUM-VAL.
43+
44+
MOVE -5 TO NUM-VAL.
45+
ADD -5 TO NUM-VAL.
46+
DISPLAY NUM-VAL.
47+
48+
MOVE -5 TO NUM-VAL.
49+
ADD -6 TO NUM-VAL.
50+
DISPLAY NUM-VAL.
51+
******************************************************************
52+
MOVE -5 TO NUM-VAL.
53+
SUBTRACT 4 FROM NUM-VAL.
54+
DISPLAY NUM-VAL.
55+
56+
MOVE -5 TO NUM-VAL.
57+
SUBTRACT 5 FROM NUM-VAL.
58+
DISPLAY NUM-VAL.
59+
60+
MOVE -5 TO NUM-VAL.
61+
SUBTRACT 6 FROM NUM-VAL.
62+
DISPLAY NUM-VAL.
63+
64+
MOVE -5 TO NUM-VAL.
65+
SUBTRACT -4 FROM NUM-VAL.
66+
DISPLAY NUM-VAL.
67+
68+
MOVE -5 TO NUM-VAL.
69+
SUBTRACT -5 FROM NUM-VAL.
70+
DISPLAY NUM-VAL.
71+
72+
MOVE -5 TO NUM-VAL.
73+
SUBTRACT -6 FROM NUM-VAL.
74+
DISPLAY NUM-VAL.
75+
******************************************************************
76+
MOVE 0 TO NUM-VAL.
77+
ADD 4 TO NUM-VAL.
78+
DISPLAY NUM-VAL.
79+
80+
MOVE 0 TO NUM-VAL.
81+
ADD 5 TO NUM-VAL.
82+
DISPLAY NUM-VAL.
83+
84+
MOVE 0 TO NUM-VAL.
85+
ADD 6 TO NUM-VAL.
86+
DISPLAY NUM-VAL.
87+
88+
MOVE 0 TO NUM-VAL.
89+
ADD -4 TO NUM-VAL.
90+
DISPLAY NUM-VAL.
91+
92+
MOVE 0 TO NUM-VAL.
93+
ADD -5 TO NUM-VAL.
94+
DISPLAY NUM-VAL.
95+
96+
MOVE 0 TO NUM-VAL.
97+
ADD -6 TO NUM-VAL.
98+
DISPLAY NUM-VAL.
99+
******************************************************************
100+
MOVE 0 TO NUM-VAL.
101+
SUBTRACT 4 FROM NUM-VAL.
102+
DISPLAY NUM-VAL.
103+
104+
MOVE 0 TO NUM-VAL.
105+
SUBTRACT 5 FROM NUM-VAL.
106+
DISPLAY NUM-VAL.
107+
108+
MOVE 0 TO NUM-VAL.
109+
SUBTRACT 6 FROM NUM-VAL.
110+
DISPLAY NUM-VAL.
111+
112+
MOVE 0 TO NUM-VAL.
113+
SUBTRACT -4 FROM NUM-VAL.
114+
DISPLAY NUM-VAL.
115+
116+
MOVE 0 TO NUM-VAL.
117+
SUBTRACT -5 FROM NUM-VAL.
118+
DISPLAY NUM-VAL.
119+
120+
MOVE 0 TO NUM-VAL.
121+
SUBTRACT -6 FROM NUM-VAL.
122+
DISPLAY NUM-VAL.
123+
******************************************************************
124+
MOVE 5 TO NUM-VAL.
125+
ADD 4 TO NUM-VAL.
126+
DISPLAY NUM-VAL.
127+
128+
MOVE 5 TO NUM-VAL.
129+
ADD 5 TO NUM-VAL.
130+
DISPLAY NUM-VAL.
131+
132+
MOVE 5 TO NUM-VAL.
133+
ADD 6 TO NUM-VAL.
134+
DISPLAY NUM-VAL.
135+
136+
MOVE 5 TO NUM-VAL.
137+
ADD -4 TO NUM-VAL.
138+
DISPLAY NUM-VAL.
139+
140+
MOVE 5 TO NUM-VAL.
141+
ADD -5 TO NUM-VAL.
142+
DISPLAY NUM-VAL.
143+
144+
MOVE 5 TO NUM-VAL.
145+
ADD -6 TO NUM-VAL.
146+
DISPLAY NUM-VAL.
147+
******************************************************************
148+
MOVE 5 TO NUM-VAL.
149+
SUBTRACT 4 FROM NUM-VAL.
150+
DISPLAY NUM-VAL.
151+
152+
MOVE 5 TO NUM-VAL.
153+
SUBTRACT 5 FROM NUM-VAL.
154+
DISPLAY NUM-VAL.
155+
156+
MOVE 5 TO NUM-VAL.
157+
SUBTRACT 6 FROM NUM-VAL.
158+
DISPLAY NUM-VAL.
159+
160+
MOVE 5 TO NUM-VAL.
161+
SUBTRACT -4 FROM NUM-VAL.
162+
DISPLAY NUM-VAL.
163+
164+
MOVE 5 TO NUM-VAL.
165+
SUBTRACT -5 FROM NUM-VAL.
166+
DISPLAY NUM-VAL.
167+
168+
MOVE 5 TO NUM-VAL.
169+
SUBTRACT -6 FROM NUM-VAL.
170+
DISPLAY NUM-VAL.
171+
******************************************************************
172+
])
173+
174+
AT_CHECK([${COBJ} prog.cbl])
175+
AT_CHECK([java prog], [0],
176+
[-01
177+
+01
178+
-01
179+
+01
180+
-01
181+
+00
182+
+01
183+
-09
184+
-10
185+
-11
186+
-09
187+
-10
188+
-11
189+
-01
190+
+00
191+
+01
192+
+04
193+
+05
194+
+06
195+
-04
196+
-05
197+
-06
198+
-04
199+
-05
200+
-06
201+
+04
202+
+05
203+
+06
204+
+09
205+
+10
206+
+11
207+
+01
208+
+00
209+
-01
210+
+01
211+
+00
212+
-01
213+
+09
214+
+10
215+
+11
216+
])
217+
218+
AT_CLEANUP
219+

0 commit comments

Comments
 (0)