Skip to content

Commit d50a126

Browse files
committed
Clean up naming in basename() implementation
1 parent 65934d3 commit d50a126

File tree

1 file changed

+24
-30
lines changed

1 file changed

+24
-30
lines changed

ext/standard/string.c

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,19 +1504,15 @@ PHP_FUNCTION(strtolower)
15041504

15051505
/* {{{ php_basename
15061506
*/
1507-
PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t sufflen)
1507+
PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t suffix_len)
15081508
{
1509-
char *c;
1510-
const char *comp, *cend;
1511-
size_t inc_len, cnt;
1512-
int state;
1513-
zend_string *ret;
1514-
1515-
comp = cend = c = (char*)s;
1516-
cnt = len;
1517-
state = 0;
1518-
while (cnt > 0) {
1519-
inc_len = (*c == '\0' ? 1 : php_mblen(c, cnt));
1509+
/* State 0 is directly after a directory separator (or at the start of the string).
1510+
* State 1 is everything else. */
1511+
int state = 0;
1512+
const char *basename_start = s;
1513+
const char *basename_end = s;
1514+
while (len > 0) {
1515+
int inc_len = (*s == '\0' ? 1 : php_mblen(s, len));
15201516

15211517
switch (inc_len) {
15221518
case -2:
@@ -1528,58 +1524,56 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t
15281524
goto quit_loop;
15291525
case 1:
15301526
#if defined(PHP_WIN32)
1531-
if (*c == '/' || *c == '\\') {
1527+
if (*s == '/' || *s == '\\') {
15321528
#else
1533-
if (*c == '/') {
1529+
if (*s == '/') {
15341530
#endif
15351531
if (state == 1) {
15361532
state = 0;
1537-
cend = c;
1533+
basename_end = s;
15381534
}
15391535
#if defined(PHP_WIN32)
15401536
/* Catch relative paths in c:file.txt style. They're not to confuse
15411537
with the NTFS streams. This part ensures also, that no drive
15421538
letter traversing happens. */
1543-
} else if ((*c == ':' && (c - comp == 1))) {
1539+
} else if ((*s == ':' && (s - basename_start == 1))) {
15441540
if (state == 0) {
1545-
comp = c;
1541+
basename_start = s;
15461542
state = 1;
15471543
} else {
1548-
cend = c;
1544+
basename_end = s;
15491545
state = 0;
15501546
}
15511547
#endif
15521548
} else {
15531549
if (state == 0) {
1554-
comp = c;
1550+
basename_start = s;
15551551
state = 1;
15561552
}
15571553
}
15581554
break;
15591555
default:
15601556
if (state == 0) {
1561-
comp = c;
1557+
basename_start = s;
15621558
state = 1;
15631559
}
15641560
break;
15651561
}
1566-
c += inc_len;
1567-
cnt -= inc_len;
1562+
s += inc_len;
1563+
len -= inc_len;
15681564
}
15691565

15701566
quit_loop:
15711567
if (state == 1) {
1572-
cend = c;
1573-
}
1574-
if (suffix != NULL && sufflen < (size_t)(cend - comp) &&
1575-
memcmp(cend - sufflen, suffix, sufflen) == 0) {
1576-
cend -= sufflen;
1568+
basename_end = s;
15771569
}
15781570

1579-
len = cend - comp;
1571+
if (suffix != NULL && suffix_len < (size_t)(basename_end - basename_start) &&
1572+
memcmp(basename_end - suffix_len, suffix, suffix_len) == 0) {
1573+
basename_end -= suffix_len;
1574+
}
15801575

1581-
ret = zend_string_init(comp, len, 0);
1582-
return ret;
1576+
return zend_string_init(basename_start, basename_end - basename_start, 0);
15831577
}
15841578
/* }}} */
15851579

0 commit comments

Comments
 (0)