@@ -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