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 ZakharinRT_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 ZakharinRT_API_ATTRS bool ConnectionState::NeedAdvance(std::size_t width) const { 246a1c3efaSpeter klausler return positionInRecord > 0 && width > RemainingSpaceInRecord(); 256a1c3efaSpeter klausler } 266a1c3efaSpeter klausler IsAtEOF() const27*8ebf7411SSlava ZakharinRT_API_ATTRS bool ConnectionState::IsAtEOF() const { 283b635714Speter klausler return endfileRecordNumber && currentRecordNumber >= *endfileRecordNumber; 293b635714Speter klausler } 303b635714Speter klausler IsAfterEndfile() const31*8ebf7411SSlava ZakharinRT_API_ATTRS bool ConnectionState::IsAfterEndfile() const { 32ac4202feSPeter Klausler return endfileRecordNumber && currentRecordNumber > *endfileRecordNumber; 33ac4202feSPeter Klausler } 34ac4202feSPeter Klausler HandleAbsolutePosition(std::int64_t n)35*8ebf7411SSlava ZakharinRT_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 ZakharinRT_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 KlauslerSavedPosition::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 KlauslerSavedPosition::~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