@@ -1504,19 +1504,15 @@ PHP_FUNCTION(strtolower)
1504
1504
1505
1505
/* {{{ php_basename
1506
1506
*/
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 )
1508
1508
{
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 ));
1520
1516
1521
1517
switch (inc_len ) {
1522
1518
case -2 :
@@ -1528,58 +1524,56 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t
1528
1524
goto quit_loop ;
1529
1525
case 1 :
1530
1526
#if defined(PHP_WIN32 )
1531
- if (* c == '/' || * c == '\\' ) {
1527
+ if (* s == '/' || * s == '\\' ) {
1532
1528
#else
1533
- if (* c == '/' ) {
1529
+ if (* s == '/' ) {
1534
1530
#endif
1535
1531
if (state == 1 ) {
1536
1532
state = 0 ;
1537
- cend = c ;
1533
+ basename_end = s ;
1538
1534
}
1539
1535
#if defined(PHP_WIN32 )
1540
1536
/* Catch relative paths in c:file.txt style. They're not to confuse
1541
1537
with the NTFS streams. This part ensures also, that no drive
1542
1538
letter traversing happens. */
1543
- } else if ((* c == ':' && (c - comp == 1 ))) {
1539
+ } else if ((* s == ':' && (s - basename_start == 1 ))) {
1544
1540
if (state == 0 ) {
1545
- comp = c ;
1541
+ basename_start = s ;
1546
1542
state = 1 ;
1547
1543
} else {
1548
- cend = c ;
1544
+ basename_end = s ;
1549
1545
state = 0 ;
1550
1546
}
1551
1547
#endif
1552
1548
} else {
1553
1549
if (state == 0 ) {
1554
- comp = c ;
1550
+ basename_start = s ;
1555
1551
state = 1 ;
1556
1552
}
1557
1553
}
1558
1554
break ;
1559
1555
default :
1560
1556
if (state == 0 ) {
1561
- comp = c ;
1557
+ basename_start = s ;
1562
1558
state = 1 ;
1563
1559
}
1564
1560
break ;
1565
1561
}
1566
- c += inc_len ;
1567
- cnt -= inc_len ;
1562
+ s += inc_len ;
1563
+ len -= inc_len ;
1568
1564
}
1569
1565
1570
1566
quit_loop :
1571
1567
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 ;
1577
1569
}
1578
1570
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
+ }
1580
1575
1581
- ret = zend_string_init (comp , len , 0 );
1582
- return ret ;
1576
+ return zend_string_init (basename_start , basename_end - basename_start , 0 );
1583
1577
}
1584
1578
/* }}} */
1585
1579
0 commit comments