1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| char *vsprintf_irc(register char *str,
register const char *format, register va_list vl)
{
register char c;
while ((c = *format++))
{
if (c == '%')
{
c = *format++; /* May never be '\0' ! */
if (c == 'c')
{
*str++ = (char)va_arg(vl, int);
continue;
}
if (c == 's')
{
register const char *p1 = va_arg(vl, const char *);
if ((*str = *p1))
while ((*++str = *++p1));
continue;
}
if (c == 'l' && *format == 'u') /* Prints time_t value in interval
[ 100000000 , 4294967295 ]
Actually prints like "%09lu" */
{
register unsigned long v1, v2;
register const char *ap;
++format;
v1 = va_arg(vl, unsigned long);
if (v1 > 999999999L)
{
v2 = v1 / 1000000000;
v1 -= v2 * 1000000000;
*str++ = '0' + v2;
}
v2 = v1 / 1000000;
v1 -= v2 * 1000000;
ap = atoi_tab + (v2 << 2);
*str++ = *ap++;
*str++ = *ap++;
*str++ = *ap;
v2 = v1 / 1000;
v1 -= v2 * 1000;
ap = atoi_tab + (v2 << 2);
*str++ = *ap++;
*str++ = *ap++;
*str++ = *ap;
ap = atoi_tab + (v1 << 2);
*str++ = *ap++;
*str++ = *ap++;
*str++ = *ap;
continue;
}
#if 0 /* Not used */
if (c == 'N') /* Prints "%03u" a numeric value in the
range [ 0, 999 ], padded with zero's */
{
register unsigned int v1;
register const char *ap;
v1 = va_arg(vl, unsigned int);
ap = atoi_tab + (v1 << 2);
*str++ = *ap++;
*str++ = *ap++;
*str++ = *ap;
continue;
}
#endif
if (c == 'd')
{
register unsigned int v1, v2;
register const char *ap;
register char *s = &scratch_buffer[sizeof(scratch_buffer) - 2];
v1 = va_arg(vl, int);
if ((int)v1 <= 0)
{
if (v1 == 0)
{
*str++ = '0';
continue;
}
*str++ = '-';
v1 = -v1;
}
do
{
v2 = v1 / 1000;
ap = atoi_tab + 2 + ((v1 - 1000 * v2) << 2);
*s-- = *ap--;
*s-- = *ap--;
*s-- = *ap;
}
while ((v1 = v2) > 0);
while ('0' == *++s);
*str = *s;
while ((*++str = *++s));
continue;
}
if (c == 'u')
{
register unsigned int v1, v2;
register const char *ap;
register char *s = &scratch_buffer[sizeof(scratch_buffer) - 2];
v1 = va_arg(vl, unsigned int);
if (v1 == 0)
{
*str++ = '0';
continue;
}
do
{
v2 = v1 / 1000;
ap = atoi_tab + 2 + ((v1 - 1000 * v2) << 2);
*s-- = *ap--;
*s-- = *ap--;
*s-- = *ap;
}
while ((v1 = v2) > 0);
while ('0' == *++s);
*str = *s;
while ((*++str = *++s));
continue;
}
if (c != '%')
{
format -= 2;
str += vsprintf(str, format, vl);
break;
}
}
*str++ = c;
}
*str = 0;
return str;
}
char *sprintf_irc(register char *str, const char *format, ...)
{
va_list vl;
register char *ret;
va_start(vl, format);
ret = vsprintf_irc(str, format, vl);
va_end(vl);
return ret;
} |
Partager