Commit 4b3e443b authored by monty@mysql.com's avatar monty@mysql.com

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/my/mysql-4.1
parents fcbee7eb df73dc78
...@@ -65,14 +65,17 @@ Microsoft Visual C++ */ ...@@ -65,14 +65,17 @@ Microsoft Visual C++ */
#define HAVE_PWRITE #define HAVE_PWRITE
#endif #endif
/* Apparently in some old SCO Unixes the return type of sprintf is not #endif /* #if (defined(WIN32) || ... */
an integer as it should be according to the modern Posix standard. Because
of that we define sprintf inside InnoDB code as our own function ut_sprintf */ /* On the 64-bit Windows we replace printf with ut_printf, etc. so that
#undef sprintf we can use the %lu format string to print a 64-bit ulint */
#define sprintf ut_sprintf #if defined(__WIN__) && (defined(WIN64) || defined(_WIN64))
#define printf ut_printf
#define sprintf ut_sprintf
#define fprintf ut_fprintf
#endif #endif
/* DEBUG VERSION CONTROL /* DEBUG VERSION CONTROL
===================== */ ===================== */
......
...@@ -19,14 +19,47 @@ typedef time_t ib_time_t; ...@@ -19,14 +19,47 @@ typedef time_t ib_time_t;
/************************************************************ /************************************************************
Uses vsprintf to emulate sprintf so that the function always returns On the 64-bit Windows we substitute the format string
the printed length. Apparently in some old SCO Unixes sprintf did not %l -> %I64
return the printed length but a pointer to the end of the printed string. */ because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
ulint int
ut_printf(
/*======*/
/* out: the number of characters written, or
negative in case of an error */
const char* format, /* in: format of prints */
...); /* in: arguments to be printed */
/************************************************************
On the 64-bit Windows we substitute the format string
%l -> %I64
because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
int
ut_sprintf( ut_sprintf(
/*=======*/ /*=======*/
char* buf, /* in/out: buffer where to print */ /* out: the number of characters written, or
negative in case of an error */
char* buf, /* in: buffer where to print */
const char* format, /* in: format of prints */
...); /* in: arguments to be printed */
/************************************************************
On the 64-bit Windows we substitute the format string
%l -> %I64
because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
int
ut_fprintf(
/*=======*/
/* out: the number of characters written, or
negative in case of an error */
FILE* stream, /* in: stream where to print */
const char* format, /* in: format of prints */ const char* format, /* in: format of prints */
...); /* in: arguments to be printed */ ...); /* in: arguments to be printed */
/************************************************************ /************************************************************
......
...@@ -20,26 +20,224 @@ Created 5/11/1994 Heikki Tuuri ...@@ -20,26 +20,224 @@ Created 5/11/1994 Heikki Tuuri
ibool ut_always_false = FALSE; ibool ut_always_false = FALSE;
/************************************************************ /************************************************************
Uses vsprintf to emulate sprintf so that the function always returns On the 64-bit Windows we substitute the format string
the printed length. Apparently in some old SCO Unixes sprintf did not %l -> %I64
return the printed length but a pointer to the end of the printed string. */ because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
int
ut_printf(
/*======*/
/* out: the number of characters written, or
negative in case of an error */
const char* format, /* in: format of prints */
...) /* in: arguments to be printed */
{
va_list args;
ulint len;
char* format_end;
char* newformat;
char* ptr;
char* newptr;
int ret;
char format_buf_in_stack[500];
len = strlen(format);
if (len > 250) {
newformat = malloc(2 * len);
} else {
newformat = format_buf_in_stack;
}
ulint format_end = (char*)format + len;
ptr = (char*)format;
newptr = newformat;
#if defined(__WIN__) && (defined(WIN64) || defined(_WIN64))
/* Replace %l with %I64 if it is not preceded with '\' */
while (ptr < format_end) {
if (*ptr == '%' && *(ptr + 1) == 'l'
&& (ptr == format || *(ptr - 1) != '\\')) {
memcpy(newptr, "%I64", 4);
ptr += 2;
newptr += 4;
} else {
*newptr = *ptr;
ptr++;
newptr++;
}
}
*newptr = '\0';
ut_a(newptr < newformat + 2 * len);
#else
strcpy(newformat, format);
#endif
va_start(args, format);
ret = vprintf((const char*)newformat, args);
va_end(args);
if (newformat != format_buf_in_stack) {
free(newformat);
}
return(ret);
}
/************************************************************
On the 64-bit Windows we substitute the format string
%l -> %I64
because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
int
ut_sprintf( ut_sprintf(
/*=======*/ /*=======*/
char* buf, /* in/out: buffer where to print */ /* out: the number of characters written, or
negative in case of an error */
char* buf, /* in: buffer where to print */
const char* format, /* in: format of prints */ const char* format, /* in: format of prints */
...) /* in: arguments to be printed */ ...) /* in: arguments to be printed */
{ {
va_list args; va_list args;
ulint len;
char* format_end;
char* newformat;
char* ptr;
char* newptr;
int ret;
char format_buf_in_stack[500];
len = strlen(format);
if (len > 250) {
newformat = malloc(2 * len);
} else {
newformat = format_buf_in_stack;
}
format_end = (char*)format + len;
ptr = (char*)format;
newptr = newformat;
#if defined(__WIN__) && (defined(WIN64) || defined(_WIN64))
/* Replace %l with %I64 if it is not preceded with '\' */
while (ptr < format_end) {
if (*ptr == '%' && *(ptr + 1) == 'l'
&& (ptr == format || *(ptr - 1) != '\\')) {
memcpy(newptr, "%I64", 4);
ptr += 2;
newptr += 4;
} else {
*newptr = *ptr;
ptr++;
newptr++;
}
}
*newptr = '\0';
ut_a(newptr < newformat + 2 * len);
#else
strcpy(newformat, format);
#endif
va_start(args, format);
ret = vsprintf(buf, (const char*)newformat, args);
va_end(args);
if (newformat != format_buf_in_stack) {
free(newformat);
}
return(ret);
}
/************************************************************
On the 64-bit Windows we substitute the format string
%l -> %I64
because we define ulint as unsigned __int64 and lint as __int64 on Windows,
and both the Microsoft and Intel C compilers require the format string
%I64 in that case instead of %l. */
int
ut_fprintf(
/*=======*/
/* out: the number of characters written, or
negative in case of an error */
FILE* stream, /* in: stream where to print */
const char* format, /* in: format of prints */
...) /* in: arguments to be printed */
{
va_list args;
ulint len;
char* format_end;
char* newformat;
char* ptr;
char* newptr;
int ret;
char format_buf_in_stack[500];
len = strlen(format);
if (len > 250) {
newformat = malloc(2 * len);
} else {
newformat = format_buf_in_stack;
}
format_end = (char*)format + len;
ptr = (char*)format;
newptr = newformat;
#if defined(__WIN__) && (defined(WIN64) || defined(_WIN64))
/* Replace %l with %I64 if it is not preceded with '\' */
while (ptr < format_end) {
if (*ptr == '%' && *(ptr + 1) == 'l'
&& (ptr == format || *(ptr - 1) != '\\')) {
memcpy(newptr, "%I64", 4);
ptr += 2;
newptr += 4;
} else {
*newptr = *ptr;
ptr++;
newptr++;
}
}
*newptr = '\0';
ut_a(newptr < newformat + 2 * len);
#else
strcpy(newformat, format);
#endif
va_start(args, format); va_start(args, format);
vsprintf(buf, format, args); ret = vfprintf(stream, (const char*)newformat, args);
va_end(args); va_end(args);
return((ulint)strlen(buf)); if (newformat != format_buf_in_stack) {
free(newformat);
}
return(ret);
} }
/************************************************************ /************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment