• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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