[an error occurred while processing this directive]
|
static char * long2str(long num, char * buff, print_format format)
{
unsigned long unsigned_num, base;
char * p;
int n, digits;
int minus = 0;
unsigned_num = num;
minus = 0;
p = buff;
*--p = 0;
digits = 0;
if (!num
&& !format.precision
&& !(format.alternate_form
&& format.conversion_char == 'o'))
return(p);
switch (format.conversion_char)
{
case 'd':
case 'i':
base = 10;
if (num < 0)
{
unsigned_num = -unsigned_num;
minus = 1;
}
break;
case 'o':
base = 8;
format.sign_options = only_minus;
break;
case 'u':
base = 10;
format.sign_options = only_minus;
break;
case 'x':
case 'X':
base = 16;
format.sign_options = only_minus;
break;
}
do
{
n = unsigned_num % base;
unsigned_num /= base;
if (n < 10)
n += '0';
else
{
n -= 10;
if (format.conversion_char == 'x')
n += 'a';
else
n += 'A';
}
*--p = n;
++digits;
}
while (unsigned_num != 0);
if (base == 8 && format.alternate_form && *p != '0')
{
*--p = '0';
++digits;
}
if (format.justification_options == zero_fill)
{
format.precision = format.field_width;
if (minus || format.sign_options != only_minus)
--format.precision;
if (base == 16 && format.alternate_form)
format.precision -= 2;
}
if (buff - p + format.precision > conversion_max)
return(NULL);
while (digits < format.precision)
{
*--p = '0';
++digits;
}
if (base == 16 && format.alternate_form)
{
*--p = format.conversion_char;
*--p = '0';
}
if (minus)
*--p = '-';
else if (format.sign_options == sign_always)
*--p = '+';
else if (format.sign_options == space_holder)
*--p = ' ';
return(p);
}
E-mail: info@telesys.ru