Rename cmd_parse_port_space() to cmd_parse_port_separator()

cmd_parse_port_separator() parse the full port number and checks that the
number end with a NUL of space.
Now this function can also be used to parse the last argument number
because this ends with a NUL.

Also refactor code.
This commit is contained in:
René van Dorst
2026-08-25 07:54:15 +02:00
parent 42f7b4fba1
commit 149dc8537f
+27 -19
View File
@@ -264,14 +264,15 @@ uint8_t cmd_parse_port(uint8_t idx, __bit cpu_is_valid) {
// Same as cmd_parse_port() addition to check the trailing space. // Same as cmd_parse_port() addition to check the trailing space.
// returns 0 when on parser error or invalid value or no space. // returns 0 when on parser error or invalid value or no space or no NUL.
// return non-zero number of bytes consumed including the space. // return non-zero number of bytes consumed including the space.
uint8_t cmd_parse_port_space(uint8_t idx, __bit cpu_is_valid) { uint8_t cmd_parse_port_separator(uint8_t idx, __bit cpu_is_valid) {
uint8_t ret = cmd_parse_port(idx, cpu_is_valid); uint8_t ret = cmd_parse_port(idx, cpu_is_valid);
if (ret != 0) { if (ret != 0) {
idx += ret; idx += ret;
ret++; ret++;
if (cmd_buffer[idx] != ' ') uint8_t c = cmd_buffer[idx];
if (c != ' ' && c != '\0')
ret = 0; ret = 0;
} }
return ret; return ret;
@@ -385,7 +386,7 @@ void parse_lag(void)
goto err; goto err;
group = atoi_results_u8 - 1; group = atoi_results_u8 - 1;
if (group > 3) /* '0' wraps well past three, so one test does both ends */ if (group > 3)
goto err; goto err;
uint8_t w = 2; uint8_t w = 2;
@@ -393,7 +394,7 @@ void parse_lag(void)
// write_char('|'); print_byte(w); write_char(':'); write_char(cmd_buffer[cmd_words_b[w]]); write_char('-'); // write_char('|'); print_byte(w); write_char(':'); write_char(cmd_buffer[cmd_words_b[w]]); write_char('-');
// Parse port. // Parse port.
if (cmd_parse_port(cmd_words_b[w++], false) == 0) if (cmd_parse_port_separator(cmd_words_b[w++], false) == 0)
goto err; goto err;
members |= ((uint16_t)1) << atoi_results_u8; members |= ((uint16_t)1) << atoi_results_u8;
@@ -407,13 +408,16 @@ err:
void parse_lag_hash(void) void parse_lag_hash(void)
{ {
__xdata uint8_t group;
__xdata uint8_t hash = 0; __xdata uint8_t hash = 0;
if (cmd_words_len < 2 || !isnumber(cmd_buffer[cmd_words_b[1]])) if (cmd_words_len < 2)
goto err; goto err;
group = cmd_buffer[cmd_words_b[1]] - '1';
if (group > 3) /* '0' wraps well past three, so one test does both ends */ if (cmd_parse_port_separator(cmd_buffer[cmd_words_b[1]], false) == 0)
goto err;
uint8_t group = atoi_results_u8 - 1;
if (group > 3)
goto err; goto err;
uint8_t w = 2; uint8_t w = 2;
@@ -507,8 +511,13 @@ void parse_vlan(void)
uint16_t pmask = ((uint16_t)1) << atoi_results_u8; uint16_t pmask = ((uint16_t)1) << atoi_results_u8;
vlan_settings.members |= pmask; vlan_settings.members |= pmask;
if (cmd_buffer[idx] == 't') if (cmd_buffer[idx] == 't') {
vlan_settings.tagged |= pmask; vlan_settings.tagged |= pmask;
idx++;
}
if (!cmd_is_space_or_null(idx))
goto err;
} }
vlan_create(); vlan_create();
} else if (cmd_compare(1, "show")) { } else if (cmd_compare(1, "show")) {
@@ -536,7 +545,7 @@ void parse_isolate(void)
print_string("\nISOLATE "); print_string("\nISOLATE ");
if (cmd_parse_port_space(cmd_words_b[1], false) == 0) if (cmd_parse_port_separator(cmd_words_b[1], false) == 0)
goto err; goto err;
uint8_t port_configured = atoi_results_u8; uint8_t port_configured = atoi_results_u8;
@@ -568,9 +577,8 @@ void parse_isolate(void)
uint8_t w = 2; uint8_t w = 2;
while (w < cmd_words_len) { while (w < cmd_words_len) {
uint8_t idx = cmd_words_b[w++]; uint8_t idx = cmd_words_b[w++];
uint8_t ret = cmd_parse_port(idx, false); uint8_t ret = cmd_parse_port_separator(idx, false);
idx += ret; if (ret == 0)
if (ret == 0 || !cmd_is_space_or_null(idx))
goto err; goto err;
uint8_t port = atoi_results_u8; uint8_t port = atoi_results_u8;
members |= ((uint16_t)1) << port; members |= ((uint16_t)1) << port;
@@ -730,7 +738,7 @@ void parse_port(void)
return; return;
} }
if (cmd_parse_port_space(cmd_words_b[1], false) == 0) { if (cmd_parse_port_separator(cmd_words_b[1], false) == 0) {
print_string("Invalid port number\n"); print_string("Invalid port number\n");
return; return;
} }
@@ -830,7 +838,7 @@ void parse_mtu(void)
if (cmd_words_len != 3) if (cmd_words_len != 3)
goto err; goto err;
if (cmd_parse_port_space(cmd_words_b[1], false) == 0) if (cmd_parse_port_separator(cmd_words_b[1], false) == 0)
goto err; goto err;
p = atoi_results_u8; p = atoi_results_u8;
@@ -1284,7 +1292,7 @@ void parse_eee(void)
speed_word = 2; speed_word = 2;
} else if (cmd_buffer[idx] == ' ' || cmd_buffer[idx] == '\0') { } else if (cmd_buffer[idx] == ' ' || cmd_buffer[idx] == '\0') {
// Word 2 is a port number // Word 2 is a port number
if (cmd_parse_port_space(idx, false) == 0) { if (cmd_parse_port_separator(idx, false) == 0) {
print_string("Speed word invalid, use: [100m|1g|2g5]\n"); print_string("Speed word invalid, use: [100m|1g|2g5]\n");
return; return;
} }
@@ -1337,7 +1345,7 @@ void parse_bw(void)
if (cmd_words_len < 2) // Check for at least 2 arguments if (cmd_words_len < 2) // Check for at least 2 arguments
goto err; goto err;
if (cmd_parse_port_space(cmd_words_b[2], false) == 0) if (cmd_parse_port_separator(cmd_words_b[2], false) == 0)
goto err; goto err;
port = atoi_results_u8; port = atoi_results_u8;
@@ -1690,7 +1698,7 @@ void cmd_parser(void) __banked
stpEnabled = 0; stpEnabled = 0;
} }
} else if (cmd_compare(0, "pvid") && cmd_words_len == 3) { } else if (cmd_compare(0, "pvid") && cmd_words_len == 3) {
if (cmd_parse_port_space(cmd_words_b[1], false) != 0 && atoi_results_u8 if (cmd_parse_port_separator(cmd_words_b[1], false) != 0 && atoi_results_u8
&& atoi_short(cmd_words_b[2]) && atoi_results_short && atoi_results_short <= 4094) && atoi_short(cmd_words_b[2]) && atoi_results_short && atoi_results_short <= 4094)
port_pvid_set(atoi_results_u8, atoi_results_short); port_pvid_set(atoi_results_u8, atoi_results_short);
else else