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