-
Notifications
You must be signed in to change notification settings - Fork 0
/
cs05a.cbl
181 lines (153 loc) · 5.89 KB
/
cs05a.cbl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
ID Division.
*
* Copyright (C) 2021 Craig Schneiderwent. All rights reserved.
*
* I accept no liability for damages of any kind resulting
* from the use of this software. Use at your own risk.
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*
*
Program-ID. cs05a.
Environment Division.
Input-Output Section.
File-Control.
Select INPT-DATA Assign Keyboard.
Data Division.
File Section.
FD INPT-DATA.
01 INPT-DATA-REC-MAX PIC X(024).
Working-Storage Section.
01 CONSTANTS.
05 MYNAME PIC X(008) VALUE 'cs05a'.
01 WORK-AREAS.
05 WS-REC-COUNT PIC 9(008) COMP VALUE 0.
05 X1 PIC 9(009) COMP VALUE 0.
05 Y1 PIC 9(009) COMP VALUE 0.
05 X2 PIC 9(009) COMP VALUE 0.
05 Y2 PIC 9(009) COMP VALUE 0.
05 OVERLAP-COUNT PIC 9(008) COMP VALUE 0.
05 CURR-AIM PIC 9(008) COMP VALUE 0.
05 CURR-PRODUCT PIC 9(016) COMP VALUE 0.
05 OPERATION-ARG PIC 9(008) COMP VALUE 0.
05 PROCESS-TYPE PIC X(004) VALUE LOW-VALUES.
05 COORD-1 PIC X(008) VALUE SPACES.
05 COORD-2 PIC X(008) VALUE SPACES.
05 COORD-X1 PIC X(004) VALUE SPACES.
05 COORD-Y1 PIC X(004) VALUE SPACES.
05 COORD-X2 PIC X(004) VALUE SPACES.
05 COORD-Y2 PIC X(004) VALUE SPACES.
01 WS-INPT-DATA.
05 WS-INPT PIC X(024) VALUE SPACES.
01 SWITCHES.
05 INPT-DATA-EOF-SW PIC X(001) VALUE 'N'.
88 INPT-DATA-EOF VALUE 'Y'.
05 PROCESS-SW PIC X(004) VALUE LOW-VALUES.
88 PROCESS-TEST VALUE 'TEST'.
01 THE-OCEAN-FLOOR.
05 Y-VAL OCCURS 1000 INDEXED Y-INDX1 Y-INDX2.
10 X-VAL OCCURS 1000 INDEXED X-INDX1 X-INDX2.
15 POINT PIC 9(004).
Procedure Division.
ACCEPT PROCESS-TYPE FROM COMMAND-LINE
MOVE FUNCTION UPPER-CASE(PROCESS-TYPE)
TO PROCESS-SW
IF PROCESS-TEST
READY TRACE
END-IF
INITIALIZE THE-OCEAN-FLOOR
OPEN INPUT INPT-DATA
PERFORM 8010-READ-INPT-DATA
PERFORM 1000-LOAD-INPUT
UNTIL INPT-DATA-EOF
CLOSE INPT-DATA
PERFORM 9010-DUMP-THE-OCEAN-FLOOR
PERFORM 2000-COUNT-INTERSECTIONS
DISPLAY MYNAME ' overlap count ' OVERLAP-COUNT
DISPLAY MYNAME ' records read ' WS-REC-COUNT
GOBACK.
1000-LOAD-INPUT.
UNSTRING WS-INPT
DELIMITED '->'
INTO COORD-1 COORD-2
END-UNSTRING
UNSTRING COORD-1
DELIMITED ','
INTO COORD-X1 COORD-Y1
END-UNSTRING
UNSTRING COORD-2
DELIMITED ','
INTO COORD-X2 COORD-Y2
END-UNSTRING
COMPUTE X1 = FUNCTION NUMVAL(COORD-X1) + 1
COMPUTE Y1 = FUNCTION NUMVAL(COORD-Y1) + 1
COMPUTE X2 = FUNCTION NUMVAL(COORD-X2) + 1
COMPUTE Y2 = FUNCTION NUMVAL(COORD-Y2) + 1
EVALUATE TRUE ALSO TRUE
WHEN X1 = X2 ALSO Y1 < Y2
SET X-INDX1 TO X1
PERFORM 1100-PLOT-THE-LINE
VARYING Y-INDX1 FROM Y1 BY 1
UNTIL Y-INDX1 > Y2
WHEN X1 = X2 ALSO Y1 > Y2
SET X-INDX1 TO X1
PERFORM 1100-PLOT-THE-LINE
VARYING Y-INDX1 FROM Y2 BY 1
UNTIL Y-INDX1 > Y1
WHEN Y1 = Y2 ALSO X1 < X2
SET Y-INDX1 TO Y1
PERFORM 1100-PLOT-THE-LINE
VARYING X-INDX1 FROM X1 BY 1
UNTIL X-INDX1 > X2
WHEN Y1 = Y2 ALSO X1 > X2
SET Y-INDX1 TO Y1
PERFORM 1100-PLOT-THE-LINE
VARYING X-INDX1 FROM X2 BY 1
UNTIL X-INDX1 > X1
WHEN OTHER
DISPLAY MYNAME ' ignoring ' WS-INPT
END-EVALUATE
PERFORM 8010-READ-INPT-DATA
.
1100-PLOT-THE-LINE.
ADD 1 TO POINT(Y-INDX1,X-INDX1)
.
2000-COUNT-INTERSECTIONS.
IF PROCESS-TEST
RESET TRACE
END-IF
PERFORM VARYING Y-INDX1 FROM 1 BY 1 UNTIL Y-INDX1 > 1000
AFTER X-INDX1 FROM 1 BY 1 UNTIL X-INDX1 > 1000
IF POINT(Y-INDX1,X-INDX1) > 1
ADD 1 TO OVERLAP-COUNT
END-IF
END-PERFORM
IF PROCESS-TEST
READY TRACE
END-IF
.
8010-READ-INPT-DATA.
INITIALIZE WS-INPT-DATA
READ INPT-DATA INTO WS-INPT-DATA
AT END SET INPT-DATA-EOF TO TRUE
NOT AT END
ADD 1 TO WS-REC-COUNT
END-READ
.
9010-DUMP-THE-OCEAN-FLOOR.
IF PROCESS-TEST
RESET TRACE
PERFORM VARYING Y-INDX1 FROM 1 BY 1
UNTIL Y-INDX1 > 10
DISPLAY MYNAME SPACE WITH NO ADVANCING
PERFORM VARYING X-INDX1 FROM 1 BY 1
UNTIL X-INDX1 > 10
DISPLAY POINT(Y-INDX1,X-INDX1) SPACE
WITH NO ADVANCING
END-PERFORM
DISPLAY SPACE
END-PERFORM
READY TRACE
END-IF
.