@@ -2012,12 +2012,21 @@ static int ucs_config_parser_is_default(const char *env_prefix,
2012
2012
(getenv (var_name ) == NULL );
2013
2013
}
2014
2014
2015
- static void
2016
- ucs_config_parser_print_field (FILE * stream , const void * opts , const char * env_prefix ,
2017
- ucs_list_link_t * prefix_list , const char * name ,
2018
- const ucs_config_field_t * field , unsigned long flags ,
2019
- const char * docstr , ...)
2015
+ static void ucs_config_parser_print_header (FILE * stream , const char * title )
2020
2016
{
2017
+ fprintf (stream , "#\n" );
2018
+ fprintf (stream , "# %s\n" , title );
2019
+ fprintf (stream , "#\n" );
2020
+ fprintf (stream , "\n" );
2021
+ }
2022
+
2023
+ static void ucs_config_parser_print_field (
2024
+ FILE * stream , const void * opts , const char * env_prefix ,
2025
+ ucs_list_link_t * prefix_list , const char * name ,
2026
+ const ucs_config_field_t * field , ucs_config_print_flags_t * flags_p ,
2027
+ const char * title , const char * filter , const char * docstr , ...)
2028
+ {
2029
+ char name_buf [128 ] = {0 };
2021
2030
char value_buf [128 ] = {0 };
2022
2031
char syntax_buf [256 ] = {0 };
2023
2032
ucs_config_parser_prefix_t * prefix , * head ;
@@ -2027,6 +2036,19 @@ ucs_config_parser_print_field(FILE *stream, const void *opts, const char *env_pr
2027
2036
ucs_assert (!ucs_list_is_empty (prefix_list ));
2028
2037
head = ucs_list_head (prefix_list , ucs_config_parser_prefix_t , list );
2029
2038
2039
+ snprintf (name_buf , sizeof (name_buf ), "%s%s%s" , env_prefix , head -> prefix ,
2040
+ name );
2041
+
2042
+ /* Apply optional filter from -F command line argument. */
2043
+ if ((filter != NULL ) && (strstr (name_buf , filter ) == NULL )) {
2044
+ return ;
2045
+ }
2046
+
2047
+ if (* flags_p & UCS_CONFIG_PRINT_HEADER ) {
2048
+ * flags_p &= ~UCS_CONFIG_PRINT_HEADER ;
2049
+ ucs_config_parser_print_header (stream , title );
2050
+ }
2051
+
2030
2052
if (ucs_config_is_deprecated_field (field )) {
2031
2053
snprintf (value_buf , sizeof (value_buf ), " (deprecated)" );
2032
2054
snprintf (syntax_buf , sizeof (syntax_buf ), "N/A" );
@@ -2038,14 +2060,14 @@ ucs_config_parser_print_field(FILE *stream, const void *opts, const char *env_pr
2038
2060
field -> parser .help (syntax_buf , sizeof (syntax_buf ) - 1 , field -> parser .arg );
2039
2061
}
2040
2062
2041
- if ((flags & UCS_CONFIG_PRINT_COMMENT_DEFAULT ) &&
2063
+ if ((* flags_p & UCS_CONFIG_PRINT_COMMENT_DEFAULT ) &&
2042
2064
ucs_config_parser_is_default (env_prefix , head -> prefix , name )) {
2043
2065
default_config_prefix = "# " ;
2044
2066
} else {
2045
2067
default_config_prefix = "" ;
2046
2068
}
2047
2069
2048
- if (flags & UCS_CONFIG_PRINT_DOC ) {
2070
+ if (* flags_p & UCS_CONFIG_PRINT_DOC ) {
2049
2071
fprintf (stream , "#\n" );
2050
2072
ucs_config_print_doc_line_by_line (field , __print_stream_cb , stream );
2051
2073
fprintf (stream , "#\n" );
@@ -2080,19 +2102,17 @@ ucs_config_parser_print_field(FILE *stream, const void *opts, const char *env_pr
2080
2102
fprintf (stream , "#\n" );
2081
2103
}
2082
2104
2083
- fprintf (stream , "%s%s%s%s%s\n" , default_config_prefix , env_prefix ,
2084
- head -> prefix , name , value_buf );
2105
+ fprintf (stream , "%s%s%s\n" , default_config_prefix , name_buf , value_buf );
2085
2106
2086
- if (flags & UCS_CONFIG_PRINT_DOC ) {
2107
+ if (* flags_p & UCS_CONFIG_PRINT_DOC ) {
2087
2108
fprintf (stream , "\n" );
2088
2109
}
2089
2110
}
2090
2111
2091
- static void
2092
- ucs_config_parser_print_opts_recurs (FILE * stream , const void * opts ,
2093
- const ucs_config_field_t * fields ,
2094
- unsigned flags , const char * prefix ,
2095
- ucs_list_link_t * prefix_list )
2112
+ static void ucs_config_parser_print_opts_recurs (
2113
+ FILE * stream , const void * opts , const ucs_config_field_t * fields ,
2114
+ ucs_config_print_flags_t * flags_p , const char * prefix ,
2115
+ ucs_list_link_t * prefix_list , const char * title , const char * filter )
2096
2116
{
2097
2117
const ucs_config_field_t * field , * aliased_field ;
2098
2118
ucs_config_parser_prefix_t * head ;
@@ -2119,16 +2139,16 @@ ucs_config_parser_print_opts_recurs(FILE *stream, const void *opts,
2119
2139
inner_prefix .prefix = NULL ;
2120
2140
}
2121
2141
2122
- ucs_config_parser_print_opts_recurs (stream ,
2123
- UCS_PTR_BYTE_OFFSET (opts , field -> offset ),
2124
- field -> parser .arg , flags ,
2125
- prefix , prefix_list );
2142
+ ucs_config_parser_print_opts_recurs (
2143
+ stream , UCS_PTR_BYTE_OFFSET (opts , field -> offset ),
2144
+ field -> parser .arg , flags_p , prefix , prefix_list , title ,
2145
+ filter );
2126
2146
2127
2147
if (inner_prefix .prefix != NULL ) {
2128
2148
ucs_list_del (& inner_prefix .list );
2129
2149
}
2130
2150
} else if (ucs_config_is_alias_field (field )) {
2131
- if (flags & UCS_CONFIG_PRINT_HIDDEN ) {
2151
+ if (* flags_p & UCS_CONFIG_PRINT_HIDDEN ) {
2132
2152
aliased_field =
2133
2153
ucs_config_find_aliased_field (fields , field ,
2134
2154
& alias_table_offset );
@@ -2138,68 +2158,62 @@ ucs_config_parser_print_opts_recurs(FILE *stream, const void *opts,
2138
2158
2139
2159
head = ucs_list_head (prefix_list , ucs_config_parser_prefix_t , list );
2140
2160
2141
- ucs_config_parser_print_field (stream ,
2142
- UCS_PTR_BYTE_OFFSET (opts , alias_table_offset ),
2143
- prefix , prefix_list ,
2144
- field -> name , aliased_field ,
2145
- flags , "%-*s %s%s%s" ,
2146
- UCS_CONFIG_PARSER_DOCSTR_WIDTH ,
2147
- "alias of:" , prefix ,
2148
- head -> prefix ,
2149
- aliased_field -> name );
2161
+ ucs_config_parser_print_field (
2162
+ stream , UCS_PTR_BYTE_OFFSET (opts , alias_table_offset ),
2163
+ prefix , prefix_list , field -> name , aliased_field ,
2164
+ flags_p , title , filter , "%-*s %s%s%s" ,
2165
+ UCS_CONFIG_PARSER_DOCSTR_WIDTH , "alias of:" , prefix ,
2166
+ head -> prefix , aliased_field -> name );
2150
2167
}
2151
2168
} else {
2152
2169
if (ucs_config_is_deprecated_field (field ) &&
2153
- !(flags & UCS_CONFIG_PRINT_HIDDEN )) {
2170
+ !(* flags_p & UCS_CONFIG_PRINT_HIDDEN )) {
2154
2171
continue ;
2155
2172
}
2156
2173
ucs_config_parser_print_field (stream , opts , prefix , prefix_list ,
2157
- field -> name , field , flags , NULL );
2174
+ field -> name , field , flags_p , title ,
2175
+ filter , NULL );
2158
2176
}
2159
2177
}
2160
2178
}
2161
2179
2162
- void ucs_config_parser_print_opts (FILE * stream , const char * title , const void * opts ,
2163
- ucs_config_field_t * fields , const char * table_prefix ,
2164
- const char * prefix , ucs_config_print_flags_t flags )
2180
+ void ucs_config_parser_print_opts (FILE * stream , const char * title ,
2181
+ const void * opts , ucs_config_field_t * fields ,
2182
+ const char * table_prefix , const char * prefix ,
2183
+ const ucs_config_print_flags_t flags ,
2184
+ const char * filter )
2165
2185
{
2186
+ ucs_config_print_flags_t flags_copy = flags ;
2166
2187
ucs_config_parser_prefix_t table_prefix_elem ;
2167
2188
UCS_LIST_HEAD (prefix_list );
2168
2189
2169
- if (flags & UCS_CONFIG_PRINT_DOC ) {
2170
- fprintf (stream , "# UCX library configuration file\n" );
2171
- fprintf (stream , "# Uncomment to modify values\n" );
2172
- }
2173
-
2174
- if (flags & UCS_CONFIG_PRINT_HEADER ) {
2175
- fprintf (stream , "\n" );
2176
- fprintf (stream , "#\n" );
2177
- fprintf (stream , "# %s\n" , title );
2178
- fprintf (stream , "#\n" );
2179
- fprintf (stream , "\n" );
2180
- }
2181
-
2182
2190
if (flags & UCS_CONFIG_PRINT_CONFIG ) {
2183
2191
table_prefix_elem .prefix = table_prefix ? table_prefix : "" ;
2184
2192
ucs_list_add_tail (& prefix_list , & table_prefix_elem .list );
2185
- ucs_config_parser_print_opts_recurs (stream , opts , fields , flags ,
2186
- prefix , & prefix_list );
2187
- }
2188
-
2189
- if (flags & UCS_CONFIG_PRINT_HEADER ) {
2190
- fprintf (stream , "\n" );
2193
+ ucs_config_parser_print_opts_recurs (stream , opts , fields , & flags_copy ,
2194
+ prefix , & prefix_list , title ,
2195
+ filter );
2196
+ } else if (flags & UCS_CONFIG_PRINT_HEADER ) {
2197
+ ucs_config_parser_print_header (stream , title );
2191
2198
}
2192
2199
}
2193
2200
2194
2201
void ucs_config_parser_print_all_opts (FILE * stream , const char * prefix ,
2195
2202
ucs_config_print_flags_t flags ,
2196
- ucs_list_link_t * config_list )
2203
+ ucs_list_link_t * config_list ,
2204
+ const char * filter )
2197
2205
{
2198
2206
ucs_config_global_list_entry_t * entry ;
2199
2207
ucs_status_t status ;
2200
2208
char title [64 ];
2201
2209
void * opts ;
2202
2210
2211
+ if (flags & UCS_CONFIG_PRINT_DOC ) {
2212
+ fprintf (stream , "# UCX library configuration file\n" );
2213
+ fprintf (stream , "# Uncomment to modify values\n" );
2214
+ fprintf (stream , "\n" );
2215
+ }
2216
+
2203
2217
ucs_list_for_each (entry , config_list , list ) {
2204
2218
if ((entry -> table == NULL ) ||
2205
2219
(ucs_config_field_is_last (& entry -> table [0 ]))) {
@@ -2221,7 +2235,7 @@ void ucs_config_parser_print_all_opts(FILE *stream, const char *prefix,
2221
2235
2222
2236
snprintf (title , sizeof (title ), "%s configuration" , entry -> name );
2223
2237
ucs_config_parser_print_opts (stream , title , opts , entry -> table ,
2224
- entry -> prefix , prefix , flags );
2238
+ entry -> prefix , prefix , flags , filter );
2225
2239
2226
2240
ucs_config_parser_release_opts (opts , entry -> table );
2227
2241
ucs_free (opts );
0 commit comments