#define NULL_STRING_LENGTH 6
#endif
+#if defined (SDCC_mcs51) && defined (SDCC_MODEL_SMALL) && !defined (SDCC_STACK_AUTO)
+# define MEM_SPACE_BUF __idata
+# define MEM_SPACE_BUF_PP __idata
+#else
+# define MEM_SPACE_BUF
+# define MEM_SPACE_BUF_PP _AUTOMEM
+#endif
+
/****************************************************************************/
//typedef char * ptr_t;
pfn_outputchar output_char, void* p)
{
unsigned char charsOutputted = 0;
+ #if defined (SDCC_mcs51)
+ char fpBuffer[16]; //mcs51 has only a small stack
+ #else
char fpBuffer[128];
+ #endif
#else
#define OUTPUT_FLOAT(F, W, D, L, Z, S, P) output_float(F, W, D, L, Z, S, P)
static void
signed char reqDecimals,
BOOL left, BOOL zero, BOOL sign, BOOL space)
{
- xdata char fpBuffer[128];
+ __xdata char fpBuffer[128];
#endif //SDCC_STACK_AUTO
BOOL negative = 0;
unsigned long integerPart;
+ float rounding;
float decimalPart;
char fpBI=0, fpBD;
unsigned char minWidth, i;
+ signed char exp = -128;
// save the sign
if (f<0) {
if (f>0x00ffffff) {
// this part is from Frank van der Hulst
- signed char exp;
for (exp = 0; f >= 10.0; exp++) f /=10.0;
for ( ; f < 1.0; exp--) f *=10.0;
OUTPUT_CHAR ('+', p);
}
}
-#ifdef SDCC_STACK_AUTO
- charsOutputted += OUTPUT_FLOAT(f, 0, reqDecimals, 0, 0, 0, 0);
-#else
- OUTPUT_FLOAT(f, 0, reqDecimals, 0, 0, 0, 0);
-#endif
- OUTPUT_CHAR ('e', p);
- if (exp<0) {
- OUTPUT_CHAR ('-', p);
- exp = -exp;
- }
- OUTPUT_CHAR ('0'+exp/10, p);
- OUTPUT_CHAR ('0'+exp%10, p);
-#ifdef SDCC_STACK_AUTO
- return charsOutputted;
-#else
- return;
-#endif //SDCC_STACK_AUTO
+ reqWidth = 0;
+ left = 0;
+ zero = 0;
+ sign = 0;
+ space = 0;
+ }
+
+ // display some decimals as default
+ if (reqDecimals==-1)
+ reqDecimals=DEFAULT_FLOAT_PRECISION;
+
+ // round the float
+ rounding = 0.5;
+ for (i=reqDecimals; i>0; i--) {
+ rounding /= 10.0;
}
+ f += rounding;
// split the float
- integerPart=f;
- decimalPart=f-integerPart;
+ integerPart = f;
+ decimalPart = f - integerPart;
// fill the buffer with the integerPart (in reversed order!)
while (integerPart) {
fpBuffer[fpBI++]='0';
}
- // display some decimals as default
- if (reqDecimals==-1)
- reqDecimals=DEFAULT_FLOAT_PRECISION;
-
// fill buffer with the decimalPart (in normal order)
fpBD=fpBI;
- for (i=reqDecimals; i>1; i--) {
+ for (i=reqDecimals; i>0; i--) {
decimalPart *= 10.0;
// truncate the float
- integerPart=decimalPart;
- fpBuffer[fpBD++]='0' + integerPart;
- decimalPart-=integerPart;
- }
- if (i) {
- decimalPart *= 10.0;
- // truncate the float
- integerPart = decimalPart + 0.5;
- fpBuffer[fpBD++] = '0' + integerPart;
+ integerPart = decimalPart;
+ fpBuffer[fpBD++] = '0' + integerPart;
+ decimalPart -= integerPart;
}
minWidth=fpBI; // we need at least these
OUTPUT_CHAR(' ', p);
}
}
+
+ if (exp != -128) {
+ OUTPUT_CHAR ('e', p);
+ if (exp<0) {
+ OUTPUT_CHAR ('-', p);
+ exp = -exp;
+ }
+ OUTPUT_CHAR ('0'+exp/10, p);
+ OUTPUT_CHAR ('0'+exp%10, p);
+ }
#ifdef SDCC_STACK_AUTO
return charsOutputted;
#else
}
if (c=='.') {
- if (decimals=-1) decimals=0;
+ if (decimals==-1) decimals=0;
else
; // duplicate, ignore
goto get_conversion_spec;
#endif //USE_FLOATS
} else if (radix != 0)
{
- // Apperently we have to output an integral type
+ // Apparently we have to output an integral type
// with radix "radix"
- unsigned char store[6];
- unsigned char _AUTOMEM *pstore = &store[5];
+ unsigned char MEM_SPACE_BUF store[6];
+ unsigned char MEM_SPACE_BUF_PP *pstore = &store[5];
// store value in byte[0] (LSB) ... byte[3] (MSB)
if (char_argument)