~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-2003 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/* This is the include file that should be included 'first' in every C file. */
17
18
#ifndef _global_h
19
#define _global_h
20
21
#define HAVE_REPLICATION
22
#define HAVE_EXTERNAL_CLIENT
23
24
/*
25
  InnoDB depends on some MySQL internals which other plugins should not
26
  need.  This is because of InnoDB's foreign key support, "safe" binlog
27
  truncation, and other similar legacy features.
28
29
  We define accessors for these internals unconditionally, but do not
30
  expose them in mysql/plugin.h.  They are declared in ha_innodb.h for
31
  InnoDB's use.
32
*/
33
#define INNODB_COMPATIBILITY_HOOKS
34
35
/* to make command line shorter we'll define USE_PRAGMA_INTERFACE here */
36
#ifdef USE_PRAGMA_IMPLEMENTATION
37
#define USE_PRAGMA_INTERFACE
38
#endif
39
40
#if defined(i386) && !defined(__i386__)
41
#define __i386__
42
#endif
43
44
/* Macros to make switching between C and C++ mode easier */
45
#ifdef __cplusplus
46
#define C_MODE_START    extern "C" {
47
#define C_MODE_END	}
48
#else
49
#define C_MODE_START
50
#define C_MODE_END
51
#endif
52
77.1.17 by Monty Taylor
Removed the my_config.h copy of config.h nonsense. Not only stupid, but breaks
53
#include <config.h>
1 by brian
clean slate
54
#if defined(__cplusplus) && defined(inline)
55
#undef inline				/* fix configure problem */
56
#endif
57
58
/* Make it easier to add conditionl code for windows */
59
#define IF_WIN(A,B) (B)
60
61
/* Some defines to avoid ifdefs in the code */
62
#ifndef NETWARE_YIELD
63
#define NETWARE_YIELD
64
#define NETWARE_SET_SCREEN_MODE(A)
65
#endif
66
67
68
/*
69
  The macros below are borrowed from include/linux/compiler.h in the
70
  Linux kernel. Use them to indicate the likelyhood of the truthfulness
71
  of a condition. This serves two purposes - newer versions of gcc will be
72
  able to optimize for branch predication, which could yield siginficant
73
  performance gains in frequently executed sections of the code, and the
74
  other reason to use them is for documentation
75
*/
76
77
#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
78
#define __builtin_expect(x, expected_value) (x)
79
#endif
80
81
#define likely(x)	__builtin_expect((x),1)
82
#define unlikely(x)	__builtin_expect((x),0)
83
84
85
/*
86
  The macros below are useful in optimising places where it has been
87
  discovered that cache misses stall the process and where a prefetch
88
  of the cache line can improve matters. This is available in GCC 3.1.1
89
  and later versions.
90
  PREFETCH_READ says that addr is going to be used for reading and that
91
  it is to be kept in caches if possible for a while
92
  PREFETCH_WRITE also says that the item to be cached is likely to be
93
  updated.
94
  The *LOCALITY scripts are also available for experimentation purposes
95
  mostly and should only be used if they are verified to improve matters.
96
  For more input see GCC manual (available in GCC 3.1.1 and later)
97
*/
98
99
#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10)
100
#define PREFETCH_READ(addr) __builtin_prefetch(addr, 0, 3)
101
#define PREFETCH_WRITE(addr) \
102
  __builtin_prefetch(addr, 1, 3)
103
#define PREFETCH_READ_LOCALITY(addr, locality) \
104
  __builtin_prefetch(addr, 0, locality)
105
#define PREFETCH_WRITE_LOCALITY(addr, locality) \
106
  __builtin_prefetch(addr, 1, locality)
107
#else
108
#define PREFETCH_READ(addr)
109
#define PREFETCH_READ_LOCALITY(addr, locality)
110
#define PREFETCH_WRITE(addr)
111
#define PREFETCH_WRITE_LOCALITY(addr, locality)
112
#endif
113
114
/*
115
  The following macro is used to ensure that code often used in most
116
  SQL statements and definitely for parts of the SQL processing are
117
  kept in a code segment by itself. This has the advantage that the
118
  risk of common code being overlapping in caches of the CPU is less.
119
  This can be a cause of big performance problems.
120
  Routines should be put in this category with care and when they are
121
  put there one should also strive to make as much of the error handling
122
  as possible (or uncommon code of the routine) to execute in a
123
  separate method to avoid moving to much code to this code segment.
124
125
  It is very easy to use, simply add HOT_METHOD at the end of the
126
  function declaration.
127
  For more input see GCC manual (available in GCC 2.95 and later)
128
*/
129
130
#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94)
131
#define HOT_METHOD \
132
  __attribute__ ((section ("hot_code_section")))
133
#else
134
#define HOT_METHOD
135
#endif
136
137
/*
138
  The following macro is used to ensure that popular global variables
139
  are located next to each other to avoid that they contend for the
140
  same cache lines.
141
142
  It is very easy to use, simply add HOT_DATA at the end of the declaration
143
  of the variable, the variable must be initialised because of the way
144
  that linker works so a declaration using HOT_DATA should look like:
145
  uint global_hot_data HOT_DATA = 0;
146
  For more input see GCC manual (available in GCC 2.95 and later)
147
*/
148
149
#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR > 94)
150
#define HOT_DATA \
151
  __attribute__ ((section ("hot_data_section")))
152
#else
153
#define HOT_DATA
154
#endif
155
156
/*
157
  now let's figure out if inline functions are supported
158
  autoconf defines 'inline' to be empty, if not
159
*/
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
160
#if defined(inline)
1 by brian
clean slate
161
#define HAVE_INLINE
162
#endif
163
/* helper macro for "instantiating" inline functions */
164
#define STATIC_INLINE static inline
165
166
/*
167
  The following macros are used to control inlining a bit more than
168
  usual. These macros are used to ensure that inlining always or
169
  never occurs (independent of compilation mode).
170
  For more input see GCC manual (available in GCC 3.1.1 and later)
171
*/
172
173
#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10)
174
#define ALWAYS_INLINE __attribute__ ((always_inline))
175
#define NEVER_INLINE __attribute__ ((noinline))
176
#else
177
#define ALWAYS_INLINE
178
#define NEVER_INLINE
179
#endif
180
181
182
/* Fix problem with S_ISLNK() on Linux */
183
#if defined(TARGET_OS_LINUX) || defined(__GLIBC__)
184
#undef  _GNU_SOURCE
185
#define _GNU_SOURCE 1
186
#endif
187
188
/*
189
  Temporary solution to solve bug#7156. Include "sys/types.h" before
190
  the thread headers, else the function madvise() will not be defined
191
*/
192
#if defined(HAVE_SYS_TYPES_H) && ( defined(sun) || defined(__sun) )
193
#include <sys/types.h>
194
#endif
195
196
#ifdef HAVE_THREADS_WITHOUT_SOCKETS
197
/* MIT pthreads does not work with unix sockets */
198
#undef HAVE_SYS_UN_H
199
#endif
200
201
#define __EXTENSIONS__ 1	/* We want some extension */
202
#ifndef __STDC_EXT__
203
#define __STDC_EXT__ 1          /* To get large file support on hpux */
204
#endif
205
206
/*
207
  Solaris 9 include file <sys/feature_tests.h> refers to X/Open document
208
209
    System Interfaces and Headers, Issue 5
210
211
  saying we should define _XOPEN_SOURCE=500 to get POSIX.1c prototypes,
212
  but apparently other systems (namely FreeBSD) don't agree.
213
214
  On a newer Solaris 10, the above file recognizes also _XOPEN_SOURCE=600.
215
  Furthermore, it tests that if a program requires older standard
216
  (_XOPEN_SOURCE<600 or _POSIX_C_SOURCE<200112L) it cannot be
217
  run on a new compiler (that defines _STDC_C99) and issues an #error.
218
  It's also an #error if a program requires new standard (_XOPEN_SOURCE=600
219
  or _POSIX_C_SOURCE=200112L) and a compiler does not define _STDC_C99.
220
221
  To add more to this mess, Sun Studio C compiler defines _STDC_C99 while
222
  C++ compiler does not!
223
224
  So, in a desperate attempt to get correct prototypes for both
225
  C and C++ code, we define either _XOPEN_SOURCE=600 or _XOPEN_SOURCE=500
226
  depending on the compiler's announced C standard support.
227
228
  Cleaner solutions are welcome.
229
*/
230
#ifdef __sun
231
#if __STDC_VERSION__ - 0 >= 199901L
232
#define _XOPEN_SOURCE 600
233
#else
234
#define _XOPEN_SOURCE 500
235
#endif
236
#endif
237
238
#ifndef _POSIX_PTHREAD_SEMANTICS
239
#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */
240
#endif
241
242
#define _REENTRANT	1	/* Some thread libraries require this */
243
244
#if !defined(_THREAD_SAFE) && !defined(_AIX)
245
#define _THREAD_SAFE            /* Required for OSF1 */
246
#endif
247
248
#include <pthread.h>		/* AIX must have this included first */
249
250
#define _REENTRANT	1	/* Threads requires reentrant code */
251
252
/* Go around some bugs in different OS and compilers */
253
254
#if defined(HAVE_BROKEN_INLINE) && !defined(__cplusplus)
255
#undef inline
256
#define inline
257
#endif
258
259
/* gcc/egcs issues */
260
261
#if defined(__GNUC) && defined(__EXCEPTIONS)
262
#error "Please add -fno-exceptions to CXXFLAGS and reconfigure/recompile"
263
#endif
264
265
#ifndef stdin
266
#include <stdio.h>
267
#endif
268
#ifdef HAVE_STDLIB_H
269
#include <stdlib.h>
270
#endif
271
#ifdef HAVE_STDDEF_H
272
#include <stddef.h>
273
#endif
274
275
#include <math.h>
276
#ifdef HAVE_LIMITS_H
277
#include <limits.h>
278
#endif
279
#ifdef HAVE_FLOAT_H
280
#include <float.h>
281
#endif
282
283
#ifdef HAVE_SYS_TYPES_H
284
#include <sys/types.h>
285
#endif
286
#ifdef HAVE_FCNTL_H
287
#include <fcntl.h>
288
#endif
289
#ifdef HAVE_SYS_TIMEB_H
290
#include <sys/timeb.h>				/* Avoid warnings on SCO */
291
#endif
292
#if TIME_WITH_SYS_TIME
293
# include <sys/time.h>
294
# include <time.h>
295
#else
296
# if HAVE_SYS_TIME_H
297
#  include <sys/time.h>
298
# else
299
#  include <time.h>
300
# endif
301
#endif /* TIME_WITH_SYS_TIME */
302
#ifdef HAVE_UNISTD_H
303
#include <unistd.h>
304
#endif
305
#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA)
306
#undef HAVE_ALLOCA
307
#undef HAVE_ALLOCA_H
308
#endif
309
#ifdef HAVE_ALLOCA_H
310
#include <alloca.h>
311
#endif
312
313
#include <errno.h>				/* Recommended by debian */
314
/* We need the following to go around a problem with openssl on solaris */
315
#if defined(HAVE_CRYPT_H)
316
#include <crypt.h>
317
#endif
318
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
319
#if defined(HAVE_STDINT_H)
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
320
/* We are mixing C and C++, so we wan the C limit macros in the C++ too */
321
#define __STDC_LIMIT_MACROS
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
322
#include <stdint.h>
323
#endif
324
#if defined(HAVE_STDBOOL_H)
325
#include <stdbool.h>
326
#endif
327
328
1 by brian
clean slate
329
/*
330
  A lot of our programs uses asserts, so better to always include it
331
  This also fixes a problem when people uses DBUG_ASSERT without including
332
  assert.h
333
*/
334
#include <assert.h>
335
336
/* an assert that works at compile-time. only for constant expression */
337
#ifndef __GNUC__
338
#define compile_time_assert(X)  do { } while(0)
339
#else
340
#define compile_time_assert(X)                                  \
341
  do                                                            \
342
  {                                                             \
343
    char compile_time_assert[(X) ? 1 : -1]                      \
344
                             __attribute__ ((unused));          \
345
  } while(0)
