瀏覽代碼

sysvars: add method to get size of pointer data

For data requiring an external buffer, add a method to determine the
length of the buffer needed.
H. Peter Anvin 1 年之前
父節點
當前提交
7cbb36d525
共有 6 個文件被更改,包括 18 次插入7 次删除
  1. 17 6
      esp32/max80/sysvars.c
  2. 1 1
      esp32/max80/sysvars.h
  3. 二進制
      esp32/output/max80.ino.bin
  4. 二進制
      fpga/output/max80.fw
  5. 二進制
      fpga/output/v1.fw
  6. 二進制
      fpga/output/v2.fw

+ 17 - 6
esp32/max80/sysvars.c

@@ -109,11 +109,16 @@ static bool sysvar_str_set(sysvar_t *to, sysvar_t from)
     return sysvar_str_fromstr(to, from.v_str);
 }
 
+static size_t sysvar_str_datasize(sysvar_t val)
+{
+    return (val.v_str ? strlen(val.v_str) : 0) + 1;
+}
+
 const struct sysvar_ops sysvar_str_ops = {
     .set = sysvar_str_set,
     .tostr = sysvar_str_tostr,
     .fromstr = sysvar_str_fromstr,
-    .is_ptr = true
+    .datasize = sysvar_str_datasize
 };
 
 static void sysvar_tz_update(sysvar_t val, bool isset)
@@ -130,7 +135,7 @@ const struct sysvar_ops sysvar_tz_ops = {
     .tostr = sysvar_str_tostr,
     .fromstr = sysvar_str_fromstr,
     .update = sysvar_tz_update,
-    .is_ptr = true
+    .datasize = sysvar_str_datasize
 };
 
 static const char *sysvar_ip_tostr(sysvar_t from, char *buf)
@@ -224,12 +229,18 @@ static bool sysvar_mac_fromstr(sysvar_t *to, const char *str)
     return sysvar_mac_set(to, from);
 }
 
+static size_t sysvar_mac_datasize(sysvar_t val)
+{
+    (void)val;
+    return 6;
+}
+
 const struct sysvar_ops sysvar_mac_ops = {
     .set = sysvar_mac_set,
     .tostr = sysvar_mac_tostr,
     .fromstr = sysvar_mac_fromstr,
     .buflen = MAC_BUFLEN,
-    .is_ptr = true
+    .datasize = sysvar_mac_datasize
 };
 
 /* --- Generic getters/setters --- */
@@ -251,10 +262,10 @@ static bool do_setvar(size_t var, sysvar_t val, bool is_set)
     sysvar_t *to = &sysvar_val[var];
     void *free_ptr = NULL;
 
-    if (type->is_ptr)
+    if (type->datasize)
 	free_ptr = to->v_ptr;
 
-    if (!type->set || (type->is_ptr && !val.v_ptr)) {
+    if (!type->set || (type->datasize && !val.v_ptr)) {
 	sysvar_val[var] = val;
     } else {
 	if (!type->set(to, val))
@@ -321,7 +332,7 @@ bool setvar_fromstr(size_t var, const char *str)
     sysvar_t *to = &sysvar_val[var];
     void *free_ptr = NULL;
 
-    if (type->is_ptr)
+    if (type->datasize)
 	free_ptr = to->v_ptr;
 
     /* A fromstr method is required */

+ 1 - 1
esp32/max80/sysvars.h

@@ -30,8 +30,8 @@ struct sysvar_ops {
     const char * (*tostr)(sysvar_t, char *);
     bool (*fromstr)(sysvar_t *, const char *);
     void (*update)(sysvar_t, bool); /* Called after set or fromstr; bool = isset */
+    size_t (*datasize)(sysvar_t);   /* If pointer, return size of data */
     size_t buflen;		/* Minimal buffer size for string if needed */
-    bool is_ptr;		/* Type is an allocated pointer */
 };
 
 typedef const struct sysvar_ops *sysvar_type_t;

二進制
esp32/output/max80.ino.bin


二進制
fpga/output/max80.fw


二進制
fpga/output/v1.fw


二進制
fpga/output/v2.fw