5
* Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
6
* See COPYRIGHT.txt for details.
12
#include "string_util.hpp"
17
get_token(char *& wp, char *wp_end, char delim)
19
char *const wp_begin = wp;
20
char *const p = memchr_char(wp_begin, delim, wp_end - wp_begin);
23
return string_wref(wp_begin, wp_end - wp_begin);
26
return string_wref(wp_begin, p - wp_begin);
29
template <typename T> T
30
atoi_tmpl_nocheck(const char *start, const char *finish)
33
for (; start != finish; ++start) {
34
const char c = *start;
35
if (c < '0' || c > '9') {
39
v += static_cast<T>(c - '0');
44
template <typename T> T
45
atoi_signed_tmpl_nocheck(const char *start, const char *finish)
48
bool negative = false;
49
if (start != finish) {
50
if (start[0] == '-') {
53
} else if (start[0] == '+') {
57
for (; start != finish; ++start) {
58
const char c = *start;
59
if (c < '0' || c > '9') {
64
v -= static_cast<T>(c - '0');
66
v += static_cast<T>(c - '0');
73
atoi_uint32_nocheck(const char *start, const char *finish)
75
return atoi_tmpl_nocheck<uint32_t>(start, finish);
79
atoll_nocheck(const char *start, const char *finish)
81
return atoi_signed_tmpl_nocheck<long long>(start, finish);
85
append_uint32(string_buffer& buf, uint32_t v)
87
char *const wp = buf.make_space(64);
88
const int len = snprintf(wp, 64, "%lu", static_cast<unsigned long>(v));
95
to_stdstring(uint32_t v)
98
snprintf(buf, sizeof(buf), "%lu", static_cast<unsigned long>(v));
99
return std::string(buf);
103
errno_string(const char *s, int en, std::string& err_r)
106
snprintf(buf, sizeof(buf), "%s: %d", s, en);
107
err_r = std::string(buf);
111
template <typename T> size_t
112
split_tmpl_arr(char delim, const T& buf, T *parts, size_t parts_len)
114
typedef typename T::value_type value_type;
116
value_type *start = buf.begin();
117
value_type *const finish = buf.end();
118
for (i = 0; i < parts_len; ++i) {
119
value_type *const p = memchr_char(start, delim, finish - start);
121
parts[i] = T(start, finish - start);
125
parts[i] = T(start, p - start);
129
for (; i < parts_len; ++i) {
136
split(char delim, const string_ref& buf, string_ref *parts,
139
return split_tmpl_arr(delim, buf, parts, parts_len);
143
split(char delim, const string_wref& buf, string_wref *parts,
146
return split_tmpl_arr(delim, buf, parts, parts_len);
149
template <typename T, typename V> size_t
150
split_tmpl_vec(char delim, const T& buf, V& parts)
152
typedef typename T::value_type value_type;
154
value_type *start = buf.begin();
155
value_type *const finish = buf.end();
157
value_type *const p = memchr_char(start, delim, finish - start);
159
parts.push_back(T(start, finish - start));
162
parts.push_back(T(start, p - start));
170
split(char delim, const string_ref& buf, std::vector<string_ref>& parts_r)
172
return split_tmpl_vec(delim, buf, parts_r);
176
split(char delim, const string_wref& buf, std::vector<string_wref>& parts_r)
178
return split_tmpl_vec(delim, buf, parts_r);