346
#endif
347
348
/* Declare madvise where it is not declared for C++, like Solaris */
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
349
#if HAVE_MADVISE && !defined(HAVE_DECL_MADVISE) && defined(__cplusplus)
1 by brian
clean slate
350
extern "C" int madvise(void *addr, size_t len, int behav);
351
#endif
352
353
/* We can not live without the following defines */
354
355
#define USE_MYFUNC 1		/* Must use syscall indirection */
356
#define MASTER 1		/* Compile without unireg */
357
#define ENGLISH 1		/* Messages in English */
358
#define POSIX_MISTAKE 1		/* regexp: Fix stupid spec error */
359
#define USE_REGEX 1		/* We want the use the regex library */
360
/* Do not define for ultra sparcs */
361
#define USE_BMOVE512 1		/* Use this unless system bmove is faster */
362
363
#define QUOTE_ARG(x)		#x	/* Quote argument (before cpp) */
364
#define STRINGIFY_ARG(x) QUOTE_ARG(x)	/* Quote argument, after cpp */
365
/* Does the system remember a signal handler after a signal ? */
366
#ifndef HAVE_BSD_SIGNALS
367
#define DONT_REMEMBER_SIGNAL
368
#endif
369
370
/* Define void to stop lint from generating "null effekt" comments */
371
#ifndef DONT_DEFINE_VOID
372
#ifdef _lint
373
int	__void__;
374
#define VOID(X)		(__void__ = (int) (X))
375
#else
376
#undef VOID
377
#define VOID(X)		(X)
378
#endif
379
#endif /* DONT_DEFINE_VOID */
380
381
#if !defined(HAVE_UINT)
382
#undef HAVE_UINT
383
#define HAVE_UINT
384
typedef unsigned int uint;
385
typedef unsigned short ushort;
386
#endif
387
388
#define CMP_NUM(a,b)    (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1)
389
#define sgn(a)		(((a) < 0) ? -1 : ((a) > 0) ? 1 : 0)
390
#define swap_variables(t, a, b) { register t dummy; dummy= a; a= b; b= dummy; }
391
#define test(a)		((a) ? 1 : 0)
392
#define set_if_bigger(a,b)  do { if ((a) < (b)) (a)=(b); } while(0)
393
#define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0)
394
#define test_all_bits(a,b) (((a) & (b)) == (b))
395
#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
396
#define array_elements(A) ((uint32_t) (sizeof(A)/sizeof(A[0])))
1 by brian
clean slate
397
#ifndef HAVE_RINT
398
#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
399
#endif
400
401
/* Define some general constants */
402
#ifndef TRUE
403
#define TRUE		(1)	/* Logical true */
404
#define FALSE		(0)	/* Logical false */
405
#endif
406
407
#if defined(__GNUC__)
408
#define function_volatile	volatile
409
#define my_reinterpret_cast(A) reinterpret_cast<A>
410
#define my_const_cast(A) const_cast<A>
411
# ifndef GCC_VERSION
412
#  define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
413
# endif
414
#elif !defined(my_reinterpret_cast)
415
#define my_reinterpret_cast(A) (A)
416
#define my_const_cast(A) (A)
417
#endif
418
419
#include <my_attribute.h>
420
421
/* From old s-system.h */
422
423
/*
424
  Support macros for non ansi & other old compilers. Since such
425
  things are no longer supported we do nothing. We keep then since
426
  some of our code may still be needed to upgrade old customers.
427
*/
428
#define _VARARGS(X) X
429
#define _STATIC_VARARGS(X) X
430
#define _PC(X)	X
431
432
/* The DBUG_ON flag always takes precedence over default DBUG_OFF */
433
#if defined(DBUG_ON) && defined(DBUG_OFF)
434
#undef DBUG_OFF
435
#endif
436
437
/* We might be forced to turn debug off, if not turned off already */
438
#if (defined(FORCE_DBUG_OFF) || defined(_lint)) && !defined(DBUG_OFF)
439
#  define DBUG_OFF
440
#  ifdef DBUG_ON
441
#    undef DBUG_ON
442
#  endif
443
#endif
444
445
#include <my_dbug.h>
446
447
#define MIN_ARRAY_SIZE	0	/* Zero or One. Gcc allows zero*/
448
#define ASCII_BITS_USED 8	/* Bit char used */
449
450
/* Some types that is different between systems */
451
452
typedef int	File;		/* File descriptor */
453
#ifndef Socket_defined
454
typedef int	my_socket;	/* File descriptor for sockets */
455
#define INVALID_SOCKET -1
456
#endif
457
/* Type for fuctions that handles signals */
458
#define sig_handler RETSIGTYPE
459
C_MODE_START
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
460
typedef void	(*sig_return)(void);/* Returns type from signal */
1 by brian
clean slate
461
C_MODE_END
462
#if defined(__GNUC__) && !defined(_lint)
463
typedef char	pchar;		/* Mixed prototypes can take char */
464
typedef char	puchar;		/* Mixed prototypes can take char */
465
typedef char	pbool;		/* Mixed prototypes can take char */
466
typedef short	pshort;		/* Mixed prototypes can take short int */
467
typedef float	pfloat;		/* Mixed prototypes can take float */
468
#else
469
typedef int	pchar;		/* Mixed prototypes can't take char */
470
typedef uint	puchar;		/* Mixed prototypes can't take char */
471
typedef int	pbool;		/* Mixed prototypes can't take char */
472
typedef int	pshort;		/* Mixed prototypes can't take short int */
473
typedef double	pfloat;		/* Mixed prototypes can't take float */
474
#endif
475
C_MODE_START
476
typedef int	(*qsort_cmp)(const void *,const void *);
477
typedef int	(*qsort_cmp2)(void*, const void *,const void *);
478
C_MODE_END
479
#define qsort_t RETQSORTTYPE	/* Broken GCC cant handle typedef !!!! */
480
#ifdef HAVE_SYS_SOCKET_H
481
#include <sys/socket.h>
482
#endif
483
typedef SOCKET_SIZE_TYPE size_socket;
484
485
#ifndef SOCKOPT_OPTLEN_TYPE
486
#define SOCKOPT_OPTLEN_TYPE size_socket
487
#endif
488
489
/* file create flags */
490
491
#ifndef O_SHARE			/* Probably not windows */
492
#define O_SHARE		0	/* Flag to my_open for shared files */
493
#ifndef O_BINARY
494
#define O_BINARY	0	/* Flag to my_open for binary files */
495
#endif
496
#ifndef FILE_BINARY
497
#define FILE_BINARY	O_BINARY /* Flag to my_fopen for binary streams */
498
#endif
499
#ifdef HAVE_FCNTL
500
#define HAVE_FCNTL_LOCK
501
#define F_TO_EOF	0L	/* Param to lockf() to lock rest of file */
502
#endif
503
#endif /* O_SHARE */
504
505
#ifndef O_TEMPORARY
506
#define O_TEMPORARY	0
507
#endif
508
#ifndef O_SHORT_LIVED
509
#define O_SHORT_LIVED	0
510
#endif
511
#ifndef O_NOFOLLOW
512
#define O_NOFOLLOW      0
513
#endif
514
515
/* #define USE_RECORD_LOCK	*/
516
517
	/* Unsigned types supported by the compiler */
518
#define UNSINT8			/* unsigned int8 (char) */
519
#define UNSINT16		/* unsigned int16 */
520
#define UNSINT32		/* unsigned int32 */
521
522
	/* General constants */
