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 Int GoEast, GoSouth, ilow, imbloc, inbloc, ioff, ioffd, iupp,
71 joff, joffd, lcmt, lcmt00, lmbloc, lnbloc, low, mb, mblkd,
72 mblks, mbloc, nb, nblkd, nblks, nbloc, npq=0, pmb, qnb,
73 tmp1, tmp2, upp;
74
75
76
77
79
80
81
82 if( ( K <= 0 ) || ( mblks == 0 ) || ( nblks == 0 ) ) return;
83
84
85
86 ioff = *II;
87 joff = *JJ;
88
89
90
96
97
98
99
100
101 GoSouth = ( lcmt00 > iupp );
102 GoEast = ( lcmt00 < ilow );
103
104
105
106 if( !( GoSouth ) && !( GoEast ) )
107 {
108
109
110
111 if( lcmt00 >= 0 )
112 {
113 npq = ( ( tmp2 = ( tmp1 = imbloc - lcmt00 ) > 0 ? tmp1 : 0 ) <
114 inbloc ? tmp2 : inbloc );
115 if( K < npq )
116 {
117 tmp1 = lcmt00 + K;
118 *II += tmp1;
119 iupp = ( imbloc -= tmp1 ) - 1;
120 if( mblks == 1 ) lmbloc = imbloc;
121 *JJ += K;
122 ilow = 1 - ( inbloc -= K );
123 if( nblks == 1 ) lnbloc = inbloc;
124 lcmt00 = 0;
125 goto l_end;
126 }
127 }
128 else
129 {
130 npq = ( ( tmp2 = ( tmp1 = inbloc + lcmt00 ) > 0 ? tmp1 : 0 ) >
131 imbloc ? imbloc : tmp2 );
132 if( K < npq )
133 {
134 tmp1 = lcmt00 - K;
135 *JJ -= tmp1;
136 ilow = 1 - ( inbloc += tmp1 );
137 if( nblks == 1 ) lnbloc = inbloc;
138 *II += K;
139 iupp = ( imbloc -= K ) - 1;
140 if( mblks == 1 ) lmbloc = imbloc;
141 lcmt00 = 0;
142 goto l_end;
143 }
144 }
145 K -= npq;
146
147
148
149
150
151 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp-upp+pmb ) ) < ilow ) );
152
153
154
155 if( GoSouth ) *II += imbloc;
156 else *JJ += inbloc;
157 }
158
159 if( GoSouth )
160 {
161
162
163
164 lcmt00 -= iupp - upp + pmb; mblks--; ioff += imbloc;
165
166
167
168
169 while( mblks && ( lcmt00 > upp ) ) { lcmt00 -= pmb; mblks--; ioff += mb; }
170
171
172
173 if( mblks <= 0 ) goto l_end;
174
175
176
177
178
179
180 lcmt = lcmt00; mblkd = mblks; mbloc = mb; ioffd = ioff;
181
182 while( mblkd && ( lcmt >= ilow ) )
183 {
184
185
186
187 if( mblkd == 1 ) mbloc = lmbloc;
188
189 if( lcmt >= 0 )
190 {
191 npq = ( ( tmp2 = ( tmp1 = mbloc - lcmt ) > 0 ? tmp1 : 0 ) < inbloc ?
192 tmp2 : inbloc );
193 if( K < npq )
194 {
195 tmp1 = lcmt + K;
196 *II = ioffd + tmp1;
197 iupp = ( imbloc = mbloc - tmp1 ) - 1;
198 if( mblks == 1 ) lmbloc = imbloc;
199 *JJ = joff + K;
200 ilow = 1 - ( inbloc -= K );
201 if( nblks == 1 ) lnbloc = inbloc;
202 lcmt00 = 0;
203 goto l_end;
204 }
205 }
206 else
207 {
208 npq = ( ( tmp2 = ( tmp1 = inbloc + lcmt ) > 0 ? tmp1 : 0 ) > mbloc ?
209 mbloc : tmp2 );
210 if( K < npq )
211 {
212 tmp1 = lcmt - K;
213 *JJ = joff - tmp1;
214 ilow = 1 - ( inbloc += tmp1 );
215 if( nblks == 1 ) lnbloc = inbloc;
216 *II = ioffd + K;
217 iupp = ( imbloc = mbloc - K ) - 1;
218 if( mblks == 1 ) lmbloc = imbloc;
219 lcmt00 = 0;
220 goto l_end;
221 }
222 }
223
224
225
226 K -= npq;
227 lcmt00 = lcmt;
228 lcmt -= pmb;
229 mblks = mblkd--;
230 ioff = ioffd;
231 ioffd += mbloc;
232 }
233
234
235
236 lcmt00 += low - ilow + qnb; nblks--; joff += inbloc;
237
238
239
240 *II = ioff;
241 *JJ = joff;
242 }
243 else if( GoEast )
244 {
245
246
247
248 lcmt00 += low - ilow + qnb; nblks--; joff += inbloc;
249
250
251
252
253 while( nblks && ( lcmt00 < low ) ) { lcmt00 += qnb; nblks--; joff += nb; }
254
255
256
257 if( nblks <= 0 ) goto l_end;
258
259
260
261
262
263 lcmt = lcmt00; nblkd = nblks; nbloc = nb; joffd = joff;
264
265 while( nblkd && ( lcmt <= iupp ) )
266 {
267
268
269
270 if( nblkd == 1 ) nbloc = lnbloc;
271
272 if( lcmt >= 0 )
273 {
274 npq = ( ( tmp2 = ( tmp1 = imbloc - lcmt ) > 0 ? tmp1 : 0 ) < nbloc ?
275 tmp2 : nbloc );
276 if( K < npq )
277 {
278 tmp1 = lcmt + K;
279 *II = ioff + tmp1;
280 iupp = ( imbloc -= tmp1 ) - 1;
281 if( mblks == 1 ) lmbloc = imbloc;
282 *JJ = joffd + K;
283 ilow = 1 - ( inbloc = nbloc - K );
284 if( nblks == 1 ) lnbloc = inbloc;
285 lcmt00 = 0;
286 goto l_end;
287 }
288 }
289 else
290 {
291 npq = ( ( tmp2 = ( tmp1 = nbloc + lcmt ) > 0 ? tmp1 : 0 ) > imbloc ?
292 imbloc : tmp2 );
293 if( K < npq )
294 {
295 tmp1 = lcmt - K;
296 *JJ = joffd - tmp1;
297 ilow = 1 - ( inbloc = nbloc + tmp1 );
298 if( nblks == 1 ) lnbloc = inbloc;
299 *II = ioff + K;
300 iupp = ( imbloc -= K ) - 1;
301 if( mblks == 1 ) lmbloc = imbloc;
302 lcmt00 = 0;
303 goto l_end;
304 }
305 }
306
307
308
309 K -= npq;
310 lcmt00 = lcmt;
311 lcmt += qnb;
312 nblks = nblkd--;
313 joff = joffd;
314 joffd += nbloc;
315 }
316
317
318
319 lcmt00 -= iupp - upp + pmb; mblks--; ioff += imbloc;
320
321
322
323 *II = ioff;
324 *JJ = joff;
325 }
326
327
328
329 nbloc = nb;
330
331 while( nblks )
332 {
333 if( nblks == 1 ) nbloc = lnbloc;
334
335
336
337
338 while( mblks && ( lcmt00 > upp ) ) { lcmt00 -= pmb; mblks--; ioff += mb; }
339
340
341
342 if( mblks <= 0 ) goto l_end;
343
344
345
346
347
348
349 lcmt = lcmt00; mblkd = mblks; mbloc = mb; ioffd = ioff;
350
351 while( mblkd && ( lcmt >= low ) )
352 {
353
354
355
356 if( mblkd == 1 ) mbloc = lmbloc;
357
358 if( lcmt >= 0 )
359 {
360 npq = ( ( tmp2 = ( tmp1 = mbloc - lcmt ) > 0 ? tmp1 : 0 ) < nbloc ?
361 tmp2 : nbloc );
362 if( K < npq )
363 {
364 tmp1 = lcmt + K;
365 *II = ioffd + tmp1;
366 iupp = ( imbloc = mbloc - tmp1 ) - 1;
367 if( mblks == 1 ) lmbloc = imbloc;
368 *JJ = joff + K;
369 ilow = 1 - ( inbloc = nbloc - K );
370 if( nblks == 1 ) lnbloc = inbloc;
371 lcmt00 = 0;
372 goto l_end;
373 }
374 }
375 else
376 {
377 npq = ( ( tmp2 = ( tmp1 = nbloc + lcmt ) > 0 ? tmp1 : 0 ) > mbloc ?
378 mbloc : tmp2 );
379 if( K < npq )
380 {
381 tmp1 = lcmt - K;
382 *JJ = joff - tmp1;
383 ilow = 1 - ( inbloc = nbloc + tmp1 );
384 if( nblks == 1 ) lnbloc = inbloc;
385 *II = ioffd + K;
386 iupp = ( imbloc = mbloc - K ) - 1;
387 if( mblks == 1 ) lmbloc = imbloc;
388 lcmt00 = 0;
389 goto l_end;
390 }
391 }
392
393
394
395 K -= npq;
396 lcmt00 = lcmt;
397 lcmt -= pmb;
398 mblks = mblkd--;
399 ioff = ioffd;
400 ioffd += mbloc;
401 }
402
403
404
405
406 lcmt00 += qnb; nblks--; joff += nbloc;
407
408
409
410 *II = ioff;
411 *JJ = joff;
412 }
413
414l_end:
415
416
417
419 VM->
mp = ( mblks >= 2 ? imbloc + ( mblks - 2 ) * mb + lmbloc :
420 ( mblks == 1 ? imbloc : 0 ) );
422 VM->
nq = ( nblks >= 2 ? inbloc + ( nblks - 2 ) * nb + lnbloc :
423 ( nblks == 1 ? inbloc : 0 ) );
425
426
427
428}