m_string.h 7.79 KB
Newer Older
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1 2 3 4 5 6 7 8
/* 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; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
9
   but WITHOUT ANY WARRANTY; without even the implied warranty of
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
10 11 12 13 14 15
   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 */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

/* 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
#ifndef __USE_GNU
#define __USE_GNU				/* We want to use stpcpy */
#endif
#if defined(HAVE_STRINGS_H)
#include <strings.h>
#endif
#if defined(HAVE_STRING_H)
#include <string.h>
#endif

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
34 35 36
/* need by my_vsnprintf */
#include <stdarg.h> 

bk@work.mysql.com's avatar
bk@work.mysql.com committed
37 38 39 40 41
#ifdef _AIX
#undef HAVE_BCMP
#endif

/*  This is needed for the definitions of bzero... on solaris */
42
#if defined(HAVE_STRINGS_H)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
43 44 45 46 47 48 49 50 51 52 53
#include <strings.h>
#endif

/*  This is needed for the definitions of memcpy... on solaris */
#if defined(HAVE_MEMORY_H) && !defined(__cplusplus)
#include <memory.h>
#endif

#if !defined(HAVE_MEMCPY) && !defined(HAVE_MEMMOVE)
# define memcpy(d, s, n)	bcopy ((s), (d), (n))
# define memset(A,C,B)		bfill((A),(B),(C))
54
# define memmove(d, s, n)	bmove ((d), (s), (n))
bk@work.mysql.com's avatar
bk@work.mysql.com committed
55 56 57 58 59 60 61 62 63
#elif defined(HAVE_MEMMOVE)
# define bmove(d, s, n)		memmove((d), (s), (n))
#else
# define memmove(d, s, n)	bmove((d), (s), (n)) /* our bmove */
#endif

/* Unixware 7 */
#if !defined(HAVE_BFILL)
# define bfill(A,B,C)           memset((A),(C),(B))
64
# define bmove_align(A,B,C)    memcpy((A),(B),(C))
bk@work.mysql.com's avatar
bk@work.mysql.com committed
65 66 67 68 69 70
#endif

#if !defined(HAVE_BCMP)
# define bcopy(s, d, n)		memcpy((d), (s), (n))
# define bcmp(A,B,C)		memcmp((A),(B),(C))
# define bzero(A,B)		memset((A),0,(B))
71
# define bmove_align(A,B,C)    memcpy((A),(B),(C))
bk@work.mysql.com's avatar
bk@work.mysql.com committed
72 73
#endif

