Ensure terminal writes little endian numbers

This commit is contained in:
Stefan Rueger 2022-07-12 11:42:59 +01:00
parent ddffabe86a
commit aa09bcf900
1 changed files with 18 additions and 1 deletions

View File

@ -518,6 +518,16 @@ static size_t maxstrlen(int argc, char **argv) {
return max;
}
// Change data item p of size bytes from big endian to little endian and vice versa
static void change_endian(void *p, int size) {
uint8_t tmp, *w = p;
for(int i=0; i<size/2; i++)
tmp = w[i], w[i] = w[size-i-1], w[size-i-1] = tmp;
}
static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
int argc, char * argv[])
{
@ -622,9 +632,13 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
.bytes_grown = 0,
.size = 0,
.str_ptr = NULL,
.ll = 0
.ull = 1
};
if(sizeof(long long) != sizeof(int64_t) || (data.a[0]^data.a[7]) != 1)
avrdude_message(MSG_INFO, "%s (write): assumption on data types not met? check source and recompile\n", progname);
bool is_big_endian = data.a[7];
for (i = start_offset; i < len + start_offset; i++) {
// Handle the next argument
if (i < argc - start_offset + 3) {
@ -767,6 +781,9 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
return -1;
}
}
// ensure we have little endian representation in data.a
if(is_big_endian && data.size > 1)
change_endian(data.a, data.size);
}
if(data.str_ptr) {