Skip to content

Commit 8f100f5

Browse files
committed
Initial support for string write
1 parent f0f9059 commit 8f100f5

File tree

1 file changed

+36
-14
lines changed

1 file changed

+36
-14
lines changed

src/term.c

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -404,17 +404,26 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
404404
uint8_t size;
405405
bool is_float;
406406
bool is_signed;
407+
char * str_ptr;
407408
// Data union
408409
union {
409410
float f;
410411
int64_t ll;
411412
uint8_t a[8];
412413
};
413-
} data = {.bytes_grown = 0, .size = 0, .is_float = false, .ll = 0, .is_signed = false};
414+
} data = {
415+
.bytes_grown = 0,
416+
.size = 0,
417+
.is_float = false,
418+
.is_signed = false,
419+
.str_ptr = NULL,
420+
.ll = 0
421+
};
414422

415423
for (i = start_offset; i < len + start_offset; i++) {
416424
data.is_float = false;
417425
data.size = 0;
426+
data.str_ptr = NULL;
418427

419428
// Handle the next argument
420429
if (i < argc - start_offset + 3) {
@@ -453,10 +462,17 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
453462
if (argv[i][0] == '\'' && argv[i][2] == '\'') {
454463
data.ll = argv[i][1];
455464
} else {
465+
// Try string that starts and ends with quote
466+
if (argv[i][0] == '\"' && argv[i][strlen(argv[i]) - 1] == '\"') {
467+
data.str_ptr = calloc(strlen(argv[i])+0x10, sizeof(char));
468+
strncpy(data.str_ptr, argv[i] + 1, strlen(argv[i]) - 2);
469+
avrdude_message(MSG_INFO, "argv: %s, malloc: %s\n", argv[i], data.str_ptr);
470+
} else {
456471
avrdude_message(MSG_INFO, "\n%s (write): can't parse data \"%s\"\n",
457-
progname, argv[i]);
472+
progname, argv[i]);
458473
free(buf);
459474
return -1;
475+
}
460476
}
461477
}
462478
}
@@ -491,18 +507,24 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
491507
data.size = 1;
492508
}
493509
}
494-
buf[i - start_offset + data.bytes_grown] = data.a[0];
495-
if (llabs(data.ll) > 0x000000FF || data.size >= 2 || data.is_float)
496-
buf[i - start_offset + ++data.bytes_grown] = data.a[1];
497-
if (llabs(data.ll) > 0x0000FFFF || data.size >= 4 || data.is_float) {
498-
buf[i - start_offset + ++data.bytes_grown] = data.a[2];
499-
buf[i - start_offset + ++data.bytes_grown] = data.a[3];
500-
}
501-
if (llabs(data.ll) > 0xFFFFFFFF || data.size == 8) {
502-
buf[i - start_offset + ++data.bytes_grown] = data.a[4];
503-
buf[i - start_offset + ++data.bytes_grown] = data.a[5];
504-
buf[i - start_offset + ++data.bytes_grown] = data.a[6];
505-
buf[i - start_offset + ++data.bytes_grown] = data.a[7];
510+
if(data.str_ptr != NULL) {
511+
for(int16_t j = 0; j < strlen(data.str_ptr); j++)
512+
buf[i - start_offset + data.bytes_grown++] = (uint8_t)data.str_ptr[j];
513+
free(data.str_ptr);
514+
} else {
515+
buf[i - start_offset + data.bytes_grown] = data.a[0];
516+
if (llabs(data.ll) > 0x000000FF || data.size >= 2 || data.is_float)
517+
buf[i - start_offset + ++data.bytes_grown] = data.a[1];
518+
if (llabs(data.ll) > 0x0000FFFF || data.size >= 4 || data.is_float) {
519+
buf[i - start_offset + ++data.bytes_grown] = data.a[2];
520+
buf[i - start_offset + ++data.bytes_grown] = data.a[3];
521+
}
522+
if (llabs(data.ll) > 0xFFFFFFFF || data.size == 8) {
523+
buf[i - start_offset + ++data.bytes_grown] = data.a[4];
524+
buf[i - start_offset + ++data.bytes_grown] = data.a[5];
525+
buf[i - start_offset + ++data.bytes_grown] = data.a[6];
526+
buf[i - start_offset + ++data.bytes_grown] = data.a[7];
527+
}
506528
}
507529
}
508530

0 commit comments

Comments
 (0)