@@ -147,6 +147,18 @@ Cookie IONAME(BeginInternalFormattedInput)(const char *internal,
147
147
format, formatLength, scratchArea, scratchBytes, sourceFile, sourceLine);
148
148
}
149
149
150
+ static Cookie NoopUnit (const Terminator &terminator, int unitNumber,
151
+ enum Iostat iostat = IostatOk) {
152
+ Cookie cookie{&New<NoopStatementState>{terminator}(
153
+ terminator.sourceFileName (), terminator.sourceLine (), unitNumber)
154
+ .release ()
155
+ ->ioStatementState ()};
156
+ if (iostat != IostatOk) {
157
+ cookie->GetIoErrorHandler ().SetPendingError (iostat);
158
+ }
159
+ return cookie;
160
+ }
161
+
150
162
static ExternalFileUnit *GetOrCreateUnit (int unitNumber, Direction direction,
151
163
std::optional<bool > isUnformatted, const Terminator &terminator,
152
164
Cookie &errorCookie) {
@@ -156,11 +168,7 @@ static ExternalFileUnit *GetOrCreateUnit(int unitNumber, Direction direction,
156
168
errorCookie = nullptr ;
157
169
return unit;
158
170
} else {
159
- errorCookie = &New<NoopStatementState>{terminator}(
160
- terminator.sourceFileName (), terminator.sourceLine (), unitNumber)
161
- .release ()
162
- ->ioStatementState ();
163
- errorCookie->GetIoErrorHandler ().SetPendingError (IostatBadUnitNumber);
171
+ errorCookie = NoopUnit (terminator, unitNumber, IostatBadUnitNumber);
164
172
return nullptr ;
165
173
}
166
174
}
@@ -358,12 +366,7 @@ Cookie IONAME(BeginOpenUnit)( // OPEN(without NEWUNIT=)
358
366
return &unit->BeginIoStatement <OpenStatementState>(
359
367
*unit, wasExtant, sourceFile, sourceLine);
360
368
} else {
361
- auto &io{
362
- New<NoopStatementState>{terminator}(sourceFile, sourceLine, unitNumber)
363
- .release ()
364
- ->ioStatementState ()};
365
- io.GetIoErrorHandler ().SetPendingError (IostatBadUnitNumber);
366
- return &io;
369
+ return NoopUnit (terminator, unitNumber, IostatBadUnitNumber);
367
370
}
368
371
}
369
372
@@ -378,7 +381,6 @@ Cookie IONAME(BeginOpenNewUnit)( // OPEN(NEWUNIT=j)
378
381
379
382
Cookie IONAME (BeginWait)(ExternalUnit unitNumber, AsynchronousId id,
380
383
const char *sourceFile, int sourceLine) {
381
- Terminator terminator{sourceFile, sourceLine};
382
384
if (ExternalFileUnit * unit{ExternalFileUnit::LookUp (unitNumber)}) {
383
385
if (unit->Wait (id)) {
384
386
return &unit->BeginIoStatement <ExternalMiscIoStatementState>(
@@ -388,14 +390,9 @@ Cookie IONAME(BeginWait)(ExternalUnit unitNumber, AsynchronousId id,
388
390
IostatBadWaitId, unit, sourceFile, sourceLine);
389
391
}
390
392
} else {
391
- auto &io{
392
- New<NoopStatementState>{terminator}(sourceFile, sourceLine, unitNumber)
393
- .release ()
394
- ->ioStatementState ()};
395
- if (id != 0 ) {
396
- io.GetIoErrorHandler ().SetPendingError (IostatBadWaitUnit);
397
- }
398
- return &io;
393
+ Terminator terminator{sourceFile, sourceLine};
394
+ return NoopUnit (
395
+ terminator, unitNumber, id == 0 ? IostatOk : IostatBadWaitUnit);
399
396
}
400
397
}
401
398
Cookie IONAME (BeginWaitAll)(
@@ -410,10 +407,8 @@ Cookie IONAME(BeginClose)(
410
407
*unit, sourceFile, sourceLine);
411
408
} else {
412
409
// CLOSE(UNIT=bad unit) is just a no-op
413
- Terminator oom{sourceFile, sourceLine};
414
- return &New<NoopStatementState>{oom}(sourceFile, sourceLine, unitNumber)
415
- .release ()
416
- ->ioStatementState ();
410
+ Terminator terminator{sourceFile, sourceLine};
411
+ return NoopUnit (terminator, unitNumber);
417
412
}
418
413
}
419
414
@@ -423,11 +418,10 @@ Cookie IONAME(BeginFlush)(
423
418
return &unit->BeginIoStatement <ExternalMiscIoStatementState>(
424
419
*unit, ExternalMiscIoStatementState::Flush, sourceFile, sourceLine);
425
420
} else {
426
- // FLUSH(UNIT=unknown) is a no-op
427
- Terminator oom{sourceFile, sourceLine};
428
- return &New<NoopStatementState>{oom}(sourceFile, sourceLine, unitNumber)
429
- .release ()
430
- ->ioStatementState ();
421
+ // FLUSH(UNIT=bad unit) is an error; an unconnected unit is a no-op
422
+ Terminator terminator{sourceFile, sourceLine};
423
+ return NoopUnit (terminator, unitNumber,
424
+ unitNumber >= 0 ? IostatOk : IostatBadFlushUnit);
431
425
}
432
426
}
433
427
@@ -438,12 +432,7 @@ Cookie IONAME(BeginBackspace)(
438
432
return &unit->BeginIoStatement <ExternalMiscIoStatementState>(
439
433
*unit, ExternalMiscIoStatementState::Backspace, sourceFile, sourceLine);
440
434
} else {
441
- auto &io{
442
- New<NoopStatementState>{terminator}(sourceFile, sourceLine, unitNumber)
443
- .release ()
444
- ->ioStatementState ()};
445
- io.GetIoErrorHandler ().SetPendingError (IostatBadBackspaceUnit);
446
- return &io;
435
+ return NoopUnit (terminator, unitNumber, IostatBadBackspaceUnit);
447
436
}
448
437
}
449
438
0 commit comments