164ab3302SCarolineConcatto //===-- lib/Evaluate/static-data.cpp --------------------------------------===// 264ab3302SCarolineConcatto // 364ab3302SCarolineConcatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 464ab3302SCarolineConcatto // See https://llvm.org/LICENSE.txt for license information. 564ab3302SCarolineConcatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 664ab3302SCarolineConcatto // 764ab3302SCarolineConcatto //===----------------------------------------------------------------------===// 864ab3302SCarolineConcatto 964ab3302SCarolineConcatto #include "flang/Evaluate/static-data.h" 1064ab3302SCarolineConcatto #include "flang/Parser/characters.h" 1164ab3302SCarolineConcatto 1264ab3302SCarolineConcatto namespace Fortran::evaluate { 1364ab3302SCarolineConcatto AsFortran(llvm::raw_ostream & o,bool bigEndian) const14*23c2bedfSPeter Klauslerllvm::raw_ostream &StaticDataObject::AsFortran( 15*23c2bedfSPeter Klausler llvm::raw_ostream &o, bool bigEndian) const { 1664ab3302SCarolineConcatto if (auto string{AsString()}) { 1764ab3302SCarolineConcatto o << parser::QuoteCharacterLiteral(*string); 18*23c2bedfSPeter Klausler } else if (auto string{AsU16String(bigEndian)}) { 1964ab3302SCarolineConcatto o << "2_" << parser::QuoteCharacterLiteral(*string); 20*23c2bedfSPeter Klausler } else if (auto string{AsU32String(bigEndian)}) { 2164ab3302SCarolineConcatto o << "4_" << parser::QuoteCharacterLiteral(*string); 2264ab3302SCarolineConcatto } else { 2364ab3302SCarolineConcatto CRASH_NO_CASE; 2464ab3302SCarolineConcatto } 2564ab3302SCarolineConcatto return o; 2664ab3302SCarolineConcatto } 2764ab3302SCarolineConcatto Push(const std::string & string,bool)28*23c2bedfSPeter KlauslerStaticDataObject &StaticDataObject::Push(const std::string &string, bool) { 2964ab3302SCarolineConcatto for (auto ch : string) { 3064ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch)); 3164ab3302SCarolineConcatto } 3264ab3302SCarolineConcatto return *this; 3364ab3302SCarolineConcatto } 3464ab3302SCarolineConcatto Push(const std::u16string & string,bool bigEndian)35*23c2bedfSPeter KlauslerStaticDataObject &StaticDataObject::Push( 36*23c2bedfSPeter Klausler const std::u16string &string, bool bigEndian) { 37*23c2bedfSPeter Klausler int shift{bigEndian ? 8 : 0}; 3864ab3302SCarolineConcatto for (auto ch : string) { 3964ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> shift)); 4064ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> (shift ^ 8))); 4164ab3302SCarolineConcatto } 4264ab3302SCarolineConcatto return *this; 4364ab3302SCarolineConcatto } 4464ab3302SCarolineConcatto Push(const std::u32string & string,bool bigEndian)45*23c2bedfSPeter KlauslerStaticDataObject &StaticDataObject::Push( 46*23c2bedfSPeter Klausler const std::u32string &string, bool bigEndian) { 47*23c2bedfSPeter Klausler int shift{bigEndian ? 24 : 0}; 4864ab3302SCarolineConcatto for (auto ch : string) { 4964ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> shift)); 5064ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> (shift ^ 8))); 5164ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> (shift ^ 16))); 5264ab3302SCarolineConcatto data_.push_back(static_cast<std::uint8_t>(ch >> (shift ^ 24))); 5364ab3302SCarolineConcatto } 5464ab3302SCarolineConcatto return *this; 5564ab3302SCarolineConcatto } 5664ab3302SCarolineConcatto AsString() const5764ab3302SCarolineConcattostd::optional<std::string> StaticDataObject::AsString() const { 5864ab3302SCarolineConcatto if (itemBytes_ <= 1) { 5964ab3302SCarolineConcatto std::string result; 6064ab3302SCarolineConcatto for (std::uint8_t byte : data_) { 6164ab3302SCarolineConcatto result += static_cast<char>(byte); 6264ab3302SCarolineConcatto } 6364ab3302SCarolineConcatto return {std::move(result)}; 6464ab3302SCarolineConcatto } 6564ab3302SCarolineConcatto return std::nullopt; 6664ab3302SCarolineConcatto } 6764ab3302SCarolineConcatto AsU16String(bool bigEndian) const68*23c2bedfSPeter Klauslerstd::optional<std::u16string> StaticDataObject::AsU16String( 69*23c2bedfSPeter Klausler bool bigEndian) const { 7064ab3302SCarolineConcatto if (itemBytes_ == 2) { 71*23c2bedfSPeter Klausler int shift{bigEndian ? 8 : 0}; 7264ab3302SCarolineConcatto std::u16string result; 7364ab3302SCarolineConcatto auto end{data_.cend()}; 7464ab3302SCarolineConcatto for (auto byte{data_.cbegin()}; byte < end;) { 7564ab3302SCarolineConcatto result += static_cast<char16_t>(*byte++) << shift | 7664ab3302SCarolineConcatto static_cast<char16_t>(*byte++) << (shift ^ 8); 7764ab3302SCarolineConcatto } 7864ab3302SCarolineConcatto return {std::move(result)}; 7964ab3302SCarolineConcatto } 8064ab3302SCarolineConcatto return std::nullopt; 8164ab3302SCarolineConcatto } 8264ab3302SCarolineConcatto AsU32String(bool bigEndian) const83*23c2bedfSPeter Klauslerstd::optional<std::u32string> StaticDataObject::AsU32String( 84*23c2bedfSPeter Klausler bool bigEndian) const { 8564ab3302SCarolineConcatto if (itemBytes_ == 4) { 86*23c2bedfSPeter Klausler int shift{bigEndian ? 24 : 0}; 8764ab3302SCarolineConcatto std::u32string result; 8864ab3302SCarolineConcatto auto end{data_.cend()}; 8964ab3302SCarolineConcatto for (auto byte{data_.cbegin()}; byte < end;) { 9064ab3302SCarolineConcatto result += static_cast<char32_t>(*byte++) << shift | 9164ab3302SCarolineConcatto static_cast<char32_t>(*byte++) << (shift ^ 8) | 9264ab3302SCarolineConcatto static_cast<char32_t>(*byte++) << (shift ^ 16) | 9364ab3302SCarolineConcatto static_cast<char32_t>(*byte++) << (shift ^ 24); 9464ab3302SCarolineConcatto } 9564ab3302SCarolineConcatto return {std::move(result)}; 9664ab3302SCarolineConcatto } 9764ab3302SCarolineConcatto return std::nullopt; 9864ab3302SCarolineConcatto } 991f879005STim Keith } // namespace Fortran::evaluate 100