74
#if defined(__cplusplus)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
75 76 77
extern "C" {
#endif

78 79 80 81 82 83 84
/*
  my_str_malloc() and my_str_free() are assigned to implementations in
  strings/alloc.c, but can be overridden in the calling program.
 */
extern void *(*my_str_malloc)(size_t);
extern void (*my_str_free)(void *);

85
#if defined(HAVE_STPCPY)
86 87 88 89 90 91
#define strmov(A,B) stpcpy((A),(B))
#ifndef stpcpy
extern char *stpcpy(char *, const char *);	/* For AIX with gcc 2.95.3 */
#endif
#endif

92 93 94
/* Declared in int2str() */
extern char NEAR _dig_vec_upper[];
extern char NEAR _dig_vec_lower[];
bk@work.mysql.com's avatar
bk@work.mysql.com committed
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

#ifdef BAD_STRING_COMPILER
#define strmov(A,B)  (memccpy(A,B,0,INT_MAX)-1)
#else
#define strmov_overlapp(A,B) strmov(A,B)
#define strmake_overlapp(A,B,C) strmake(A,B,C)
#endif

#ifdef BAD_MEMCPY			/* Problem with gcc on Alpha */
#define memcpy_fixed(A,B,C) bmove((A),(B),(C))
#else
#define memcpy_fixed(A,B,C) memcpy((A),(B),(C))
#endif

#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512)
#define bmove512(A,B,C) memcpy(A,B,C)
#endif

	/* Prototypes for string functions */

#if !defined(bfill) && !defined(HAVE_BFILL)
extern	void bfill(gptr dst,uint len,pchar fill);
#endif

#if !defined(bzero) && !defined(HAVE_BZERO)
extern	void bzero(gptr dst,uint len);
#endif

#if !defined(bcmp) && !defined(HAVE_BCMP)
extern	int bcmp(const char *s1,const char *s2,uint len);
125
#endif
bk@work.mysql.com's avatar
bk@work.mysql.com committed
126 127
#ifdef HAVE_purify
extern	int my_bcmp(const char *s1,const char *s2,uint len);
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
128
#undef bcmp
bk@work.mysql.com's avatar
bk@work.mysql.com committed
129 130 131 132 133 134 135 136
#define bcmp(A,B,C) my_bcmp((A),(B),(C))
#endif

#ifndef bmove512
extern	void bmove512(gptr dst,const gptr src,uint len);
#endif

#if !defined(HAVE_BMOVE) && !defined(bmove)
137
extern	void bmove(char *dst, const char *src,uint len);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
138 139 140 141 142 143 144
#endif

extern	void bmove_upp(char *dst,const char *src,uint len);
extern	void bchange(char *dst,uint old_len,const char *src,
		     uint new_len,uint tot_len);
extern	void strappend(char *s,uint len,pchar fill);
extern	char *strend(const char *s);
145
extern  char *strcend(const char *, pchar);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
extern	char *strfield(char *src,int fields,int chars,int blanks,
			   int tabch);
extern	char *strfill(my_string s,uint len,pchar fill);
extern	uint strinstr(const char *str,const char *search);
extern  uint r_strinstr(reg1 my_string str,int from, reg4 my_string search);
extern	char *strkey(char *dst,char *head,char *tail,char *flags);
extern	char *strmake(char *dst,const char *src,uint length);
#ifndef strmake_overlapp
extern	char *strmake_overlapp(char *dst,const char *src, uint length);
#endif

#ifndef strmov
extern	char *strmov(char *dst,const char *src);
#endif
extern	char *strnmov(char *dst,const char *src,uint n);
extern	char *strsuff(const char *src,const char *suffix);
extern	char *strcont(const char *src,const char *set);
extern	char *strxcat _VARARGS((char *dst,const char *src, ...));
extern	char *strxmov _VARARGS((char *dst,const char *src, ...));
extern	char *strxcpy _VARARGS((char *dst,const char *src, ...));
extern	char *strxncat _VARARGS((char *dst,uint len, const char *src, ...));
extern	char *strxnmov _VARARGS((char *dst,uint len, const char *src, ...));
extern	char *strxncpy _VARARGS((char *dst,uint 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 *, pchar);
extern char *strrchr(const char *, pchar);
extern char *strcpy(char *, const char *);
extern int strcmp(const char *, const char *);
#ifndef __GNUC__
extern size_t strlen(const char *);
#endif
#endif
serg@serg.mylan's avatar
serg@serg.mylan committed
182
#ifndef HAVE_STRNLEN
bk@work.mysql.com's avatar
bk@work.mysql.com committed
183 184 185 186 187 188 189 190 191 192 193 194 195
extern uint strnlen(const char *s, uint n);
#endif

#if !defined(__cplusplus)
#ifndef HAVE_STRPBRK
extern char *strpbrk(const char *, const char *);
#endif
#ifndef HAVE_STRSTR
extern char *strstr(const char *, const char *);
#endif
#endif
extern int is_prefix(const char *, const char *);

serg@serg.mylan's avatar
serg@serg.mylan committed
196
/* Conversion routines */
197
double my_strtod(const char *str, char **end, int *error);
serg@serg.mylan's avatar
serg@serg.mylan committed
198
double my_atof(const char *nptr);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
199 200 201 202 203 204 205

extern char *llstr(longlong value,char *buff);
#ifndef HAVE_STRTOUL
extern long strtol(const char *str, char **ptr, int base);
extern ulong strtoul(const char *str, char **ptr, int base);
#endif

206
extern char *int2str(long val, char *dst, int radix, int upcase);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
207 208 209
extern char *int10_to_str(long val,char *dst,int radix);
extern char *str2int(const char *src,int radix,long lower,long upper,
			 long *val);
210
longlong my_strtoll10(const char *nptr, char **endptr, int *error);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
211
#if SIZEOF_LONG == SIZEOF_LONG_LONG
212
#define longlong2str(A,B,C) int2str((A),(B),(C),1)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
213
#define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C))
214
#undef strtoll
bk@work.mysql.com's avatar
bk@work.mysql.com committed
215 216 217 218 219
#define strtoll(A,B,C) strtol((A),(B),(C))
#define strtoull(A,B,C) strtoul((A),(B),(C))
#ifndef HAVE_STRTOULL
#define HAVE_STRTOULL
#endif
220 221 222
#ifndef HAVE_STRTOLL
#define HAVE_STRTOLL
#endif
bk@work.mysql.com's avatar
bk@work.mysql.com committed
223 224 225 226
#else
#ifdef HAVE_LONG_LONG
extern char *longlong2str(longlong val,char *dst,int radix);
extern char *longlong10_to_str(longlong val,char *dst,int radix);
petr@mysql.com's avatar
petr@mysql.com committed
227
#if (!defined(HAVE_STRTOULL) || defined(NO_STRTOLL_PROTO))
bk@work.mysql.com's avatar
bk@work.mysql.com committed
228 229 230 231 232 233
extern longlong strtoll(const char *str, char **ptr, int base);
extern ulonglong strtoull(const char *str, char **ptr, int base);
#endif
#endif
#endif

234 235 236 237 238 239
/* my_vsnprintf.c */

extern int my_vsnprintf( char *str, size_t n,
                                const char *format, va_list ap );
extern int my_snprintf(char* to, size_t n, const char* fmt, ...);

240
#if defined(__cplusplus)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
241 242
}
#endif
243

244 245 246 247 248 249 250
/*
  LEX_STRING -- a pair of a C-string and its length.

  NOTE: this exactly form of declaration is required for some C-compilers
  (for one, Sun C 5.7 2005/01/07). Unfortunatelt with such declaration
  LEX_STRING can not be forward declared.
*/
251

252
typedef struct
253 254 255
{
  char *str;
  uint length;
256
} LEX_STRING;
257 258

#define STRING_WITH_LEN(X) (X), ((uint) (sizeof(X) - 1))
259
#define C_STRING_WITH_LEN(X) ((char *) (X)), ((uint) (sizeof(X) - 1))
260

bk@work.mysql.com's avatar
bk@work.mysql.com committed
261
#endif