523
#define SC_MAXWIDTH	256	/* Max width of screen (for error messages) */
524
#define FN_LEN		256	/* Max file name len */
525
#define FN_HEADLEN	253	/* Max length of filepart of file name */
526
#define FN_EXTLEN	20	/* Max length of extension (part of FN_LEN) */
527
#define FN_REFLEN	512	/* Max length of full path-name */
528
#define FN_EXTCHAR	'.'
529
#define FN_HOMELIB	'~'	/* ~/ is used as abbrev for home dir */
530
#define FN_CURLIB	'.'	/* ./ is used as abbrev for current dir */
531
#define FN_PARENTDIR	".."	/* Parent directory; Must be a string */
532
533
#ifndef FN_LIBCHAR
534
#define FN_LIBCHAR	'/'
535
#define FN_ROOTDIR	"/"
536
#endif
537
#define MY_NFILE	64	/* This is only used to save filenames */
538
#ifndef OS_FILE_LIMIT
539
#define OS_FILE_LIMIT	65535
540
#endif
541
542
/* #define EXT_IN_LIBNAME     */
543
/* #define FN_NO_CASE_SENCE   */
544
/* #define FN_UPPER_CASE TRUE */
545
546
/*
547
  Io buffer size; Must be a power of 2 and a multiple of 512. May be
548
  smaller what the disk page size. This influences the speed of the
549
  isam btree library. eg to big to slow.
550
*/
551
#define IO_SIZE			4096
552
/*
553
  How much overhead does malloc have. The code often allocates
554
  something like 1024-MALLOC_OVERHEAD bytes
555
*/
556
#define MALLOC_OVERHEAD 8
557
558
	/* get memory in huncs */
559
#define ONCE_ALLOC_INIT		(uint) (4096-MALLOC_OVERHEAD)
560
	/* Typical record cash */
561
#define RECORD_CACHE_SIZE	(uint) (64*1024-MALLOC_OVERHEAD)
562
	/* Typical key cash */
563
#define KEY_CACHE_SIZE		(uint) (8*1024*1024-MALLOC_OVERHEAD)
564
	/* Default size of a key cache block  */
565
#define KEY_CACHE_BLOCK_SIZE	(uint) 1024
566
567
568
	/* Some things that this system doesn't have */
569
570
#define NO_HASH			/* Not needed anymore */
571
572
/* Some defines of functions for portability */
573
574
#undef remove		/* Crashes MySQL on SCO 5.0.0 */
575
#define closesocket(A)	close(A)
576
#ifndef ulonglong2double
577
#define ulonglong2double(A) ((double) (ulonglong) (A))
578
#define my_off_t2double(A)  ((double) (my_off_t) (A))
579
#endif
580
581
#ifndef offsetof
582
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
583
#endif
584
#define ulong_to_double(X) ((double) (ulong) (X))
585
#define SET_STACK_SIZE(X)	/* Not needed on real machines */
586
587
#ifndef STACK_DIRECTION
588
#error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS"
589
#endif
590
591
#if !defined(HAVE_STRTOK_R)
592
#define strtok_r(A,B,C) strtok((A),(B))
593
#endif
594
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
595
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
596
#if defined(INT64_MAX)
597
#define LONGLONG_MAX INT64_MAX
598
#endif
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
599
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
600
#if defined(INT64_MIN)
601
#define LONGLONG_MIN INT64_MIN
602
#endif
1 by brian
clean slate
603
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
604
#if !defined(ULONGLONG_MAX)
1 by brian
clean slate
605
/* First check for ANSI C99 definition: */
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
606
#if defined(UINT64_MAX)
607
#define ULONGLONG_MAX  UINT64_MAX
1 by brian
clean slate
608
#else
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
609
#define ULONGLONG_MAX ((uint64_t)(~0ULL))
1 by brian
clean slate
610
#endif
53.2.31 by Monty Taylor
Removed HAVE_LONG_LONG, as this is now assumed.
611
#endif /* !defined(ULONGLONG_MAX)*/
1 by brian
clean slate
612
613
#define INT_MIN32       (~0x7FFFFFFFL)
614
#define INT_MAX32       0x7FFFFFFFL
615
#define UINT_MAX32      0xFFFFFFFFL
616
#define INT_MIN24       (~0x007FFFFF)
617
#define INT_MAX24       0x007FFFFF
618
#define UINT_MAX24      0x00FFFFFF
619
#define INT_MIN16       (~0x7FFF)
620
#define INT_MAX16       0x7FFF
621
#define UINT_MAX16      0xFFFF
622
#define INT_MIN8        (~0x7F)
623
#define INT_MAX8        0x7F
624
#define UINT_MAX8       0xFF
625
626
/* From limits.h instead */
627
#ifndef DBL_MIN
628
#define DBL_MIN		4.94065645841246544e-324
629
#define FLT_MIN		((float)1.40129846432481707e-45)
630
#endif
631
#ifndef DBL_MAX
632
#define DBL_MAX		1.79769313486231470e+308
633
#define FLT_MAX		((float)3.40282346638528860e+38)
634
#endif
635
#ifndef SIZE_T_MAX
636
#define SIZE_T_MAX ~((size_t) 0)
637
#endif
638
639
#ifndef isfinite
640
#ifdef HAVE_FINITE
641
#define isfinite(x) finite(x)
642
#else
643
#define finite(x) (1.0 / fabs(x) > 0.0)
644
#endif /* HAVE_FINITE */
645
#endif /* isfinite */
646
647
#ifndef HAVE_ISNAN
648
#define isnan(x) ((x) != (x))
649
#endif
650
651
#ifdef HAVE_ISINF
652
/* isinf() can be used in both C and C++ code */
653
#define my_isinf(X) isinf(X)
654
#else
655
#define my_isinf(X) (!isfinite(X) && !isnan(X))
656
#endif
657
658
/* Define missing math constants. */
659
#ifndef M_PI
660
#define M_PI 3.14159265358979323846
661
#endif
662
#ifndef M_E
663
#define M_E 2.7182818284590452354
664
#endif
665
#ifndef M_LN2
666
#define M_LN2 0.69314718055994530942
667
#endif
668
669
/*
670
  Max size that must be added to a so that we know Size to make
671
  adressable obj.
672
*/
673
#if SIZEOF_CHARP == 4
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
674
typedef int32_t		my_ptrdiff_t;
1 by brian
clean slate
675
#else
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
676
typedef int64_t 	my_ptrdiff_t;
1 by brian
clean slate
677
#endif
678
679
#define MY_ALIGN(A,L)	(((A) + (L) - 1) & ~((L) - 1))
680
#define ALIGN_SIZE(A)	MY_ALIGN((A),sizeof(double))
681
/* Size to make adressable obj. */
682
#define ALIGN_PTR(A, t) ((t*) MY_ALIGN((A),sizeof(t)))
683
			 /* Offset of field f in structure t */
