From b6177695117a26c3d214d037c320ae9d549ed9d3 Mon Sep 17 00:00:00 2001 From: ZTG LXC Date: Fri, 26 Feb 2021 18:19:33 +0700 Subject: [PATCH] Update hex2hcd.c --- hex2hcd.c | 163 +++++++++++++++++++++++++++--------------------------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/hex2hcd.c b/hex2hcd.c index 3da7e68..c2bf411 100644 --- a/hex2hcd.c +++ b/hex2hcd.c @@ -26,43 +26,43 @@ static unsigned int asc_to_int(char a) { - return a >= 'A' ? (a - 'A') + 10 : a - '0'; + return a >= 'A' ? (a - 'A') + 10 : a - '0'; } static unsigned int hex_to_int(const char *h) { - return asc_to_int(*h) * 0x10 + asc_to_int(*(h + 1)); + return asc_to_int(*h) * 0x10 + asc_to_int(*(h + 1)); } static unsigned int lhex_to_int(const char *h) { - return hex_to_int(h) * 0x100 + hex_to_int(h + 2); + return hex_to_int(h) * 0x100 + hex_to_int(h + 2); } static int check_sum(const char *str, int len) { - unsigned int sum, cal; - int i; - sum = hex_to_int(str + len - 2); - for (cal = 0, i = 1; i < len - 2; i += 2) - cal += hex_to_int(str + i); - cal = 0x100 - cal & 0xFF; - return sum == cal; + unsigned int sum, cal; + int i; + sum = hex_to_int(str + len - 2); + for (cal = 0, i = 1; i < len - 2; i += 2) + cal += hex_to_int(str + i); + cal = 0x100 - cal & 0xFF; + return sum == cal; } static int check_hex_line(const char *str, int len) { - if ((str[0] != ':') || (len < 11) || !check_sum(str, len) || - (hex_to_int(str + 1) * 2 + 11 != len)) - return 0; - return 1; + if ((str[0] != ':') || (len < 11) || !check_sum(str, len) || + (hex_to_int(str + 1) * 2 + 11 != len)) + return 0; + return 1; } static FILE *open_file(const char *fileName, const char *mode) { - FILE *f = fopen(fileName, mode); - if (f == NULL) { - printf("The file '%s' could not be opened with the following reason\n", fileName); + FILE *f = fopen(fileName, mode); + if (f == NULL) { + printf("The file '%s' could not be opened with the following reason\n", fileName); printf("%s\n", strerror(errno)); exit(-EIO); } @@ -71,78 +71,77 @@ static FILE *open_file(const char *fileName, const char *mode) int main(int argc, char *argv[]) { - unsigned int addr = 0; - char *ifn, *ofn; - FILE *ifp, *ofp; - char *rbuf; - ssize_t len, i; - size_t buflen; + unsigned int addr = 0; + char *ifn, *ofn; + FILE *ifp, *ofp; + char *rbuf; + ssize_t len, i; + size_t buflen; - switch (argc) { - case 2: - ifn = ofn = argv[1]; - break; - case 3: - ifn = argv[1]; - ofn = argv[2]; - break; - default: - printf("Usage: %s []\n", argv[0]); - return 0; - } + switch (argc) { + case 2: + ifn = ofn = argv[1]; + break; + case 3: + ifn = argv[1]; + ofn = argv[2]; + break; + default: + printf("Usage: %s []\n", argv[0]); + return 0; + } - ifp = open_file(ifn, "r"); - ofp = open_file(ofn, "w"); - + ifp = open_file(ifn, "r"); + ofp = open_file(ofn, "w"); + - rbuf = NULL; - while ((len = getline(&rbuf, &buflen, ifp)) > 0) { - int type; - char obuf[7]; - unsigned int dest_addr; - while ((rbuf[len - 1] == '\r') || (rbuf[len - 1] == '\n')) - len--; - printf("%d, %s\n", (int)len, rbuf); - if (!check_hex_line(rbuf, len)) - break; - type = hex_to_int(rbuf + 7); - switch (type) { - case 4: - addr = lhex_to_int(rbuf + 9) * 0x10000; - printf("Bump addr to 0x%08X\n", addr); - break; - case 0: - dest_addr = addr + lhex_to_int(rbuf + 3); - obuf[0] = 0x4c; - obuf[1] = 0xfc; - obuf[2] = hex_to_int(rbuf + 1) + 4; - obuf[3] = dest_addr; - obuf[4] = dest_addr >> 8; - obuf[5] = dest_addr >> 16; - obuf[6] = dest_addr >> 24; - if (fwrite(obuf, 7, 1, ofp) != 1) - goto output_err; - for (i = 0; i < hex_to_int(rbuf + 1); i++) { - obuf[0] = hex_to_int(rbuf + 9 + i * 2); - if (fwrite(obuf, 1, 1, ofp) != 1) goto output_err; - } - break; - case 1: - if (fwrite("\x4e\xfc\x04\xff\xff\xff\xff", 7, 1, ofp) != 1) goto output_err; - goto end; - default: - return -EINVAL; - } - } + rbuf = NULL; + while ((len = getline(&rbuf, &buflen, ifp)) > 0) { + int type; + char obuf[7]; + unsigned int dest_addr; + while ((rbuf[len - 1] == '\r') || (rbuf[len - 1] == '\n')) len--; + printf("%d, %s\n", (int)len, rbuf); + if (!check_hex_line(rbuf, len)) + break; + type = hex_to_int(rbuf + 7); + switch (type) { + case 4: + addr = lhex_to_int(rbuf + 9) * 0x10000; + printf("Bump addr to 0x%08X\n", addr); + break; + case 0: + dest_addr = addr + lhex_to_int(rbuf + 3); + obuf[0] = 0x4c; + obuf[1] = 0xfc; + obuf[2] = hex_to_int(rbuf + 1) + 4; + obuf[3] = dest_addr; + obuf[4] = dest_addr >> 8; + obuf[5] = dest_addr >> 16; + obuf[6] = dest_addr >> 24; + if (fwrite(obuf, 7, 1, ofp) != 1) + goto output_err; + for (i = 0; i < hex_to_int(rbuf + 1); i++) { + obuf[0] = hex_to_int(rbuf + 9 + i * 2); + if (fwrite(obuf, 1, 1, ofp) != 1) goto output_err; + } + break; + case 1: + if (fwrite("\x4e\xfc\x04\xff\xff\xff\xff", 7, 1, ofp) != 1) goto output_err; + goto end; + default: + return -EINVAL; + } + } - puts("Hex file formatting error"); - return -EINVAL; + puts("Hex file formatting error"); + return -EINVAL; output_err: - puts("Error on writing output file"); - return -EIO; + puts("Error on writing output file"); + return -EIO; end: - return 0; + return 0; }