static int parseIntelHex(char *hexfile, char* buffer, int *startAddr, int *endAddr) { int address, base, d, segment, i, lineLen, sum; FILE *input; input = strcmp(hexfile, "-") == 0 ? stdin : fopen(hexfile, "r"); if (input == NULL) { printf("> Error opening %s: %s\n", hexfile, strerror(errno)); return 1; } while (parseUntilColon(input) == ':') { sum = 0; sum += lineLen = parseHex(input, 2); base = address = parseHex(input, 4); sum += address >> 8; sum += address; sum += segment = parseHex(input, 2); /* segment value? */ if (segment != 0) { /* ignore lines where this byte is not 0 */ continue; } for (i = 0; i < lineLen; i++) { d = parseHex(input, 2); buffer[address++] = d; sum += d; } sum += parseHex(input, 2); if ((sum & 0xff) != 0) { printf("> Warning: Checksum error between address 0x%x and 0x%x\n", base, address); } if(*startAddr > base) { *startAddr = base; } if(*endAddr < address) { *endAddr = address; } } fclose(input); return 0; }
static int parseIntelHex(char *hexfile, char buffer[131072 + 256]) { int address, base, d, segment, i, lineLen, sum, extSegAddr; FILE *input; extSegAddr = 0; input = fopen(hexfile, "r"); if(input == NULL){ fprintf(stderr, "error opening %s: %s\n", hexfile, strerror(errno)); return 1; } while(parseUntilColon(input) == ':'){ sum = 0; sum += lineLen = parseHex(input, 2); base = address = parseHex(input, 4); sum += address >> 8; sum += address; address += extSegAddr; base += extSegAddr; if(address >= 0x7000) break; sum += segment = parseHex(input, 2); /* segment value? */ if(segment == 0x02) /* Extended Segment Address Records (HEX86)*/ { extSegAddr = parseHex(input, 4); extSegAddr = (extSegAddr << 4) & 0xFFFF0; continue; }else if(segment != 0) /* ignore lines where this byte is not 0 */ { continue; } for(i = 0; i < lineLen ; i++){ d = parseHex(input, 2); buffer[address++] = d; sum += d; } sum += parseHex(input, 2); if((sum & 0xff) != 0){ fprintf(stderr, "Warning: Checksum error between address 0x%x and 0x%x\n", base, address); } if(start) { startAddress[addressIndex] = base; endAddress[addressIndex] = address; start = 0; // fprintf(stderr, "s[%d]=%x, e[%d]=%x \n", addressIndex, startAddress[addressIndex], addressIndex, endAddress[addressIndex]); } if ((base - endAddress[addressIndex]) >= 32 || (endAddress[addressIndex] - base) >= 32) { addressIndex++; startAddress[addressIndex] = base; // fprintf(stderr, "s[%d]=%x, e[%d]=%x \n", addressIndex, startAddress[addressIndex], addressIndex, endAddress[addressIndex]); } endAddress[addressIndex] = address; // fprintf(stderr, "s[%d]=%x, e[%d]=%x \n", addressIndex, startAddress[addressIndex], addressIndex, endAddress[addressIndex]); } #ifdef DEBUG for(i = 0; i <= addressIndex; i++) { fprintf(stderr, "s[%d]=%x, e[%d]=%x \n", i, startAddress[i], i, endAddress[i]); } #endif fclose(input); return 0; }