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 a161f0abcdcb6a669d395c4a58be12976de0c126
Author: Szymon Janc <[email protected]>
AuthorDate: Thu Jul 20 15:27:48 2023 +0200

    apps/btshell: Convert to parse_arg module
    
    Mkae use of common argument parsing code.
---
 apps/btshell/pkg.yml         |   1 +
 apps/btshell/src/cmd.c       | 122 ++++-----
 apps/btshell/src/cmd.h       |  40 +--
 apps/btshell/src/cmd_gatt.c  |  30 +--
 apps/btshell/src/cmd_l2cap.c |  14 +-
 apps/btshell/src/parse.c     | 624 -------------------------------------------
 6 files changed, 89 insertions(+), 742 deletions(-)

diff --git a/apps/btshell/pkg.yml b/apps/btshell/pkg.yml
index b50b371c..d98f541f 100644
--- a/apps/btshell/pkg.yml
+++ b/apps/btshell/pkg.yml
@@ -29,6 +29,7 @@ pkg.deps:
     - "@apache-mynewt-core/sys/stats"
     - "@apache-mynewt-core/sys/console"
     - "@apache-mynewt-core/sys/shell"
+    - "@apache-mynewt-core/util/parse_arg"
     - nimble/host
     - nimble/host/services/gap
     - nimble/host/services/gatt
diff --git a/apps/btshell/src/cmd.c b/apps/btshell/src/cmd.c
index 22819219..e0fc57ac 100644
--- a/apps/btshell/src/cmd.c
+++ b/apps/btshell/src/cmd.c
@@ -69,7 +69,7 @@ cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t 
*out_start,
     return 0;
 }
 
-static const struct kv_pair cmd_own_addr_types[] = {
+static const struct parse_arg_kv_pair cmd_own_addr_types[] = {
     { "public",     BLE_OWN_ADDR_PUBLIC },
     { "random",     BLE_OWN_ADDR_RANDOM },
     { "rpa_pub",    BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT },
@@ -77,7 +77,7 @@ static const struct kv_pair cmd_own_addr_types[] = {
     { NULL }
 };
 
-static const struct kv_pair cmd_peer_addr_types[] = {
+static const struct parse_arg_kv_pair cmd_peer_addr_types[] = {
     { "public",     BLE_ADDR_PUBLIC },
     { "random",     BLE_ADDR_RANDOM },
     { "public_id",  BLE_ADDR_PUBLIC_ID },
@@ -85,7 +85,7 @@ static const struct kv_pair cmd_peer_addr_types[] = {
     { NULL }
 };
 
-static const struct kv_pair cmd_addr_type[] = {
+static const struct parse_arg_kv_pair cmd_addr_type[] = {
     { "public",     BLE_ADDR_PUBLIC },
     { "random",     BLE_ADDR_RANDOM },
     { NULL }
@@ -93,7 +93,7 @@ static const struct kv_pair cmd_addr_type[] = {
 
 
 static int
-parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
+parse_dev_addr(const char *prefix, const struct parse_arg_kv_pair *addr_types,
                ble_addr_t *addr)
 {
     char name[32];
@@ -115,7 +115,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair 
*addr_types,
     }
     written += rc;
 
-    rc = parse_arg_addr(name, addr);
+    rc = parse_arg_ble_addr(name, addr);
     if (rc == ENOENT) {
         /* not found */
         return rc;
@@ -153,7 +153,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair 
*addr_types,
 /*****************************************************************************
  * $advertise                                                                *
  *****************************************************************************/
-static const struct kv_pair cmd_adv_filt_types[] = {
+static const struct parse_arg_kv_pair cmd_adv_filt_types[] = {
     { "none", BLE_HCI_ADV_FILT_NONE },
     { "scan", BLE_HCI_ADV_FILT_SCAN },
     { "conn", BLE_HCI_ADV_FILT_CONN },
@@ -162,7 +162,7 @@ static const struct kv_pair cmd_adv_filt_types[] = {
 };
 
 #if MYNEWT_VAL(BLE_EXT_ADV)
-static struct kv_pair cmd_ext_adv_phy_opts[] = {
+static struct parse_arg_kv_pair cmd_ext_adv_phy_opts[] = {
     { "1M",          0x01 },
     { "2M",          0x02 },
     { "coded",       0x03 },
@@ -177,7 +177,7 @@ cmd_advertise_configure(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -338,7 +338,7 @@ cmd_advertise_set_addr(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -349,7 +349,7 @@ cmd_advertise_set_addr(int argc, char **argv)
         return rc;
     }
 
-    rc = parse_arg_mac("addr", addr.val);
+    rc = parse_arg_mac_addr("addr", addr.val);
     if (rc != 0) {
         console_printf("invalid 'addr' parameter\n");
                     return rc;
@@ -375,7 +375,7 @@ cmd_advertise_start(int argc, char **argv)
     bool restart;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -419,7 +419,7 @@ cmd_advertise_stop(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -445,7 +445,7 @@ cmd_advertise_remove(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -546,14 +546,14 @@ static const struct shell_cmd_help advertise_remove_help 
= {
 #endif
 
 #else
-static const struct kv_pair cmd_adv_conn_modes[] = {
+static const struct parse_arg_kv_pair cmd_adv_conn_modes[] = {
     { "non", BLE_GAP_CONN_MODE_NON },
     { "und", BLE_GAP_CONN_MODE_UND },
     { "dir", BLE_GAP_CONN_MODE_DIR },
     { NULL }
 };
 
-static const struct kv_pair cmd_adv_disc_modes[] = {
+static const struct parse_arg_kv_pair cmd_adv_disc_modes[] = {
     { "non", BLE_GAP_DISC_MODE_NON },
     { "ltd", BLE_GAP_DISC_MODE_LTD },
     { "gen", BLE_GAP_DISC_MODE_GEN },
@@ -571,7 +571,7 @@ cmd_advertise(int argc, char **argv)
     bool restart;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -699,7 +699,7 @@ static const struct shell_cmd_help advertise_help = {
  * $connect                                                                  *
  *****************************************************************************/
 
-static struct kv_pair cmd_ext_conn_phy_opts[] = {
+static struct parse_arg_kv_pair cmd_ext_conn_phy_opts[] = {
     { "none",        0x00 },
     { "1M",          0x01 },
     { "coded",       0x02 },
@@ -721,7 +721,7 @@ cmd_connect(int argc, char **argv)
     int own_addr_type;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1014,7 +1014,7 @@ cmd_disconnect(int argc, char **argv)
     uint8_t reason;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1117,7 +1117,7 @@ cmd_set_scan_opts(int argc, char **argv)
     char *name_filter;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1173,7 +1173,7 @@ static const struct shell_cmd_help set_scan_opts_help = {
  * $scan                                                                     *
  *****************************************************************************/
 
-static const struct kv_pair cmd_scan_filt_policies[] = {
+static const struct parse_arg_kv_pair cmd_scan_filt_policies[] = {
     { "no_wl", BLE_HCI_SCAN_FILT_NO_WL },
     { "use_wl", BLE_HCI_SCAN_FILT_USE_WL },
     { "no_wl_inita", BLE_HCI_SCAN_FILT_NO_WL_INITA },
@@ -1181,7 +1181,7 @@ static const struct kv_pair cmd_scan_filt_policies[] = {
     { NULL }
 };
 
-static struct kv_pair cmd_scan_ext_types[] = {
+static struct parse_arg_kv_pair cmd_scan_ext_types[] = {
     { "none",       0x00 },
     { "1M",         0x01 },
     { "coded",      0x02 },
@@ -1204,7 +1204,7 @@ cmd_scan(int argc, char **argv)
     uint16_t period;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1428,7 +1428,7 @@ cmd_set(int argc, char **argv)
     int good = 0;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1544,11 +1544,11 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, 
bool scan_rsp,
     int8_t eddystone_measured_power = 0;
     char eddystone_url_body[BLE_EDDYSTONE_URL_MAX_LEN];
     char *eddystone_url_full;
-    int svc_data_uuid16_len;
-    int svc_data_uuid32_len;
-    int svc_data_uuid128_len;
-    int uri_len;
-    int mfg_data_len;
+    unsigned int svc_data_uuid16_len;
+    unsigned int svc_data_uuid32_len;
+    unsigned int svc_data_uuid128_len;
+    unsigned int uri_len;
+    unsigned int mfg_data_len;
     int tmp;
     int rc;
 #if MYNEWT_VAL(BLE_EXT_ADV)
@@ -1566,7 +1566,7 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool 
scan_rsp,
 
     memset(&adv_fields, 0, sizeof adv_fields);
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1753,9 +1753,9 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool 
scan_rsp,
         return rc;
     }
 
-    rc = parse_arg_byte_stream("service_data_uuid128",
+    rc = parse_arg_byte_stream_custom("service_data_uuid128", ":-",
                                CMD_ADV_DATA_SVC_DATA_UUID128_MAX_LEN,
-                               svc_data_uuid128, &svc_data_uuid128_len);
+                               svc_data_uuid128, 0, &svc_data_uuid128_len);
     if (rc == 0) {
         adv_fields.svc_data_uuid128 = svc_data_uuid128;
         adv_fields.svc_data_uuid128_len = svc_data_uuid128_len;
@@ -1932,7 +1932,7 @@ cmd_set_priv_mode(int argc, char **argv)
     uint8_t priv_mode;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -1980,7 +1980,7 @@ cmd_white_list(int argc, char **argv)
     int addrs_cnt;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2036,7 +2036,7 @@ cmd_conn_rssi(int argc, char **argv)
     int8_t rssi;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2082,7 +2082,7 @@ cmd_conn_update_params(int argc, char **argv)
     uint16_t conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2176,7 +2176,7 @@ cmd_conn_datalen(int argc, char **argv)
     uint16_t tx_time;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2229,7 +2229,7 @@ static const struct shell_cmd_help conn_datalen_help = {
  * keystore                                                                  *
  *****************************************************************************/
 
-static const struct kv_pair cmd_keystore_entry_type[] = {
+static const struct parse_arg_kv_pair cmd_keystore_entry_type[] = {
     { "msec",       BLE_STORE_OBJ_TYPE_PEER_SEC },
     { "ssec",       BLE_STORE_OBJ_TYPE_OUR_SEC },
     { "cccd",       BLE_STORE_OBJ_TYPE_CCCD },
@@ -2327,7 +2327,7 @@ cmd_keystore_add(int argc, char **argv)
     int obj_type;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2391,7 +2391,7 @@ cmd_keystore_del(int argc, char **argv)
     int obj_type;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2480,7 +2480,7 @@ cmd_keystore_show(int argc, char **argv)
     int type;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2546,7 +2546,7 @@ cmd_auth_passkey(int argc, char **argv)
     char *yesno;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2666,7 +2666,7 @@ cmd_security_pair(int argc, char **argv)
     uint16_t conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2710,7 +2710,7 @@ cmd_security_unpair(int argc, char **argv)
     int rc;
     int oldest;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2767,7 +2767,7 @@ cmd_security_start(int argc, char **argv)
     uint16_t conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2815,7 +2815,7 @@ cmd_security_encryption(int argc, char **argv)
     int rc;
     int auth;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -2896,7 +2896,7 @@ cmd_security_set_data(int argc, char **argv)
 
     good = 0;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3010,7 +3010,7 @@ cmd_test_tx(int argc, char **argv)
     uint16_t num;
     uint8_t stop;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3087,7 +3087,7 @@ cmd_phy_set(int argc, char **argv)
     uint16_t phy_opts;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3147,7 +3147,7 @@ cmd_phy_set_default(int argc, char **argv)
     uint8_t rx_phys_mask;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3193,7 +3193,7 @@ cmd_phy_read(int argc, char **argv)
     uint8_t rx_phy;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3634,7 +3634,7 @@ cmd_periodic_configure(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3690,7 +3690,7 @@ cmd_periodic_start(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3716,7 +3716,7 @@ cmd_periodic_stop(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3783,7 +3783,7 @@ cmd_sync_create(int argc, char **argv)
     uint8_t sid;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3868,7 +3868,7 @@ cmd_sync_transfer(int argc, char **argv)
     uint16_t sync_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3907,7 +3907,7 @@ cmd_sync_reporting(int argc, char **argv)
     bool enable;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -3968,7 +3968,7 @@ cmd_sync_transfer_set_info(int argc, char **argv)
     uint8_t instance;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -4023,7 +4023,7 @@ cmd_sync_transfer_receive(int argc, char **argv)
     bool disable;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -4100,7 +4100,7 @@ cmd_sync_terminate(int argc, char **argv)
     uint16_t sync_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -4138,7 +4138,7 @@ cmd_sync_stats(int argc, char **argv)
     uint16_t sync_handle;
     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/btshell/src/cmd.h b/apps/btshell/src/cmd.h
index 63bd50d1..0984d009 100644
--- a/apps/btshell/src/cmd.h
+++ b/apps/btshell/src/cmd.h
@@ -22,44 +22,14 @@
 
 #include <inttypes.h>
 #include "host/ble_uuid.h"
+#include <parse_arg/parse_arg.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_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_arg_all(int argc, char **argv);
+//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);
+
 int cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t *out_start,
                              uint16_t *out_end);
 
diff --git a/apps/btshell/src/cmd_gatt.c b/apps/btshell/src/cmd_gatt.c
index 4c57b42d..734b1004 100644
--- a/apps/btshell/src/cmd_gatt.c
+++ b/apps/btshell/src/cmd_gatt.c
@@ -45,7 +45,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv)
     ble_uuid_any_t uuid;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -56,7 +56,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv)
         return rc;
     }
 
-    rc = parse_arg_uuid("uuid", &uuid);
+    rc = parse_arg_ble_uuid("uuid", &uuid);
     if (rc == 0) {
         rc = btshell_disc_chrs_by_uuid(conn_handle, start_handle, end_handle,
                                        &uuid.u);
@@ -82,7 +82,7 @@ cmd_gatt_discover_descriptor(int argc, char **argv)
     uint16_t end_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -109,7 +109,7 @@ cmd_gatt_discover_service(int argc, char **argv)
     int conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -120,7 +120,7 @@ cmd_gatt_discover_service(int argc, char **argv)
         return rc;
     }
 
-    rc = parse_arg_uuid("uuid", &uuid);
+    rc = parse_arg_ble_uuid("uuid", &uuid);
     if (rc == 0) {
         rc = btshell_disc_svc_by_uuid(conn_handle, &uuid.u);
     } else if (rc == ENOENT) {
@@ -144,7 +144,7 @@ cmd_gatt_discover_full(int argc, char **argv)
     int conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -174,7 +174,7 @@ cmd_gatt_exchange_mtu(int argc, char **argv)
     uint16_t conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -204,7 +204,7 @@ cmd_gatt_notify(int argc, char **argv)
     uint16_t attr_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -241,7 +241,7 @@ cmd_gatt_read(int argc, char **argv)
     bool is_var;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -279,7 +279,7 @@ cmd_gatt_read(int argc, char **argv)
         }
     }
 
-    rc = parse_arg_uuid("uuid", &uuid);
+    rc = parse_arg_ble_uuid("uuid", &uuid);
     if (rc == ENOENT) {
         is_uuid = 0;
     } else if (rc == 0) {
@@ -351,7 +351,7 @@ cmd_gatt_service_changed(int argc, char **argv)
     uint16_t end;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -384,7 +384,7 @@ cmd_gatt_service_visibility(int argc, char **argv)
     bool vis;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -418,7 +418,7 @@ cmd_gatt_find_included_services(int argc, char **argv)
     uint16_t end_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -482,13 +482,13 @@ cmd_gatt_write(int argc, char **argv)
     uint16_t offset;
     int total_attr_len;
     int num_attrs;
-    int attr_len;
+    unsigned int attr_len;
     int is_long;
     int no_rsp;
     int rc;
     int i;
 
-    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/btshell/src/cmd_l2cap.c b/apps/btshell/src/cmd_l2cap.c
index e74e3bf3..0c9d6a45 100644
--- a/apps/btshell/src/cmd_l2cap.c
+++ b/apps/btshell/src/cmd_l2cap.c
@@ -40,7 +40,7 @@ cmd_l2cap_update(int argc, char **argv)
     uint16_t conn_handle;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -101,7 +101,7 @@ cmd_l2cap_create_server(int argc, char **argv)
     int accept_response = 0;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -159,7 +159,7 @@ cmd_l2cap_connect(int argc, char **argv)
     uint8_t num;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -202,7 +202,7 @@ cmd_l2cap_disconnect(int argc, char **argv)
     uint16_t idx;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -234,7 +234,7 @@ cmd_l2cap_send(int argc, char **argv)
     uint16_t bytes;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -294,7 +294,7 @@ cmd_l2cap_reconfig(int argc, char **argv)
     int num;
     int rc;
 
-    rc = parse_arg_all(argc - 1, argv + 1);
+    rc = parse_arg_init(argc - 1, argv + 1);
     if (rc != 0) {
         return rc;
     }
@@ -311,7 +311,7 @@ cmd_l2cap_reconfig(int argc, char **argv)
        return rc;
     }
 
-    rc = parse_arg_uint8_list_with_separator("idxs", ",", 5, idxs, &num);
+    rc = parse_arg_byte_stream_custom("idxs", ",", 5, idxs, 0, &num);
     if (rc != 0) {
        console_printf("invalid 'idxs' parameter\n");
        return rc;
diff --git a/apps/btshell/src/parse.c b/apps/btshell/src/parse.c
index e4dbade4..d759511a 100644
--- a/apps/btshell/src/parse.c
+++ b/apps/btshell/src/parse.c
@@ -19,633 +19,9 @@
 
 #include <string.h>
 #include <stdlib.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <assert.h>
-#include <ctype.h>
-#include "console/console.h"
 #include "host/ble_hs.h"
-#include "host/ble_uuid.h"
 #include "host/ble_eddystone.h"
 #include "cmd.h"
-#include "btshell.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;
-}
-
-static void
-parse_reverse_bytes(uint8_t *bytes, int len)
-{
-    uint8_t tmp;
-    int i;
-
-    for (i = 0; i < len / 2; i++) {
-        tmp = bytes[i];
-        bytes[i] = bytes[len - i - 1];
-        bytes[len - i - 1] = tmp;
-    }
-}
-
-int
-parse_arg_mac(char *name, uint8_t *dst)
-{
-    int rc;
-
-    rc = parse_arg_byte_stream_exact_length(name, dst, 6);
-    if (rc != 0) {
-        return rc;
-    }
-
-    parse_reverse_bytes(dst, 6);
-
-    return 0;
-}
-
-int
-parse_arg_addr(char *name, ble_addr_t *addr)
-{
-    char *arg;
-    size_t len;
-    uint8_t addr_type;
-    bool addr_type_found;
-    int rc;
-
-    arg = parse_arg_peek(name);
-    if (!arg) {
-        return ENOENT;
-    }
-
-    len = strlen(arg);
-    if (len < 2) {
-        return EINVAL;
-    }
-
-    addr_type_found = false;
-    if ((arg[len - 2] == ':') || (arg[len - 2] == '-')) {
-        if (tolower(arg[len - 1]) == 'p') {
-            addr_type = BLE_ADDR_PUBLIC;
-            addr_type_found = true;
-        } else if (tolower(arg[len - 1]) == 'r') {
-            addr_type = BLE_ADDR_RANDOM;
-            addr_type_found = true;
-        }
-
-        if (addr_type_found) {
-            arg[len - 2] = '\0';
-        }
-}
-
-    rc = parse_arg_mac(name, addr->val);
-    if (rc != 0) {
-        return rc;
-    }
-
-    if (addr_type_found) {
-        addr->type = addr_type;
-    } else {
-        rc = EAGAIN;
-    }
-
-    return rc;
-}
-
-int
-parse_arg_uuid(char *str, ble_uuid_any_t *uuid)
-{
-    uint16_t uuid16;
-    uint8_t val[16];
-    int len;
-    int rc;
-
-    uuid16 = parse_arg_uint16_peek(str, &rc);
-    switch (rc) {
-    case ENOENT:
-        parse_arg_extract(str);
-        return ENOENT;
-
-    case 0:
-        len = 2;
-        val[0] = uuid16;
-        val[1] = uuid16 >> 8;
-        parse_arg_extract(str);
-        break;
-
-    default:
-        len = 16;
-        rc = parse_arg_byte_stream_exact_length(str, val, 16);
-        if (rc != 0) {
-            return EINVAL;
-        }
-        parse_reverse_bytes(val, 16);
-        break;
-    }
-
-    rc = ble_uuid_init_from_buf(uuid, val, len);
-    if (rc != 0) {
-        return EINVAL;
-    } else {
-        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;
-}
 
 int
 parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body,


Reply via email to