misc: Point to correct simavr include dirs
[simavr] / simavr / sim / sim_hex.c
index 0a8b10f..0c4f24f 100644 (file)
@@ -121,7 +121,7 @@ uint8_t * read_ihex_file(const char * fname, uint32_t * dsize, uint32_t * start)
                }
                uint16_t addr = (bline[1] << 8) | bline[2];
                if (base == ~0) {
-                       base = addr;    // stadt address
+                       base = addr;    // start address
                }
                if (addr != base + size) {
                        fprintf(stderr, "%s: %s, offset out of bounds %04x expected %04x\n", __FUNCTION__, fname, addr, base+size);
@@ -139,19 +139,21 @@ uint8_t * read_ihex_file(const char * fname, uint32_t * dsize, uint32_t * start)
 }
 
 
-int read_ihex_chunks(const char * fname, struct ihex_chunk_t * chunks, int max_chunks)
+int
+read_ihex_chunks(
+               const char * fname,
+               ihex_chunk_p * chunks )
 {
-       if (!fname || !chunks || !max_chunks)
+       if (!fname || !chunks)
                return -1;
-       memset((void*)chunks, 0, sizeof(chunks[0]) * max_chunks);
        FILE * f = fopen(fname, "r");
        if (!f) {
                perror(fname);
                return -1;
        }
        uint32_t segment = 0;   // segment address
-       int chunk = 0;
-       chunks[0].baseaddr = ~0;
+       int chunk = 0, max_chunks = 0;
+       *chunks = NULL;
 
        while (!feof(f)) {
                char line[128];
@@ -182,7 +184,7 @@ int read_ihex_chunks(const char * fname, struct ihex_chunk_t * chunks, int max_c
                uint32_t addr = 0;
                switch (bline[3]) {
                        case 0: // normal data
-                               addr = segment + (bline[1] << 8) | bline[2];
+                               addr = segment | (bline[1] << 8) | bline[2];
                                break;
                        case 1: // end of file
                                continue;
@@ -196,25 +198,28 @@ int read_ihex_chunks(const char * fname, struct ihex_chunk_t * chunks, int max_c
                                fprintf(stderr, "%s: %s, unsupported check type %02x\n", __FUNCTION__, fname, bline[3]);
                                continue;
                }
-               if (addr != chunks[chunk].baseaddr + chunks[chunk].size) {
-                       if (chunks[chunk].size)
+               if (chunk < max_chunks && addr != ((*chunks)[chunk].baseaddr + (*chunks)[chunk].size)) {
+                       if ((*chunks)[chunk].size)
                                chunk++;
-                       chunks[chunk].baseaddr = addr;
                }
-               chunks[chunk].data = realloc(chunks[chunk].data, chunks[chunk].size + bline[0]);
-               memcpy(chunks[chunk].data + chunks[chunk].size, bline + 4, bline[0]);
-               chunks[chunk].size += bline[0];
+               if (chunk >= max_chunks) {
+                       max_chunks++;
+                       *chunks = realloc(*chunks, max_chunks * sizeof(ihex_chunk_t));
+                       memset(*chunks + chunk, 0, (max_chunks - chunk) * sizeof(ihex_chunk_t));
+                       (*chunks)[chunk].baseaddr = addr;
+               }
+               (*chunks)[chunk].data = realloc((*chunks)[chunk].data, (*chunks)[chunk].size + bline[0]);
+               memcpy((*chunks)[chunk].data + (*chunks)[chunk].size, bline + 4, bline[0]);
+               (*chunks)[chunk].size += bline[0];
        }
-       if (chunks[chunk].size)
-               chunk++;
        fclose(f);
-       return chunk;
+       return max_chunks;
 }
 
 
 #ifdef IHEX_TEST
-// gcc -std=gnu99 -Isimavr/sim simavr/sim/sim_hex.c -o sim_hex -DIHEX_TEST
-int main(int argc, char * argv[])
+// gcc -std=gnu99 -Isimavr/sim simavr/sim/sim_hex.c -o sim_hex -DIHEX_TEST -Dtest_main=main
+int test_main(int argc, char * argv[])
 {
        struct ihex_chunk_t chunk[4];