//===-- runtime/iostat.cpp ------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "flang/Runtime/iostat.h"

namespace Fortran::runtime::io {
const char *IostatErrorString(int iostat) {
  switch (iostat) {
  case IostatOk:
    return "No error";
  case IostatEnd:
    return "End of file during input";
  case IostatEor:
    return "End of record during non-advancing input";
  case IostatUnflushable:
    return "FLUSH not possible";
  case IostatInquireInternalUnit:
    return "INQUIRE on internal unit";
  case IostatGenericError:
    return "I/O error"; // dummy value, there's always a message
  case IostatRecordWriteOverrun:
    return "Excessive output to fixed-size record";
  case IostatRecordReadOverrun:
    return "Excessive input from fixed-size record";
  case IostatInternalWriteOverrun:
    return "Internal write overran available records";
  case IostatErrorInFormat:
    return "Bad FORMAT";
  case IostatErrorInKeyword:
    return "Bad keyword argument value";
  case IostatEndfileDirect:
    return "ENDFILE on direct-access file";
  case IostatEndfileUnwritable:
    return "ENDFILE on read-only file";
  case IostatOpenBadRecl:
    return "OPEN with bad RECL= value";
  case IostatOpenUnknownSize:
    return "OPEN of file of unknown size";
  case IostatOpenBadAppend:
    return "OPEN(POSITION='APPEND') of unpositionable file";
  case IostatWriteToReadOnly:
    return "Attempted output to read-only file";
  case IostatReadFromWriteOnly:
    return "Attempted input from write-only file";
  case IostatBackspaceNonSequential:
    return "BACKSPACE on non-sequential file";
  case IostatBackspaceAtFirstRecord:
    return "BACKSPACE at first record";
  case IostatRewindNonSequential:
    return "REWIND on non-sequential file";
  case IostatWriteAfterEndfile:
    return "WRITE after ENDFILE";
  case IostatFormattedIoOnUnformattedUnit:
    return "Formatted I/O on unformatted file";
  case IostatUnformattedIoOnFormattedUnit:
    return "Unformatted I/O on formatted file";
  case IostatListIoOnDirectAccessUnit:
    return "List-directed or NAMELIST I/O on direct-access file";
  case IostatUnformattedChildOnFormattedParent:
    return "Unformatted child I/O on formatted parent unit";
  case IostatFormattedChildOnUnformattedParent:
    return "Formatted child I/O on unformatted parent unit";
  case IostatChildInputFromOutputParent:
    return "Child input from output parent unit";
  case IostatChildOutputToInputParent:
    return "Child output to input parent unit";
  case IostatShortRead:
    return "Read from external unit returned insufficient data";
  case IostatMissingTerminator:
    return "Sequential record missing its terminator";
  case IostatBadUnformattedRecord:
    return "Erroneous unformatted sequential file record structure";
  case IostatUTF8Decoding:
    return "UTF-8 decoding error";
  case IostatUnitOverflow:
    return "UNIT number is out of range";
  case IostatBadRealInput:
    return "Bad REAL input value";
  case IostatBadScaleFactor:
    return "Bad REAL output scale factor (kP)";
  case IostatBadAsynchronous:
    return "READ/WRITE(ASYNCHRONOUS='YES') on unit without "
           "OPEN(ASYNCHRONOUS='YES')";
  case IostatBadWaitUnit:
    return "WAIT(UNIT=) for a bad or unconnected unit number";
  case IostatBOZInputOverflow:
    return "B/O/Z input value overflows variable";
  case IostatIntegerInputOverflow:
    return "Integer input value overflows variable";
  case IostatRealInputOverflow:
    return "Real or complex input value overflows type";
  case IostatCannotReposition:
    return "Attempt to reposition a unit which is connected to a file that can "
           "only be processed sequentially";
  case IostatOpenAlreadyConnected:
    return "OPEN of file already connected to another unit";
  case IostatBadWaitId:
    return "WAIT(ID=nonzero) for an ID value that is not a pending operation";
  case IostatTooManyAsyncOps:
    return "Too many asynchronous operations pending on unit";
  case IostatBadBackspaceUnit:
    return "BACKSPACE on unconnected unit";
  case IostatBadUnitNumber:
    return "Negative unit number is not allowed";
  case IostatBadFlushUnit:
    return "FLUSH attempted on a bad or unconnected unit number";
  case IostatBadOpOnChildUnit:
    return "Impermissible I/O statement on child I/O unit";
  default:
    return nullptr;
  }
}

} // namespace Fortran::runtime::io
