Переглянути джерело

sysvar: drop count in namespace array, rename sysvars_enum, blank is false

- Drop the "count" field in the namespace array; instead add an entry
  for the end of the list containing the total count of the
  array. This way each entry in the list is terminated by the first
  field of the next array entry, which is guaranteed to exist even for
  the last namespace.

- Rename sysvars_enum to sysvar_enum.

- For setvar_fromstr(), an empty string is false for bool.
H. Peter Anvin 1 рік тому
батько
коміт
785e9806ee

+ 4 - 4
esp32/max80/config.c

@@ -127,9 +127,9 @@ exit:
 int write_sysvars(FILE *f, bool status)
 {
     size_t ns = status ? sysvar_ns_status : sysvar_ns_config;
-    sysvar_ns_t nsi = sysvar_ns[ns];
+    const sysvar_ns_t * const nsi = &sysvar_ns[ns];
 
-    for (size_t var = nsi.first; var < nsi.first + nsi.count; var++) {
+    for (enum sysvar_enum var = nsi->first; var < nsi[1].first; var++) {
 	fputs(sysvar_name[var], f);
 	putc('=', f);
 	fputs(notempty(getvar_tostr(var)), f);
@@ -187,8 +187,8 @@ void log_config_status(void)
 {
     const sysvar_ns_t *nsi = &sysvar_ns[0];
 
-    for (size_t var = 1; var < (size_t)sysvar_count; var++) {
-	if (var >= nsi->first + nsi->count)
+    for (enum sysvar_enum var = 1; var < sysvar_count; var++) {
+	if (var >= nsi[1].first)
 	    nsi++;
 
 	logmsg(nsi->name, "%s\n", notempty(getvar_tostr(var)));

+ 7 - 5
esp32/max80/sysvars.c

@@ -23,6 +23,7 @@ static bool sysvar_bool_fromstr(sysvar_t *to, const char *from)
     case 's':
 	to->v_bool = true;
 	return true;
+    case ' ':			/* Blank or null */
     case '0':
     case 'f':
     case 'n':
@@ -246,7 +247,7 @@ const struct sysvar_ops sysvar_mac_ops = {
 /* --- Generic getters/setters --- */
 
 /* Contains the lowest numbered sysvar changed; or sysvar_count if nothing */
-enum sysvars_enum sysvar_changed;
+enum sysvar_enum sysvar_changed;
 
 sysvar_t getvar(size_t var)
 {
@@ -276,7 +277,7 @@ static bool do_setvar(size_t var, sysvar_t val, bool is_set)
 	free(free_ptr);
 
     if (var < (size_t)sysvar_changed)
-	sysvar_changed = (enum sysvars_enum)var;
+	sysvar_changed = (enum sysvar_enum)var;
 
     sysvar_isset[var] = is_set;
     if (type->update)
@@ -340,7 +341,7 @@ bool setvar_fromstr(size_t var, const char *str)
 	return false;
 
     if (var < (size_t)sysvar_changed)
-	sysvar_changed = (enum sysvars_enum)var;
+	sysvar_changed = (enum sysvar_enum)var;
 
     if (free_ptr)
 	free(free_ptr);
@@ -365,9 +366,10 @@ size_t sysvar_find(size_t ns, const char *name)
 
     const sysvar_ns_t *nsi = &sysvar_ns[ns];
     const char * const *varname;
+    const size_t count = nsi[1].first - nsi->first;
 
     varname = bsearch(name, sysvar_name + nsi->first,
-		      nsi->count, sizeof(const char *),
+		      count, sizeof(const char *),
 		      string_ptr_compare);
     if (!varname)
 	return 0;
@@ -379,7 +381,7 @@ size_t sysvar_find(size_t ns, const char *name)
 
 void sysvar_reset(void)
 {
-    for (size_t i = sysvar_null; i < (size_t)sysvar_count; i++)
+    for (enum sysvar_enum i = sysvar_null; i < sysvar_count; i++)
 	unsetvar(i);
 
     sysvar_changed = sysvar_null;

+ 4 - 5
esp32/max80/sysvars.h

@@ -51,12 +51,11 @@ extern_c const struct sysvar_ops sysvar_mac_ops;
 
 typedef struct sysvar_namespace {
     const char *name;
-    enum sysvars_enum first;
-    size_t count;
+    enum sysvar_enum first;
 } sysvar_ns_t;
 
-extern_c const sysvar_ns_t sysvar_ns[sysvar_nscount];
-extern_c enum sysvars_enum sysvar_changed;
+extern_c const sysvar_ns_t sysvar_ns[(size_t)sysvar_nscount+1];
+extern_c enum sysvar_enum sysvar_changed;
 
 /* Buffer size needed to represent some data types */
 #define BOOL_BUFLEN 2
@@ -75,7 +74,7 @@ extern_c const char *getvar_tostr_r(size_t var, char *buf);
 extern_c bool setvar_fromstr(size_t var, const char *str);
 extern_c void sysvar_reset(void);
 extern_c size_t sysvar_find(size_t ns, const char *name);
-extern_c size_t sysvar_marshall(enum sysvars_enum first, size_t count,
+extern_c size_t sysvar_marshall(enum sysvar_enum first, size_t count,
 				void *buf, size_t *buflen, uintptr_t extaddr);
 
 /* Type-specific definitions/getters/setters */

+ 1 - 1
esp32/max80/sysvars_marshall.c

@@ -16,7 +16,7 @@
  *
  * On return, *buflen is adjusted to the number of bytes actually used.
  */
-size_t sysvar_marshall(enum sysvars_enum first, size_t count,
+size_t sysvar_marshall(enum sysvar_enum first, size_t count,
 		       void *buf, size_t *buflen, uintptr_t extaddr)
 {
     static const size_t align_mask = 3;

+ 2 - 2
esp32/max80/wifi.cpp

@@ -31,11 +31,11 @@ static volatile bool sta_timeout_enabled;
 static volatile unsigned int sta_timeout_count;
 static unsigned int connected;
 
-static inline bool setvar_ip4(enum sysvars_enum var, const IP4 &ip)
+static inline bool setvar_ip4(enum sysvar_enum var, const IP4 &ip)
 {
     return setvar_ip(var, static_cast<uint32_t>(ip));
 }
-static inline IP4 getvar_ip4(enum sysvars_enum var)
+static inline IP4 getvar_ip4(enum sysvar_enum var)
 {
     return IP4(getvar_ip(var));
 }

BIN
esp32/output/max80.ino.bin


+ 4 - 3
esp32/sysvars.pl

@@ -92,7 +92,7 @@ print $h "enum sysvar_ns_enum {\n";
 print $h map { "\tsysvar_ns_$_,\n" } @nslist;
 print $h "\tsysvar_nscount\n};\n\n";
 
-print $h "enum sysvars_enum {\n";
+print $h "enum sysvar_enum {\n";
 print $h map { "\t$_,\n" } @varenum;
 print $h "\tsysvar_count\n};\n\n";
 
@@ -134,10 +134,11 @@ close($h);
 open(my $c, '>', $cfile) or die "$0:$cfile: $!\n";
 print $c "#include \"sysvars.h\"\n\n";
 
-printf $c "const sysvar_ns_t sysvar_ns[%d] = {\n", scalar(@nslist);
+printf $c "const sysvar_ns_t sysvar_ns[%d] = {\n", scalar(@nslist)+1;
 foreach my $ns (@nslist) {
-    printf $c "\t{ \"%s\", %d, %d },\n", $ns, $nsfirst{$ns}, $nscount{$ns};
+    printf $c "\t{ \"%s\", %d },\n", $ns, $nsfirst{$ns}, $nscount{$ns};
 }
+printf $c "\t{ NULL, %d }\n", $cnt;
 printf $c "};\n";
 
 print $c "const char * const sysvar_name[$cnt] = {\n";

BIN
fpga/output/max80.fw


BIN
fpga/output/v1.fw


BIN
fpga/output/v2.fw