int LoadIHexFile (char *FileName, u_char** FileBuffer) { int rval = 0; int okline_counter = 0; u_char *endp; u_char *dp; int img_size = 0; char riga[MAXLINE+1]; long laddr = 0; long raddr = 0; FILE *fh; USHORT bcount; USHORT addr; USHORT data; USHORT rectype; *FileBuffer = malloc(sizeof(u_char)*576) ; // 64 Bytes as reserve if (*FileBuffer==NULL) { printf ("Out of mem in LoadIHex\n") ; exit (1) ; }; endp = *FileBuffer + 512; dp = *FileBuffer; if ( (fh = fopen(FileName, "r")) == NULL ) return FILENOTFOUND; riga[MAXLINE] = '\0'; while ( fgets(riga, MAXLINE, fh) ) { char *s; int k; if ( (s = strchr(riga, ':')) == NULL ) continue; else s++; //Byte Count if ( ScanHex(&s, 2, &bcount) != OK ) { rval = BADFILETYPE; break; } u_char checksum = (u_char)bcount; //Address if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; //affect only low 16 bits of address raddr = laddr ; laddr &= 0xFFFF0000; laddr |= addr; //Record Type if ( ScanHex(&s, 2, &rectype) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)rectype; //Data Byte if (rectype == DATA_RECORD) { //buffer overflow // laddr anpassen, wenn STM32, sonst wird an die falsche stelle geladen (-0x8004000) raddr = laddr ; if (raddr>=0x8004000) raddr-=0x8004000 ; if (dp+raddr+bcount >= endp) { *FileBuffer= realloc(*FileBuffer, raddr+bcount+64) ; // 64 bytes as reserve dp = *FileBuffer ; if (*FileBuffer==NULL) { printf ("Out of mem in LoadIHex\n") ; exit (1) ; }; endp = dp+raddr+bcount ; } char ok = TRUE; u_char *p; for (k = 0, p = dp+raddr; k < bcount && ok; k++) { if ( ScanHex(&s, 2, &data) != OK ) ok = FALSE; checksum += (u_char)data; *p++ = (u_char)data; } if (!ok) { //Irgendwas war defekt rval = BADFILETYPE; break; } img_size = raddr + bcount; } else if (rectype == SEG_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address USHORT addr; if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; laddr = (long)addr << 4; } } else if (rectype == LIN_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address USHORT addr; if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; laddr = (long)addr << 16; } } else { // Unknown record type: discard data bytes (but check for validity)
int LoadIHexFile (char *FileName, long relocation_offset) { int rval = 0; int okline_counter = 0; u_char *endp; u_char *dp; int img_size = 0; char riga[MAXLINE+1]; long laddr = 0; FILE *fh; USHORT bcount; USHORT addr; USHORT data; USHORT rectype; endp = FileBuffer + BUFFERSIZE; dp = FileBuffer; //Relocation check if (dp + relocation_offset > endp) return BADPARAM; else dp += relocation_offset; if ( (fh = fopen(FileName, "r")) == NULL ) return FILENOTFOUND; riga[MAXLINE] = '\0'; while ( fgets(riga, MAXLINE, fh) ) { char *s; int k; if ( (s = strchr(riga, ':')) == NULL ) continue; else s++; //Byte Count if ( ScanHex(&s, 2, &bcount) != OK ) { rval = BADFILETYPE; break; } u_char checksum = (u_char)bcount; //Address if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; //affect only low 16 bits of address laddr &= 0xFFFF0000; laddr |= addr; //Record Type if ( ScanHex(&s, 2, &rectype) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)rectype; //Data Byte if (rectype == DATA_RECORD) { //buffer overflow if (dp+laddr+bcount > endp) { rval = BUFFEROVERFLOW; break; } char ok = TRUE; u_char *p; for (k = 0, p = dp+laddr; k < bcount && ok; k++) { if ( ScanHex(&s, 2, &data) != OK ) ok = FALSE; checksum += (u_char)data; *p++ = (u_char)data; } if (!ok) //Irgendwas war defekt { rval = BADFILETYPE; break; } img_size = laddr + bcount; } else if (rectype == SEG_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address USHORT addr; if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; laddr = (long)addr << 4; } } else if (rectype == LIN_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address USHORT addr; if ( ScanHex(&s, 4, &addr) != OK ) { rval = BADFILETYPE; break; } checksum += (u_char)(addr >> 8); checksum += (u_char)addr; laddr = (long)addr << 16; } } else // Unknown record type: discard data bytes (but check for validity) {