xref: /llvm-project/flang/runtime/connection.cpp (revision 8ebf741136c66f51053315bf4f0ef828c6f66094)
1651f58bfSDiana Picus //===-- runtime/connection.cpp --------------------------------------------===//
295696d56Speter klausler //
395696d56Speter klausler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
495696d56Speter klausler // See https://llvm.org/LICENSE.txt for license information.
595696d56Speter klausler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
695696d56Speter klausler //
795696d56Speter klausler //===----------------------------------------------------------------------===//
895696d56Speter klausler 
995696d56Speter klausler #include "connection.h"
1095696d56Speter klausler #include "environment.h"
11e7823608SPeter Klausler #include "io-stmt.h"
12231fae90SIsuru Fernando #include <algorithm>
1395696d56Speter klausler 
1495696d56Speter klausler namespace Fortran::runtime::io {
15*8ebf7411SSlava Zakharin RT_OFFLOAD_API_GROUP_BEGIN
1695696d56Speter klausler 
RemainingSpaceInRecord() const17*8ebf7411SSlava Zakharin RT_API_ATTRS std::size_t ConnectionState::RemainingSpaceInRecord() const {
183a96446dSPeter Klausler   auto recl{recordLength.value_or(openRecl.value_or(
193a96446dSPeter Klausler       executionEnvironment.listDirectedOutputLineLengthLimit))};
203b635714Speter klausler   return positionInRecord >= recl ? 0 : recl - positionInRecord;
213b635714Speter klausler }
223b635714Speter klausler 
NeedAdvance(std::size_t width) const23*8ebf7411SSlava Zakharin RT_API_ATTRS bool ConnectionState::NeedAdvance(std::size_t width) const {
246a1c3efaSpeter klausler   return positionInRecord > 0 && width > RemainingSpaceInRecord();
256a1c3efaSpeter klausler }
266a1c3efaSpeter klausler 
IsAtEOF() const27*8ebf7411SSlava Zakharin RT_API_ATTRS bool ConnectionState::IsAtEOF() const {
283b635714Speter klausler   return endfileRecordNumber && currentRecordNumber >= *endfileRecordNumber;
293b635714Speter klausler }
303b635714Speter klausler 
IsAfterEndfile() const31*8ebf7411SSlava Zakharin RT_API_ATTRS bool ConnectionState::IsAfterEndfile() const {
32ac4202feSPeter Klausler   return endfileRecordNumber && currentRecordNumber > *endfileRecordNumber;
33ac4202feSPeter Klausler }
34ac4202feSPeter Klausler 
HandleAbsolutePosition(std::int64_t n)35*8ebf7411SSlava Zakharin RT_API_ATTRS void ConnectionState::HandleAbsolutePosition(std::int64_t n) {
363b635714Speter klausler   positionInRecord = std::max(n, std::int64_t{0}) + leftTabLimit.value_or(0);
373b635714Speter klausler }
383b635714Speter klausler 
HandleRelativePosition(std::int64_t n)39*8ebf7411SSlava Zakharin RT_API_ATTRS void ConnectionState::HandleRelativePosition(std::int64_t n) {
403b635714Speter klausler   positionInRecord = std::max(leftTabLimit.value_or(0), positionInRecord + n);
4195696d56Speter klausler }
42e7823608SPeter Klausler 
SavedPosition(IoStatementState & io)43e7823608SPeter Klausler SavedPosition::SavedPosition(IoStatementState &io) : io_{io} {
44e7823608SPeter Klausler   ConnectionState &conn{io_.GetConnectionState()};
45e7823608SPeter Klausler   saved_ = conn;
46e7823608SPeter Klausler   conn.pinnedFrame = true;
47e7823608SPeter Klausler }
48e7823608SPeter Klausler 
~SavedPosition()49e7823608SPeter Klausler SavedPosition::~SavedPosition() {
509469dc38SPeter Klausler   if (!cancelled_) {
51e7823608SPeter Klausler     ConnectionState &conn{io_.GetConnectionState()};
52e7823608SPeter Klausler     while (conn.currentRecordNumber > saved_.currentRecordNumber) {
53e7823608SPeter Klausler       io_.BackspaceRecord();
54e7823608SPeter Klausler     }
55e7823608SPeter Klausler     conn.leftTabLimit = saved_.leftTabLimit;
56e7823608SPeter Klausler     conn.furthestPositionInRecord = saved_.furthestPositionInRecord;
57e7823608SPeter Klausler     conn.positionInRecord = saved_.positionInRecord;
58e7823608SPeter Klausler     conn.pinnedFrame = saved_.pinnedFrame;
59e7823608SPeter Klausler   }
609469dc38SPeter Klausler }
61*8ebf7411SSlava Zakharin 
62*8ebf7411SSlava Zakharin RT_OFFLOAD_API_GROUP_END
631f879005STim Keith } // namespace Fortran::runtime::io
64