//===-- runtime/environment.cpp ---------------------------------*- C++ -*-===// // // 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 "environment.h" #include "tools.h" #include #include #include #include namespace Fortran::runtime { ExecutionEnvironment executionEnvironment; std::optional GetConvertFromString(const char *x, std::size_t n) { static const char *keywords[]{ "UNKNOWN", "NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN", "SWAP", nullptr}; switch (IdentifyValue(x, n, keywords)) { case 0: return Convert::Unknown; case 1: return Convert::Native; case 2: return Convert::LittleEndian; case 3: return Convert::BigEndian; case 4: return Convert::Swap; default: return std::nullopt; } } void ExecutionEnvironment::Configure( int ac, const char *av[], const char *env[]) { argc = ac; argv = av; envp = env; listDirectedOutputLineLengthLimit = 79; // PGI default defaultOutputRoundingMode = decimal::FortranRounding::RoundNearest; // RP(==RN) conversion = Convert::Unknown; if (auto *x{std::getenv("FORT_FMT_RECL")}) { char *end; auto n{std::strtol(x, &end, 10)}; if (n > 0 && n < std::numeric_limits::max() && *end == '\0') { listDirectedOutputLineLengthLimit = n; } else { std::fprintf( stderr, "Fortran runtime: FORT_FMT_RECL=%s is invalid; ignored\n", x); } } if (auto *x{std::getenv("FORT_CONVERT")}) { if (auto convert{GetConvertFromString(x, std::strlen(x))}) { conversion = *convert; } else { std::fprintf( stderr, "Fortran runtime: FORT_CONVERT=%s is invalid; ignored\n", x); } } // TODO: Set RP/ROUND='PROCESSOR_DEFINED' from environment } } // namespace Fortran::runtime