Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void value_print(menu_item_Type_Def *p) {
- char tmp[15]; // Для вывода в 10 символов. Начинаем вывод с 7 ячейки
- const char *prefix = "yzafpnum kMGTPEZY";
- prefix += 8;
- char *start = &tmp[7]; //Откуда заполнять влево
- char *end = &tmp[8]; //Откуда заполнять вправо
- int sig = 0; //Отрицательность
- int n; //Знаков после запятой
- int d; //Целая часть числа
- int dt; //Копия целой части числа
- float h = 0.5f; //Округлятор
- float val;
- if(p->type & VAL_FLAG_FLOAT) { // Float
- val = *(float *)p->ptr;
- } else if(p->type & VAL_FLAG_IQ) { //QI
- //TODO
- } else { // int.../uint...
- int offset = p->type & 31;
- if(p->type & VAL_FLAG_SIG) { //Число знаковое
- int32_t tmp = *(int32_t *)p->ptr << offset;
- val = tmp / (1 << offset);
- } else {
- val = *(uint32_t *)p->ptr & (0xFFFFFFFF >> offset);
- }
- }
- union {
- float f;
- uint32_t u;
- }u = {val};
- if(val < 0) {
- sig = 1;
- val = -val;
- }
- if((0xFFUL & (u.u >> 23)) == 0xFFUL) {
- if((u.u & 0x7FFFFFUL) != 0)
- memcpy(end, "NaN", 3);
- else
- memcpy(end, "Inf", 3);
- end += 3;
- goto wrap;
- }
- if(val >= (float) (1UL << 31)) {
- memcpy(end, "MAX", 3);
- end += 3;
- goto wrap;
- }
- if(val > 0.0f) {
- do {
- if(val >= 1000.0f) {
- val /= 1000.0f;
- prefix++;
- } else if(val < 1.0f) {
- val *= 1000.0f;
- prefix--;
- } else
- break;
- } while(1);
- }
- d = (int)val;
- dt = d;
- val -= d;
- do {
- *start-- = '0' + (d % 10);
- d /= 10;
- } while(d);
- n = 6 - (end - start);
- for (int i = 0; i < n; ++i)
- h /= 10.f;
- val += h;
- if(val > 1) { //Переполнились, дробной части не будет, а целую перепишем.
- dt++;
- if(dt == 1000) {
- dt = 1;
- prefix++;
- }
- start = &tmp[7];
- do {
- *start-- = '0' + (dt % 10);
- dt /= 10;
- } while(dt);
- } else {
- char *end_t = end;
- if (val >= h * 2) {
- *end_t++ = '.';
- while(n > 0) {
- val *= 10.f;
- int d = (int)val;
- val -= d;
- *end_t++ = '0' + d;
- n--;
- if(d != 0)
- end = end_t;
- }
- }
- }
- wrap:
- if(sig)
- *start-- = '-';
- while(end - start < 8) {
- *start-- = ' ';
- }
- *start = '[';
- *end++ = *prefix;
- *end++ = ']';
- *end = '\0';
- addstr(start);
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement