#include <my_global.h>#include <m_string.h>#include <stdarg.h>#include <m_ctype.h>Include dependency graph for my_vsnprintf.c:

Go to the source code of this file.
Functions | |
| int | my_vsnprintf (char *to, size_t n, const char *fmt, va_list ap) |
| int | my_snprintf (char *to, size_t n, const char *fmt,...) |
| int my_snprintf | ( | char * | to, | |
| size_t | n, | |||
| const char * | fmt, | |||
| ... | ||||
| ) |
Definition at line 169 of file my_vsnprintf.c.
References args, and my_vsnprintf().
00170 { 00171 int result; 00172 va_list args; 00173 va_start(args,fmt); 00174 result= my_vsnprintf(to, n, fmt, args); 00175 va_end(args); 00176 return result; 00177 }
Here is the call graph for this function:

| int my_vsnprintf | ( | char * | to, | |
| size_t | n, | |||
| const char * | fmt, | |||
| va_list | ap | |||
| ) |
Definition at line 37 of file my_vsnprintf.c.
References abs, bfill, bmove(), DBUG_ASSERT, int10_to_str(), int2str(), memmove, min, my_charset_latin1, my_isdigit, reg2, set_if_smaller, start(), strlen(), and strnmov().
00038 { 00039 char *start=to, *end=to+n-1; 00040 uint length, width, pre_zero, have_long; 00041 00042 for (; *fmt ; fmt++) 00043 { 00044 if (*fmt != '%') 00045 { 00046 if (to == end) /* End of buffer */ 00047 break; 00048 *to++= *fmt; /* Copy ordinary char */ 00049 continue; 00050 } 00051 fmt++; /* skip '%' */ 00052 /* Read max fill size (only used with %d and %u) */ 00053 if (*fmt == '-') 00054 fmt++; 00055 length= width= pre_zero= have_long= 0; 00056 if (*fmt == '*') 00057 { 00058 fmt++; 00059 length= va_arg(ap, int); 00060 } 00061 else 00062 for (; my_isdigit(&my_charset_latin1, *fmt); fmt++) 00063 { 00064 length= length * 10 + (uint)(*fmt - '0'); 00065 if (!length) 00066 pre_zero= 1; /* first digit was 0 */ 00067 } 00068 if (*fmt == '.') 00069 { 00070 fmt++; 00071 if (*fmt == '*') 00072 { 00073 fmt++; 00074 width= va_arg(ap, int); 00075 } 00076 else 00077 for (; my_isdigit(&my_charset_latin1, *fmt); fmt++) 00078 width= width * 10 + (uint)(*fmt - '0'); 00079 } 00080 else 00081 width= ~0; 00082 if (*fmt == 'l') 00083 { 00084 fmt++; 00085 have_long= 1; 00086 } 00087 if (*fmt == 's') /* String parameter */ 00088 { 00089 reg2 char *par = va_arg(ap, char *); 00090 uint plen,left_len = (uint)(end-to)+1; 00091 if (!par) par = (char*)"(null)"; 00092 plen = (uint) strlen(par); 00093 set_if_smaller(plen,width); 00094 if (left_len <= plen) 00095 plen = left_len - 1; 00096 to=strnmov(to,par,plen); 00097 continue; 00098 } 00099 else if (*fmt == 'b') /* Buffer parameter */ 00100 { 00101 char *par = va_arg(ap, char *); 00102 DBUG_ASSERT(to <= end); 00103 if (to + abs(width) + 1 > end) 00104 width= end - to - 1; /* sign doesn't matter */ 00105 memmove(to, par, abs(width)); 00106 to+= width; 00107 continue; 00108 } 00109 else if (*fmt == 'd' || *fmt == 'u'|| *fmt== 'x') /* Integer parameter */ 00110 { 00111 register long larg; 00112 uint res_length, to_length; 00113 char *store_start= to, *store_end; 00114 char buff[32]; 00115 00116 if ((to_length= (uint) (end-to)) < 16 || length) 00117 store_start= buff; 00118 if (have_long) 00119 larg = va_arg(ap, long); 00120 else 00121 if (*fmt == 'd') 00122 larg = va_arg(ap, int); 00123 else 00124 larg= (long) (uint) va_arg(ap, int); 00125 if (*fmt == 'd') 00126 store_end= int10_to_str(larg, store_start, -10); 00127 else 00128 if (*fmt== 'u') 00129 store_end= int10_to_str(larg, store_start, 10); 00130 else 00131 store_end= int2str(larg, store_start, 16, 0); 00132 if ((res_length= (uint) (store_end - store_start)) > to_length) 00133 break; /* num doesn't fit in output */ 00134 /* If %#d syntax was used, we have to pre-zero/pre-space the string */ 00135 if (store_start == buff) 00136 { 00137 length= min(length, to_length); 00138 if (res_length < length) 00139 { 00140 uint diff= (length- res_length); 00141 bfill(to, diff, pre_zero ? '0' : ' '); 00142 to+= diff; 00143 } 00144 bmove(to, store_start, res_length); 00145 } 00146 to+= res_length; 00147 continue; 00148 } 00149 else if (*fmt == 'c') /* Character parameter */ 00150 { 00151 register int larg; 00152 if (to == end) 00153 break; 00154 larg = va_arg(ap, int); 00155 *to++= (char) larg; 00156 continue; 00157 } 00158 00159 /* We come here on '%%', unknown code or too long parameter */ 00160 if (to == end) 00161 break; 00162 *to++='%'; /* % used as % or unknown code */ 00163 } 00164 DBUG_ASSERT(to <= end); 00165 *to='\0'; /* End of errmessage */ 00166 return (uint) (to - start); 00167 }
Here is the call graph for this function:

1.4.7

