Advertisement
7134956

Untitled

Nov 19th, 2019
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.41 KB | None | 0 0
  1. void value_print(menu_item_Type_Def *p) {
  2.     char tmp[15]; // Для вывода в 10 символов. Начинаем вывод с 7 ячейки
  3.  
  4.     const char *prefix = "yzafpnum kMGTPEZY";
  5.     prefix += 8;
  6.  
  7.     char *start = &tmp[7];  //Откуда заполнять влево
  8.     char *end = &tmp[8];    //Откуда заполнять вправо
  9.     int sig = 0;            //Отрицательность
  10.     int n;                  //Знаков после запятой
  11.     int d;                  //Целая часть числа
  12.     int dt;                 //Копия целой части числа
  13.     float h = 0.5f;         //Округлятор
  14.     float val;
  15.    
  16.     if(p->type & VAL_FLAG_FLOAT) { // Float
  17.         val = *(float *)p->ptr;
  18.     } else if(p->type & VAL_FLAG_IQ) { //QI
  19.         //TODO
  20.     } else { // int.../uint...
  21.         int offset = p->type & 31;
  22.         if(p->type & VAL_FLAG_SIG) { //Число знаковое
  23.             int32_t tmp = *(int32_t *)p->ptr << offset;
  24.             val = tmp / (1 << offset);
  25.         } else {
  26.             val = *(uint32_t *)p->ptr & (0xFFFFFFFF >> offset);
  27.         }
  28.     }
  29.  
  30.     union {
  31.         float f;
  32.         uint32_t u;
  33.     }u = {val};
  34.  
  35.     if(val < 0) {
  36.         sig = 1;
  37.         val = -val;
  38.     }
  39.  
  40.     if((0xFFUL & (u.u >> 23)) == 0xFFUL) {
  41.         if((u.u & 0x7FFFFFUL) != 0)
  42.             memcpy(end, "NaN", 3);
  43.         else
  44.             memcpy(end, "Inf", 3);
  45.         end += 3;
  46.         goto wrap;
  47.     }
  48.    
  49.     if(val >= (float) (1UL << 31)) {
  50.         memcpy(end, "MAX", 3);
  51.         end += 3;
  52.         goto wrap;
  53.     }
  54.  
  55.     if(val > 0.0f) {
  56.         do {
  57.             if(val >= 1000.0f) {
  58.                 val /= 1000.0f;
  59.                 prefix++;
  60.             } else if(val < 1.0f) {
  61.                 val *= 1000.0f;
  62.                 prefix--;
  63.             } else
  64.                 break;
  65.         } while(1);
  66.     }
  67.  
  68.     d = (int)val;
  69.     dt = d;
  70.     val -= d;
  71.     do {
  72.         *start-- = '0' + (d % 10);
  73.         d /= 10;
  74.     } while(d);
  75.  
  76.     n = 6 - (end - start);
  77.  
  78.     for (int i = 0; i < n; ++i)
  79.         h /= 10.f;
  80.     val += h;
  81.  
  82.     if(val > 1) { //Переполнились, дробной части не будет, а целую перепишем.
  83.         dt++;
  84.         if(dt == 1000) {
  85.             dt = 1;
  86.             prefix++;
  87.         }
  88.         start = &tmp[7];
  89.         do {
  90.             *start-- = '0' + (dt % 10);
  91.             dt /= 10;
  92.         } while(dt);
  93.     } else {
  94.         char *end_t = end;
  95.         if (val >= h * 2) {
  96.             *end_t++ = '.';
  97.             while(n > 0) {
  98.                 val *= 10.f;
  99.                 int d = (int)val;
  100.                 val -= d;
  101.                 *end_t++ = '0' + d;
  102.                 n--;
  103.                 if(d != 0)
  104.                     end = end_t;
  105.             }
  106.         }
  107.     }
  108. wrap:
  109.     if(sig)
  110.         *start-- = '-';
  111.     while(end - start < 8) {
  112.         *start-- = ' ';
  113.     }
  114.     *start = '[';
  115.     *end++ = *prefix;
  116.     *end++ = ']';
  117.     *end = '\0';
  118.     addstr(start);
  119.     return;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement