From 714751b38c4e53bbefb4a2baa70128f826cb546b Mon Sep 17 00:00:00 2001 From: dhood Date: Tue, 5 Jun 2018 17:07:14 -0700 Subject: [PATCH 01/18] Set default logger level from command line --- rcl/src/rcl/arguments.c | 62 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index f16994d17..ac5e4dc53 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -98,6 +98,22 @@ rcl_arguments_get_param_files_count( return args->impl->num_param_files_args; } +/// Parse an argument that may or may not be a remap rule. +/// \param[in] arg the argument to parse +/// \param[in] allocator an allocator to use +/// \param[in,out] output_rule input a zero intialized rule, output a fully initialized one +/// \return RCL_RET_OK if a valid rule was parsed, or +/// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or +/// \return RCL_RET_BAD_ALLOC if an allocation failed, or +/// \return RLC_RET_ERROR if an unspecified error occurred. +/// \internal +RCL_LOCAL +rcl_ret_t +_rcl_parse_log_level( + const char * arg, + rcl_allocator_t allocator, + int * log_level); + rcl_ret_t rcl_parse_arguments( int argc, @@ -157,8 +173,10 @@ rcl_parse_arguments( goto fail; } + // Attempt to parse arguments as remap rules for (int i = 0; i < argc; ++i) { + int log_level; rcl_remap_t * rule = &(args_impl->remap_rules[args_impl->num_remap_rules]); *rule = rcl_remap_get_zero_initialized(); args_impl->parameter_files[args_impl->num_param_files_args] = NULL; @@ -174,11 +192,16 @@ rcl_parse_arguments( } else if (RCL_RET_OK == _rcl_parse_remap_rule(argv[i], allocator, rule)) { ++(args_impl->num_remap_rules); } else { - RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], - rcl_get_error_string()); + // Attempt to parse argument as log level configuration + if (RCL_RET_OK == _rcl_parse_log_level(argv[i], allocator, &log_level)) { + rcutils_logging_set_default_logger_level(log_level); + } else { + RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], + rcl_get_error_string()); + args_impl->unparsed_args[args_impl->num_unparsed_args] = i; + ++(args_impl->num_unparsed_args); + } rcl_reset_error(); - args_impl->unparsed_args[args_impl->num_unparsed_args] = i; - ++(args_impl->num_unparsed_args); } } @@ -933,6 +956,37 @@ _rcl_parse_remap_begin_remap_rule( return ret; } +rcl_ret_t +_rcl_parse_log_level( + const char * arg, + rcl_allocator_t allocator, + int * log_level) +{ + RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); + RCL_CHECK_ARGUMENT_FOR_NULL(log_level, RCL_RET_INVALID_ARGUMENT, allocator); + + const char * severity_string = arg; + int severity; + if (strcmp("__log:=DEBUG", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_DEBUG; + } else if (strcmp("__log:=INFO", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_INFO; + } else if (strcmp("__log:=WARN", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_WARN; + } else if (strcmp("__log:=ERROR", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_ERROR; + } else if (strcmp("__log:=FATAL", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_FATAL; + } else if (strcmp("__log:=UNSET", severity_string) == 0) { + severity = RCUTILS_LOG_SEVERITY_UNSET; + } else { + return RCL_RET_ERROR; + } + *log_level = severity; + return RCL_RET_OK; +} + + rcl_ret_t _rcl_parse_remap_rule( const char * arg, From dc35947f52a2662dde9ad09f79f8c82fdf92f184 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 6 Jun 2018 14:02:32 -0700 Subject: [PATCH 02/18] Return INVALID_REMAP_RULE --- rcl/src/rcl/arguments.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index ac5e4dc53..18d1a5246 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -38,8 +38,8 @@ static rcl_arguments_t __rcl_global_arguments; /// Parse an argument that may or may not be a remap rule. /// \param[in] arg the argument to parse /// \param[in] allocator an allocator to use -/// \param[in,out] output_rule input a zero intialized rule, output a fully initialized one -/// \return RCL_RET_OK if a valid rule was parsed, or +/// \param[in,out] log_level parsed log level represented by RCUTILS_LOG_SEVERITY enum +/// \return RCL_RET_OK if a valid log level was parsed, or /// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or /// \return RCL_RET_BAD_ALLOC if an allocation failed, or /// \return RLC_RET_ERROR if an unspecified error occurred. @@ -980,7 +980,7 @@ _rcl_parse_log_level( } else if (strcmp("__log:=UNSET", severity_string) == 0) { severity = RCUTILS_LOG_SEVERITY_UNSET; } else { - return RCL_RET_ERROR; + return RCL_INVALID_REMAP_RULE; } *log_level = severity; return RCL_RET_OK; From 08b6266d033e14a1f96c99f1621739d5725d02a3 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 6 Jun 2018 14:08:12 -0700 Subject: [PATCH 03/18] Add tests --- rcl/test/rcl/test_arguments.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rcl/test/rcl/test_arguments.cpp b/rcl/test/rcl/test_arguments.cpp index bd28342b2..b8f8ce616 100644 --- a/rcl/test/rcl/test_arguments.cpp +++ b/rcl/test/rcl/test_arguments.cpp @@ -119,6 +119,18 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval EXPECT_FALSE(is_valid_arg("rostopic://:=rosservice")); EXPECT_FALSE(is_valid_arg("rostopic::=rosservice")); EXPECT_FALSE(is_valid_arg("__param:=node_name")); + + // Setting logger level + EXPECT_TRUE(is_valid_arg("__log:=UNSET")); + EXPECT_TRUE(is_valid_arg("__log:=DEBUG")); + EXPECT_TRUE(is_valid_arg("__log:=INFO")); + EXPECT_TRUE(is_valid_arg("__log:=WARN")); + EXPECT_TRUE(is_valid_arg("__log:=ERROR")); + EXPECT_TRUE(is_valid_arg("__log:=FATAL")); + + EXPECT_FALSE(is_valid_arg("__log:=Debug")); + EXPECT_FALSE(is_valid_arg("__log:=")); + EXPECT_FALSE(is_valid_arg("__log:=foo")); } TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_no_args) { From 10b405667f7fdc695328bc4bb3fc8719edc7dc1d Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 6 Jun 2018 16:03:16 -0700 Subject: [PATCH 04/18] Do string parsing in rcutils --- rcl/src/rcl/arguments.c | 28 +++++++++++----------------- rcl/test/rcl/test_arguments.cpp | 3 ++- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 18d1a5246..d02fd90bf 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -22,6 +22,7 @@ #include "rcl/lexer_lookahead.h" #include "rcl/validate_topic_name.h" #include "rcutils/allocator.h" +#include "rcutils/logging.h" #include "rcutils/logging_macros.h" #include "rcutils/strdup.h" #include "rmw/validate_namespace.h" @@ -194,6 +195,7 @@ rcl_parse_arguments( } else { // Attempt to parse argument as log level configuration if (RCL_RET_OK == _rcl_parse_log_level(argv[i], allocator, &log_level)) { + // Set the log level immediately so it can take effect for the rest of the argument parsing. rcutils_logging_set_default_logger_level(log_level); } else { RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], @@ -965,25 +967,17 @@ _rcl_parse_log_level( RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); RCL_CHECK_ARGUMENT_FOR_NULL(log_level, RCL_RET_INVALID_ARGUMENT, allocator); + static const char LOG_ARG_RULE[] = "__log:="; const char * severity_string = arg; - int severity; - if (strcmp("__log:=DEBUG", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_DEBUG; - } else if (strcmp("__log:=INFO", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_INFO; - } else if (strcmp("__log:=WARN", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_WARN; - } else if (strcmp("__log:=ERROR", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_ERROR; - } else if (strcmp("__log:=FATAL", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_FATAL; - } else if (strcmp("__log:=UNSET", severity_string) == 0) { - severity = RCUTILS_LOG_SEVERITY_UNSET; - } else { - return RCL_INVALID_REMAP_RULE; + if (strncmp(LOG_ARG_RULE, severity_string, strlen(LOG_ARG_RULE)) != 0) { + return RCL_RET_INVALID_REMAP_RULE; } - *log_level = severity; - return RCL_RET_OK; + rcutils_ret_t ret = rcutils_logging_severity_level_from_string( + severity_string + strlen(LOG_ARG_RULE), allocator, log_level); + if (RCUTILS_RET_OK == ret) { + return RCL_RET_OK; + } + return RCL_RET_INVALID_REMAP_RULE; } diff --git a/rcl/test/rcl/test_arguments.cpp b/rcl/test/rcl/test_arguments.cpp index b8f8ce616..fafc3e6ba 100644 --- a/rcl/test/rcl/test_arguments.cpp +++ b/rcl/test/rcl/test_arguments.cpp @@ -127,8 +127,9 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval EXPECT_TRUE(is_valid_arg("__log:=WARN")); EXPECT_TRUE(is_valid_arg("__log:=ERROR")); EXPECT_TRUE(is_valid_arg("__log:=FATAL")); + EXPECT_TRUE(is_valid_arg("__log:=debug")); + EXPECT_TRUE(is_valid_arg("__log:=Info")); - EXPECT_FALSE(is_valid_arg("__log:=Debug")); EXPECT_FALSE(is_valid_arg("__log:=")); EXPECT_FALSE(is_valid_arg("__log:=foo")); } From 64792693681808f6db55fb23a69dfed64d1ff9d9 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 11:54:05 -0700 Subject: [PATCH 05/18] Set log level after parsing all arguments Less convenient but seems cleaner --- rcl/src/rcl/arguments.c | 4 ++-- rcl/src/rcl/arguments_impl.h | 3 +++ rcl/src/rcl/rcl.c | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index d02fd90bf..df564a746 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -146,6 +146,7 @@ rcl_parse_arguments( rcl_arguments_impl_t * args_impl = args_output->impl; args_impl->num_remap_rules = 0; args_impl->remap_rules = NULL; + args_impl->log_level = -1; args_impl->unparsed_args = NULL; args_impl->num_unparsed_args = 0; args_impl->parameter_files = NULL; @@ -195,8 +196,7 @@ rcl_parse_arguments( } else { // Attempt to parse argument as log level configuration if (RCL_RET_OK == _rcl_parse_log_level(argv[i], allocator, &log_level)) { - // Set the log level immediately so it can take effect for the rest of the argument parsing. - rcutils_logging_set_default_logger_level(log_level); + args_impl->log_level = log_level; } else { RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], rcl_get_error_string()); diff --git a/rcl/src/rcl/arguments_impl.h b/rcl/src/rcl/arguments_impl.h index d2a0e4274..eec52b2a6 100644 --- a/rcl/src/rcl/arguments_impl.h +++ b/rcl/src/rcl/arguments_impl.h @@ -42,6 +42,9 @@ typedef struct rcl_arguments_impl_t /// Length of remap_rules. int num_remap_rules; + /// Default log level (represented by `RCUTILS_LOG_SEVERITY` enum or -1 if not specified. + int log_level; + /// Allocator used to allocate objects in this struct rcl_allocator_t allocator; } rcl_arguments_impl_t; diff --git a/rcl/src/rcl/rcl.c b/rcl/src/rcl/rcl.c index ca4d2fa8f..7f12c3d65 100644 --- a/rcl/src/rcl/rcl.c +++ b/rcl/src/rcl/rcl.c @@ -117,6 +117,12 @@ rcl_init(int argc, char const * const * argv, rcl_allocator_t allocator) RCUTILS_LOG_ERROR_NAMED(ROS_PACKAGE_NAME, "Failed to parse global arguments"); goto fail; } + + // Update the default log level if specified in arguments. + if (global_args->impl->log_level >= 0) { + rcutils_logging_set_default_logger_level(global_args->impl->log_level); + } + rcl_atomic_store(&__rcl_instance_id, ++__rcl_next_unique_id); if (rcl_atomic_load_uint64_t(&__rcl_instance_id) == 0) { // Roll over occurred. From 73b987a072d28d4f9cd4a5447469778fead26cfc Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 12:53:14 -0700 Subject: [PATCH 06/18] Document log arg format, custom return code --- rcl/include/rcl/arguments.h | 7 +++++++ rcl/include/rcl/types.h | 2 ++ rcl/src/rcl/arguments.c | 14 ++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/rcl/include/rcl/arguments.h b/rcl/include/rcl/arguments.h index 64f310e3b..2c850a2ba 100644 --- a/rcl/include/rcl/arguments.h +++ b/rcl/include/rcl/arguments.h @@ -34,6 +34,8 @@ typedef struct rcl_arguments_t struct rcl_arguments_impl_t * impl; } rcl_arguments_t; +static const char LOG_LEVEL_ARG_RULE[] = "__log:="; + /// Return a rcl_node_t struct with members initialized to `NULL`. RCL_PUBLIC RCL_WARN_UNUSED @@ -52,6 +54,11 @@ rcl_get_zero_initialized_arguments(void); * Successfully parsed remap rules are stored in the order they were given in `argv`. * If given arguments `{"__ns:=/foo", "__ns:=/bar"}` then the namespace used by nodes in this * process will be `/foo` and not `/bar`. + * + * The default log level will be parsed as `__log:=level`, where `level` is a name representing + * one of the log levels in the `RCUTILS_LOG_SEVERITY` enum, e.g. `info`, `debug`, `warn`, not case + * sensitive. + * * \sa rcl_remap_topic_name() * \sa rcl_remap_service_name() * \sa rcl_remap_node_name() diff --git a/rcl/include/rcl/types.h b/rcl/include/rcl/types.h index 725161b69..0e6bfd729 100644 --- a/rcl/include/rcl/types.h +++ b/rcl/include/rcl/types.h @@ -94,5 +94,7 @@ typedef rmw_ret_t rcl_ret_t; #define RCL_RET_WRONG_LEXEME 1002 /// Argument is not a valid parameter rule #define RCL_RET_INVALID_PARAM_RULE 1010 +/// Argument is not a valid log level rule +#define RCL_RET_INVALID_LOG_LEVEL_RULE 1020 #endif // RCL__TYPES_H_ diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index df564a746..c7aecf634 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -960,24 +960,22 @@ _rcl_parse_remap_begin_remap_rule( rcl_ret_t _rcl_parse_log_level( - const char * arg, + const char * severity_string, rcl_allocator_t allocator, int * log_level) { - RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); + RCL_CHECK_ARGUMENT_FOR_NULL(severity_string, RCL_RET_INVALID_ARGUMENT, allocator); RCL_CHECK_ARGUMENT_FOR_NULL(log_level, RCL_RET_INVALID_ARGUMENT, allocator); - static const char LOG_ARG_RULE[] = "__log:="; - const char * severity_string = arg; - if (strncmp(LOG_ARG_RULE, severity_string, strlen(LOG_ARG_RULE)) != 0) { - return RCL_RET_INVALID_REMAP_RULE; + if (strncmp(LOG_LEVEL_ARG_RULE, severity_string, strlen(LOG_LEVEL_ARG_RULE)) != 0) { + return RCL_RET_INVALID_LOG_LEVEL_RULE; } rcutils_ret_t ret = rcutils_logging_severity_level_from_string( - severity_string + strlen(LOG_ARG_RULE), allocator, log_level); + severity_string + strlen(LOG_LEVEL_ARG_RULE), allocator, log_level); if (RCUTILS_RET_OK == ret) { return RCL_RET_OK; } - return RCL_RET_INVALID_REMAP_RULE; + return RCL_RET_INVALID_LOG_LEVEL_RULE; } From eb72a1a7462d23c0571a13eed741072b6c421b91 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 14:06:17 -0700 Subject: [PATCH 07/18] Rename function --- rcl/src/rcl/arguments.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index c7aecf634..402b110f5 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -102,15 +102,15 @@ rcl_arguments_get_param_files_count( /// Parse an argument that may or may not be a remap rule. /// \param[in] arg the argument to parse /// \param[in] allocator an allocator to use -/// \param[in,out] output_rule input a zero intialized rule, output a fully initialized one -/// \return RCL_RET_OK if a valid rule was parsed, or -/// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or +/// \param[in,out] log_level parsed log level represented by RCUTILS_LOG_SEVERITY enum +/// \return RCL_RET_OK if a valid log level was parsed, or +/// \return RCL_RET_INVALID_LOG_LEVEL_RULE if the argument is not a valid rule, or /// \return RCL_RET_BAD_ALLOC if an allocation failed, or /// \return RLC_RET_ERROR if an unspecified error occurred. /// \internal RCL_LOCAL rcl_ret_t -_rcl_parse_log_level( +_rcl_parse_log_level_rule( const char * arg, rcl_allocator_t allocator, int * log_level); @@ -195,7 +195,7 @@ rcl_parse_arguments( ++(args_impl->num_remap_rules); } else { // Attempt to parse argument as log level configuration - if (RCL_RET_OK == _rcl_parse_log_level(argv[i], allocator, &log_level)) { + if (RCL_RET_OK == _rcl_parse_log_level_rule(argv[i], allocator, &log_level)) { args_impl->log_level = log_level; } else { RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], @@ -959,7 +959,7 @@ _rcl_parse_remap_begin_remap_rule( } rcl_ret_t -_rcl_parse_log_level( +_rcl_parse_log_level_rule( const char * severity_string, rcl_allocator_t allocator, int * log_level) From 77b1a8c98da74d74f47b731924f8ccee0f5dacca Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 16:01:50 -0700 Subject: [PATCH 08/18] Rename argument --- rcl/src/rcl/arguments.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 402b110f5..02faf4751 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -960,18 +960,18 @@ _rcl_parse_remap_begin_remap_rule( rcl_ret_t _rcl_parse_log_level_rule( - const char * severity_string, + const char * arg, rcl_allocator_t allocator, int * log_level) { - RCL_CHECK_ARGUMENT_FOR_NULL(severity_string, RCL_RET_INVALID_ARGUMENT, allocator); + RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); RCL_CHECK_ARGUMENT_FOR_NULL(log_level, RCL_RET_INVALID_ARGUMENT, allocator); - if (strncmp(LOG_LEVEL_ARG_RULE, severity_string, strlen(LOG_LEVEL_ARG_RULE)) != 0) { + if (strncmp(LOG_LEVEL_ARG_RULE, arg, strlen(LOG_LEVEL_ARG_RULE)) != 0) { return RCL_RET_INVALID_LOG_LEVEL_RULE; } rcutils_ret_t ret = rcutils_logging_severity_level_from_string( - severity_string + strlen(LOG_LEVEL_ARG_RULE), allocator, log_level); + arg + strlen(LOG_LEVEL_ARG_RULE), allocator, log_level); if (RCUTILS_RET_OK == ret) { return RCL_RET_OK; } From 7d5c90de5ce9c37377032bc96db5ae48c1d9219a Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 16:15:53 -0700 Subject: [PATCH 09/18] Refactor argument parsing after rebasing to include param files --- rcl/include/rcl/arguments.h | 3 +- rcl/src/rcl/arguments.c | 63 +++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/rcl/include/rcl/arguments.h b/rcl/include/rcl/arguments.h index 2c850a2ba..07a24ef61 100644 --- a/rcl/include/rcl/arguments.h +++ b/rcl/include/rcl/arguments.h @@ -34,7 +34,8 @@ typedef struct rcl_arguments_t struct rcl_arguments_impl_t * impl; } rcl_arguments_t; -static const char LOG_LEVEL_ARG_RULE[] = "__log:="; +#define RCL_LOG_LEVEL_ARG_RULE "__log:=" +#define RCL_PARAM_FILE_ARG_RULE "__params:=" /// Return a rcl_node_t struct with members initialized to `NULL`. RCL_PUBLIC diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 02faf4751..a172491d1 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -175,12 +175,8 @@ rcl_parse_arguments( goto fail; } - - // Attempt to parse arguments as remap rules for (int i = 0; i < argc; ++i) { - int log_level; - rcl_remap_t * rule = &(args_impl->remap_rules[args_impl->num_remap_rules]); - *rule = rcl_remap_get_zero_initialized(); + // Attempt to parse argument as parameter file rule args_impl->parameter_files[args_impl->num_param_files_args] = NULL; if ( RCL_RET_OK == _rcl_parse_param_rule( @@ -190,21 +186,39 @@ rcl_parse_arguments( RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "params rule : %s\n total num param rules %d", args_impl->parameter_files[args_impl->num_param_files_args - 1], - args_impl->num_param_files_args) - } else if (RCL_RET_OK == _rcl_parse_remap_rule(argv[i], allocator, rule)) { + args_impl->num_param_files_args); + continue; + } + RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, + "Couldn't parse arg %d (%s) as parameter file rule. Error: %s", i, argv[i], + rcl_get_error_string()); + rcl_reset_error(); + + // Attempt to parse argument as remap rule + rcl_remap_t * rule = &(args_impl->remap_rules[args_impl->num_remap_rules]); + *rule = rcl_remap_get_zero_initialized(); + if (RCL_RET_OK == _rcl_parse_remap_rule(argv[i], allocator, rule)) { ++(args_impl->num_remap_rules); - } else { - // Attempt to parse argument as log level configuration - if (RCL_RET_OK == _rcl_parse_log_level_rule(argv[i], allocator, &log_level)) { - args_impl->log_level = log_level; - } else { - RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, "arg %d (%s) error '%s'", i, argv[i], - rcl_get_error_string()); - args_impl->unparsed_args[args_impl->num_unparsed_args] = i; - ++(args_impl->num_unparsed_args); - } - rcl_reset_error(); + continue; } + RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, + "Couldn't parse arg %d (%s) as remap rule. Error: %s", i, argv[i], rcl_get_error_string()); + rcl_reset_error(); + + // Attempt to parse argument as log level configuration + int log_level; + if (RCL_RET_OK == _rcl_parse_log_level_rule(argv[i], allocator, &log_level)) { + args_impl->log_level = log_level; + continue; + } + RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME, + "Couldn't parse arg %d (%s) as log level rule. Error: %s", i, argv[i], + rcl_get_error_string()); + rcl_reset_error(); + + // Argument wasn't parsed by any rule + args_impl->unparsed_args[args_impl->num_unparsed_args] = i; + ++(args_impl->num_unparsed_args); } // Shrink remap_rules array to match number of successfully parsed rules @@ -967,14 +981,16 @@ _rcl_parse_log_level_rule( RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); RCL_CHECK_ARGUMENT_FOR_NULL(log_level, RCL_RET_INVALID_ARGUMENT, allocator); - if (strncmp(LOG_LEVEL_ARG_RULE, arg, strlen(LOG_LEVEL_ARG_RULE)) != 0) { + if (strncmp(RCL_LOG_LEVEL_ARG_RULE, arg, strlen(RCL_LOG_LEVEL_ARG_RULE)) != 0) { + RCL_SET_ERROR_MSG("Argument does not start with '" RCL_LOG_LEVEL_ARG_RULE "'", allocator); return RCL_RET_INVALID_LOG_LEVEL_RULE; } rcutils_ret_t ret = rcutils_logging_severity_level_from_string( - arg + strlen(LOG_LEVEL_ARG_RULE), allocator, log_level); + arg + strlen(RCL_LOG_LEVEL_ARG_RULE), allocator, log_level); if (RCUTILS_RET_OK == ret) { return RCL_RET_OK; } + RCL_SET_ERROR_MSG("Argument does not use a valid severity level", allocator); return RCL_RET_INVALID_LOG_LEVEL_RULE; } @@ -1022,17 +1038,18 @@ _rcl_parse_param_rule( { RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); - const char * param_prefix = "__params:="; - const size_t param_prefix_len = strlen(param_prefix); - if (strncmp(param_prefix, arg, param_prefix_len) == 0) { + const size_t param_prefix_len = strlen(RCL_PARAM_FILE_ARG_RULE); + if (strncmp(RCL_PARAM_FILE_ARG_RULE, arg, param_prefix_len) == 0) { size_t outlen = strlen(arg) - param_prefix_len; *output_rule = allocator.allocate(sizeof(char) * (outlen + 1), allocator.state); if (NULL == output_rule) { + RCL_SET_ERROR_MSG("Failed to allocate memory for parameters file path", allocator) return RCL_RET_BAD_ALLOC; } snprintf(*output_rule, outlen + 1, "%s", arg + param_prefix_len); return RCL_RET_OK; } + RCL_SET_ERROR_MSG("Argument does not start with '" RCL_PARAM_FILE_ARG_RULE "'", allocator); return RCL_RET_INVALID_PARAM_RULE; } From 0cf31b5a6601ff3278017e3584e98151c9f162d9 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 16:41:46 -0700 Subject: [PATCH 10/18] Renaming from param files support --- rcl/src/rcl/arguments.c | 26 ++++++++++++++++++-------- rcl/test/rcl/test_arguments.cpp | 4 ++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index a172491d1..4401be34e 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -52,12 +52,22 @@ _rcl_parse_remap_rule( rcl_allocator_t allocator, rcl_remap_t * output_rule); +/// Parse an argument that may or may not be a parameter file rule. +/// The syntax of the file name is not validated. +/// \param[in] arg the argument to parse +/// \param[in] allocator an allocator to use +/// \param[in,out] param_file string that could be a parameter file name +/// \return RCL_RET_OK if the rule was parsed correctly, or +/// \return RCL_RET_INVALID_PARAM_RULE if the argument is not a valid rule, or +/// \return RCL_RET_BAD_ALLOC if an allocation failed, or +/// \return RLC_RET_ERROR if an unspecified error occurred. +/// \internal RCL_LOCAL rcl_ret_t -_rcl_parse_param_rule( +_rcl_parse_param_file_rule( const char * arg, rcl_allocator_t allocator, - char ** output_rule); + char ** param_file); rcl_ret_t rcl_arguments_get_param_files( @@ -179,7 +189,7 @@ rcl_parse_arguments( // Attempt to parse argument as parameter file rule args_impl->parameter_files[args_impl->num_param_files_args] = NULL; if ( - RCL_RET_OK == _rcl_parse_param_rule( + RCL_RET_OK == _rcl_parse_param_file_rule( argv[i], allocator, &(args_impl->parameter_files[args_impl->num_param_files_args]))) { ++(args_impl->num_param_files_args); @@ -1031,22 +1041,22 @@ _rcl_parse_remap_rule( } rcl_ret_t -_rcl_parse_param_rule( +_rcl_parse_param_file_rule( const char * arg, rcl_allocator_t allocator, - char ** output_rule) + char ** param_file) { RCL_CHECK_ARGUMENT_FOR_NULL(arg, RCL_RET_INVALID_ARGUMENT, allocator); const size_t param_prefix_len = strlen(RCL_PARAM_FILE_ARG_RULE); if (strncmp(RCL_PARAM_FILE_ARG_RULE, arg, param_prefix_len) == 0) { size_t outlen = strlen(arg) - param_prefix_len; - *output_rule = allocator.allocate(sizeof(char) * (outlen + 1), allocator.state); - if (NULL == output_rule) { + *param_file = allocator.allocate(sizeof(char) * (outlen + 1), allocator.state); + if (NULL == param_file) { RCL_SET_ERROR_MSG("Failed to allocate memory for parameters file path", allocator) return RCL_RET_BAD_ALLOC; } - snprintf(*output_rule, outlen + 1, "%s", arg + param_prefix_len); + snprintf(*param_file, outlen + 1, "%s", arg + param_prefix_len); return RCL_RET_OK; } RCL_SET_ERROR_MSG("Argument does not start with '" RCL_PARAM_FILE_ARG_RULE "'", allocator); diff --git a/rcl/test/rcl/test_arguments.cpp b/rcl/test/rcl/test_arguments.cpp index fafc3e6ba..e36232c0e 100644 --- a/rcl/test/rcl/test_arguments.cpp +++ b/rcl/test/rcl/test_arguments.cpp @@ -100,7 +100,7 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval EXPECT_TRUE(is_valid_arg("rostopic://rostopic:=rosservice")); EXPECT_TRUE(is_valid_arg("rostopic:///rosservice:=rostopic")); EXPECT_TRUE(is_valid_arg("rostopic:///foo/bar:=baz")); - EXPECT_TRUE(is_valid_arg("__params:=node_name")); + EXPECT_TRUE(is_valid_arg("__params:=file_name.yaml")); EXPECT_FALSE(is_valid_arg(":=")); EXPECT_FALSE(is_valid_arg("foo:=")); @@ -118,7 +118,7 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval EXPECT_FALSE(is_valid_arg("foo:=/b}ar")); EXPECT_FALSE(is_valid_arg("rostopic://:=rosservice")); EXPECT_FALSE(is_valid_arg("rostopic::=rosservice")); - EXPECT_FALSE(is_valid_arg("__param:=node_name")); + EXPECT_FALSE(is_valid_arg("__param:=file_name.yaml")); // Setting logger level EXPECT_TRUE(is_valid_arg("__log:=UNSET")); From 9ac0f8d22c7af0c4e4e91525c7fdf254dc61404a Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 16:41:57 -0700 Subject: [PATCH 11/18] Doc fixup --- rcl/src/rcl/arguments.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 4401be34e..9f7197a3c 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -39,8 +39,8 @@ static rcl_arguments_t __rcl_global_arguments; /// Parse an argument that may or may not be a remap rule. /// \param[in] arg the argument to parse /// \param[in] allocator an allocator to use -/// \param[in,out] log_level parsed log level represented by RCUTILS_LOG_SEVERITY enum -/// \return RCL_RET_OK if a valid log level was parsed, or +/// \param[in,out] output_rule input a zero intialized rule, output a fully initialized one +/// \return RCL_RET_OK if a valid rule was parsed, or /// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or /// \return RCL_RET_BAD_ALLOC if an allocation failed, or /// \return RLC_RET_ERROR if an unspecified error occurred. @@ -109,10 +109,10 @@ rcl_arguments_get_param_files_count( return args->impl->num_param_files_args; } -/// Parse an argument that may or may not be a remap rule. +/// Parse an argument that may or may not be a log level rule. /// \param[in] arg the argument to parse /// \param[in] allocator an allocator to use -/// \param[in,out] log_level parsed log level represented by RCUTILS_LOG_SEVERITY enum +/// \param[in,out] log_level parsed log level represented by `RCUTILS_LOG_SEVERITY` enum /// \return RCL_RET_OK if a valid log level was parsed, or /// \return RCL_RET_INVALID_LOG_LEVEL_RULE if the argument is not a valid rule, or /// \return RCL_RET_BAD_ALLOC if an allocation failed, or From 3d5cba6b7805cc5cff5e39821a3ec84b0d068a3c Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 17:22:32 -0700 Subject: [PATCH 12/18] __log -> __log_level --- rcl/include/rcl/arguments.h | 2 +- rcl/test/rcl/test_arguments.cpp | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/rcl/include/rcl/arguments.h b/rcl/include/rcl/arguments.h index 07a24ef61..172429a84 100644 --- a/rcl/include/rcl/arguments.h +++ b/rcl/include/rcl/arguments.h @@ -34,7 +34,7 @@ typedef struct rcl_arguments_t struct rcl_arguments_impl_t * impl; } rcl_arguments_t; -#define RCL_LOG_LEVEL_ARG_RULE "__log:=" +#define RCL_LOG_LEVEL_ARG_RULE "__log_level:=" #define RCL_PARAM_FILE_ARG_RULE "__params:=" /// Return a rcl_node_t struct with members initialized to `NULL`. diff --git a/rcl/test/rcl/test_arguments.cpp b/rcl/test/rcl/test_arguments.cpp index e36232c0e..3bb0361f8 100644 --- a/rcl/test/rcl/test_arguments.cpp +++ b/rcl/test/rcl/test_arguments.cpp @@ -121,17 +121,19 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval EXPECT_FALSE(is_valid_arg("__param:=file_name.yaml")); // Setting logger level - EXPECT_TRUE(is_valid_arg("__log:=UNSET")); - EXPECT_TRUE(is_valid_arg("__log:=DEBUG")); - EXPECT_TRUE(is_valid_arg("__log:=INFO")); - EXPECT_TRUE(is_valid_arg("__log:=WARN")); - EXPECT_TRUE(is_valid_arg("__log:=ERROR")); - EXPECT_TRUE(is_valid_arg("__log:=FATAL")); - EXPECT_TRUE(is_valid_arg("__log:=debug")); - EXPECT_TRUE(is_valid_arg("__log:=Info")); - - EXPECT_FALSE(is_valid_arg("__log:=")); + EXPECT_TRUE(is_valid_arg("__log_level:=UNSET")); + EXPECT_TRUE(is_valid_arg("__log_level:=DEBUG")); + EXPECT_TRUE(is_valid_arg("__log_level:=INFO")); + EXPECT_TRUE(is_valid_arg("__log_level:=WARN")); + EXPECT_TRUE(is_valid_arg("__log_level:=ERROR")); + EXPECT_TRUE(is_valid_arg("__log_level:=FATAL")); + EXPECT_TRUE(is_valid_arg("__log_level:=debug")); + EXPECT_TRUE(is_valid_arg("__log_level:=Info")); + EXPECT_FALSE(is_valid_arg("__log:=foo")); + EXPECT_FALSE(is_valid_arg("__loglevel:=foo")); + EXPECT_FALSE(is_valid_arg("__log_level:=")); + EXPECT_FALSE(is_valid_arg("__log_level:=foo")); } TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), test_no_args) { From 27fca189c20540f1ea88ed585aa443dae34d3869 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 17:38:02 -0700 Subject: [PATCH 13/18] Use RCUTILS_SAFE_FWRITE_TO_STDERR on bad alloc --- rcl/src/rcl/arguments.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 9f7197a3c..2ba65faa0 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -22,6 +22,7 @@ #include "rcl/lexer_lookahead.h" #include "rcl/validate_topic_name.h" #include "rcutils/allocator.h" +#include "rcutils/error_handling.h" #include "rcutils/logging.h" #include "rcutils/logging_macros.h" #include "rcutils/strdup.h" @@ -1053,7 +1054,7 @@ _rcl_parse_param_file_rule( size_t outlen = strlen(arg) - param_prefix_len; *param_file = allocator.allocate(sizeof(char) * (outlen + 1), allocator.state); if (NULL == param_file) { - RCL_SET_ERROR_MSG("Failed to allocate memory for parameters file path", allocator) + RCUTILS_SAFE_FWRITE_TO_STDERR("Failed to allocate memory for parameters file path\n"); return RCL_RET_BAD_ALLOC; } snprintf(*param_file, outlen + 1, "%s", arg + param_prefix_len); From ed56679f11bd31e4fb3a0b65adb7092163e65afb Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 17:43:11 -0700 Subject: [PATCH 14/18] doc fixup --- rcl/src/rcl/arguments_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/src/rcl/arguments_impl.h b/rcl/src/rcl/arguments_impl.h index eec52b2a6..bb0c049c3 100644 --- a/rcl/src/rcl/arguments_impl.h +++ b/rcl/src/rcl/arguments_impl.h @@ -42,7 +42,7 @@ typedef struct rcl_arguments_impl_t /// Length of remap_rules. int num_remap_rules; - /// Default log level (represented by `RCUTILS_LOG_SEVERITY` enum or -1 if not specified. + /// Default log level (represented by `RCUTILS_LOG_SEVERITY` enum) or -1 if not specified. int log_level; /// Allocator used to allocate objects in this struct From e923448245f1a904e097754cffe523bf82a5cde9 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 7 Jun 2018 17:44:20 -0700 Subject: [PATCH 15/18] doc fixup --- rcl/include/rcl/arguments.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/include/rcl/arguments.h b/rcl/include/rcl/arguments.h index 172429a84..7f9d6c07e 100644 --- a/rcl/include/rcl/arguments.h +++ b/rcl/include/rcl/arguments.h @@ -56,7 +56,7 @@ rcl_get_zero_initialized_arguments(void); * If given arguments `{"__ns:=/foo", "__ns:=/bar"}` then the namespace used by nodes in this * process will be `/foo` and not `/bar`. * - * The default log level will be parsed as `__log:=level`, where `level` is a name representing + * The default log level will be parsed as `__log_level:=level`, where `level` is a name representing * one of the log levels in the `RCUTILS_LOG_SEVERITY` enum, e.g. `info`, `debug`, `warn`, not case * sensitive. * From 0ef1505b3416d3eee29037a9790d88e661f81ddd Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 11 Jun 2018 14:48:00 -0700 Subject: [PATCH 16/18] Document behaviour if multiple __log_level rules found --- rcl/include/rcl/arguments.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rcl/include/rcl/arguments.h b/rcl/include/rcl/arguments.h index 7f9d6c07e..86d604c3f 100644 --- a/rcl/include/rcl/arguments.h +++ b/rcl/include/rcl/arguments.h @@ -56,9 +56,10 @@ rcl_get_zero_initialized_arguments(void); * If given arguments `{"__ns:=/foo", "__ns:=/bar"}` then the namespace used by nodes in this * process will be `/foo` and not `/bar`. * - * The default log level will be parsed as `__log_level:=level`, where `level` is a name representing - * one of the log levels in the `RCUTILS_LOG_SEVERITY` enum, e.g. `info`, `debug`, `warn`, not case - * sensitive. + * The default log level will be parsed as `__log_level:=level`, where `level` is a name + * representing one of the log levels in the `RCUTILS_LOG_SEVERITY` enum, e.g. `info`, `debug`, + * `warn`, not case sensitive. + * If multiple of these rules are found, the last one parsed will be used. * * \sa rcl_remap_topic_name() * \sa rcl_remap_service_name() From b626c0aa8d40df62d95cfaece51a9e933d9ad3d9 Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 11 Jun 2018 15:22:43 -0700 Subject: [PATCH 17/18] Update docblock formatting --- rcl/src/rcl/arguments.c | 126 ++++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 50 deletions(-) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 2ba65faa0..4e70c4fca 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -38,14 +38,16 @@ extern "C" static rcl_arguments_t __rcl_global_arguments; /// Parse an argument that may or may not be a remap rule. -/// \param[in] arg the argument to parse -/// \param[in] allocator an allocator to use -/// \param[in,out] output_rule input a zero intialized rule, output a fully initialized one -/// \return RCL_RET_OK if a valid rule was parsed, or -/// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or -/// \return RCL_RET_BAD_ALLOC if an allocation failed, or -/// \return RLC_RET_ERROR if an unspecified error occurred. -/// \internal +/** + * \param[in] arg the argument to parse + * \param[in] allocator an allocator to use + * \param[in,out] output_rule input a zero intialized rule, output a fully initialized one + * \return RCL_RET_OK if a valid rule was parsed, or + * \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or + * \return RCL_RET_BAD_ALLOC if an allocation failed, or + * \return RLC_RET_ERROR if an unspecified error occurred. + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_rule( @@ -54,15 +56,17 @@ _rcl_parse_remap_rule( rcl_remap_t * output_rule); /// Parse an argument that may or may not be a parameter file rule. -/// The syntax of the file name is not validated. -/// \param[in] arg the argument to parse -/// \param[in] allocator an allocator to use -/// \param[in,out] param_file string that could be a parameter file name -/// \return RCL_RET_OK if the rule was parsed correctly, or -/// \return RCL_RET_INVALID_PARAM_RULE if the argument is not a valid rule, or -/// \return RCL_RET_BAD_ALLOC if an allocation failed, or -/// \return RLC_RET_ERROR if an unspecified error occurred. -/// \internal +/** + * The syntax of the file name is not validated. + * \param[in] arg the argument to parse + * \param[in] allocator an allocator to use + * \param[in,out] param_file string that could be a parameter file name + * \return RCL_RET_OK if the rule was parsed correctly, or + * \return RCL_RET_INVALID_PARAM_RULE if the argument is not a valid rule, or + * \return RCL_RET_BAD_ALLOC if an allocation failed, or + * \return RLC_RET_ERROR if an unspecified error occurred. + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_param_file_rule( @@ -111,14 +115,16 @@ rcl_arguments_get_param_files_count( } /// Parse an argument that may or may not be a log level rule. -/// \param[in] arg the argument to parse -/// \param[in] allocator an allocator to use -/// \param[in,out] log_level parsed log level represented by `RCUTILS_LOG_SEVERITY` enum -/// \return RCL_RET_OK if a valid log level was parsed, or -/// \return RCL_RET_INVALID_LOG_LEVEL_RULE if the argument is not a valid rule, or -/// \return RCL_RET_BAD_ALLOC if an allocation failed, or -/// \return RLC_RET_ERROR if an unspecified error occurred. -/// \internal +/** + * \param[in] arg the argument to parse + * \param[in] allocator an allocator to use + * \param[in,out] log_level parsed log level represented by `RCUTILS_LOG_SEVERITY` enum + * \return RCL_RET_OK if a valid log level was parsed, or + * \return RCL_RET_INVALID_LOG_LEVEL_RULE if the argument is not a valid rule, or + * \return RCL_RET_BAD_ALLOC if an allocation failed, or + * \return RLC_RET_ERROR if an unspecified error occurred. + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_log_level_rule( @@ -515,8 +521,10 @@ rcl_get_global_arguments() } /// Parses a fully qualified namespace for a namespace replacement rule (ex: `/foo/bar`) -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_fully_qualified_namespace( @@ -547,8 +555,10 @@ _rcl_parse_remap_fully_qualified_namespace( } /// Parse either a token or a backreference (ex: `bar`, or `\7`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_replacement_token( @@ -580,8 +590,10 @@ _rcl_parse_remap_replacement_token( } /// Parse the replacement side of a name remapping rule (ex: `bar/\1/foo`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_replacement_name( @@ -646,8 +658,10 @@ _rcl_parse_remap_replacement_name( } /// Parse either a token or a wildcard (ex: `foobar`, or `*`, or `**`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_match_token( @@ -679,8 +693,10 @@ _rcl_parse_remap_match_token( } /// Parse the match side of a name remapping rule (ex: `rostopic://foo`) -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_match_name( @@ -762,8 +778,10 @@ _rcl_parse_remap_match_name( } /// Parse a name remapping rule (ex: `rostopic:///foo:=bar`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_name_remap( @@ -791,8 +809,10 @@ _rcl_parse_remap_name_remap( } /// Parse a namespace replacement rule (ex: `__ns:=/new/ns`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_namespace_replacement( @@ -848,8 +868,10 @@ _rcl_parse_remap_namespace_replacement( } /// Parse a nodename replacement rule (ex: `__node:=new_name`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_nodename_replacement( @@ -890,8 +912,10 @@ _rcl_parse_remap_nodename_replacement( } /// Parse a nodename prefix including trailing colon (ex: `node_name:`). -/// \sa _rcl_parse_remap_begin_remap_rule() -/// \internal +/** + * \sa _rcl_parse_remap_begin_remap_rule() + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_nodename_prefix( @@ -923,13 +947,15 @@ _rcl_parse_remap_nodename_prefix( } /// Start recursive descent parsing of a remap rule. -/// \param[in] lex_lookahead a lookahead(2) buffer for the parser to use. -/// \param[in,out] rule input a zero intialized rule, output a fully initialized one. -/// \return RCL_RET_OK if a valid rule was parsed, or -/// \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or -/// \return RCL_RET_BAD_ALLOC if an allocation failed, or -/// \return RLC_RET_ERROR if an unspecified error occurred. -/// \internal +/** + * \param[in] lex_lookahead a lookahead(2) buffer for the parser to use. + * \param[in,out] rule input a zero intialized rule, output a fully initialized one. + * \return RCL_RET_OK if a valid rule was parsed, or + * \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or + * \return RCL_RET_BAD_ALLOC if an allocation failed, or + * \return RLC_RET_ERROR if an unspecified error occurred. + * \internal + */ RCL_LOCAL rcl_ret_t _rcl_parse_remap_begin_remap_rule( From 3307ff734681e4ba53075c1dad95f88ad4e052ba Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 11 Jun 2018 15:53:46 -0700 Subject: [PATCH 18/18] Label all documentation in arguments.c as internal --- rcl/Doxyfile | 4 ++++ rcl/src/rcl/arguments.c | 17 ++++------------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/rcl/Doxyfile b/rcl/Doxyfile index d58f95ba3..30dbcae3c 100644 --- a/rcl/Doxyfile +++ b/rcl/Doxyfile @@ -19,6 +19,10 @@ EXPAND_ONLY_PREDEF = YES PREDEFINED += RCL_PUBLIC= PREDEFINED += RCL_WARN_UNUSED= +# Uncomment to generate internal documentation. +ENABLED_SECTIONS = INTERNAL +INPUT += ./src/rcl/arguments.c + # Tag files that do not exist will produce a warning and cross-project linking will not work. TAGFILES += "../../../../doxygen_tag_files/cppreference-doxygen-web.tag.xml=http://en.cppreference.com/w/" # Consider changing "latest" to the version you want to reference (e.g. beta1 or 1.0.0) diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 4e70c4fca..6b05dec0a 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +/// \cond INTERNAL // Internal Doxygen documentation + #include "rcl/arguments.h" #include @@ -46,7 +48,6 @@ static rcl_arguments_t __rcl_global_arguments; * \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or * \return RCL_RET_BAD_ALLOC if an allocation failed, or * \return RLC_RET_ERROR if an unspecified error occurred. - * \internal */ RCL_LOCAL rcl_ret_t @@ -65,7 +66,6 @@ _rcl_parse_remap_rule( * \return RCL_RET_INVALID_PARAM_RULE if the argument is not a valid rule, or * \return RCL_RET_BAD_ALLOC if an allocation failed, or * \return RLC_RET_ERROR if an unspecified error occurred. - * \internal */ RCL_LOCAL rcl_ret_t @@ -123,7 +123,6 @@ rcl_arguments_get_param_files_count( * \return RCL_RET_INVALID_LOG_LEVEL_RULE if the argument is not a valid rule, or * \return RCL_RET_BAD_ALLOC if an allocation failed, or * \return RLC_RET_ERROR if an unspecified error occurred. - * \internal */ RCL_LOCAL rcl_ret_t @@ -523,7 +522,6 @@ rcl_get_global_arguments() /// Parses a fully qualified namespace for a namespace replacement rule (ex: `/foo/bar`) /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -557,7 +555,6 @@ _rcl_parse_remap_fully_qualified_namespace( /// Parse either a token or a backreference (ex: `bar`, or `\7`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -592,7 +589,6 @@ _rcl_parse_remap_replacement_token( /// Parse the replacement side of a name remapping rule (ex: `bar/\1/foo`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -660,7 +656,6 @@ _rcl_parse_remap_replacement_name( /// Parse either a token or a wildcard (ex: `foobar`, or `*`, or `**`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -695,7 +690,6 @@ _rcl_parse_remap_match_token( /// Parse the match side of a name remapping rule (ex: `rostopic://foo`) /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -780,7 +774,6 @@ _rcl_parse_remap_match_name( /// Parse a name remapping rule (ex: `rostopic:///foo:=bar`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -811,7 +804,6 @@ _rcl_parse_remap_name_remap( /// Parse a namespace replacement rule (ex: `__ns:=/new/ns`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -870,7 +862,6 @@ _rcl_parse_remap_namespace_replacement( /// Parse a nodename replacement rule (ex: `__node:=new_name`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -914,7 +905,6 @@ _rcl_parse_remap_nodename_replacement( /// Parse a nodename prefix including trailing colon (ex: `node_name:`). /** * \sa _rcl_parse_remap_begin_remap_rule() - * \internal */ RCL_LOCAL rcl_ret_t @@ -954,7 +944,6 @@ _rcl_parse_remap_nodename_prefix( * \return RCL_RET_INVALID_REMAP_RULE if the argument is not a valid rule, or * \return RCL_RET_BAD_ALLOC if an allocation failed, or * \return RLC_RET_ERROR if an unspecified error occurred. - * \internal */ RCL_LOCAL rcl_ret_t @@ -1093,3 +1082,5 @@ _rcl_parse_param_file_rule( #ifdef __cplusplus } #endif + +/// \endcond // Internal Doxygen documentation