@@ -353,10 +353,25 @@ size_t fill_pathname(char *s, const char *in_path,
353353 **/
354354char * find_last_slash (const char * str )
355355{
356- const char * slash = strrchr (str , '/' );
357- const char * backslash = strrchr (str , '\\' );
358- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
359- return last_slash ;
356+ const char * p ;
357+ const char * last_slash = NULL ;
358+ const char * last_backslash = NULL ;
359+
360+ /* Traverse the string once */
361+ for (p = str ; * p != '\0' ; ++ p )
362+ {
363+ if (* p == '/' )
364+ last_slash = p ; /* Update last forward slash */
365+ else if (* p == '\\' )
366+ last_backslash = p ; /* Update last backslash */
367+ }
368+
369+ /* Determine which one is last */
370+ if (!last_slash ) /* Backslash */
371+ return (char * )last_backslash ;
372+ if (!last_backslash ) /* Forward slash */
373+ return (char * )last_slash ;
374+ return (last_backslash > last_slash ) ? (char * )last_backslash : (char * )last_slash ;
360375}
361376
362377/**
@@ -369,9 +384,7 @@ char *find_last_slash(const char *str)
369384 **/
370385size_t fill_pathname_slash (char * s , size_t len )
371386{
372- const char * slash = strrchr (s , '/' );
373- const char * backslash = strrchr (s , '\\' );
374- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
387+ char * last_slash = find_last_slash (s );
375388 if (!last_slash )
376389 return strlcat (s , PATH_DEFAULT_SLASH (), len );
377390 len = strlen (s );
@@ -460,33 +473,26 @@ size_t fill_pathname_basedir(char *s, const char *in_path, size_t len)
460473 **/
461474size_t fill_pathname_parent_dir_name (char * s , const char * in_dir , size_t len )
462475{
463- size_t _len = 0 ;
464- char * tmp = strdup (in_dir );
465- const char * slash = strrchr (tmp , '/' );
466- const char * backslash = strrchr (tmp , '\\' );
467- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
476+ size_t _len = 0 ;
477+ char * tmp = strdup (in_dir );
478+ char * last_slash = find_last_slash (tmp );
468479
469480 if (last_slash && last_slash [1 ] == 0 )
470481 {
471- * last_slash = '\0' ;
472- slash = strrchr (tmp , '/' );
473- backslash = strrchr (tmp , '\\' );
474- last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
482+ * last_slash = '\0' ;
483+ last_slash = find_last_slash (tmp );
475484 }
476485
477486 /* Cut the last part of the string (the filename) after the slash,
478487 leaving the directory name (or nested directory names) only. */
479488 if (last_slash )
480- * last_slash = '\0' ;
489+ * last_slash = '\0' ;
481490
482491 /* Point in_dir to the address of the last slash.
483492 * If in_dir is NULL, it means there was no slash in tmp,
484493 * so use tmp as-is. */
485- slash = strrchr (tmp , '/' );
486- backslash = strrchr (tmp , '\\' );
487- in_dir = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
488- if (!in_dir )
489- in_dir = tmp ;
494+ if (!(in_dir = find_last_slash (tmp )))
495+ in_dir = tmp ;
490496
491497 if (in_dir && in_dir [1 ])
492498 {
@@ -592,14 +598,10 @@ size_t fill_str_dated_filename(char *s,
592598 **/
593599size_t path_basedir (char * s )
594600{
595- const char * slash ;
596- const char * backslash ;
597601 char * last_slash = NULL ;
598602 if (!s || s [0 ] == '\0' || s [1 ] == '\0' )
599603 return (s && s [0 ] != '\0' ) ? 1 : 0 ;
600- slash = strrchr (s , '/' );
601- backslash = strrchr (s , '\\' );
602- last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
604+ last_slash = find_last_slash (s );
603605 if (last_slash )
604606 {
605607 last_slash [1 ] = '\0' ;
@@ -630,15 +632,10 @@ size_t path_parent_dir(char *s, size_t len)
630632 if (len && PATH_CHAR_IS_SLASH (s [len - 1 ]))
631633 {
632634 char * last_slash ;
633- const char * slash ;
634- const char * backslash ;
635635 bool was_absolute = path_is_absolute (s );
636636
637637 s [len - 1 ] = '\0' ;
638-
639- slash = strrchr (s , '/' );
640- backslash = strrchr (s , '\\' );
641- last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
638+ last_slash = find_last_slash (s );
642639
643640 if (was_absolute && !last_slash )
644641 {
@@ -667,9 +664,7 @@ const char *path_basename(const char *path)
667664 /* We cut either at the first compression-related hash,
668665 * or we cut at the last slash */
669666 const char * ptr = NULL ;
670- const char * slash = strrchr (path , '/' );
671- const char * backslash = strrchr (path , '\\' );
672- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
667+ char * last_slash = find_last_slash (path );
673668 return ((ptr = path_get_archive_delim (path )) || (ptr = last_slash ))
674669 ? (ptr + 1 ) : path ;
675670}
@@ -687,9 +682,7 @@ const char *path_basename(const char *path)
687682const char * path_basename_nocompression (const char * path )
688683{
689684 /* We cut at the last slash */
690- const char * slash = strrchr (path , '/' );
691- const char * backslash = strrchr (path , '\\' );
692- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
685+ char * last_slash = find_last_slash (path );
693686 return (last_slash ) ? (last_slash + 1 ) : path ;
694687}
695688
@@ -999,9 +992,7 @@ size_t fill_pathname_join_special(char *s,
999992
1000993 if (* s )
1001994 {
1002- const char * slash = strrchr (s , '/' );
1003- const char * backslash = strrchr (s , '\\' );
1004- char * last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
995+ char * last_slash = find_last_slash (s );
1005996 if (last_slash )
1006997 {
1007998 /* Try to preserve slash type. */
@@ -1327,8 +1318,6 @@ size_t fill_pathname_abbreviated_or_relative(char *s,
13271318 **/
13281319void path_basedir_wrapper (char * s )
13291320{
1330- const char * slash ;
1331- const char * backslash ;
13321321 char * last_slash = NULL ;
13331322 if (!s || s [0 ] == '\0' || s [1 ] == '\0' )
13341323 return ;
@@ -1337,9 +1326,7 @@ void path_basedir_wrapper(char *s)
13371326 if ((last_slash = (char * )path_get_archive_delim (s )))
13381327 * last_slash = '\0' ;
13391328#endif
1340- slash = strrchr (s , '/' );
1341- backslash = strrchr (s , '\\' );
1342- last_slash = (!slash || (backslash > slash )) ? (char * )backslash : (char * )slash ;
1329+ last_slash = find_last_slash (s );
13431330 if (last_slash )
13441331 last_slash [1 ] = '\0' ;
13451332 else
0 commit comments