~drizzle-trunk/drizzle/development

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