21
21
#include <stdarg.h>
22
22
#include <m_ctype.h>
26
int my_vsnprintf(char* str, size_t n, const char* fmt, va_list ap)
24
int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
26
char *start=to, *end=to+n-1;
44
*endpos++= *tpos++; /* Copy ordinary char */
48
if (*++tpos == '%') /* test if %% */
54
/* Skipp if max size is used (to be compatible with printf) */
55
while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')
57
if (*tpos == 's') /* String parameter */
59
par = va_arg(ap, char *);
60
plen = (uint) strlen(par);
61
if (olen + plen < n) /* Replace if possible */
63
endpos=strmov(endpos,par);
69
else if (*tpos == 'd' || *tpos == 'u') /* Integer parameter */
72
iarg = va_arg(ap, int);
73
if(olen + 16 >= n) break;
76
plen= (uint) (int2str((long) iarg,endpos, -10) - endpos);
78
plen= (uint) (int2str((long) (uint) iarg,endpos,10)- endpos);
79
if (olen + plen < n) /* Replace parameter if possible */
88
*endpos++='%'; /* % used as % or unknown code */
32
if (to == end) /* End of buffer */
34
*to++= *fmt; /* Copy ordinary char */
37
/* Skipp if max size is used (to be compatible with printf) */
38
while (isdigit(*fmt) || *fmt == '.' || *fmt == '-')
40
if (*fmt == 's') /* String parameter */
42
reg2 char *par = va_arg(ap, char *);
43
uint plen = (uint) strlen(par);
44
if ((uint) (end-to) > plen) /* Replace if possible */
50
else if (*fmt == 'd' || *fmt == 'u') /* Integer parameter */
53
if ((uint) (end-to) < 16)
55
iarg = va_arg(ap, int);
57
to=int10_to_str((long) iarg,to, -10);
59
to=int10_to_str((long) (uint) iarg,to,10);
62
/* We come here on '%%', unknown code or too long parameter */
65
*to++='%'; /* % used as % or unknown code */
91
/* End of errmessage */
67
*to='\0'; /* End of errmessage */
68
return (uint) (to - start);