diff --git a/src/term.c b/src/term.c index 407d77f2..c004b801 100644 --- a/src/term.c +++ b/src/term.c @@ -401,13 +401,14 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p, int32_t bytes_grown; uint8_t size; bool is_float; + bool is_signed; // Data union union { float f; int64_t ll; uint8_t a[8]; }; - } data = {.bytes_grown = 0, .size = 0, .is_float = false, .ll = 0}; + } data = {.bytes_grown = 0, .size = 0, .is_float = false, .ll = 0, .is_signed = false}; for (i = start_offset; i < len + start_offset - data.bytes_grown; i++) { data.is_float = false; @@ -457,12 +458,12 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p, } } } + // Print warning if data size might be ambiguous bool is_hex = (strncmp(argv[i], "0x", 2) == 0); bool is_neg_hex = (strncmp(argv[i], "-0x", 3) == 0); bool leading_zero = (strncmp(argv[i], "0x0", 3) == 0); int8_t hex_digits = (strlen(argv[i]) - 2); - if(!data.size // No pre-defined size && (is_neg_hex // Hex with - sign in front || (is_hex && leading_zero && (hex_digits & (hex_digits - 1))) // Hex with 3, 5, 6 or 7 digits @@ -471,9 +472,21 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p, avrdude_message(MSG_INFO, "Warning: no size suffix specified for \"%s\". " "Writing %d byte(s)\n", argv[i], - llabs(data.ll) > 0xFFFFFFFF ? 8 : - llabs(data.ll) > 0x0000FFFF || data.is_float ? 4 : \ - llabs(data.ll) > 0x000000FF ? 2 : 1); + llabs(data.ll) > UINT32_MAX ? 8 : + llabs(data.ll) > UINT16_MAX || data.is_float ? 4 : \ + llabs(data.ll) > UINT8_MAX ? 2 : 1); + } + // Flag if signed integer and adjust size + if (data.ll < 0 && !data.is_float) { + data.is_signed = true; + if (data.ll < INT32_MIN) + data.size = 8; + else if (data.ll < INT16_MIN) + data.size = 4; + else if (data.ll < INT8_MIN) + data.size = 2; + else + data.size = 1; } } buf[i - start_offset + data.bytes_grown] = data.a[0];