- switch (type)
- {
- case '0':
- case '5':
- /* Prologue - ignore */
- break;
- case '3':
- address = HEX (src);
- src += 2;
- bytes_on_line--;
-
- case '2':
- address = HEX (src) | (address << 8);
- src += 2;
- bytes_on_line--;
- case '1':
- address = HEX (src) | (address << 8);
- src += 2;
- address = HEX (src) | (address << 8);
- src += 2;
- bytes_on_line -= 2;
- func (abfd, section, address, src, bytes_on_line);
- break;
-
- case '7':
- address = HEX (src);
- src += 2;
- bytes_on_line--;
- case '8':
- address = HEX (src) | (address << 8);
- src += 2;
- bytes_on_line--;
- case '9':
- address = HEX (src) | (address << 8);
- src += 2;
- address = HEX (src) | (address << 8);
- src += 2;
- bytes_on_line -= 2;
- abfd->start_address = address;
- return;
-
- default:
- return;
- }
+ /* Ignore the checksum byte. */
+ --bytes;
+
+ address = 0;
+ data = buf;
+ switch (hdr[0])
+ {
+ case '0':
+ case '5':
+ /* Prologue--ignore the file name, but stop building a
+ section at this point. */
+ sec = NULL;
+ break;
+
+ case '3':
+ address = HEX (data);
+ data += 2;
+ --bytes;
+ /* Fall through. */
+ case '2':
+ address = (address << 8) | HEX (data);
+ data += 2;
+ --bytes;
+ /* Fall through. */
+ case '1':
+ address = (address << 8) | HEX (data);
+ data += 2;
+ address = (address << 8) | HEX (data);
+ data += 2;
+ bytes -= 2;
+
+ if (sec != NULL
+ && sec->vma + sec->_raw_size == address)
+ {
+ /* This data goes at the end of the section we are
+ currently building. */
+ sec->_raw_size += bytes;
+ }
+ else
+ {
+ char secbuf[20];
+ char *secname;
+
+ sprintf (secbuf, ".sec%d", bfd_count_sections (abfd) + 1);
+ secname = (char *) bfd_alloc (abfd, strlen (secbuf) + 1);
+ strcpy (secname, secbuf);
+ sec = bfd_make_section (abfd, secname);
+ if (sec == NULL)
+ goto error_return;
+ sec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
+ sec->vma = address;
+ sec->lma = address;
+ sec->_raw_size = bytes;
+ sec->filepos = pos;
+ }
+
+ break;
+
+ case '7':
+ address = HEX (data);
+ data += 2;
+ /* Fall through. */
+ case '8':
+ address = (address << 8) | HEX (data);
+ data += 2;
+ /* Fall through. */
+ case '9':
+ address = (address << 8) | HEX (data);
+ data += 2;
+ address = (address << 8) | HEX (data);
+ data += 2;
+
+ /* This is a termination record. */
+ abfd->start_address = address;
+
+ if (buf != NULL)
+ free (buf);
+
+ return true;
+ }
+ }
+ break;