Skip to content

Commit e84210c

Browse files
authored
Merge pull request avrdudes#914 from MCUdude/terminal-write-str
Add terminal write string functionality
2 parents e069871 + 08bd5fa commit e84210c

File tree

2 files changed

+64
-21
lines changed

2 files changed

+64
-21
lines changed

src/doc/avrdude.texi

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,14 +1553,16 @@ avrdude: AVR device initialized and ready to accept instructions
15531553
Reading | ################################################## | 100% 0.01s
15541554
15551555
avrdude: Device signature = 0x1e970c (probably avr128db48)
1556-
avrdude> write eeprom 0 1234567890 'A' 'V' 'R' 2.718282
1557-
>>> write eeprom 0 1234567890 'A' 'V' 'R' 2.718282
1556+
avrdude> write eeprom 0 1234567890 'A' 'V' 'R' 2.718282 "Hello World!"
1557+
>>> write eeprom 0 1234567890 'A' 'V' 'R' 2.718282 "Hello World!"
15581558
Warning: no size suffix specified for "1234567890". Writing 4 byte(s)
1559+
Info: Writing 24 bytes starting from address 0x00
15591560
15601561
avrdude> dump eeprom 0 32
15611562
>>> dump eeprom 0 32
1562-
0000 d2 02 96 49 41 56 52 55 f8 2d 40 ff ff ff ff ff |...IAVRU.-@.....|
1563-
0010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
1563+
1564+
0000 d2 02 96 49 41 56 52 55 f8 2d 40 48 65 6c 6c 6f |...IAVRU.-@Hello|
1565+
0010 20 57 6f 72 6c 64 21 00 ff ff ff ff ff ff ff ff | World!.........|
15641566
15651567
avrdude> q
15661568
@end cartouche

src/term.c

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,15 @@ static int nexttok(char * buf, char ** tok, char ** next)
126126
q++;
127127

128128
/* isolate first token */
129-
n = q+1;
130-
while (*n && !isspace((int)*n))
129+
n = q;
130+
uint8_t quotes = 0;
131+
while (*n && (!isspace((int)*n) || quotes)) {
132+
if (*n == '\"')
133+
quotes++;
134+
else if (isspace((int)*n) && *(n-1) == '\"')
135+
break;
131136
n++;
137+
}
132138

133139
if (*n) {
134140
*n = 0;
@@ -397,20 +403,34 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
397403
uint8_t size;
398404
bool is_float;
399405
bool is_signed;
406+
char * str_ptr;
400407
// Data union
401408
union {
402409
float f;
403410
int64_t ll;
404411
uint8_t a[8];
405412
};
406-
} data = {.bytes_grown = 0, .size = 0, .is_float = false, .ll = 0, .is_signed = false};
413+
} data = {
414+
.bytes_grown = 0,
415+
.size = 0,
416+
.is_float = false,
417+
.is_signed = false,
418+
.str_ptr = NULL,
419+
.ll = 0
420+
};
407421

408422
for (i = start_offset; i < len + start_offset; i++) {
409423
data.is_float = false;
410424
data.size = 0;
411425

412426
// Handle the next argument
413427
if (i < argc - start_offset + 3) {
428+
// Free string pointer if already allocated
429+
if(data.str_ptr) {
430+
free(data.str_ptr);
431+
data.str_ptr = NULL;
432+
}
433+
414434
// Get suffix if present
415435
char suffix = argv[i][strlen(argv[i]) - 1];
416436
char lsuffix = argv[i][strlen(argv[i]) - 2];
@@ -446,10 +466,23 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
446466
if (argv[i][0] == '\'' && argv[i][2] == '\'') {
447467
data.ll = argv[i][1];
448468
} else {
449-
avrdude_message(MSG_INFO, "\n%s (write): can't parse data \"%s\"\n",
450-
progname, argv[i]);
469+
// Try string that starts and ends with quotes
470+
if (argv[i][0] == '\"' && argv[i][strlen(argv[i]) - 1] == '\"') {
471+
data.str_ptr = calloc(strlen(argv[i]), sizeof(char));
472+
if (data.str_ptr == NULL) {
473+
avrdude_message(MSG_INFO, "%s (write str): out of memory\n", progname);
474+
return -1;
475+
}
476+
// Strip start and end quotes
477+
strncpy(data.str_ptr, argv[i] + 1, strlen(argv[i]) - 2);
478+
} else {
479+
avrdude_message(MSG_INFO, "\n%s (write): can't parse data '%s'\n",
480+
progname, argv[i]);
451481
free(buf);
482+
if(data.str_ptr != NULL)
483+
free(data.str_ptr);
452484
return -1;
485+
}
453486
}
454487
}
455488
}
@@ -484,18 +517,23 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
484517
data.size = 1;
485518
}
486519
}
487-
buf[i - start_offset + data.bytes_grown] = data.a[0];
488-
if (llabs(data.ll) > 0x000000FF || data.size >= 2 || data.is_float)
489-
buf[i - start_offset + ++data.bytes_grown] = data.a[1];
490-
if (llabs(data.ll) > 0x0000FFFF || data.size >= 4 || data.is_float) {
491-
buf[i - start_offset + ++data.bytes_grown] = data.a[2];
492-
buf[i - start_offset + ++data.bytes_grown] = data.a[3];
493-
}
494-
if (llabs(data.ll) > 0xFFFFFFFF || data.size == 8) {
495-
buf[i - start_offset + ++data.bytes_grown] = data.a[4];
496-
buf[i - start_offset + ++data.bytes_grown] = data.a[5];
497-
buf[i - start_offset + ++data.bytes_grown] = data.a[6];
498-
buf[i - start_offset + ++data.bytes_grown] = data.a[7];
520+
if(data.str_ptr) {
521+
for(int16_t j = 0; j < strlen(data.str_ptr); j++)
522+
buf[i - start_offset + data.bytes_grown++] = (uint8_t)data.str_ptr[j];
523+
} else {
524+
buf[i - start_offset + data.bytes_grown] = data.a[0];
525+
if (llabs(data.ll) > 0x000000FF || data.size >= 2 || data.is_float)
526+
buf[i - start_offset + ++data.bytes_grown] = data.a[1];
527+
if (llabs(data.ll) > 0x0000FFFF || data.size >= 4 || data.is_float) {
528+
buf[i - start_offset + ++data.bytes_grown] = data.a[2];
529+
buf[i - start_offset + ++data.bytes_grown] = data.a[3];
530+
}
531+
if (llabs(data.ll) > 0xFFFFFFFF || data.size == 8) {
532+
buf[i - start_offset + ++data.bytes_grown] = data.a[4];
533+
buf[i - start_offset + ++data.bytes_grown] = data.a[5];
534+
buf[i - start_offset + ++data.bytes_grown] = data.a[6];
535+
buf[i - start_offset + ++data.bytes_grown] = data.a[7];
536+
}
499537
}
500538
}
501539

@@ -511,6 +549,9 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
511549
return -1;
512550
}
513551

552+
if(data.str_ptr)
553+
free(data.str_ptr);
554+
514555
avrdude_message(MSG_NOTICE, "\nInfo: Writing %d bytes starting from address 0x%02x",
515556
len + data.bytes_grown, addr);
516557
if (write_mode == WRITE_MODE_FILL)

0 commit comments

Comments
 (0)