684
#define OFFSET(t, f)	((size_t)(char *)&((t *)0)->f)
685
#define ADD_TO_PTR(ptr,size,type) (type) ((uchar*) (ptr)+size)
686
#define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((uchar*) (A) - (uchar*) (B))
687
688
#define MY_DIV_UP(A, B) (((A) + (B) - 1) / (B))
689
#define MY_ALIGNED_BYTE_ARRAY(N, S, T) T N[MY_DIV_UP(S, sizeof(T))]
690
691
/*
692
  Custom version of standard offsetof() macro which can be used to get
693
  offsets of members in class for non-POD types (according to the current
694
  version of C++ standard offsetof() macro can't be used in such cases and
695
  attempt to do so causes warnings to be emitted, OTOH in many cases it is
696
  still OK to assume that all instances of the class has the same offsets
697
  for the same members).
698
699
  This is temporary solution which should be removed once File_parser class
700
  and related routines are refactored.
701
*/
702
703
#define my_offsetof(TYPE, MEMBER) \
704
        ((size_t)((char *)&(((TYPE *)0x10)->MEMBER) - (char*)0x10))
705
706
#define NullS		(char *) 0
707
708
#define STDCALL
709
710
/* Typdefs for easyier portability */
711
712
#ifndef HAVE_UCHAR
713
typedef unsigned char	uchar;	/* Short for unsigned char */
714
#endif
715
716
#ifndef HAVE_INT8
717
typedef signed char int8;       /* Signed integer >= 8  bits */
718
#endif
719
#ifndef HAVE_UINT8
720
typedef unsigned char uint8;    /* Unsigned integer >= 8  bits */
721
#endif
722
#ifndef HAVE_INT16
723
typedef short int16;
724
#endif
725
#ifndef HAVE_UINT16
726
typedef unsigned short uint16;
727
#endif
728
#if SIZEOF_INT == 4
729
#ifndef HAVE_INT32
730
typedef int int32;
731
#endif
732
#ifndef HAVE_UINT32
733
typedef unsigned int uint32;
734
#endif
735
#elif SIZEOF_LONG == 4
736
#ifndef HAVE_INT32
737
typedef long int32;
738
#endif
739
#ifndef HAVE_UINT32
740
typedef unsigned long uint32;
741
#endif
742
#else
743
#error Neither int or long is of 4 bytes width
744
#endif
745
746
#if !defined(HAVE_ULONG) && !defined(__USE_MISC)
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
747
typedef uint32_t	ulong;		  /* Short for unsigned long */
1 by brian
clean slate
748
#endif
749
#ifndef longlong_defined
750
/* 
751
  Using [unsigned] long long is preferable as [u]longlong because we use 
752
  [unsigned] long long unconditionally in many places, 
753
  for example in constants with [U]LL suffix.
754
*/
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
755
typedef uint64_t ulonglong; /* ulong or unsigned long long */
756
typedef int64_t	longlong;
757
#endif
758
1 by brian
clean slate
759
#ifndef HAVE_INT64
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
760
typedef int64_t int64;
1 by brian
clean slate
761
#endif
762
#ifndef HAVE_UINT64
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
763
typedef uint64_t uint64;
1 by brian
clean slate
764
#endif
765
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
766
typedef uint64_t my_ulonglong;
1 by brian
clean slate
767
768
#if SIZEOF_CHARP == SIZEOF_INT
769
typedef int intptr;
770
#elif SIZEOF_CHARP == SIZEOF_LONG
771
typedef long intptr;
772
#elif SIZEOF_CHARP == SIZEOF_LONG_LONG
773
typedef long long intptr;
774
#else
775
#error sizeof(void *) is neither sizeof(int) nor sizeof(long) nor sizeof(long long)
776
#endif
777
778
#define MY_ERRPTR ((void*)(intptr)1)
779
780
#if SIZEOF_OFF_T > 4
781
typedef ulonglong my_off_t;
782
#else
783
typedef unsigned long my_off_t;
784
#endif
785
#define MY_FILEPOS_ERROR	(~(my_off_t) 0)
786
787
typedef off_t os_off_t;
788
789
#define socket_errno	errno
790
#define closesocket(A)	close(A)
791
#define SOCKET_EINTR	EINTR
792
#define SOCKET_EAGAIN	EAGAIN
793
#define SOCKET_ETIMEDOUT SOCKET_EINTR
794
#define SOCKET_EWOULDBLOCK EWOULDBLOCK
795
#define SOCKET_EADDRINUSE EADDRINUSE
796
#define SOCKET_ENFILE	ENFILE
797
#define SOCKET_EMFILE	EMFILE
798
799
typedef uint8		int7;	/* Most effective integer 0 <= x <= 127 */
800
typedef short		int15;	/* Most effective integer 0 <= x <= 32767 */
801
typedef int		myf;	/* Type of MyFlags in my_funcs */
802
typedef char		my_bool; /* Small bool */
803
#if !defined(bool) && (!defined(HAVE_BOOL) || !defined(__cplusplus))
804
typedef char		bool;	/* Ordinary boolean values 0 1 */
805
#endif
806
	/* Macros for converting *constants* to the right type */
807
#define INT8(v)		(int8) (v)
808
#define INT16(v)	(int16) (v)
809
#define INT32(v)	(int32) (v)
810
#define MYF(v)		(myf) (v)
811
812
#ifndef LL
813
#define LL(A) A ## L
814
#endif
815
816
#ifndef ULL
817
#define ULL(A) A ## UL
818
#endif
819
820
/*
821
  Sometimes we want to make sure that the variable is not put into
822
  a register in debugging mode so we can see its value in the core
823
*/
824
825
#ifndef DBUG_OFF
826
#define dbug_volatile volatile
827
#else
828
#define dbug_volatile
829
#endif
830
831
/* Defines for time function */
832
#define SCALE_SEC	100
833
#define SCALE_USEC	10000
834
#define MY_HOW_OFTEN_TO_ALARM	2	/* How often we want info on screen */
835
#define MY_HOW_OFTEN_TO_WRITE	1000	/* How often we want info on screen */
836
837
838
839
/*
840
  Define-funktions for reading and storing in machine independent format
841
  (low byte first)
842
*/
843
844
/* Optimized store functions for Intel x86 */
845
#if defined(__i386__)
846
#define sint2korr(A)	(*((int16 *) (A)))
847
#define sint3korr(A)	((int32) ((((uchar) (A)[2]) & 128) ? \
848
				  (((uint32) 255L << 24) | \
849
				   (((uint32) (uchar) (A)[2]) << 16) |\
850
				   (((uint32) (uchar) (A)[1]) << 8) | \
851
				   ((uint32) (uchar) (A)[0])) : \
852
				  (((uint32) (uchar) (A)[2]) << 16) |\
