1 //===-- runtime/environment.cpp ---------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "environment.h" 10 #include "tools.h" 11 #include <cstdio> 12 #include <cstdlib> 13 #include <cstring> 14 #include <limits> 15 16 namespace Fortran::runtime { 17 18 ExecutionEnvironment executionEnvironment; 19 20 std::optional<Convert> GetConvertFromString(const char *x, std::size_t n) { 21 static const char *keywords[]{ 22 "UNKNOWN", "NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN", "SWAP", nullptr}; 23 switch (IdentifyValue(x, n, keywords)) { 24 case 0: 25 return Convert::Unknown; 26 case 1: 27 return Convert::Native; 28 case 2: 29 return Convert::LittleEndian; 30 case 3: 31 return Convert::BigEndian; 32 case 4: 33 return Convert::Swap; 34 default: 35 return std::nullopt; 36 } 37 } 38 39 void ExecutionEnvironment::Configure( 40 int ac, const char *av[], const char *env[]) { 41 argc = ac; 42 argv = av; 43 envp = env; 44 listDirectedOutputLineLengthLimit = 79; // PGI default 45 defaultOutputRoundingMode = 46 decimal::FortranRounding::RoundNearest; // RP(==RN) 47 conversion = Convert::Unknown; 48 49 if (auto *x{std::getenv("FORT_FMT_RECL")}) { 50 char *end; 51 auto n{std::strtol(x, &end, 10)}; 52 if (n > 0 && n < std::numeric_limits<int>::max() && *end == '\0') { 53 listDirectedOutputLineLengthLimit = n; 54 } else { 55 std::fprintf( 56 stderr, "Fortran runtime: FORT_FMT_RECL=%s is invalid; ignored\n", x); 57 } 58 } 59 60 if (auto *x{std::getenv("FORT_CONVERT")}) { 61 if (auto convert{GetConvertFromString(x, std::strlen(x))}) { 62 conversion = *convert; 63 } else { 64 std::fprintf( 65 stderr, "Fortran runtime: FORT_CONVERT=%s is invalid; ignored\n", x); 66 } 67 } 68 69 // TODO: Set RP/ROUND='PROCESSOR_DEFINED' from environment 70 } 71 } // namespace Fortran::runtime 72