From e0026ff0fd2225e29ec4c95452e16b25892e2b9b Mon Sep 17 00:00:00 2001
From: "Brian S. Dean" <bsd@bsdhome.com>
Date: Thu, 22 May 2003 00:46:59 +0000
Subject: [PATCH] Make the s-record output routine work like the raw and intel
 hex output routines (don't optimize away 0xff data before and after non 0xff
 data).  Also, fix a bug where the data contents sometimes weren't written out
 completely.

Initial bug reported by Tom Harris <TomH@optiscan.com>.  Fixes
provided by Alexey V.Levdikov <tsar@kemford.com>.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk@330 81a1dc3b-b13d-400b-aceb-764788c761c2
---
 avrdude/fileio.c | 72 +++++++++++-------------------------------------
 1 file changed, 16 insertions(+), 56 deletions(-)

diff --git a/avrdude/fileio.c b/avrdude/fileio.c
index f3806215..19591747 100644
--- a/avrdude/fileio.c
+++ b/avrdude/fileio.c
@@ -360,11 +360,10 @@ int b2srec(unsigned char * inbuf, int bufsize,
            char * outfile, FILE * outf)
 {
   unsigned char * buf;
-  unsigned int nextaddr, stopaddr;
+  unsigned int nextaddr;
   int n, nbytes, addr_width;
   int i;
   unsigned char cksum;
-  unsigned char startf, stopf ,emptyf;
 
   char * tmpl=0;
 
@@ -373,39 +372,11 @@ int b2srec(unsigned char * inbuf, int bufsize,
             progname, recsize);
     return -1;
   }
-
+  
+  nextaddr = startaddr;
   buf = inbuf;
-  nextaddr = 0;    
-  stopaddr = 0;
-  startf = 0;
-  stopf = 0;
+  nbytes = 0;    
 
-  /* search for ranges of 'real' data */     
-  for (i=startaddr; i<bufsize; i++) {
-    if (buf[i] == 0xff) {
-      if (startf == 0) 
-        continue;
-      else if (stopf == 0) {
-        stopf = 1;
-        stopaddr = i;
-      }
-    }
-    else {
-      if (startf == 0) {
-        startf = 1;
-        nextaddr = i;
-        while (nextaddr % recsize != 0)
-          nextaddr --;
-      }
-      else if (stopf == 1) {
-        stopf = 0;
-        stopaddr = bufsize;
-      }
-    }
-  }
-  nbytes = i; 
-
-  bufsize = stopaddr - nextaddr;
   addr_width = 0;
 
   while (bufsize) {
@@ -435,34 +406,23 @@ int b2srec(unsigned char * inbuf, int bufsize,
         return -1;
       }
 
-      /* skip the lines filled with 0xff */ 
-      emptyf = 1;
+      fprintf(outf, tmpl, n + addr_width + 1, nextaddr);		
+
+      cksum += n + addr_width + 1;
+
+      for (i=addr_width; i>0; i--) 
+        cksum += (nextaddr >> (i-1) * 8) & 0xff;
+
       for (i=nextaddr; i<nextaddr + n; i++) {
-        if (buf[i] != 0xff) {
-          emptyf=0;
-          break;
-        }
+        fprintf(outf, "%02X", buf[i]);
+        cksum += buf[i];
       }
 
-      if (emptyf != 1) {	
-
-        fprintf(outf, tmpl, n + addr_width + 1, nextaddr);		
-
-        cksum += n + addr_width + 1;
-
-        for (i=addr_width; i>0; i--) 
-          cksum += (nextaddr >> (i-1) * 8) & 0xff;
-
-        for (i=nextaddr; i<nextaddr + n; i++) {
-          fprintf(outf, "%02X", buf[i]);
-          cksum += buf[i];
-        }
-
-        cksum = 0xff - cksum;
-        fprintf(outf, "%02X\n", cksum);
-      }
+      cksum = 0xff - cksum;
+      fprintf(outf, "%02X\n", cksum);
 
       nextaddr += n;
+      nbytes +=n;
     }
 
     /* advance to next 'recsize' bytes */