@@ -199,6 +199,98 @@ void git_config_push_parameter(const char *text)
199
199
strbuf_release (& env );
200
200
}
201
201
202
+ static inline int iskeychar (int c )
203
+ {
204
+ return isalnum (c ) || c == '-' ;
205
+ }
206
+
207
+ /*
208
+ * Auxiliary function to sanity-check and split the key into the section
209
+ * identifier and variable name.
210
+ *
211
+ * Returns 0 on success, -1 when there is an invalid character in the key and
212
+ * -2 if there is no section name in the key.
213
+ *
214
+ * store_key - pointer to char* which will hold a copy of the key with
215
+ * lowercase section and variable name
216
+ * baselen - pointer to int which will hold the length of the
217
+ * section + subsection part, can be NULL
218
+ */
219
+ static int git_config_parse_key_1 (const char * key , char * * store_key , int * baselen_ , int quiet )
220
+ {
221
+ int i , dot , baselen ;
222
+ const char * last_dot = strrchr (key , '.' );
223
+
224
+ /*
225
+ * Since "key" actually contains the section name and the real
226
+ * key name separated by a dot, we have to know where the dot is.
227
+ */
228
+
229
+ if (last_dot == NULL || last_dot == key ) {
230
+ if (!quiet )
231
+ error ("key does not contain a section: %s" , key );
232
+ return - CONFIG_NO_SECTION_OR_NAME ;
233
+ }
234
+
235
+ if (!last_dot [1 ]) {
236
+ if (!quiet )
237
+ error ("key does not contain variable name: %s" , key );
238
+ return - CONFIG_NO_SECTION_OR_NAME ;
239
+ }
240
+
241
+ baselen = last_dot - key ;
242
+ if (baselen_ )
243
+ * baselen_ = baselen ;
244
+
245
+ /*
246
+ * Validate the key and while at it, lower case it for matching.
247
+ */
248
+ if (store_key )
249
+ * store_key = xmallocz (strlen (key ));
250
+
251
+ dot = 0 ;
252
+ for (i = 0 ; key [i ]; i ++ ) {
253
+ unsigned char c = key [i ];
254
+ if (c == '.' )
255
+ dot = 1 ;
256
+ /* Leave the extended basename untouched.. */
257
+ if (!dot || i > baselen ) {
258
+ if (!iskeychar (c ) ||
259
+ (i == baselen + 1 && !isalpha (c ))) {
260
+ if (!quiet )
261
+ error ("invalid key: %s" , key );
262
+ goto out_free_ret_1 ;
263
+ }
264
+ c = tolower (c );
265
+ } else if (c == '\n' ) {
266
+ if (!quiet )
267
+ error ("invalid key (newline): %s" , key );
268
+ goto out_free_ret_1 ;
269
+ }
270
+ if (store_key )
271
+ (* store_key )[i ] = c ;
272
+ }
273
+
274
+ return 0 ;
275
+
276
+ out_free_ret_1 :
277
+ if (store_key ) {
278
+ free (* store_key );
279
+ * store_key = NULL ;
280
+ }
281
+ return - CONFIG_INVALID_KEY ;
282
+ }
283
+
284
+ int git_config_parse_key (const char * key , char * * store_key , int * baselen )
285
+ {
286
+ return git_config_parse_key_1 (key , store_key , baselen , 0 );
287
+ }
288
+
289
+ int git_config_key_is_valid (const char * key )
290
+ {
291
+ return !git_config_parse_key_1 (key , NULL , NULL , 1 );
292
+ }
293
+
202
294
int git_config_parse_parameter (const char * text ,
203
295
config_fn_t fn , void * data )
204
296
{
@@ -354,11 +446,6 @@ static char *parse_value(void)
354
446
}
355
447
}
356
448
357
- static inline int iskeychar (int c )
358
- {
359
- return isalnum (c ) || c == '-' ;
360
- }
361
-
362
449
static int get_value (config_fn_t fn , void * data , struct strbuf * name )
363
450
{
364
451
int c ;
@@ -1962,93 +2049,6 @@ void git_config_set(const char *key, const char *value)
1962
2049
git_config_set_multivar (key , value , NULL , 0 );
1963
2050
}
1964
2051
1965
- /*
1966
- * Auxiliary function to sanity-check and split the key into the section
1967
- * identifier and variable name.
1968
- *
1969
- * Returns 0 on success, -1 when there is an invalid character in the key and
1970
- * -2 if there is no section name in the key.
1971
- *
1972
- * store_key - pointer to char* which will hold a copy of the key with
1973
- * lowercase section and variable name
1974
- * baselen - pointer to int which will hold the length of the
1975
- * section + subsection part, can be NULL
1976
- */
1977
- static int git_config_parse_key_1 (const char * key , char * * store_key , int * baselen_ , int quiet )
1978
- {
1979
- int i , dot , baselen ;
1980
- const char * last_dot = strrchr (key , '.' );
1981
-
1982
- /*
1983
- * Since "key" actually contains the section name and the real
1984
- * key name separated by a dot, we have to know where the dot is.
1985
- */
1986
-
1987
- if (last_dot == NULL || last_dot == key ) {
1988
- if (!quiet )
1989
- error ("key does not contain a section: %s" , key );
1990
- return - CONFIG_NO_SECTION_OR_NAME ;
1991
- }
1992
-
1993
- if (!last_dot [1 ]) {
1994
- if (!quiet )
1995
- error ("key does not contain variable name: %s" , key );
1996
- return - CONFIG_NO_SECTION_OR_NAME ;
1997
- }
1998
-
1999
- baselen = last_dot - key ;
2000
- if (baselen_ )
2001
- * baselen_ = baselen ;
2002
-
2003
- /*
2004
- * Validate the key and while at it, lower case it for matching.
2005
- */
2006
- if (store_key )
2007
- * store_key = xmallocz (strlen (key ));
2008
-
2009
- dot = 0 ;
2010
- for (i = 0 ; key [i ]; i ++ ) {
2011
- unsigned char c = key [i ];
2012
- if (c == '.' )
2013
- dot = 1 ;
2014
- /* Leave the extended basename untouched.. */
2015
- if (!dot || i > baselen ) {
2016
- if (!iskeychar (c ) ||
2017
- (i == baselen + 1 && !isalpha (c ))) {
2018
- if (!quiet )
2019
- error ("invalid key: %s" , key );
2020
- goto out_free_ret_1 ;
2021
- }
2022
- c = tolower (c );
2023
- } else if (c == '\n' ) {
2024
- if (!quiet )
2025
- error ("invalid key (newline): %s" , key );
2026
- goto out_free_ret_1 ;
2027
- }
2028
- if (store_key )
2029
- (* store_key )[i ] = c ;
2030
- }
2031
-
2032
- return 0 ;
2033
-
2034
- out_free_ret_1 :
2035
- if (store_key ) {
2036
- free (* store_key );
2037
- * store_key = NULL ;
2038
- }
2039
- return - CONFIG_INVALID_KEY ;
2040
- }
2041
-
2042
- int git_config_parse_key (const char * key , char * * store_key , int * baselen )
2043
- {
2044
- return git_config_parse_key_1 (key , store_key , baselen , 0 );
2045
- }
2046
-
2047
- int git_config_key_is_valid (const char * key )
2048
- {
2049
- return !git_config_parse_key_1 (key , NULL , NULL , 1 );
2050
- }
2051
-
2052
2052
/*
2053
2053
* If value==NULL, unset in (remove from) config,
2054
2054
* if value_regex!=NULL, disregard key/value pairs where value does not match.
0 commit comments