853
				  (((uint32) (uchar) (A)[1]) << 8) | \
854
				  ((uint32) (uchar) (A)[0])))
855
#define sint4korr(A)	(*((long *) (A)))
856
#define uint2korr(A)	(*((uint16 *) (A)))
857
#if defined(HAVE_purify)
858
#define uint3korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
859
				  (((uint32) ((uchar) (A)[1])) << 8) +\
860
				  (((uint32) ((uchar) (A)[2])) << 16))
861
#else
862
/*
863
   ATTENTION !
864
   
865
    Please, note, uint3korr reads 4 bytes (not 3) !
866
    It means, that you have to provide enough allocated space !
867
*/
868
#define uint3korr(A)	(long) (*((unsigned int *) (A)) & 0xFFFFFF)
869
#endif /* HAVE_purify */
870
#define uint4korr(A)	(*((uint32 *) (A)))
871
#define uint5korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
872
				    (((uint32) ((uchar) (A)[1])) << 8) +\
873
				    (((uint32) ((uchar) (A)[2])) << 16) +\
874
				    (((uint32) ((uchar) (A)[3])) << 24)) +\
875
				    (((ulonglong) ((uchar) (A)[4])) << 32))
876
#define uint6korr(A)	((ulonglong)(((uint32)    ((uchar) (A)[0]))          + \
877
                                     (((uint32)    ((uchar) (A)[1])) << 8)   + \
878
                                     (((uint32)    ((uchar) (A)[2])) << 16)  + \
879
                                     (((uint32)    ((uchar) (A)[3])) << 24)) + \
880
                         (((ulonglong) ((uchar) (A)[4])) << 32) +       \
881
                         (((ulonglong) ((uchar) (A)[5])) << 40))
882
#define uint8korr(A)	(*((ulonglong *) (A)))
883
#define sint8korr(A)	(*((longlong *) (A)))
884
#define int2store(T,A)	*((uint16*) (T))= (uint16) (A)
885
#define int3store(T,A)  do { *(T)=  (uchar) ((A));\
886
                            *(T+1)=(uchar) (((uint) (A) >> 8));\
887
                            *(T+2)=(uchar) (((A) >> 16)); } while (0)
888
#define int4store(T,A)	*((long *) (T))= (long) (A)
889
#define int5store(T,A)  do { *(T)= (uchar)((A));\
890
                             *((T)+1)=(uchar) (((A) >> 8));\
891
                             *((T)+2)=(uchar) (((A) >> 16));\
892
                             *((T)+3)=(uchar) (((A) >> 24)); \
893
                             *((T)+4)=(uchar) (((A) >> 32)); } while(0)
894
#define int6store(T,A)  do { *(T)=    (uchar)((A));          \
895
                             *((T)+1)=(uchar) (((A) >> 8));  \
896
                             *((T)+2)=(uchar) (((A) >> 16)); \
897
                             *((T)+3)=(uchar) (((A) >> 24)); \
898
                             *((T)+4)=(uchar) (((A) >> 32)); \
899
                             *((T)+5)=(uchar) (((A) >> 40)); } while(0)
900
#define int8store(T,A)	*((ulonglong *) (T))= (ulonglong) (A)
901
902
typedef union {
903
  double v;
904
  long m[2];
905
} doubleget_union;
906
#define doubleget(V,M)	\
907
do { doubleget_union _tmp; \
908
     _tmp.m[0] = *((long*)(M)); \
909
     _tmp.m[1] = *(((long*) (M))+1); \
910
     (V) = _tmp.v; } while(0)
911
#define doublestore(T,V) do { *((long *) T) = ((doubleget_union *)&V)->m[0]; \
912
			     *(((long *) T)+1) = ((doubleget_union *)&V)->m[1]; \
913
                         } while (0)
914
#define float4get(V,M)   do { *((float *) &(V)) = *((float*) (M)); } while(0)
915
#define float8get(V,M)   doubleget((V),(M))
916
#define float4store(V,M) memcpy((uchar*) V,(uchar*) (&M),sizeof(float))
917
#define floatstore(T,V)  memcpy((uchar*)(T), (uchar*)(&V),sizeof(float))
918
#define floatget(V,M)    memcpy((uchar*) &V,(uchar*) (M),sizeof(float))
919
#define float8store(V,M) doublestore((V),(M))
920
#else
921
922
/*
923
  We're here if it's not a IA-32 architecture (Win32 and UNIX IA-32 defines
924
  were done before)
925
*/
926
#define sint2korr(A)	(int16) (((int16) ((uchar) (A)[0])) +\
927
				 ((int16) ((int16) (A)[1]) << 8))
928
#define sint3korr(A)	((int32) ((((uchar) (A)[2]) & 128) ? \
929
				  (((uint32) 255L << 24) | \
930
				   (((uint32) (uchar) (A)[2]) << 16) |\
931
				   (((uint32) (uchar) (A)[1]) << 8) | \
932
				   ((uint32) (uchar) (A)[0])) : \
933
				  (((uint32) (uchar) (A)[2]) << 16) |\
934
				  (((uint32) (uchar) (A)[1]) << 8) | \
935
				  ((uint32) (uchar) (A)[0])))
936
#define sint4korr(A)	(int32) (((int32) ((uchar) (A)[0])) +\
937
				(((int32) ((uchar) (A)[1]) << 8)) +\
938
				(((int32) ((uchar) (A)[2]) << 16)) +\
939
				(((int32) ((int16) (A)[3]) << 24)))
940
#define sint8korr(A)	(longlong) uint8korr(A)
941
#define uint2korr(A)	(uint16) (((uint16) ((uchar) (A)[0])) +\
942
				  ((uint16) ((uchar) (A)[1]) << 8))
943
#define uint3korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
944
				  (((uint32) ((uchar) (A)[1])) << 8) +\
945
				  (((uint32) ((uchar) (A)[2])) << 16))
946
#define uint4korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
947
				  (((uint32) ((uchar) (A)[1])) << 8) +\
948
				  (((uint32) ((uchar) (A)[2])) << 16) +\
949
				  (((uint32) ((uchar) (A)[3])) << 24))
950
#define uint5korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
951
				    (((uint32) ((uchar) (A)[1])) << 8) +\
952
				    (((uint32) ((uchar) (A)[2])) << 16) +\
953
				    (((uint32) ((uchar) (A)[3])) << 24)) +\
954
				    (((ulonglong) ((uchar) (A)[4])) << 32))
955
#define uint6korr(A)	((ulonglong)(((uint32)    ((uchar) (A)[0]))          + \
956
                                     (((uint32)    ((uchar) (A)[1])) << 8)   + \
