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:44 UTC
[mynewt-nimble] 01/02: apps/btshell: Convert 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 a161f0abcdcb6a669d395c4a58be12976de0c126
Author: Szymon Janc <sz...@codecoup.pl>
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,