16
16
/* This file is originally from the mysql distribution. Coded by monty */
20
#include <drizzled/definitions.h>
21
#include <drizzled/internal/my_sys.h>
22
#include <drizzled/internal/m_string.h>
23
#include <drizzled/memory/root.h>
24
#include <drizzled/charset.h>
20
#include "drizzled/internal/my_sys.h"
21
#include "drizzled/internal/m_string.h"
22
#include "drizzled/charset.h"
23
#include "drizzled/global_charset_info.h"
26
25
#include <algorithm>
28
#include <drizzled/sql_string.h>
27
#include "drizzled/sql_string.h"
30
29
using namespace std;
34
// Converstion functions to and from std::string.
36
std::string String_to_std_string(String const& s)
38
return std::string(s.ptr(), s.length());
41
String* set_String_from_std_string(String* s, std::string const& cs)
43
s->set_ascii(cs.c_str(), cs.length());
34
48
/*****************************************************************************
35
49
** String functions
129
new_ptr= (char*) ::realloc(Ptr,len);
145
if ((new_ptr= (char*) ::realloc(Ptr,len)))
151
return true; // Signal error
153
else if ((new_ptr= (char*) malloc(len)))
135
new_ptr= (char*) malloc(len);
136
155
if (str_length) // Avoid bugs in memcpy on AIX
137
memcpy(new_ptr,Ptr,str_length);
156
memcpy(new_ptr,Ptr,str_length);
138
157
new_ptr[str_length]=0;
140
159
Alloced_length=len;
163
return true; // Signal error
144
165
Ptr[alloc_length]=0; // This make other funcs shorter
147
void String::set_int(int64_t num, bool unsigned_flag, const charset_info_st * const cs)
169
bool String::set_int(int64_t num, bool unsigned_flag, const CHARSET_INFO * const cs)
149
171
size_t l=20*cs->mbmaxlen+1;
150
172
int base= unsigned_flag ? 10 : -10;
153
176
str_length=(size_t) (cs->cset->int64_t10_to_str)(cs,Ptr,l,base,num);
157
void String::set_real(double num,size_t decimals, const charset_info_st * const cs)
181
bool String::set_real(double num,size_t decimals, const CHARSET_INFO * const cs)
159
183
char buff[FLOATING_POINT_BUFFER];
163
188
if (decimals >= NOT_FIXED_DEC)
165
len= internal::my_gcvt(num, internal::MY_GCVT_ARG_DOUBLE, sizeof(buff) - 1, buff, NULL);
190
len= internal::my_gcvt(num,
191
internal::MY_GCVT_ARG_DOUBLE,
192
sizeof(buff) - 1, buff, NULL);
193
return copy(buff, len, &my_charset_utf8_general_ci, cs, &dummy_errors);
169
195
len= internal::my_fcvt(num, decimals, buff, NULL);
196
return copy(buff, (size_t) len, &my_charset_utf8_general_ci, cs,
178
205
Alloced_length=0; // Force realloc
206
return realloc(str_length);
183
void String::copy(const String &str)
211
bool String::copy(const String &str)
185
alloc(str.str_length);
213
if (alloc(str.str_length))
186
215
str_length=str.str_length;
187
216
memmove(Ptr, str.Ptr, str_length); // May be overlapping
188
217
Ptr[str_length]=0;
189
218
str_charset=str.str_charset;
192
void String::copy(const std::string& arg, const charset_info_st * const cs) // Allocate new string
222
bool String::copy(const std::string& arg, const CHARSET_INFO * const cs) // Allocate new string
224
if (alloc(arg.size()))
196
227
if ((str_length= arg.size()))
197
228
memcpy(Ptr, arg.c_str(), arg.size());
199
230
Ptr[arg.size()]= 0;
203
void String::copy(const char *str,size_t arg_length, const charset_info_st* cs)
236
bool String::copy(const char *str,size_t arg_length, const CHARSET_INFO * const cs)
238
if (alloc(arg_length))
206
240
if ((str_length=arg_length))
207
241
memcpy(Ptr,str,arg_length);
208
242
Ptr[arg_length]=0;
258
294
assert(!offset); /* All characters are complete, just copy */
260
296
set(str, arg_length, cs);
300
/* Copy with charset conversion */
302
bool String::copy(const char *str, size_t arg_length,
303
const CHARSET_INFO * const,
304
const CHARSET_INFO * const to_cs, size_t *errors)
307
return copy(str, arg_length, to_cs);
264
312
Set a string to the value of a latin1-string, keeping the original charset
282
void String::set_ascii(const char *str, size_t arg_length)
330
bool String::set_ascii(const char *str, size_t arg_length)
284
332
if (str_charset->mbminlen == 1)
286
334
set(str, arg_length, str_charset);
289
copy(str, arg_length, str_charset);
338
return copy(str, arg_length, &my_charset_utf8_general_ci, str_charset, &dummy_errors);
292
void String::append(const String &s)
341
bool String::append(const String &s)
296
realloc(str_length+s.length());
345
if (realloc(str_length+s.length()))
297
347
memcpy(Ptr+str_length,s.ptr(),s.length());
298
348
str_length+=s.length();
333
386
with character set recoding
336
void String::append(const char *s,size_t arg_length, const charset_info_st * const)
389
bool String::append(const char *s,size_t arg_length, const CHARSET_INFO * const)
338
realloc(str_length + arg_length);
391
if (realloc(str_length + arg_length))
339
393
memcpy(Ptr + str_length, s, arg_length);
340
394
str_length+= arg_length;
344
void String::append_with_prefill(const char *s,size_t arg_length,
400
bool String::append_with_prefill(const char *s,size_t arg_length,
345
401
size_t full_length, char fill_char)
347
403
int t_length= arg_length > full_length ? arg_length : full_length;
349
realloc(str_length + t_length);
405
if (realloc(str_length + t_length))
350
407
t_length= full_length - arg_length;
351
408
if (t_length > 0)
431
489
If wrong parameter or not enough memory, do nothing
434
void String::replace(size_t offset,size_t arg_length,const String &to)
492
bool String::replace(size_t offset,size_t arg_length,const String &to)
436
replace(offset,arg_length,to.ptr(),to.length());
494
return replace(offset,arg_length,to.ptr(),to.length());
439
void String::replace(size_t offset,size_t arg_length,
497
bool String::replace(size_t offset,size_t arg_length,
440
498
const char *to, size_t to_length)
442
500
long diff = (long) to_length-(long) arg_length;
572
well_formed_copy_nchars(const charset_info_st * const to_cs,
633
well_formed_copy_nchars(const CHARSET_INFO * const to_cs,
573
634
char *to, size_t to_length,
574
const charset_info_st * const from_cs,
635
const CHARSET_INFO * const from_cs,
575
636
const char *from, size_t from_length,
577
638
const char **well_formed_error_pos,
721
782
append("e_char, 1, system_charset_info);
724
bool check_if_only_end_space(const charset_info_st * const cs, char *str,
787
Exchange state of this object and argument.
793
Target string will contain state of this object and vice versa.
796
void String::swap(String &s)
798
std::swap(Ptr, s.Ptr);
799
std::swap(str_length, s.str_length);
800
std::swap(Alloced_length, s.Alloced_length);
801
std::swap(alloced, s.alloced);
802
std::swap(str_charset, s.str_charset);
805
void String::q_append(const size_t n)
807
int8store(Ptr + str_length, n);
810
void String::q_append(double d)
812
float8store(Ptr + str_length, d);
815
void String::q_append(double *d)
817
float8store(Ptr + str_length, *d);
820
void String::q_append(const char *data, size_t data_len)
822
memcpy(Ptr + str_length, data, data_len);
823
str_length += data_len;
826
void String::write_at_position(int position, size_t value)
828
int8store(Ptr + position,value);
830
bool check_if_only_end_space(const CHARSET_INFO * const cs, char *str,
727
833
return str+ cs->cset->scan(cs, str, end, MY_SEQ_SPACES) == end;