57
56
extern void *(*my_str_malloc)(size_t);
58
57
extern void (*my_str_free)(void *);
60
char *my_stpncpy(register char *dst, register const char *src, size_t n);
61
char *my_stpcpy(register char *dst, register const char *src);
63
#define strmov_overlapp(A,B) my_stpcpy(A,B)
59
#define strmov_overlapp(A,B) stpcpy(A,B)
64
60
#define strmake_overlapp(A,B,C) strmake(A,B,C)
66
62
extern void bmove_upp(unsigned char *dst,const unsigned char *src,size_t len);
135
136
(DBL_DIG + 2) significant digits + sign + "." + ("e-NNN" or
136
137
MAX_DECPT_FOR_F_FORMAT zeros for cases when |x|<1 and the 'f' format is used).
138
#define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + cmax(5, MAX_DECPT_FOR_F_FORMAT))
139
#define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + max(5, MAX_DECPT_FOR_F_FORMAT))
141
142
extern char *llstr(int64_t value,char *buff);
142
143
extern char *ullstr(int64_t value,char *buff);
144
extern char *int2str(int32_t val, char *dst, int radix, int upcase);
145
extern char *int10_to_str(int32_t val,char *dst,int radix);
145
extern char *int2str(long val, char *dst, int radix, int upcase);
146
extern char *int10_to_str(long val,char *dst,int radix);
146
147
extern char *str2int(const char *src,int radix,long lower,long upper,
148
149
int64_t my_strtoll10(const char *nptr, char **endptr, int *error);
150
#if SIZEOF_LONG == SIZEOF_LONG_LONG
151
#define int64_t2str(A,B,C) int2str((A),(B),(C),1)
152
#define int64_t10_to_str(A,B,C) int10_to_str((A),(B),(C))
149
154
extern char *int64_t2str(int64_t val,char *dst,int radix);
150
155
extern char *int64_t10_to_str(int64_t val,char *dst,int radix);
153
159
#if defined(__cplusplus)
164
LEX_STRING -- a pair of a C-string and its length.
168
/* This definition must match the one given in mysql/plugin.h */
169
struct st_mysql_lex_string
175
typedef struct st_mysql_lex_string LEX_STRING;
177
#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1))
178
#define USTRING_WITH_LEN(X) ((unsigned char*) X), ((size_t) (sizeof(X) - 1))
179
#define C_STRING_WITH_LEN(X) ((char *) (X)), ((size_t) (sizeof(X) - 1))
181
/* SPACE_INT is a word that contains only spaces */
183
#define SPACE_INT 0x20202020
184
#elif SIZEOF_INT == 8
185
#define SPACE_INT 0x2020202020202020
187
#error define the appropriate constant for a word full of spaces
159
191
Skip trailing space.
193
On most systems reading memory in larger chunks (ideally equal to the size of
194
the chinks that the machine physically reads from memory) causes fewer memory
195
access loops and hence increased performance.
196
This is why the 'int' type is used : it's closest to that (according to how
198
So when we determine the amount of whitespace at the end of a string we do
200
1. We divide the string into 3 zones :
201
a) from the start of the string (__start) to the first multiple
202
of sizeof(int) (__start_words)
203
b) from the end of the string (__end) to the last multiple of sizeof(int)
205
c) a zone that is aligned to sizeof(int) and can be safely accessed
207
2. We start comparing backwards from (c) char-by-char. If all we find is
208
space then we continue
209
3. If there are elements in zone (b) we compare them as unsigned ints to a
210
int mask (SPACE_INT) consisting of all spaces
211
4. Finally we compare the remaining part (a) of the string char by char.
212
This covers for the last non-space unsigned int from 3. (if any)
214
This algorithm works well for relatively larger strings, but it will slow
215
the things down for smaller strings (because of the additional calculations
216
and checks compared to the naive method). Thus the barrier of length 20
161
219
@param ptr pointer to the input string
162
220
@param len the length of the string
163
221
@return the last non-space character
166
static inline const unsigned char *
167
skip_trailing_space(const unsigned char *ptr, size_t len)
224
static inline const unsigned char *skip_trailing_space(const unsigned char *ptr,size_t len)
169
226
const unsigned char *end= ptr + len;
171
while (end > ptr && isspace(*--end))
230
const unsigned char *end_words= (const unsigned char *)(intptr_t)
231
(((uint64_t)(intptr_t)end) / SIZEOF_INT * SIZEOF_INT);
232
const unsigned char *start_words= (const unsigned char *)(intptr_t)
233
((((uint64_t)(intptr_t)ptr) + SIZEOF_INT - 1) / SIZEOF_INT * SIZEOF_INT);
235
assert(((uint64_t)(intptr_t)ptr) >= SIZEOF_INT);
238
while (end > end_words && end[-1] == 0x20)
240
if (end[-1] == 0x20 && start_words < end_words)
241
while (end > start_words && ((const unsigned *)end)[-1] == SPACE_INT)
245
while (end > ptr && end[-1] == 0x20)