1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkSLUtil.h"
9
10 #ifndef __STDC_FORMAT_MACROS
11 #define __STDC_FORMAT_MACROS
12 #endif
13 #include <cinttypes>
14 #include <locale>
15 #include <sstream>
16 #include <string>
17
18 namespace SkSL {
19
to_string(double value)20 SkString to_string(double value) {
21 #ifdef SK_BUILD_FOR_WIN
22 #define SNPRINTF _snprintf
23 #else
24 #define SNPRINTF snprintf
25 #endif
26 #define MAX_DOUBLE_CHARS 25
27 char buffer[MAX_DOUBLE_CHARS];
28 SkDEBUGCODE(int len = )SNPRINTF(buffer, sizeof(buffer), "%.17g", value);
29 ASSERT(len < MAX_DOUBLE_CHARS);
30 SkString result(buffer);
31 if (!strchr(buffer, '.') && !strchr(buffer, 'e')) {
32 result += ".0";
33 }
34 return result;
35 #undef SNPRINTF
36 #undef MAX_DOUBLE_CHARS
37 }
38
to_string(int32_t value)39 SkString to_string(int32_t value) {
40 return SkStringPrintf("%d", value);
41 }
42
to_string(uint32_t value)43 SkString to_string(uint32_t value) {
44 return SkStringPrintf("%u", value);
45 }
46
to_string(int64_t value)47 SkString to_string(int64_t value) {
48 return SkStringPrintf("%" PRId64, value);
49 }
50
to_string(uint64_t value)51 SkString to_string(uint64_t value) {
52 return SkStringPrintf("%" PRIu64, value);
53 }
54
stoi(SkString s)55 int stoi(SkString s) {
56 if (s.size() > 2 && s[0] == '0' && s[1] == 'x') {
57 char* p;
58 int result = strtoul(s.c_str() + 2, &p, 16);
59 ASSERT(*p == 0);
60 return result;
61 }
62 return atoi(s.c_str());
63 }
64
stod(SkString s)65 double stod(SkString s) {
66 double result;
67 std::string str(s.c_str(), s.size());
68 std::stringstream buffer(str);
69 buffer.imbue(std::locale::classic());
70 buffer >> result;
71 return result;
72 }
73
stol(SkString s)74 long stol(SkString s) {
75 if (s.size() > 2 && s[0] == '0' && s[1] == 'x') {
76 char* p;
77 long result = strtoul(s.c_str() + 2, &p, 16);
78 ASSERT(*p == 0);
79 return result;
80 }
81 return atol(s.c_str());
82 }
83
sksl_abort()84 void sksl_abort() {
85 #ifdef SKIA
86 sk_abort_no_print();
87 exit(1);
88 #else
89 abort();
90 #endif
91 }
92
write_data(const SkData & data,SkWStream & out)93 void write_data(const SkData& data, SkWStream& out) {
94 out.write(data.data(), data.size());
95 }
96
operator +(const SkString & s,const char * c)97 SkString operator+(const SkString& s, const char* c) {
98 SkString result(s);
99 result += c;
100 return result;
101 }
102
operator +(const char * c,const SkString & s)103 SkString operator+(const char* c, const SkString& s) {
104 SkString result(c);
105 result += s;
106 return result;
107 }
108
operator +(const SkString & s1,const SkString & s2)109 SkString operator+(const SkString& s1, const SkString& s2) {
110 SkString result(s1);
111 result += s2;
112 return result;
113 }
114
operator ==(const SkString & s1,const char * s2)115 bool operator==(const SkString& s1, const char* s2) {
116 return !strcmp(s1.c_str(), s2);
117 }
118
operator !=(const SkString & s1,const char * s2)119 bool operator!=(const SkString& s1, const char* s2) {
120 return strcmp(s1.c_str(), s2);
121 }
122
operator !=(const char * s1,const SkString & s2)123 bool operator!=(const char* s1, const SkString& s2) {
124 return strcmp(s1, s2.c_str());
125 }
126 } // namespace
127