Loading include/my_sys.h +5 −0 Original line number Diff line number Diff line Loading @@ -601,6 +601,11 @@ extern char *_my_strndup(const byte *from, uint length, const char *sFile, uint uLine, myf MyFlag); /* implemented in my_memmem.c */ extern void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #ifdef __WIN__ extern int my_access(const char *path, int amode); extern File my_sopen(const char *path, int oflag, int shflag, int pmode); Loading mysql-test/t/mysql_client_test-master.opt 0 → 100644 +1 −0 Original line number Diff line number Diff line --log --log-output=FILE mysys/Makefile.am +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ charset.c charset-def.c my_bitmap.c my_bit.c md5.c \ my_gethostbyname.c rijndael.c my_aes.c sha1.c \ my_handler.c my_netware.c my_largepage.c \ my_memmem.c \ my_windac.c my_access.c base64.c EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c \ Loading mysys/mf_iocache2.c +72 −20 Original line number Diff line number Diff line Loading @@ -252,37 +252,89 @@ uint my_b_printf(IO_CACHE *info, const char* fmt, ...) uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) { uint out_length=0; uint minimum_width; /* as yet unimplemented */ uint minimum_width_sign; uint precision; /* as yet unimplemented for anything but %b */ for (; *fmt ; fmt++) { if (*fmt++ != '%') /* Store the location of the beginning of a format directive, for the case where we learn we shouldn't have been parsing a format string at all, and we don't want to lose the flag/precision/width/size information. */ const char* backtrack; for (; *fmt != '\0'; fmt++) { /* Copy everything until '%' or end of string */ const char *start=fmt-1; const char *start=fmt; uint length; for (; *fmt && *fmt != '%' ; fmt++ ) ; for (; (*fmt != '\0') && (*fmt != '%'); fmt++) ; length= (uint) (fmt - start); out_length+=length; if (my_b_write(info, start, length)) goto err; if (!*fmt) /* End of format */ if (*fmt == '\0') /* End of format */ { return out_length; } /* By this point, *fmt must be a percent; Keep track of this location and skip over the percent character. */ DBUG_ASSERT(*fmt == '%'); backtrack= fmt; fmt++; /* Found one '%' */ } minimum_width= 0; precision= 0; minimum_width_sign= 1; /* Skip if max size is used (to be compatible with printf) */ while (my_isdigit(&my_charset_latin1, *fmt) || *fmt == '.' || *fmt == '-') while (*fmt == '-') { fmt++; minimum_width_sign= -1; } if (*fmt == '*') { precision= (int) va_arg(args, int); fmt++; } else { while (my_isdigit(&my_charset_latin1, *fmt)) { minimum_width=(minimum_width * 10) + (*fmt - '0'); fmt++; } } minimum_width*= minimum_width_sign; if (*fmt == '.') { fmt++; if (*fmt == '*') { precision= (int) va_arg(args, int); fmt++; } else { while (my_isdigit(&my_charset_latin1, *fmt)) { precision=(precision * 10) + (*fmt - '0'); fmt++; } } } if (*fmt == 's') /* String parameter */ { reg2 char *par = va_arg(args, char *); uint length = (uint) strlen(par); /* TODO: implement minimum width and precision */ out_length+=length; if (my_b_write(info, par, length)) goto err; } else if (*fmt == 'b') /* Sized buffer parameter, only precision makes sense */ { char *par = va_arg(args, char *); out_length+= precision; if (my_b_write(info, par, precision)) goto err; } else if (*fmt == 'd' || *fmt == 'u') /* Integer parameter */ { register int iarg; Loading Loading @@ -317,9 +369,9 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) else { /* %% or unknown code */ if (my_b_write(info, "%", 1)) if (my_b_write(info, backtrack, fmt-backtrack)) goto err; out_length++; out_length+= fmt-backtrack; } } return out_length; Loading mysys/my_memmem.c 0 → 100644 +65 −0 Original line number Diff line number Diff line #include "my_base.h" /* my_memmem, port of a GNU extension. Returns a pointer to the beginning of the substring, needle, or NULL if the substring is not found in haystack. */ void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { const void *cursor; const void *last_possible_needle_location = haystack + haystacklen - needlelen; /* Easy answers */ if (needlelen > haystacklen) return(NULL); if (needle == NULL) return(NULL); if (haystack == NULL) return(NULL); if (needlelen == 0) return(NULL); if (haystacklen == 0) return(NULL); for (cursor = haystack; cursor <= last_possible_needle_location; cursor++) { if (memcmp(needle, cursor, needlelen) == 0) { return((void *) cursor); } } return(NULL); } #ifdef MAIN #include <assert.h> int main(int argc, char *argv[]) { char haystack[10], needle[3]; memmove(haystack, "0123456789", 10); memmove(needle, "no", 2); assert(my_memmem(haystack, 10, needle, 2) == NULL); memmove(needle, "345", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); memmove(needle, "789", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); assert(my_memmem(haystack, 9, needle, 3) == NULL); memmove(needle, "012", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); assert(my_memmem(NULL, 10, needle, 3) == NULL); assert(my_memmem(NULL, 10, needle, 3) == NULL); assert(my_memmem(haystack, 0, needle, 3) == NULL); assert(my_memmem(haystack, 10, NULL, 3) == NULL); assert(my_memmem(haystack, 10, needle, 0) == NULL); assert(my_memmem(haystack, 1, needle, 3) == NULL); printf("success\n"); return(0); } #endif Loading
include/my_sys.h +5 −0 Original line number Diff line number Diff line Loading @@ -601,6 +601,11 @@ extern char *_my_strndup(const byte *from, uint length, const char *sFile, uint uLine, myf MyFlag); /* implemented in my_memmem.c */ extern void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #ifdef __WIN__ extern int my_access(const char *path, int amode); extern File my_sopen(const char *path, int oflag, int shflag, int pmode); Loading
mysql-test/t/mysql_client_test-master.opt 0 → 100644 +1 −0 Original line number Diff line number Diff line --log --log-output=FILE
mysys/Makefile.am +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ charset.c charset-def.c my_bitmap.c my_bit.c md5.c \ my_gethostbyname.c rijndael.c my_aes.c sha1.c \ my_handler.c my_netware.c my_largepage.c \ my_memmem.c \ my_windac.c my_access.c base64.c EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c \ Loading
mysys/mf_iocache2.c +72 −20 Original line number Diff line number Diff line Loading @@ -252,37 +252,89 @@ uint my_b_printf(IO_CACHE *info, const char* fmt, ...) uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) { uint out_length=0; uint minimum_width; /* as yet unimplemented */ uint minimum_width_sign; uint precision; /* as yet unimplemented for anything but %b */ for (; *fmt ; fmt++) { if (*fmt++ != '%') /* Store the location of the beginning of a format directive, for the case where we learn we shouldn't have been parsing a format string at all, and we don't want to lose the flag/precision/width/size information. */ const char* backtrack; for (; *fmt != '\0'; fmt++) { /* Copy everything until '%' or end of string */ const char *start=fmt-1; const char *start=fmt; uint length; for (; *fmt && *fmt != '%' ; fmt++ ) ; for (; (*fmt != '\0') && (*fmt != '%'); fmt++) ; length= (uint) (fmt - start); out_length+=length; if (my_b_write(info, start, length)) goto err; if (!*fmt) /* End of format */ if (*fmt == '\0') /* End of format */ { return out_length; } /* By this point, *fmt must be a percent; Keep track of this location and skip over the percent character. */ DBUG_ASSERT(*fmt == '%'); backtrack= fmt; fmt++; /* Found one '%' */ } minimum_width= 0; precision= 0; minimum_width_sign= 1; /* Skip if max size is used (to be compatible with printf) */ while (my_isdigit(&my_charset_latin1, *fmt) || *fmt == '.' || *fmt == '-') while (*fmt == '-') { fmt++; minimum_width_sign= -1; } if (*fmt == '*') { precision= (int) va_arg(args, int); fmt++; } else { while (my_isdigit(&my_charset_latin1, *fmt)) { minimum_width=(minimum_width * 10) + (*fmt - '0'); fmt++; } } minimum_width*= minimum_width_sign; if (*fmt == '.') { fmt++; if (*fmt == '*') { precision= (int) va_arg(args, int); fmt++; } else { while (my_isdigit(&my_charset_latin1, *fmt)) { precision=(precision * 10) + (*fmt - '0'); fmt++; } } } if (*fmt == 's') /* String parameter */ { reg2 char *par = va_arg(args, char *); uint length = (uint) strlen(par); /* TODO: implement minimum width and precision */ out_length+=length; if (my_b_write(info, par, length)) goto err; } else if (*fmt == 'b') /* Sized buffer parameter, only precision makes sense */ { char *par = va_arg(args, char *); out_length+= precision; if (my_b_write(info, par, precision)) goto err; } else if (*fmt == 'd' || *fmt == 'u') /* Integer parameter */ { register int iarg; Loading Loading @@ -317,9 +369,9 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) else { /* %% or unknown code */ if (my_b_write(info, "%", 1)) if (my_b_write(info, backtrack, fmt-backtrack)) goto err; out_length++; out_length+= fmt-backtrack; } } return out_length; Loading
mysys/my_memmem.c 0 → 100644 +65 −0 Original line number Diff line number Diff line #include "my_base.h" /* my_memmem, port of a GNU extension. Returns a pointer to the beginning of the substring, needle, or NULL if the substring is not found in haystack. */ void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { const void *cursor; const void *last_possible_needle_location = haystack + haystacklen - needlelen; /* Easy answers */ if (needlelen > haystacklen) return(NULL); if (needle == NULL) return(NULL); if (haystack == NULL) return(NULL); if (needlelen == 0) return(NULL); if (haystacklen == 0) return(NULL); for (cursor = haystack; cursor <= last_possible_needle_location; cursor++) { if (memcmp(needle, cursor, needlelen) == 0) { return((void *) cursor); } } return(NULL); } #ifdef MAIN #include <assert.h> int main(int argc, char *argv[]) { char haystack[10], needle[3]; memmove(haystack, "0123456789", 10); memmove(needle, "no", 2); assert(my_memmem(haystack, 10, needle, 2) == NULL); memmove(needle, "345", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); memmove(needle, "789", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); assert(my_memmem(haystack, 9, needle, 3) == NULL); memmove(needle, "012", 3); assert(my_memmem(haystack, 10, needle, 3) != NULL); assert(my_memmem(NULL, 10, needle, 3) == NULL); assert(my_memmem(NULL, 10, needle, 3) == NULL); assert(my_memmem(haystack, 0, needle, 3) == NULL); assert(my_memmem(haystack, 10, NULL, 3) == NULL); assert(my_memmem(haystack, 10, needle, 0) == NULL); assert(my_memmem(haystack, 1, needle, 3) == NULL); printf("success\n"); return(0); } #endif