fix tail zeroes elimination
diff --git a/skeletons/REAL.c b/skeletons/REAL.c
index 6a06ea5..68157de 100644
--- a/skeletons/REAL.c
+++ b/skeletons/REAL.c
@@ -168,7 +168,13 @@
 	do {
 		ret = snprintf(buf, buflen, fmt, d);
 		if(ret < 0) {
+			/* There are some old broken APIs. */
 			buflen <<= 1;
+			if(buflen > 4096) {
+				/* Should be plenty. */
+				if(buf != local_buf) FREEMEM(buf);
+				return -1;
+			}
 		} else if(ret >= buflen) {
 			buflen = ret + 1;
 		} else {
@@ -188,12 +194,12 @@
 		char *dot;
 		char *end = buf + buflen;
 		char *last_zero;
-		char *prev_zero;
+		char *first_zero_in_run;
         char *s;
 
         enum {
             LZSTATE_NOTHING,
-            LZSTATE_SEEN_ZERO
+            LZSTATE_ZEROES
         } lz_state = LZSTATE_NOTHING;
 
 		dot = (buf[0] == 0x2d /* '-' */) ? (buf + 2) : (buf + 1);
@@ -204,16 +210,14 @@
 		}
 		*dot = 0x2e;		/* Replace possible comma */
 
-		for(prev_zero = last_zero = s = dot + 2; s < end; s++) {
+        for(first_zero_in_run = last_zero = s = dot + 2; s < end; s++) {
             switch(*s) {
             case 0x45: /* 'E' */
-                if(lz_state == LZSTATE_SEEN_ZERO)
-                    last_zero = prev_zero;
+                if(lz_state == LZSTATE_ZEROES) last_zero = first_zero_in_run;
                 break;
-            case 0x30:  /* '0' */
-                if(lz_state == LZSTATE_NOTHING)
-                    prev_zero = s;
-                lz_state = LZSTATE_SEEN_ZERO;
+            case 0x30: /* '0' */
+                if(lz_state == LZSTATE_NOTHING) first_zero_in_run = s;
+                lz_state = LZSTATE_ZEROES;
                 continue;
             default:
                 lz_state = LZSTATE_NOTHING;
@@ -253,7 +257,7 @@
                 buflen--;
                 expptr++;
             }
-            if(*last_zero == 0x30) {
+            if(lz_state == LZSTATE_ZEROES) {
                 *last_zero = 0x45;	/* E */
                 buflen -= s - (last_zero + 1);
                 s = last_zero + 1;