diff options
author | monty@narttu.mysql.fi <> | 2000-11-15 23:00:06 +0200 |
---|---|---|
committer | monty@narttu.mysql.fi <> | 2000-11-15 23:00:06 +0200 |
commit | e69becf133867fff26b59ba74ec1ee722ce1e81e (patch) | |
tree | 622092bf596b26a1f762020729c03d573a5b216d /mysys/my_vsnprintf.c | |
parent | 7a013339f84c48ea6194a35d9c00d0d549466b1d (diff) | |
download | mariadb-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.c | 91 |
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); } - |