957
                                     (((uint32)    ((uchar) (A)[2])) << 16)  + \
958
                                     (((uint32)    ((uchar) (A)[3])) << 24)) + \
959
                         (((ulonglong) ((uchar) (A)[4])) << 32) +       \
960
                         (((ulonglong) ((uchar) (A)[5])) << 40))
961
#define uint8korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
962
				    (((uint32) ((uchar) (A)[1])) << 8) +\
963
				    (((uint32) ((uchar) (A)[2])) << 16) +\
964
				    (((uint32) ((uchar) (A)[3])) << 24)) +\
965
			(((ulonglong) (((uint32) ((uchar) (A)[4])) +\
966
				    (((uint32) ((uchar) (A)[5])) << 8) +\
967
				    (((uint32) ((uchar) (A)[6])) << 16) +\
968
				    (((uint32) ((uchar) (A)[7])) << 24))) <<\
969
				    32))
970
#define int2store(T,A)       do { uint def_temp= (uint) (A) ;\
971
                                  *((uchar*) (T))=  (uchar)(def_temp); \
972
                                   *((uchar*) (T)+1)=(uchar)((def_temp >> 8)); \
973
                             } while(0)
974
#define int3store(T,A)       do { /*lint -save -e734 */\
975
                                  *((uchar*)(T))=(uchar) ((A));\
976
                                  *((uchar*) (T)+1)=(uchar) (((A) >> 8));\
977
                                  *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \
978
                                  /*lint -restore */} while(0)
979
#define int4store(T,A)       do { *((char *)(T))=(char) ((A));\
980
                                  *(((char *)(T))+1)=(char) (((A) >> 8));\
981
                                  *(((char *)(T))+2)=(char) (((A) >> 16));\
982
                                  *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0)
983
#define int5store(T,A)       do { *((char *)(T))=     (char)((A));  \
984
                                  *(((char *)(T))+1)= (char)(((A) >> 8)); \
985
                                  *(((char *)(T))+2)= (char)(((A) >> 16)); \
986
                                  *(((char *)(T))+3)= (char)(((A) >> 24)); \
987
                                  *(((char *)(T))+4)= (char)(((A) >> 32)); \
988
		                } while(0)
989
#define int6store(T,A)       do { *((char *)(T))=     (char)((A)); \
990
                                  *(((char *)(T))+1)= (char)(((A) >> 8)); \
991
                                  *(((char *)(T))+2)= (char)(((A) >> 16)); \
992
                                  *(((char *)(T))+3)= (char)(((A) >> 24)); \
993
                                  *(((char *)(T))+4)= (char)(((A) >> 32)); \
994
                                  *(((char *)(T))+5)= (char)(((A) >> 40)); \
995
                                } while(0)
996
#define int8store(T,A)       do { uint def_temp= (uint) (A), def_temp2= (uint) ((A) >> 32); \
997
                                  int4store((T),def_temp); \
998
                                  int4store((T+4),def_temp2); } while(0)
999
#ifdef WORDS_BIGENDIAN
1000
#define float4store(T,A) do { *(T)= ((uchar *) &A)[3];\
1001
                              *((T)+1)=(char) ((uchar *) &A)[2];\
1002
                              *((T)+2)=(char) ((uchar *) &A)[1];\
1003
                              *((T)+3)=(char) ((uchar *) &A)[0]; } while(0)
1004
1005
#define float4get(V,M)   do { float def_temp;\
1006
                              ((uchar*) &def_temp)[0]=(M)[3];\
1007
                              ((uchar*) &def_temp)[1]=(M)[2];\
1008
                              ((uchar*) &def_temp)[2]=(M)[1];\
1009
                              ((uchar*) &def_temp)[3]=(M)[0];\
1010
                              (V)=def_temp; } while(0)
1011
#define float8store(T,V) do { *(T)= ((uchar *) &V)[7];\
1012
                              *((T)+1)=(char) ((uchar *) &V)[6];\
1013
                              *((T)+2)=(char) ((uchar *) &V)[5];\
1014
                              *((T)+3)=(char) ((uchar *) &V)[4];\
1015
                              *((T)+4)=(char) ((uchar *) &V)[3];\
1016
                              *((T)+5)=(char) ((uchar *) &V)[2];\
1017
                              *((T)+6)=(char) ((uchar *) &V)[1];\
1018
                              *((T)+7)=(char) ((uchar *) &V)[0]; } while(0)
1019
1020
#define float8get(V,M)   do { double def_temp;\
1021
                              ((uchar*) &def_temp)[0]=(M)[7];\
1022
                              ((uchar*) &def_temp)[1]=(M)[6];\
1023
                              ((uchar*) &def_temp)[2]=(M)[5];\
1024
                              ((uchar*) &def_temp)[3]=(M)[4];\
1025
                              ((uchar*) &def_temp)[4]=(M)[3];\
1026
                              ((uchar*) &def_temp)[5]=(M)[2];\
1027
                              ((uchar*) &def_temp)[6]=(M)[1];\
1028
                              ((uchar*) &def_temp)[7]=(M)[0];\
1029
                              (V) = def_temp; } while(0)
1030
#else
1031
#define float4get(V,M)   memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float))
1032
#define float4store(V,M) memcpy_fixed((uchar*) V,(uchar*) (&M),sizeof(float))
1033
1034
#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
1035
#define doublestore(T,V) do { *(((char*)T)+0)=(char) ((uchar *) &V)[4];\
1036
                              *(((char*)T)+1)=(char) ((uchar *) &V)[5];\
1037
                              *(((char*)T)+2)=(char) ((uchar *) &V)[6];\
1038
                              *(((char*)T)+3)=(char) ((uchar *) &V)[7];\
1039
                              *(((char*)T)+4)=(char) ((uchar *) &V)[0];\
1040
                              *(((char*)T)+5)=(char) ((uchar *) &V)[1];\
1041
                              *(((char*)T)+6)=(char) ((uchar *) &V)[2];\
1042
                              *(((char*)T)+7)=(char) ((uchar *) &V)[3]; }\
1043
                         while(0)
1044
#define doubleget(V,M)   do { double def_temp;\
1045
                              ((uchar*) &def_temp)[0]=(M)[4];\
1046
                              ((uchar*) &def_temp)[1]=(M)[5];\
1047
                              ((uchar*) &def_temp)[2]=(M)[6];\
1048
                              ((uchar*) &def_temp)[3]=(M)[7];\
1049
                              ((uchar*) &def_temp)[4]=(M)[0];\
1050
                              ((uchar*) &def_temp)[5]=(M)[1];\
1051
                              ((uchar*) &def_temp)[6]=(M)[2];\
1052
                              ((uchar*) &def_temp)[7]=(M)[3];\
