1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-17 16:29:32 +00:00

fix output for negative numbers

This commit is contained in:
mrdudz 2023-08-28 02:01:56 +02:00
parent 23a2b13a62
commit 2da00e7daa

View File

@ -2,6 +2,10 @@
#include <stdlib.h>
#include <stdio.h>
//#define DEBUG_VALUE
// This is really a terrible function that should get completely rewritten and
// tested by someone who knows what he is doing =P
char *_ftostr(char *buffer, float f) {
signed long intpart;
float fracpart;
@ -12,42 +16,83 @@ char *_ftostr(char *buffer, float f) {
is_negative = (raw_value & 0x80000000) ? 1 : 0; // very hacky indeed
intpart = (signed long)(f);
if (!is_negative) {
intpart = (signed long)(f);
} else {
intpart = (signed long)(f);
intpart = -intpart;
}
f2 = intpart;
#if 0
if (!is_negative) {
if (f2 > f) {
if (intpart > 0) {
--intpart;
}
}
} else {
if (f2 > f) {
if (intpart > 0) {
--intpart;
}
}
// ++intpart;
}
if (f2 > f) {
if (intpart > 0) {
--intpart;
if (!is_negative) {
if (intpart < 0) {
intpart *= -1;
}
} else {
if (intpart < 0) {
intpart *= -1;
}
}
if (intpart < 0) {
intpart *= -1;
}
#endif
f2 = intpart;
fracpart = f - f2;
if (!is_negative) {
fracpart = f - f2;
} else {
fracpart = (-f) - f2;
}
f1 = 10000.0f;
f1 = f1 * fracpart;
n0 = (signed long)f1;
#if 0
// caution: make sure fracpart can never be negative
if (n0 < 0) {
n0 *= -1;
}
#endif
// printf("n0:%ld\n",n0);
#ifdef DEBUG_VALUE
if (n0 >= 1000) {
sprintf(buffer, "<0x%08lx:%s%ld.%ld>", raw_value, is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 100) {
sprintf(buffer, "<0x%08lx:%s%ld.0%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0);
sprintf(buffer, "<0x%08lx:%s%ld.0%ld>", raw_value, is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 10) {
sprintf(buffer, "<0x%08lx:%s%ld.00%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0);
sprintf(buffer, "<0x%08lx:%s%ld.00%ld>", raw_value, is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 1) {
sprintf(buffer, "<0x%08lx:%s%ld.000%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0);
sprintf(buffer, "<0x%08lx:%s%ld.000%ld>", raw_value, is_negative ? "-" : "", intpart, n0);
} else {
sprintf(buffer, "<0x%08lx:%s%ld.0000%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0);
sprintf(buffer, "<0x%08lx:%s%ld.0000>", raw_value, is_negative ? "-" : "", intpart);
}
#else
if (n0 >= 1000) {
sprintf(buffer, "%s%ld.%ld", is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 100) {
sprintf(buffer, "%s%ld.0%ld", is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 10) {
sprintf(buffer, "%s%ld.00%ld", is_negative ? "-" : "", intpart, n0);
} else if (n0 >= 1) {
sprintf(buffer, "%s%ld.000%ld", is_negative ? "-" : "", intpart, n0);
} else {
sprintf(buffer, "%s%ld.0000", is_negative ? "-" : "", intpart);
}
#endif
return &buffer[0];
}