@@ -279,7 +279,7 @@ void ExternalFileUnit::FlushAll(IoErrorHandler &handler) {
279
279
}
280
280
}
281
281
282
- static void SwapEndianness (
282
+ static inline void SwapEndianness (
283
283
char *data, std::size_t bytes, std::size_t elementBytes) {
284
284
if (elementBytes > 1 ) {
285
285
auto half{elementBytes >> 1 };
@@ -733,7 +733,7 @@ void ExternalFileUnit::BeginSequentialVariableUnformattedInputRecord(
733
733
" record #%jd (file offset %jd): truncated record header" ;
734
734
}
735
735
} else {
736
- std::memcpy (& header, Frame () + recordOffsetInFrame_, sizeof header );
736
+ header = ReadHeaderOrFooter ( recordOffsetInFrame_);
737
737
recordLength = sizeof header + header; // does not include footer
738
738
need = recordOffsetInFrame_ + *recordLength + sizeof footer;
739
739
got = ReadFrame (frameOffsetInFile_, need, handler);
@@ -742,8 +742,7 @@ void ExternalFileUnit::BeginSequentialVariableUnformattedInputRecord(
742
742
" record #%jd (file offset %jd): hit EOF reading record with "
743
743
" length %jd bytes" ;
744
744
} else {
745
- std::memcpy (&footer, Frame () + recordOffsetInFrame_ + *recordLength,
746
- sizeof footer);
745
+ footer = ReadHeaderOrFooter (recordOffsetInFrame_ + *recordLength);
747
746
if (footer != header) {
748
747
error = " Unformatted variable-length sequential file input failed at "
749
748
" record #%jd (file offset %jd): record header has length %jd "
@@ -800,7 +799,7 @@ void ExternalFileUnit::BackspaceFixedRecord(IoErrorHandler &handler) {
800
799
801
800
void ExternalFileUnit::BackspaceVariableUnformattedRecord (
802
801
IoErrorHandler &handler) {
803
- std::int32_t header{0 }, footer{ 0 } ;
802
+ std::int32_t header{0 };
804
803
auto headerBytes{static_cast <std::int64_t >(sizeof header)};
805
804
frameOffsetInFile_ += recordOffsetInFrame_;
806
805
recordOffsetInFrame_ = 0 ;
@@ -817,8 +816,7 @@ void ExternalFileUnit::BackspaceVariableUnformattedRecord(
817
816
handler.SignalError (IostatShortRead);
818
817
return ;
819
818
}
820
- std::memcpy (&footer, Frame (), sizeof footer);
821
- recordLength = footer;
819
+ recordLength = ReadHeaderOrFooter (0 );
822
820
if (frameOffsetInFile_ < *recordLength + 2 * headerBytes) {
823
821
handler.SignalError (IostatBadUnformattedRecord);
824
822
return ;
@@ -835,7 +833,7 @@ void ExternalFileUnit::BackspaceVariableUnformattedRecord(
835
833
handler.SignalError (IostatShortRead);
836
834
return ;
837
835
}
838
- std::memcpy (& header, Frame () + recordOffsetInFrame_, sizeof header );
836
+ header = ReadHeaderOrFooter ( recordOffsetInFrame_);
839
837
if (header != *recordLength) {
840
838
handler.SignalError (IostatBadUnformattedRecord);
841
839
return ;
@@ -993,6 +991,16 @@ bool ExternalFileUnit::Wait(int id) {
993
991
}
994
992
}
995
993
994
+ std::int32_t ExternalFileUnit::ReadHeaderOrFooter (std::int64_t frameOffset) {
995
+ std::int32_t word;
996
+ char *wordPtr{reinterpret_cast <char *>(&word)};
997
+ std::memcpy (wordPtr, Frame () + frameOffset, sizeof word);
998
+ if (swapEndianness_) {
999
+ SwapEndianness (wordPtr, sizeof word, sizeof word);
1000
+ }
1001
+ return word;
1002
+ }
1003
+
996
1004
void ChildIo::EndIoStatement () {
997
1005
io_.reset ();
998
1006
u_.emplace <std::monostate>();
0 commit comments