1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ecmascript/mem/c_string.h"
17
18 #include <cmath>
19 #include <cstdlib>
20
21 #include "ecmascript/ecma_string-inl.h"
22 #include "ecmascript/js_symbol.h"
23 #include "ecmascript/mem/c_containers.h"
24
25 #include "libpandabase/macros.h"
26
27 namespace panda::ecmascript {
CStringToL(const CString & str)28 long CStringToL(const CString &str)
29 {
30 char *endPtr = nullptr;
31 int64_t result = std::strtol(str.c_str(), &endPtr, BASE);
32 ASSERT(!(result == 0 && str.c_str() == endPtr) && "CString argument is not long int");
33 return result;
34 }
35
CStringToLL(const CString & str)36 int64_t CStringToLL(const CString &str)
37 {
38 char *endPtr = nullptr;
39 int64_t result = std::strtoll(str.c_str(), &endPtr, BASE);
40 ASSERT(!(result == 0 && str.c_str() == endPtr) && "CString argument is not long long int");
41 return result;
42 }
43
CStringToULL(const CString & str)44 uint64_t CStringToULL(const CString &str)
45 {
46 char *endPtr = nullptr;
47 uint64_t result = std::strtoull(str.c_str(), &endPtr, BASE);
48 ASSERT(!(result == 0 && str.c_str() == endPtr) && "CString argument is not unsigned long long int");
49 return result;
50 }
51
CStringToF(const CString & str)52 float CStringToF(const CString &str)
53 {
54 char *endPtr = nullptr;
55 float result = std::strtof(str.c_str(), &endPtr);
56 ASSERT(result != HUGE_VALF && "CString argument is not float");
57 ASSERT(!(result == 0 && str.c_str() == endPtr) && "CString argument is not float");
58 return result;
59 }
60
CStringToD(const CString & str)61 double CStringToD(const CString &str)
62 {
63 char *endPtr = nullptr;
64 double result = std::strtod(str.c_str(), &endPtr);
65 ASSERT(result != HUGE_VALF && "CString argument is not double");
66 ASSERT(!(result == 0 && str.c_str() == endPtr) && "CString argument is not double");
67 return result;
68 }
69
70 template<class T>
ConvertToString(T sp)71 CString ConvertToString(T sp)
72 {
73 CString res;
74 res.reserve(sp.size());
75
76 // Also support ascii that great than 127, so using unsigned char here
77 constexpr size_t maxChar = std::numeric_limits<unsigned char>::max();
78
79 for (const auto &c : sp) {
80 if (c > maxChar) {
81 return "";
82 }
83 res.push_back(c);
84 }
85
86 return res;
87 }
88
89 // NB! the following function need additional mem allocation, don't use when unnecessary!
ConvertToString(const std::string & str)90 CString ConvertToString(const std::string &str)
91 {
92 CString res;
93 res.reserve(str.size());
94 for (auto c : str) {
95 res.push_back(c);
96 }
97 return res;
98 }
99
ConvertToString(const EcmaString * s,StringConvertedUsage usage)100 CString ConvertToString(const EcmaString *s, StringConvertedUsage usage)
101 {
102 if (s == nullptr) {
103 return CString("");
104 }
105 return EcmaStringAccessor(const_cast<EcmaString *>(s)).ToCString(usage);
106 }
107
ConvertToString(JSTaggedValue key)108 CString ConvertToString(JSTaggedValue key)
109 {
110 ASSERT(key.IsStringOrSymbol());
111 if (key.IsString()) {
112 return ConvertToString(EcmaString::ConstCast(key.GetTaggedObject()));
113 }
114
115 ecmascript::JSTaggedValue desc = JSSymbol::Cast(key.GetTaggedObject())->GetDescription();
116 if (desc.IsUndefined()) {
117 return CString("Symbol()");
118 }
119
120 return ConvertToString(EcmaString::ConstCast(desc.GetTaggedObject()));
121 }
122
ConvertToStdString(const CString & str)123 std::string ConvertToStdString(const CString &str)
124 {
125 std::string res;
126 res.reserve(str.size());
127 for (auto c : str) {
128 res.push_back(c);
129 }
130 return res;
131 }
132 } // namespace panda::ecmascript
133