74
74
return true; // Signal error
76
else if ((new_ptr= (char*) malloc(len)))
76
else if ((new_ptr= (char*) my_malloc(len,MYF(MY_WME))))
78
78
if (str_length) // Avoid bugs in memcpy on AIX
79
79
memcpy(new_ptr,Ptr,str_length);
195
Copy a multi-byte character sets with adding leading zeros.
201
arg_length Length of string. This should NOT be dividable with
203
offset arg_length % cs->mb_minlength
204
cs Character set for 'str'
207
For real multi-byte, ascii incompatible charactser sets,
208
like UCS-2, add leading zeros if we have an incomplete character.
211
will automatically be converted into
219
bool String::copy_aligned(const char *str,uint32_t arg_length, uint32_t offset,
220
const CHARSET_INFO * const cs)
222
/* How many bytes are in incomplete character */
223
offset= cs->mbmaxlen - offset; /* How many zeros we should prepend */
224
assert(offset && offset != cs->mbmaxlen);
226
uint32_t aligned_length= arg_length + offset;
227
if (alloc(aligned_length))
231
Note, this is only safe for big-endian UCS-2.
232
If we add little-endian UCS-2 sometimes, this code
233
will be more complicated. But it's OK for now.
235
memset(Ptr, 0, offset);
236
memcpy(Ptr + offset, str, arg_length);
237
Ptr[aligned_length]=0;
238
/* str_length is always >= 0 as arg_length is != 0 */
239
str_length= aligned_length;
196
245
bool String::set_or_copy_aligned(const char *str,uint32_t arg_length,
197
246
const CHARSET_INFO * const cs)
199
248
/* How many bytes are in incomplete character */
200
uint32_t offset= (arg_length % cs->mbminlen);
202
assert(!offset); /* All characters are complete, just copy */
204
set(str, arg_length, cs);
249
uint32_t offset= (arg_length % cs->mbminlen);
251
if (!offset) /* All characters are complete, just copy */
253
set(str, arg_length, cs);
256
return copy_aligned(str, arg_length, offset, cs);
208
259
/* Copy with charset conversion */
220
271
if ((from_cs == &my_charset_bin) && offset)
223
assert((from_cs == &my_charset_bin) && offset);
224
return false; //copy_aligned(str, arg_length, offset, to_cs);
274
return copy_aligned(str, arg_length, offset, to_cs);
226
276
uint32_t new_length= to_cs->mbmaxlen*arg_length;
227
277
if (alloc(new_length))
263
313
return copy(str, arg_length, &my_charset_utf8_general_ci, str_charset, &dummy_errors);
317
/* This is used by mysql.cc */
319
bool String::fill(uint32_t max_length,char fill_char)
321
if (str_length > max_length)
322
Ptr[str_length=max_length]=0;
325
if (realloc(max_length))
327
memset(Ptr+str_length, fill_char, max_length-str_length);
328
str_length=max_length;
266
333
bool String::append(const String &s)
329
396
bool String::append(const char *s,uint32_t arg_length, const CHARSET_INFO * const cs)
331
398
uint32_t dummy_offset;
333
400
if (needs_conversion(arg_length, cs, str_charset, &dummy_offset))
335
402
uint32_t add_length= arg_length / cs->mbminlen * str_charset->mbmaxlen;
336
403
uint32_t dummy_errors;
337
if (realloc(str_length + add_length))
404
if (realloc(str_length + add_length))
339
406
str_length+= copy_and_convert(Ptr+str_length, add_length, str_charset,
340
407
s, arg_length, cs, &dummy_errors);
344
if (realloc(str_length + arg_length))
411
if (realloc(str_length + arg_length))
346
413
memcpy(Ptr + str_length, s, arg_length);
347
414
str_length+= arg_length;
420
bool String::append(IO_CACHE* file, uint32_t arg_length)
422
if (realloc(str_length+arg_length))
424
if (my_b_read(file, (unsigned char*) Ptr + str_length, arg_length))
429
str_length+=arg_length;
353
433
bool String::append_with_prefill(const char *s,uint32_t arg_length,
354
434
uint32_t full_length, char fill_char)
459
539
memcpy(Ptr+offset,to,to_length);
460
memmove(Ptr+offset+to_length, Ptr+offset+arg_length,
461
str_length-offset-arg_length);
540
memcpy(Ptr+offset+to_length, Ptr+offset+arg_length,
541
str_length-offset-arg_length);
561
// added by Holyfoot for "geometry" needs
562
int String::reserve(uint32_t space_needed, uint32_t grow_by)
564
if (Alloced_length < str_length + space_needed)
566
if (realloc(Alloced_length + cmax(space_needed, grow_by) - 1))
572
void String::qs_append(const char *str, uint32_t len)
574
memcpy(Ptr + str_length, str, len + 1);
578
void String::qs_append(double d)
580
char *buff = Ptr + str_length;
581
str_length+= my_gcvt(d, MY_GCVT_ARG_DOUBLE, FLOATING_POINT_BUFFER - 1, buff, NULL);
584
void String::qs_append(double *d)
587
float8get(ld, (char*) d);
591
void String::qs_append(int i)
593
char *buff= Ptr + str_length;
594
char *end= int10_to_str(i, buff, -10);
595
str_length+= (int) (end-buff);
598
void String::qs_append(uint32_t i)
600
char *buff= Ptr + str_length;
601
char *end= int10_to_str(i, buff, 10);
602
str_length+= (int) (end-buff);
483
606
Compare strings according to collation, without end space.
577
700
copy_and_convert_extended(char *to, uint32_t to_length,
578
const CHARSET_INFO * const to_cs,
701
const CHARSET_INFO * const to_cs,
579
702
const char *from, uint32_t from_length,
580
703
const CHARSET_INFO * const from_cs,
581
704
uint32_t *errors)
634
757
Optimized for quick copying of ASCII characters in the range 0x00..0x7F.
637
copy_and_convert(char *to, uint32_t to_length, const CHARSET_INFO * const to_cs,
760
copy_and_convert(char *to, uint32_t to_length, const CHARSET_INFO * const to_cs,
638
761
const char *from, uint32_t from_length,
639
762
const CHARSET_INFO * const from_cs, uint32_t *errors)
698
820
are read from "src". Any sequences of bytes representing
699
821
a not-well-formed substring (according to cs) are hex-encoded,
700
822
and all well-formed substrings (according to cs) are copied as is.
701
Not more than "dstlen" bytes are written to "dst". The number
823
Not more than "dstlen" bytes are written to "dst". The number
702
824
of bytes written to "dst" is returned.
704
826
@param cs character set pointer of the destination string
705
827
@param[out] dst destination string
706
828
@param dstlen size of dst
921
str->append("\\\\", sizeof("\\\\")-1);
1043
str->append(STRING_WITH_LEN("\\\\"));
924
str->append("\\0", sizeof("\\0")-1);
1046
str->append(STRING_WITH_LEN("\\0"));
927
str->append("\\'", sizeof("\\'")-1);
1049
str->append(STRING_WITH_LEN("\\'"));
930
str->append("\\n", sizeof("\\n")-1);
1052
str->append(STRING_WITH_LEN("\\n"));
933
str->append("\\r", sizeof("\\r")-1);
1055
str->append(STRING_WITH_LEN("\\r"));
935
1057
case '\032': // Ctrl-Z
936
str->append("\\Z", sizeof("\\Z")-1);
1058
str->append(STRING_WITH_LEN("\\Z"));
945
Quote the given identifier.
946
If the given identifier is empty, it will be quoted.
950
name the identifier to be appended
951
name_length length of the appending identifier
954
/* Factor the extern out */
955
extern const CHARSET_INFO *system_charset_info, *files_charset_info;
957
void String::append_identifier(const char *name, uint32_t in_length)
959
const char *name_end;
964
The identifier must be quoted as it includes a quote character or
968
reserve(in_length*2 + 2);
969
quote_char= (char) q;
970
append("e_char, 1, system_charset_info);
972
for (name_end= name+in_length ; name < name_end ; name+= in_length)
974
unsigned char chr= (unsigned char) *name;
975
in_length= my_mbcharlen(system_charset_info, chr);
977
my_mbcharlen can return 0 on a wrong multibyte
978
sequence. It is possible when upgrading from 4.0,
979
and identifier contains some accented characters.
980
The manual says it does not work. So we'll just
981
change length to 1 not to hang in the endless loop.
985
if (in_length == 1 && chr == (unsigned char) quote_char)
986
append("e_char, 1, system_charset_info);
987
append(name, in_length, system_charset_info);
989
append("e_char, 1, system_charset_info);
994
1068
Exchange state of this object and argument.
1008
1082
std::swap(alloced, s.alloced);
1009
1083
std::swap(str_charset, s.str_charset);
1013
bool operator==(const String &s1, const String &s2)
1015
return stringcmp(&s1,&s2) == 0;
1018
bool operator!=(const String &s1, const String &s2)