1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* Copyright (C) 2000 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* There may be prolems include all of theese. Try to test in
configure with ones are needed? */
/* This is needed for the definitions of strchr... on solaris */
#ifndef _m_string_h
#define _m_string_h
#include <drizzled/global.h>
#ifndef __USE_GNU
#define __USE_GNU /* We want to use my_stpcpy */
#endif
#if defined(HAVE_STRINGS_H)
#include <strings.h>
#endif
#if defined(HAVE_STRING_H)
#include <string.h>
#endif
#include <stdlib.h>
#include <stddef.h>
#include <assert.h>
#include <limits.h>
#include <ctype.h>
/* This is needed for the definitions of memcpy... on solaris */
#if defined(HAVE_MEMORY_H) && !defined(__cplusplus)
#include <memory.h>
#endif
#if defined(__cplusplus)
extern "C" {
#endif
#define strmov_overlapp(A,B) my_stpcpy(A,B)
#define strmake_overlapp(A,B,C) strmake(A,B,C)
extern void bmove_upp(unsigned char *dst,const unsigned char *src,size_t len);
extern void bchange(unsigned char *dst,size_t old_len,const unsigned char *src,
size_t new_len,size_t tot_len);
extern char *strfield(char *src,int fields,int chars,int blanks,
int tabch);
extern char *strfill(char * s,size_t len,char fill);
extern char *strkey(char *dst,char *head,char *tail,char *flags);
extern char *strmake(char *dst,const char *src,size_t length);
#ifndef strmake_overlapp
extern char *strmake_overlapp(char *dst,const char *src, size_t length);
#endif
extern char *strsuff(const char *src,const char *suffix);
extern char *strxcat(char *dst,const char *src, ...);
extern char *strxmov(char *dst,const char *src, ...);
extern char *strxcpy(char *dst,const char *src, ...);
extern char *strxncat(char *dst,size_t len, const char *src, ...);
extern char *strxncpy(char *dst,size_t len, const char *src, ...);
/* Prototypes of normal stringfunctions (with may ours) */
#ifdef WANT_STRING_PROTOTYPES
extern char *strcat(char *, const char *);
extern char *strchr(const char *, char);
extern char *strrchr(const char *, char);
extern char *strcpy(char *, const char *);
#endif
extern int is_prefix(const char *, const char *);
/* Conversion routines */
typedef enum {
MY_GCVT_ARG_FLOAT,
MY_GCVT_ARG_DOUBLE
} my_gcvt_arg_type;
double my_strtod(const char *str, char **end, int *error);
double my_atof(const char *nptr);
size_t my_fcvt(double x, int precision, char *to, bool *error);
size_t my_gcvt(double x, my_gcvt_arg_type type, int width, char *to,
bool *error);
#define NOT_FIXED_DEC (uint8_t)31
/*
The longest string my_fcvt can return is 311 + "precision" bytes.
Here we assume that we never cal my_fcvt() with precision >= NOT_FIXED_DEC
(+ 1 byte for the terminating '\0').
*/
#define FLOATING_POINT_BUFFER (311 + NOT_FIXED_DEC)
/*
We want to use the 'e' format in some cases even if we have enough space
for the 'f' one just to mimic sprintf("%.15g") behavior for large integers,
and to improve it for numbers < 10^(-4).
That is, for |x| < 1 we require |x| >= 10^(-15), and for |x| > 1 we require
it to be integer and be <= 10^DBL_DIG for the 'f' format to be used.
We don't lose precision, but make cases like "1e200" or "0.00001" look nicer.
*/
#define MAX_DECPT_FOR_F_FORMAT DBL_DIG
/*
The maximum possible field width for my_gcvt() conversion.
(DBL_DIG + 2) significant digits + sign + "." + ("e-NNN" or
MAX_DECPT_FOR_F_FORMAT zeros for cases when |x|<1 and the 'f' format is used).
*/
#define MY_GCVT_MAX_FIELD_WIDTH (DBL_DIG + 4 + cmax(5, MAX_DECPT_FOR_F_FORMAT))
extern char *llstr(int64_t value,char *buff);
extern char *ullstr(int64_t value,char *buff);
extern char *int2str(int32_t val, char *dst, int radix, int upcase);
extern char *int10_to_str(int32_t val,char *dst,int radix);
int64_t my_strtoll10(const char *nptr, char **endptr, int *error);
extern char *int64_t2str(int64_t val,char *dst,int radix);
extern char *int64_t10_to_str(int64_t val,char *dst,int radix);
#if defined(__cplusplus)
}
#endif
/**
Skip trailing space.
@param ptr pointer to the input string
@param len the length of the string
@return the last non-space character
*/
static inline const unsigned char *
skip_trailing_space(const unsigned char *ptr, size_t len)
{
const unsigned char *end= ptr + len;
while (end > ptr && isspace(*--end))
continue;
return end+1;
}
#endif
|