From 2a92b8cce42c73e51681df1a786937f17a66b74e Mon Sep 17 00:00:00 2001
From: MCUdude <hansibull@gmail.com>
Date: Thu, 17 Feb 2022 13:00:30 +0100
Subject: [PATCH] Add support for memory "fill" with arbitrary data too If you
 run the following command: $ write eeprom 0x00 0x10 A B C ...

It will write the following data to EEPROM:
|ABCCCCCCCCCCCCCC|
starting from address 0x00
---
 src/term.c | 62 +++++++++++++++++++++++++-----------------------------
 1 file changed, 29 insertions(+), 33 deletions(-)

diff --git a/src/term.c b/src/term.c
index ce58c19c..fc2e5d3c 100644
--- a/src/term.c
+++ b/src/term.c
@@ -336,7 +336,7 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
   unsigned char b;
   int rc;
   int werror;
-  int write_mode;
+  int write_mode, start_offset;
   AVRMEM * mem;
 
   if (argc < 4) {
@@ -370,8 +370,8 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
     return -1;
   }
 
-  // Figure out how many bytes to write to memory
-  if(strcmp(argv[5], "...") == 0) {
+  // Figure out how many bytes there is to write to memory
+  if(strcmp(argv[argc - 1], "...") == 0) {
     write_mode = WRITE_MODE_FILL;
     len = strtoul(argv[3], &e, 0);
     if (*e || (e == argv[3])) {
@@ -397,38 +397,34 @@ static int cmd_write(PROGRAMMER * pgm, struct avrpart * p,
     return -1;
   }
 
-  if(write_mode == WRITE_MODE_STANDARD) {
-    for (i=3; i<argc; i++) {
-      unsigned char write_val = strtoul(argv[i], &e, 0);
-      if (*e || (e == argv[i])) {
-        // If passed argument is a single character
-        if(argv[i][1] == '\0') {
-          write_val = argv[i][0];
-        } else {
-          avrdude_message(MSG_INFO, "%s (write): can't parse byte \"%s\"\n",
-                  progname, argv[i]);
-          free(buf);
-          return -1;
-        }
+  if (write_mode == WRITE_MODE_STANDARD)
+    start_offset = 3; // Data to write from argument no. 3
+  else if (write_mode == WRITE_MODE_FILL)
+    start_offset = 4;
+  else {
+    avrdude_message(MSG_INFO, "%s (write): invalid write mode %d\n",
+                    progname, write_mode);
+    return -1;
+  }
+
+  unsigned char write_val;
+  for (i = start_offset; i < argc - start_offset + 3; i++) {
+    write_val = strtoul(argv[i], &e, 0);
+    if (*e || (e == argv[i])) {
+      // Accept if passed argument is a single character
+      if (argv[i][1] == '\0') {
+        write_val = argv[i][0];
+      } else {
+        avrdude_message(MSG_INFO, "%s (write ...): can't parse byte \"%s\"\n",
+              progname, argv[i]);
+        free(buf);
+        return -1;
       }
-      buf[i-3] = write_val;
-    }
-  } else if(write_mode == WRITE_MODE_FILL) {
-    unsigned char fill_val = strtoul(argv[4], &e, 0);
-    if (*e || (e == argv[4])) {
-        // If passed argument is a single character
-        if(argv[4][1] == '\0') {
-          fill_val = argv[4][0];
-        } else {
-          avrdude_message(MSG_INFO, "%s (write ...): can't parse byte \"%s\"\n",
-                progname, argv[4]);
-          free(buf);
-          return -1;
-        }
-    }
-    for (i = 0; i < len; i++) {
-      buf[i] = fill_val;
     }
+    buf[i - start_offset] = write_val;
+  }
+  for (; i < len + start_offset; i++) {
+    buf[i - start_offset] = write_val;
   }
 
   pgm->err_led(pgm, OFF);