16
16
/* This file is originally from the mysql distribution. Coded by monty */
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"
19
#include <mysys/my_sys.h>
20
#include <mystrings/m_string.h>
25
22
#include <algorithm>
27
#include "drizzled/sql_string.h"
29
24
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());
27
The following extern declarations are ok as these are interface functions
28
required by the string function
31
extern unsigned char* sql_alloc(unsigned size);
32
extern void sql_element_free(void *ptr);
34
#include "sql_string.h"
48
36
/*****************************************************************************
49
37
** String functions
50
38
*****************************************************************************/
57
str_charset(&my_charset_bin)
61
String::String(uint32_t length_arg)
66
str_charset(&my_charset_bin)
68
(void) real_alloc(length_arg);
71
String::String(const char *str, const CHARSET_INFO * const cs)
72
: Ptr(const_cast<char *>(str)),
73
str_length(static_cast<uint32_t>(strlen(str))),
80
String::String(const char *str, uint32_t len, const CHARSET_INFO * const cs)
81
: Ptr(const_cast<char *>(str)),
89
String::String(char *str, uint32_t len, const CHARSET_INFO * const cs)
98
String::String(const String &str)
100
str_length(str.str_length),
101
Alloced_length(str.Alloced_length),
103
str_charset(str.str_charset)
107
void *String::operator new(size_t size, memory::Root *mem_root)
109
return alloc_root(mem_root, static_cast<uint32_t>(size));
112
40
String::~String() { free(); }
114
42
bool String::real_alloc(uint32_t arg_length)
187
115
if (decimals >= NOT_FIXED_DEC)
189
len= internal::my_gcvt(num,
190
internal::MY_GCVT_ARG_DOUBLE,
191
sizeof(buff) - 1, buff, NULL);
117
len= my_gcvt(num, MY_GCVT_ARG_DOUBLE, sizeof(buff) - 1, buff, NULL);
192
118
return copy(buff, len, &my_charset_utf8_general_ci, cs, &dummy_errors);
194
len= internal::my_fcvt(num, decimals, buff, NULL);
120
len= my_fcvt(num, decimals, buff, NULL);
195
121
return copy(buff, (uint32_t) len, &my_charset_utf8_general_ci, cs,
500
426
if (realloc(str_length+(uint32_t) diff))
502
internal::bmove_upp((unsigned char*) Ptr+str_length+diff,
503
(unsigned char*) Ptr+str_length,
504
str_length-offset-arg_length);
428
bmove_upp((unsigned char*) Ptr+str_length+diff, (unsigned char*) Ptr+str_length,
429
str_length-offset-arg_length);
507
432
memcpy(Ptr+offset,to,to_length);
589
514
****************************************************************************/
519
Copy string with HEX-encoding of "bad" characters.
521
@details This functions copies the string pointed by "src"
522
to the string pointed by "dst". Not more than "srclen" bytes
523
are read from "src". Any sequences of bytes representing
524
a not-well-formed substring (according to cs) are hex-encoded,
525
and all well-formed substrings (according to cs) are copied as is.
526
Not more than "dstlen" bytes are written to "dst". The number
527
of bytes written to "dst" is returned.
529
@param cs character set pointer of the destination string
530
@param[out] dst destination string
531
@param dstlen size of dst
532
@param src source string
533
@param srclen length of src
535
@retval result length
539
my_copy_with_hex_escaping(const CHARSET_INFO * const cs,
540
char *dst, size_t dstlen,
541
const char *src, size_t srclen)
543
const char *srcend= src + srclen;
546
for ( ; src < srcend ; )
549
if ((chlen= my_ismbchar(cs, src, srcend)))
552
break; /* purecov: inspected */
553
memcpy(dst, src, chlen);
558
else if (*src & 0x80)
561
break; /* purecov: inspected */
564
*dst++= _dig_vec_upper[((unsigned char) *src) >> 4];
565
*dst++= _dig_vec_upper[((unsigned char) *src) & 15];
572
break; /* purecov: inspected */
593
582
with optional character set conversion,
788
777
std::swap(str_charset, s.str_charset);
791
void String::q_append(const uint32_t n)
793
int4store(Ptr + str_length, n);
796
void String::q_append(double d)
798
float8store(Ptr + str_length, d);
801
void String::q_append(double *d)
803
float8store(Ptr + str_length, *d);
806
void String::q_append(const char *data, uint32_t data_len)
808
memcpy(Ptr + str_length, data, data_len);
809
str_length += data_len;
812
void String::write_at_position(int position, uint32_t value)
814
int4store(Ptr + position,value);
816
bool check_if_only_end_space(const CHARSET_INFO * const cs, char *str,
819
return str+ cs->cset->scan(cs, str, end, MY_SEQ_SPACES) == end;
822
} /* namespace drizzled */
824
bool operator==(const drizzled::String &s1, const drizzled::String &s2)
781
bool operator==(const String &s1, const String &s2)
826
783
return stringcmp(&s1,&s2) == 0;
829
bool operator!=(const drizzled::String &s1, const drizzled::String &s2)
786
bool operator!=(const String &s1, const String &s2)
831
788
return !(s1 == s2);