[an error occurred while processing this directive]
Похоже, ничего нового не придумали... взяли поди ещё из гнутых компилеров...
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено TImattU 09 февраля 2006 г. 14:06
В ответ на: Нашёл... но это трудно назвать оптимальным: С + почти не оптимизирующий компилер = не совсем здравый код (-) отправлено <font color=gray>TImattU</font> 09 февраля 2006 г. 14:00

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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru