@@ -3334,53 +3334,36 @@ int update_refs(const char *action, const struct ref_update **updates_orig,
3334
3334
return ret ;
3335
3335
}
3336
3336
3337
- /*
3338
- * generate a format suitable for scanf from a ref_rev_parse_rules
3339
- * rule, that is replace the "%.*s" spec with a "%s" spec
3340
- */
3341
- static void gen_scanf_fmt (char * scanf_fmt , const char * rule )
3342
- {
3343
- char * spec ;
3344
-
3345
- spec = strstr (rule , "%.*s" );
3346
- if (!spec || strstr (spec + 4 , "%.*s" ))
3347
- die ("invalid rule in ref_rev_parse_rules: %s" , rule );
3348
-
3349
- /* copy all until spec */
3350
- strncpy (scanf_fmt , rule , spec - rule );
3351
- scanf_fmt [spec - rule ] = '\0' ;
3352
- /* copy new spec */
3353
- strcat (scanf_fmt , "%s" );
3354
- /* copy remaining rule */
3355
- strcat (scanf_fmt , spec + 4 );
3356
-
3357
- return ;
3358
- }
3359
-
3360
3337
char * shorten_unambiguous_ref (const char * refname , int strict )
3361
3338
{
3362
3339
int i ;
3363
3340
static char * * scanf_fmts ;
3364
3341
static int nr_rules ;
3365
3342
char * short_name ;
3366
3343
3367
- /* pre generate scanf formats from ref_rev_parse_rules[] */
3368
3344
if (!nr_rules ) {
3345
+ /*
3346
+ * Pre-generate scanf formats from ref_rev_parse_rules[].
3347
+ * Generate a format suitable for scanf from a
3348
+ * ref_rev_parse_rules rule by interpolating "%s" at the
3349
+ * location of the "%.*s".
3350
+ */
3369
3351
size_t total_len = 0 ;
3352
+ size_t offset = 0 ;
3370
3353
3371
3354
/* the rule list is NULL terminated, count them first */
3372
3355
for (nr_rules = 0 ; ref_rev_parse_rules [nr_rules ]; nr_rules ++ )
3373
- /* no +1 because strlen("%s") < strlen("%.* s") */
3374
- total_len += strlen (ref_rev_parse_rules [nr_rules ]);
3356
+ /* -2 for strlen("%.* s") - strlen("%s"); +1 for NUL */
3357
+ total_len += strlen (ref_rev_parse_rules [nr_rules ]) - 2 + 1 ;
3375
3358
3376
3359
scanf_fmts = xmalloc (nr_rules * sizeof (char * ) + total_len );
3377
3360
3378
- total_len = 0 ;
3361
+ offset = 0 ;
3379
3362
for (i = 0 ; i < nr_rules ; i ++ ) {
3380
- scanf_fmts [ i ] = ( char * ) & scanf_fmts [ nr_rules ]
3381
- + total_len ;
3382
- gen_scanf_fmt (scanf_fmts [i ], ref_rev_parse_rules [ i ]);
3383
- total_len += strlen ( ref_rev_parse_rules [i ]) ;
3363
+ assert ( offset < total_len );
3364
+ scanf_fmts [ i ] = ( char * ) & scanf_fmts [ nr_rules ] + offset ;
3365
+ offset += snprintf (scanf_fmts [i ], total_len - offset ,
3366
+ ref_rev_parse_rules [i ], 2 , "%s" ) + 1 ;
3384
3367
}
3385
3368
}
3386
3369
0 commit comments