You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2023/09/25 09:08:45 UTC
[mynewt-nimble] 02/02: apps/dtm: Port to parse_arg module
This is an automated email from the ASF dual-hosted git repository.
janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 61e724ab23572889bab317f71012f463ecc1383b
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Thu Jul 20 15:28:16 2023 +0200
apps/dtm: Port to parse_arg module
Make use of common argument parsing code.
---
apps/btshell/src/cmd.h | 3 -
apps/dtm/pkg.yml | 1 +
apps/dtm/src/main.c | 16 +-
apps/dtm/src/parse.c | 529 -------------------------------------------------
apps/dtm/src/parse.h | 58 ------
5 files changed, 9 insertions(+), 598 deletions(-)
diff --git a/apps/btshell/src/cmd.h b/apps/btshell/src/cmd.h
index 0984d009..1477ea85 100644
--- a/apps/btshell/src/cmd.h
+++ b/apps/btshell/src/cmd.h
@@ -24,9 +24,6 @@
#include "host/ble_uuid.h"
#include <parse_arg/parse_arg.h>
-//int parse_arg_mac(char *name, uint8_t *dst);
-//int parse_arg_addr(char *name, ble_addr_t *addr);
-//int parse_arg_uuid(char *name, ble_uuid_any_t *uuid);
int parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body,
uint8_t *out_body_len, uint8_t *out_suffix);
diff --git a/apps/dtm/pkg.yml b/apps/dtm/pkg.yml
index 2204befc..bf1ced36 100644
--- a/apps/dtm/pkg.yml
+++ b/apps/dtm/pkg.yml
@@ -28,6 +28,7 @@ pkg.deps:
- "@apache-mynewt-core/sys/shell"
- "@apache-mynewt-core/sys/console"
- "@apache-mynewt-core/kernel/os"
+ - "@apache-mynewt-core/util/parse_arg"
- "@apache-mynewt-nimble/nimble/host"
- "@apache-mynewt-mcumgr/cmd/img_mgmt"
- "@mcuboot/boot/bootutil"
diff --git a/apps/dtm/src/main.c b/apps/dtm/src/main.c
index 11f41160..3b171618 100644
--- a/apps/dtm/src/main.c
+++ b/apps/dtm/src/main.c
@@ -19,7 +19,7 @@
#include "os/mynewt.h"
#include <console/console.h>
-#include <parse.h>
+#include <parse_arg/parse_arg.h>
#include <shell/shell.h>
#include "nimble/ble.h"
#include "nimble/nimble_opt.h"
@@ -28,14 +28,14 @@
#include <img_mgmt/img_mgmt.h>
#include <bootutil/image.h>
-static const struct kv_pair phy_opts[] = {
+static const struct parse_arg_kv_pair phy_opts[] = {
{ "1M", 0x01 },
{ "2M", 0x02 },
{ "coded", 0x03 },
{ NULL }
};
-static const struct kv_pair modulation_index_opts[] = {
+static const struct parse_arg_kv_pair modulation_index_opts[] = {
{ "standard", 0x00 },
{ "stable", 0x01 },
{ NULL }
@@ -47,7 +47,7 @@ cmd_rx_test(int argc, char **argv)
struct ble_dtm_rx_params params;
int rc;
- rc = parse_arg_all(argc - 1, argv + 1);
+ rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -87,7 +87,7 @@ cmd_tx_test(int argc, char **argv)
struct ble_dtm_tx_params params;
int rc;
- rc = parse_arg_all(argc - 1, argv + 1);
+ rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -132,7 +132,7 @@ cmd_stop_test(int argc, char **argv)
uint16_t num_packets;
int rc;
- rc = parse_arg_all(argc - 1, argv + 1);
+ rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -154,7 +154,7 @@ cmd_tx_power(int argc, char **argv)
struct ble_hci_vs_set_tx_pwr_rp rsp;
int rc;
- rc = parse_arg_all(argc - 1, argv + 1);
+ rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -183,7 +183,7 @@ cmd_set_antenna(int argc, char **argv)
struct ble_hci_vs_set_antenna_cp cmd;
int rc;
- rc = parse_arg_all(argc - 1, argv + 1);
+ rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
diff --git a/apps/dtm/src/parse.c b/apps/dtm/src/parse.c
deleted file mode 100644
index ed79d740..00000000
--- a/apps/dtm/src/parse.c
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <assert.h>
-#include <ctype.h>
-#include <parse.h>
-#include "console/console.h"
-
-#define CMD_MAX_ARGS 16
-
-static char *cmd_args[CMD_MAX_ARGS][2];
-static int cmd_num_args;
-
-int
-parse_arg_find_idx(const char *key)
-{
- int i;
-
- for (i = 0; i < cmd_num_args; i++) {
- if (strcmp(cmd_args[i][0], key) == 0) {
- return i;
- }
- }
-
- return -1;
-}
-
-char *
-parse_arg_peek(const char *key)
-{
- int i;
-
- for (i = 0; i < cmd_num_args; i++) {
- if (strcmp(cmd_args[i][0], key) == 0) {
- return cmd_args[i][1];
- }
- }
-
- return NULL;
-}
-
-char *
-parse_arg_extract(const char *key)
-{
- int i;
-
- for (i = 0; i < cmd_num_args; i++) {
- if (strcmp(cmd_args[i][0], key) == 0) {
- /* Erase parameter. */
- cmd_args[i][0][0] = '\0';
-
- return cmd_args[i][1];
- }
- }
-
- return NULL;
-}
-
-/**
- * Determines which number base to use when parsing the specified numeric
- * string. This just avoids base '0' so that numbers don't get interpreted as
- * octal.
- */
-static int
-parse_arg_long_base(char *sval)
-{
- if (sval[0] == '0' && sval[1] == 'x') {
- return 0;
- } else {
- return 10;
- }
-}
-
-long
-parse_long_bounds(char *sval, long min, long max, int *out_status)
-{
- char *endptr;
- long lval;
-
- lval = strtol(sval, &endptr, parse_arg_long_base(sval));
- if (sval[0] != '\0' && *endptr == '\0' &&
- lval >= min && lval <= max) {
-
- *out_status = 0;
- return lval;
- }
-
- *out_status = EINVAL;
- return 0;
-}
-
-long
-parse_arg_long_bounds_peek(char *name, long min, long max, int *out_status)
-{
- char *sval;
-
- sval = parse_arg_peek(name);
- if (sval == NULL) {
- *out_status = ENOENT;
- return 0;
- }
- return parse_long_bounds(sval, min, max, out_status);
-}
-
-long
-parse_arg_long_bounds(char *name, long min, long max, int *out_status)
-{
- char *sval;
-
- sval = parse_arg_extract(name);
- if (sval == NULL) {
- *out_status = ENOENT;
- return 0;
- }
- return parse_long_bounds(sval, min, max, out_status);
-}
-
-long
-parse_arg_long_bounds_dflt(char *name, long min, long max,
- long dflt, int *out_status)
-{
- long val;
- int rc;
-
- val = parse_arg_long_bounds(name, min, max, &rc);
- if (rc == ENOENT) {
- rc = 0;
- val = dflt;
- }
-
- *out_status = rc;
-
- return val;
-}
-
-uint64_t
-parse_arg_uint64_bounds(char *name, uint64_t min, uint64_t max, int *out_status)
-{
- char *endptr;
- char *sval;
- uint64_t lval;
-
- sval = parse_arg_extract(name);
- if (sval == NULL) {
- *out_status = ENOENT;
- return 0;
- }
-
- lval = strtoull(sval, &endptr, parse_arg_long_base(sval));
- if (sval[0] != '\0' && *endptr == '\0' &&
- lval >= min && lval <= max) {
-
- *out_status = 0;
- return lval;
- }
-
- *out_status = EINVAL;
- return 0;
-}
-
-long
-parse_arg_long(char *name, int *out_status)
-{
- return parse_arg_long_bounds(name, LONG_MIN, LONG_MAX, out_status);
-}
-
-uint8_t
-parse_arg_bool(char *name, int *out_status)
-{
- return parse_arg_long_bounds(name, 0, 1, out_status);
-}
-
-uint8_t
-parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status)
-{
- return parse_arg_long_bounds_dflt(name, 0, 1, dflt, out_status);
-}
-
-uint8_t
-parse_arg_uint8(char *name, int *out_status)
-{
- return parse_arg_long_bounds(name, 0, UINT8_MAX, out_status);
-}
-
-uint16_t
-parse_arg_uint16(char *name, int *out_status)
-{
- return parse_arg_long_bounds(name, 0, UINT16_MAX, out_status);
-}
-
-uint16_t
-parse_arg_uint16_peek(char *name, int *out_status)
-{
- return parse_arg_long_bounds_peek(name, 0, UINT16_MAX, out_status);
-}
-
-uint32_t
-parse_arg_uint32(char *name, int *out_status)
-{
- return parse_arg_uint64_bounds(name, 0, UINT32_MAX, out_status);
-}
-
-uint64_t
-parse_arg_uint64(char *name, int *out_status)
-{
- return parse_arg_uint64_bounds(name, 0, UINT64_MAX, out_status);
-}
-
-uint8_t
-parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status)
-{
- uint8_t val;
- int rc;
-
- val = parse_arg_uint8(name, &rc);
- if (rc == ENOENT) {
- val = dflt;
- rc = 0;
- }
-
- *out_status = rc;
- return val;
-}
-
-uint16_t
-parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status)
-{
- uint16_t val;
- int rc;
-
- val = parse_arg_uint16(name, &rc);
- if (rc == ENOENT) {
- val = dflt;
- rc = 0;
- }
-
- *out_status = rc;
- return val;
-}
-
-uint32_t
-parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status)
-{
- uint32_t val;
- int rc;
-
- val = parse_arg_uint32(name, &rc);
- if (rc == ENOENT) {
- val = dflt;
- rc = 0;
- }
-
- *out_status = rc;
- return val;
-}
-
-static uint32_t
-parse_time_unit_mult(const char *str)
-{
- if (!strcasecmp(str, "us")) {
- return 1;
- } else if (!strcasecmp(str, "ms")) {
- return 1000;
- } else if (!strcasecmp(str, "s")) {
- return 1000000;
- }
-
- return 0;
-}
-
-static uint32_t
-parse_time_us(const char *str, int *out_status)
-{
- uint32_t val = 0;
- uint32_t val_div = 1;
- uint32_t val_mult = 1;
- uint32_t val_us;
-
- while (isdigit((unsigned char)*str)) {
- val *= 10;
- val += *str - '0';
- str++;
- }
-
- if (*str == '.') {
- str++;
- while (isdigit((unsigned char)*str)) {
- val *= 10;
- val += *str - '0';
- val_div *= 10;
- str++;
- }
- }
-
- val_mult = parse_time_unit_mult(str);
- if (val_mult == 0) {
- *out_status = EINVAL;
- return 0;
- }
-
- if (val_mult > val_div) {
- val_us = val * (val_mult / val_div);
- } else {
- val_us = val * (val_div / val_mult);
- }
-
- *out_status = 0;
-
- return val_us;
-}
-
-uint32_t
-parse_arg_time_dflt(char *name, int step_us, uint32_t dflt, int *out_status)
-{
- const char *arg;
- uint32_t val;
- int rc;
-
- arg = parse_arg_peek(name);
- if (!arg) {
- *out_status = 0;
- return dflt;
- }
-
- val = parse_time_us(arg, &rc);
- if (rc) {
- val = parse_arg_uint32(name, &rc);
- if (rc == ENOENT) {
- *out_status = 0;
- return dflt;
- }
- } else {
- val /= step_us;
- parse_arg_extract(name);
- }
-
- *out_status = rc;
- return val;
-}
-
-const struct kv_pair *
-parse_kv_find(const struct kv_pair *kvs, char *name)
-{
- const struct kv_pair *kv;
- int i;
-
- for (i = 0; kvs[i].key != NULL; i++) {
- kv = kvs + i;
- if (strcmp(name, kv->key) == 0) {
- return kv;
- }
- }
-
- return NULL;
-}
-
-int
-parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status)
-{
- const struct kv_pair *kv;
- char *sval;
-
- sval = parse_arg_extract(name);
- if (sval == NULL) {
- *out_status = ENOENT;
- return -1;
- }
-
- kv = parse_kv_find(kvs, sval);
- if (kv == NULL) {
- *out_status = EINVAL;
- return -1;
- }
-
- *out_status = 0;
- return kv->val;
-}
-
-int
-parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val,
- int *out_status)
-{
- int val;
- int rc;
-
- val = parse_arg_kv(name, kvs, &rc);
- if (rc == ENOENT) {
- rc = 0;
- val = def_val;
- }
-
- *out_status = rc;
-
- return val;
-}
-
-
-static int
-parse_arg_byte_stream_delim(char *sval, char *delims, int max_len,
- uint8_t *dst, int *out_len)
-{
- unsigned long ul;
- char *endptr;
- char *token;
- int i;
- char *tok_ptr;
-
- i = 0;
- for (token = strtok_r(sval, delims, &tok_ptr);
- token != NULL;
- token = strtok_r(NULL, delims, &tok_ptr)) {
-
- if (i >= max_len) {
- return EINVAL;
- }
-
- ul = strtoul(token, &endptr, 16);
- if (sval[0] == '\0' || *endptr != '\0' || ul > UINT8_MAX) {
- return -1;
- }
-
- dst[i] = ul;
- i++;
- }
-
- *out_len = i;
-
- return 0;
-}
-
-int
-parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len)
-{
- char *sval;
-
- sval = parse_arg_extract(name);
- if (sval == NULL) {
- return ENOENT;
- }
-
- return parse_arg_byte_stream_delim(sval, ":-", max_len, dst, out_len);
-}
-
-int
-parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len,
- uint8_t *dst, int *out_len)
-{
- char *sval;
-
- sval = parse_arg_extract(name);
- if (sval == NULL) {
- return ENOENT;
- }
-
- return parse_arg_byte_stream_delim(sval, separator, max_len, dst, out_len);
-}
-
-int
-parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len)
-{
- int actual_len;
- int rc;
-
- rc = parse_arg_byte_stream(name, len, dst, &actual_len);
- if (rc != 0) {
- return rc;
- }
-
- if (actual_len != len) {
- return EINVAL;
- }
-
- return 0;
-}
-
-int
-parse_arg_all(int argc, char **argv)
-{
- char *key;
- char *val;
- int i;
- char *tok_ptr;
-
- cmd_num_args = 0;
-
- for (i = 0; i < argc; i++) {
- key = strtok_r(argv[i], "=", &tok_ptr);
- val = strtok_r(NULL, "=", &tok_ptr);
-
- if (key != NULL && val != NULL) {
- if (strlen(key) == 0) {
- console_printf("Error: invalid argument: %s\n", argv[i]);
- return -1;
- }
-
- if (cmd_num_args >= CMD_MAX_ARGS) {
- console_printf("Error: too many arguments");
- return -1;
- }
-
- cmd_args[cmd_num_args][0] = key;
- cmd_args[cmd_num_args][1] = val;
- cmd_num_args++;
- }
- }
-
- return 0;
-}
diff --git a/apps/dtm/src/parse.h b/apps/dtm/src/parse.h
deleted file mode 100644
index a0255d36..00000000
--- a/apps/dtm/src/parse.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef PARSE_H
-#define PARSE_H
-
-#include <inttypes.h>
-
-struct kv_pair {
- char *key;
- int val;
-};
-
-uint32_t parse_arg_time_dflt(char *name, int step, uint32_t dflt, int *out_status);
-const struct kv_pair *parse_kv_find(const struct kv_pair *kvs, char *name);
-int parse_arg_find_idx(const char *key);
-char *parse_arg_extract(const char *key);
-long parse_arg_long_bounds(char *name, long min, long max, int *out_status);
-long parse_arg_long_bounds_dflt(char *name, long min, long max,
- long dflt, int *out_status);
-uint64_t parse_arg_uint64_bounds(char *name, uint64_t min,
- uint64_t max, int *out_status);
-long parse_arg_long(char *name, int *staus);
-uint8_t parse_arg_bool(char *name, int *status);
-uint8_t parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status);
-uint8_t parse_arg_uint8(char *name, int *status);
-uint8_t parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status);
-uint16_t parse_arg_uint16(char *name, int *status);
-uint16_t parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status);
-uint32_t parse_arg_uint32(char *name, int *out_status);
-uint32_t parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status);
-uint64_t parse_arg_uint64(char *name, int *out_status);
-int parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status);
-int parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val,
- int *out_status);
-int parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len);
-int parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len,
- uint8_t *dst, int *out_len);
-int parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len);
-int parse_arg_all(int argc, char **argv);
-
-#endif