summaryrefslogtreecommitdiff
path: root/mysys/my_vsnprintf.c
diff options
context:
space:
mode:
authormonty@narttu.mysql.fi <>2000-11-15 23:00:06 +0200
committermonty@narttu.mysql.fi <>2000-11-15 23:00:06 +0200
commite69becf133867fff26b59ba74ec1ee722ce1e81e (patch)
tree622092bf596b26a1f762020729c03d573a5b216d /mysys/my_vsnprintf.c
parent7a013339f84c48ea6194a35d9c00d0d549466b1d (diff)
downloadmariadb-git-e69becf133867fff26b59ba74ec1ee722ce1e81e.tar.gz
changed to use IO_CACHE instead of FILE
Diffstat (limited to 'mysys/my_vsnprintf.c')
-rw-r--r--mysys/my_vsnprintf.c91
1 files changed, 33 insertions, 58 deletions
diff --git a/mysys/my_vsnprintf.c b/mysys/my_vsnprintf.c
index 63730926156..b394adf2a96 100644
--- a/mysys/my_vsnprintf.c
+++ b/mysys/my_vsnprintf.c
@@ -21,74 +21,49 @@
#include <stdarg.h>
#include <m_ctype.h>
-
-
-int my_vsnprintf(char* str, size_t n, const char* fmt, va_list ap)
+int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
{
- uint olen = 0, plen;
- const char *tpos;
- reg1 char *endpos;
- reg2 char * par;
- char* ebuff = str;
-
- endpos=ebuff;
- tpos = fmt;
+ char *start=to, *end=to+n-1;
- while (*tpos)
+ for (; *fmt ; fmt++)
{
- if (tpos[0] != '%')
+ if (fmt[0] != '%')
{
- if(olen + 1 >= n)
+ if (to == end) /* End of buffer */
break;
-
- *endpos++= *tpos++; /* Copy ordinary char */
- olen++;
+ *to++= *fmt; /* Copy ordinary char */
continue;
}
- if (*++tpos == '%') /* test if %% */
- {
- olen--;
- }
- else
+ /* Skipp if max size is used (to be compatible with printf) */
+ while (isdigit(*fmt) || *fmt == '.' || *fmt == '-')
+ fmt++;
+ if (*fmt == 's') /* String parameter */
{
- /* Skipp if max size is used (to be compatible with printf) */
- while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')
- tpos++;
- if (*tpos == 's') /* String parameter */
- {
- par = va_arg(ap, char *);
- plen = (uint) strlen(par);
- if (olen + plen < n) /* Replace if possible */
- {
- endpos=strmov(endpos,par);
- tpos++;
- olen+=plen;
- continue;
- }
- }
- else if (*tpos == 'd' || *tpos == 'u') /* Integer parameter */
+ reg2 char *par = va_arg(ap, char *);
+ uint plen = (uint) strlen(par);
+ if ((uint) (end-to) > plen) /* Replace if possible */
{
- register int iarg;
- iarg = va_arg(ap, int);
- if(olen + 16 >= n) break;
-
- if (*tpos == 'd')
- plen= (uint) (int2str((long) iarg,endpos, -10) - endpos);
- else
- plen= (uint) (int2str((long) (uint) iarg,endpos,10)- endpos);
- if (olen + plen < n) /* Replace parameter if possible */
- {
- endpos+=plen;
- tpos++;
- olen+=plen;
- continue;
- }
+ to=strmov(to,par);
+ continue;
}
}
- *endpos++='%'; /* % used as % or unknown code */
+ else if (*fmt == 'd' || *fmt == 'u') /* Integer parameter */
+ {
+ register int iarg;
+ if ((uint) (end-to) < 16)
+ break;
+ iarg = va_arg(ap, int);
+ if (*fmt == 'd')
+ to=int10_to_str((long) iarg,to, -10);
+ else
+ to=int10_to_str((long) (uint) iarg,to,10);
+ continue;
+ }
+ /* We come here on '%%', unknown code or too long parameter */
+ if (to == end)
+ break;
+ *to++='%'; /* % used as % or unknown code */
}
- *endpos='\0';
- /* End of errmessage */
- return olen;
+ *to='\0'; /* End of errmessage */
+ return (uint) (to - start);
}
-