From 7375477f7097b4cb835f4e17889fc0674bb1ed38 Mon Sep 17 00:00:00 2001
From: Stefan Rueger <stefan.rueger@urclocks.com>
Date: Tue, 9 Aug 2022 21:45:04 +0100
Subject: [PATCH] Replace string arrays with const char * and allocated space
 (part 1)

This commit deals with default_programmer, default_serial, default_parallel
and default_spi. The long term objective is to remove all fixed-size buffers
from the structures that lexer.l and config_gram.y deal with.
---
 src/config.c      |  8 ++++----
 src/config.h      |  2 --
 src/config_gram.y | 12 ++++--------
 src/libavrdude.h  |  8 ++++----
 src/main.c        | 17 +++++++++--------
 5 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/src/config.c b/src/config.c
index 8d99848d..f0b65822 100644
--- a/src/config.c
+++ b/src/config.c
@@ -33,10 +33,10 @@
 
 #include "config_gram.h"
 
-char default_programmer[MAX_STR_CONST];
-char default_parallel[PATH_MAX];
-char default_serial[PATH_MAX];
-char default_spi[PATH_MAX];
+const char *default_programmer;
+const char *default_parallel;
+const char *default_serial;
+const char *default_spi;
 double default_bitclock;
 
 LISTID       string_list;
diff --git a/src/config.h b/src/config.h
index 260d404a..7b6c6d0d 100644
--- a/src/config.h
+++ b/src/config.h
@@ -30,8 +30,6 @@
 #endif
 
 
-#define MAX_STR_CONST 1024
-
 enum { V_NONE, V_NUM, V_NUM_REAL, V_STR };
 typedef struct value_t {
   int      type;
diff --git a/src/config_gram.y b/src/config_gram.y
index 0b9cf6cd..554de900 100644
--- a/src/config_gram.y
+++ b/src/config_gram.y
@@ -246,26 +246,22 @@ def :
   part_def TKN_SEMI |
 
   K_DEFAULT_PROGRAMMER TKN_EQUAL TKN_STRING TKN_SEMI {
-    strncpy(default_programmer, $3->value.string, MAX_STR_CONST);
-    default_programmer[MAX_STR_CONST-1] = 0;
+    default_programmer = cache_string($3->value.string);
     free_token($3);
   } |
 
   K_DEFAULT_PARALLEL TKN_EQUAL TKN_STRING TKN_SEMI {
-    strncpy(default_parallel, $3->value.string, PATH_MAX);
-    default_parallel[PATH_MAX-1] = 0;
+    default_parallel = cache_string($3->value.string);
     free_token($3);
   } |
 
   K_DEFAULT_SERIAL TKN_EQUAL TKN_STRING TKN_SEMI {
-    strncpy(default_serial, $3->value.string, PATH_MAX);
-    default_serial[PATH_MAX-1] = 0;
+    default_serial = cache_string($3->value.string);
     free_token($3);
   } |
 
   K_DEFAULT_SPI TKN_EQUAL TKN_STRING TKN_SEMI {
-    strncpy(default_spi, $3->value.string, PATH_MAX);
-    default_spi[PATH_MAX-1] = 0;
+    default_spi = cache_string($3->value.string);
     free_token($3);
   } |
 
diff --git a/src/libavrdude.h b/src/libavrdude.h
index 840d8fc1..3c2f2a57 100644
--- a/src/libavrdude.h
+++ b/src/libavrdude.h
@@ -992,10 +992,10 @@ void walk_programmer_types(/*LISTID programmer_types,*/ walk_programmer_types_cb
 
 extern LISTID       part_list;
 extern LISTID       programmers;
-extern char         default_programmer[];
-extern char         default_parallel[];
-extern char         default_serial[];
-extern char         default_spi[];
+extern const char *default_programmer;
+extern const char *default_parallel;
+extern const char *default_serial;
+extern const char *default_spi;
 extern double       default_bitclock;
 
 /* This name is fixed, it's only here for symmetry with
diff --git a/src/main.c b/src/main.c
index b696d6d7..08266f00 100644
--- a/src/main.c
+++ b/src/main.c
@@ -314,10 +314,11 @@ int main(int argc, char * argv [])
   else
     progname = argv[0];
 
-  default_parallel[0] = 0;
-  default_serial[0]   = 0;
-  default_spi[0]      = 0;
-  default_bitclock    = 0.0;
+  default_programmer = "";
+  default_parallel   = "";
+  default_serial     = "";
+  default_spi        = "";
+  default_bitclock   = 0.0;
 
   init_config();
 
@@ -351,7 +352,7 @@ int main(int argc, char * argv [])
   quell_progress = 0;
   exitspecs     = NULL;
   pgm           = NULL;
-  programmer    = default_programmer;
+  programmer    = cfg_strdup("main()", default_programmer);
   verbose       = 0;
   baudrate      = 0;
   bitclock      = 0.0;
@@ -755,7 +756,7 @@ int main(int argc, char * argv [])
   int dev_opts = 0;
   // Developer option -c <wildcard>/[ASsrt] prints programmer description(s) and exits
   if(programmer && (strcmp(programmer, "*") == 0 || strchr(programmer, '/'))) {
-    dev_output_pgm_defs(programmer);
+    dev_output_pgm_defs(cfg_strdup("main()", programmer));
     dev_opts = 1;
   }
   // Developer option -p <wildcard>/[dASsrcow*t] prints part description(s) and exits
@@ -849,11 +850,11 @@ int main(int argc, char * argv [])
     switch (pgm->conntype)
     {
       case CONNTYPE_PARALLEL:
-        port = default_parallel;
+        port = cfg_strdup("main()", default_parallel);
         break;
 
       case CONNTYPE_SERIAL:
-        port = default_serial;
+        port = cfg_strdup("main()", default_serial);
         break;
 
       case CONNTYPE_USB: