Skip to content
This repository has been archived by the owner on Feb 12, 2022. It is now read-only.

Commit

Permalink
Redo most of r851 and r880, respectively, minus the bugs. ;-)
Browse files Browse the repository at this point in the history
(Submitted by dhoerl)


git-svn-id: svn://svn.sv.gnu.org/avrdude/trunk/avrdude@929 81a1dc3b-b13d-400b-aceb-764788c761c2
  • Loading branch information
joerg_wunsch committed Jan 18, 2010
1 parent ecaf592 commit f8a3254
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 14 deletions.
4 changes: 2 additions & 2 deletions ChangeLog
@@ -1,8 +1,8 @@
2010-01-18 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
2010-01-18 David Hoerl <dhoerl@mac.com>

bug #28660: Problem with loading intel hex rom files that exceed
0x10000 bytes
* fileio.c: Revert the changes from r851 and r880, respectively.
* fileio.c: Fix two byte shifts.

2010-01-15 Joerg Wunsch <j.gnu@uriah.heep.sax.de>

Expand Down
25 changes: 13 additions & 12 deletions fileio.c
Expand Up @@ -261,23 +261,24 @@ static int ihex_readrec(struct ihexrec * ihex, char * rec)
* If an error occurs, return -1.
*
* */

static int ihex2b(char * infile, FILE * inf,
unsigned char * outbuf, int bufsize)
{
char buffer [ MAX_LINE_LEN ];
unsigned char * buf;
unsigned int nextaddr, baseaddr, maxaddr;
unsigned int nextaddr, baseaddr, maxaddr, offsetaddr;
int i;
int lineno;
int len;
struct ihexrec ihex;
int rc;

lineno = 0;
buf = outbuf;
baseaddr = 0;
maxaddr = 0;
lineno = 0;
buf = outbuf;
baseaddr = 0;
maxaddr = 0;
offsetaddr = 0;
nextaddr = 0;

while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) {
lineno++;
Expand All @@ -301,24 +302,23 @@ static int ihex2b(char * infile, FILE * inf,
}

switch (ihex.rectyp) {

case 0: /* data record */
nextaddr = ihex.loadofs + baseaddr;
if (nextaddr + ihex.reclen > bufsize) {
if ((nextaddr + ihex.reclen) > (bufsize+offsetaddr)) {
fprintf(stderr,
"%s: ERROR: address 0x%04x out of range at line %d of %s\n",
progname, nextaddr+ihex.reclen, lineno, infile);
return -1;
}
for (i=0; i<ihex.reclen; i++) {
buf[nextaddr+i] = ihex.data[i];
buf[nextaddr+i-offsetaddr] = ihex.data[i];
}
if (nextaddr+ihex.reclen > maxaddr)
maxaddr = nextaddr+ihex.reclen;
break;

case 1: /* end of file record */
return maxaddr;
return maxaddr-offsetaddr;
break;

case 2: /* extended segment address record */
Expand All @@ -331,6 +331,7 @@ static int ihex2b(char * infile, FILE * inf,

case 4: /* extended linear address record */
baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 16;
if(nextaddr == 0) offsetaddr = baseaddr; // if provided before any data, then remember it
break;

case 5: /* start linear address record */
Expand All @@ -353,10 +354,9 @@ static int ihex2b(char * infile, FILE * inf,
"file \"%s\"\n",
progname, infile);

return maxaddr;
return maxaddr-offsetaddr;
}


static int b2srec(unsigned char * inbuf, int bufsize,
int recsize, int startaddr,
char * outfile, FILE * outf)
Expand Down Expand Up @@ -1153,6 +1153,7 @@ int fileio(int op, char * filename, FILEFMT format,
if (format != FMT_IMM && !using_stdio) {
fclose(f);
}

return rc;
}

0 comments on commit f8a3254

Please sign in to comment.