1053
                              (V) = def_temp; } while(0)
1054
#endif /* __FLOAT_WORD_ORDER */
1055
1056
#define float8get(V,M)   doubleget((V),(M))
1057
#define float8store(V,M) doublestore((V),(M))
1058
#endif /* WORDS_BIGENDIAN */
1059
1060
#endif /* __i386__ */
1061
1062
/*
1063
  Macro for reading 32-bit integer from network byte order (big-endian)
1064
  from unaligned memory location.
1065
*/
1066
#define int4net(A)        (int32) (((uint32) ((uchar) (A)[3]))        |\
1067
				  (((uint32) ((uchar) (A)[2])) << 8)  |\
1068
				  (((uint32) ((uchar) (A)[1])) << 16) |\
1069
				  (((uint32) ((uchar) (A)[0])) << 24))
1070
/*
1071
  Define-funktions for reading and storing in machine format from/to
1072
  short/long to/from some place in memory V should be a (not
1073
  register) variable, M is a pointer to byte
1074
*/
1075
1076
#ifdef WORDS_BIGENDIAN
1077
1078
#define ushortget(V,M)  do { V = (uint16) (((uint16) ((uchar) (M)[1]))+\
1079
                                 ((uint16) ((uint16) (M)[0]) << 8)); } while(0)
1080
#define shortget(V,M)   do { V = (short) (((short) ((uchar) (M)[1]))+\
1081
                                 ((short) ((short) (M)[0]) << 8)); } while(0)
1082
#define longget(V,M)    do { int32 def_temp;\
1083
                             ((uchar*) &def_temp)[0]=(M)[0];\
1084
                             ((uchar*) &def_temp)[1]=(M)[1];\
1085
                             ((uchar*) &def_temp)[2]=(M)[2];\
1086
                             ((uchar*) &def_temp)[3]=(M)[3];\
1087
                             (V)=def_temp; } while(0)
1088
#define ulongget(V,M)   do { uint32 def_temp;\
1089
                            ((uchar*) &def_temp)[0]=(M)[0];\
1090
                            ((uchar*) &def_temp)[1]=(M)[1];\
1091
                            ((uchar*) &def_temp)[2]=(M)[2];\
1092
                            ((uchar*) &def_temp)[3]=(M)[3];\
1093
                            (V)=def_temp; } while(0)
1094
#define shortstore(T,A) do { uint def_temp=(uint) (A) ;\
1095
                             *(((char*)T)+1)=(char)(def_temp); \
1096
                             *(((char*)T)+0)=(char)(def_temp >> 8); } while(0)
1097
#define longstore(T,A)  do { *(((char*)T)+3)=((A));\
1098
                             *(((char*)T)+2)=(((A) >> 8));\
1099
                             *(((char*)T)+1)=(((A) >> 16));\
1100
                             *(((char*)T)+0)=(((A) >> 24)); } while(0)
1101
1102
#define floatget(V,M)    memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(float))
1103
#define floatstore(T,V)  memcpy_fixed((uchar*) (T),(uchar*)(&V),sizeof(float))
1104
#define doubleget(V,M)	 memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double))
1105
#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double))
1106
#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong))
1107
#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong))
1108
1109
#else
1110
1111
#define ushortget(V,M)	do { V = uint2korr(M); } while(0)
1112
#define shortget(V,M)	do { V = sint2korr(M); } while(0)
1113
#define longget(V,M)	do { V = sint4korr(M); } while(0)
1114
#define ulongget(V,M)   do { V = uint4korr(M); } while(0)
1115
#define shortstore(T,V) int2store(T,V)
1116
#define longstore(T,V)	int4store(T,V)
1117
#ifndef floatstore
1118
#define floatstore(T,V)  memcpy_fixed((uchar*) (T),(uchar*) (&V),sizeof(float))
1119
#define floatget(V,M)    memcpy_fixed((uchar*) &V, (uchar*) (M), sizeof(float))
1120
#endif
1121
#ifndef doubleget
1122
#define doubleget(V,M)	 memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(double))
1123
#define doublestore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(double))
1124
#endif /* doubleget */
1125
#define longlongget(V,M) memcpy_fixed((uchar*) &V,(uchar*) (M),sizeof(ulonglong))
1126
#define longlongstore(T,V) memcpy_fixed((uchar*) (T),(uchar*) &V,sizeof(ulonglong))
1127
1128
#endif /* WORDS_BIGENDIAN */
1129
1130
/* sprintf does not always return the number of bytes :- */
1131
#ifdef SPRINTF_RETURNS_INT
1132
#define my_sprintf(buff,args) sprintf args
1133
#else
1134
#ifdef SPRINTF_RETURNS_PTR
1135
#define my_sprintf(buff,args) ((int)(sprintf args - buff))
1136
#else
1137
#define my_sprintf(buff,args) ((ulong) sprintf args, (ulong) strlen(buff))
1138
#endif
1139
#endif
1140
1141
#if defined(HAVE_CHARSET_utf8mb3) || defined(HAVE_CHARSET_utf8mb4)
1142
#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8"
1143
#else
1144
#define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME
1145
#endif
1146
1147
#ifdef HAVE_DLOPEN
1148
#if defined(HAVE_DLFCN_H)
1149
#include <dlfcn.h>
1150
#endif
1151
#endif
1152
1153
/* FreeBSD 2.2.2 does not define RTLD_NOW) */
1154
#ifndef RTLD_NOW
1155
#define RTLD_NOW 1
1156
#endif
1157
1158
#ifndef HAVE_DLERROR
1159
#define dlerror() ""
1160
#endif
1161
1162
1163
/*
1164
 *  Include standard definitions of operator new and delete.
1165
 */
1166
#ifdef __cplusplus
1167
#include <new>
1168
#endif
1169
1170
/* Length of decimal number represented by INT32. */
1171
#define MY_INT32_NUM_DECIMAL_DIGITS 11
1172
1173
/* Length of decimal number represented by INT64. */
1174
#define MY_INT64_NUM_DECIMAL_DIGITS 21
1175
1176
/* Define some useful general macros (should be done after all headers). */
1177
#if !defined(max)
1178
#define max(a, b)	((a) > (b) ? (a) : (b))
1179
#define min(a, b)	((a) < (b) ? (a) : (b))
1180
#endif  
1181
/*
1182
  Only Linux is known to need an explicit sync of the directory to make sure a
1183
  file creation/deletion/renaming in(from,to) this directory durable.
1184
*/
1185
#ifdef TARGET_OS_LINUX
1186
#define NEED_EXPLICIT_SYNC_DIR 1
1187
#endif
1188
1189
#endif /* my_global_h */