Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:39099 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 51669 invoked from network); 19 Jul 2008 12:56:02 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 19 Jul 2008 12:56:02 -0000 Authentication-Results: pb1.pair.com smtp.mail=martin.jansen@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=martin.jansen@gmail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain gmail.com designates 74.125.46.29 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: martin.jansen@gmail.com X-Host-Fingerprint: 74.125.46.29 yw-out-2324.google.com Received: from [74.125.46.29] ([74.125.46.29:27077] helo=yw-out-2324.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id CF/5A-13864-064E1884 for ; Sat, 19 Jul 2008 08:56:01 -0400 Received: by yw-out-2324.google.com with SMTP id 5so218001ywb.83 for ; Sat, 19 Jul 2008 05:55:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:sender :to:subject:mime-version:content-type:x-google-sender-auth; bh=Z/p3aZB4p88D2ZC6hg/5FWMZgKsCgtQcyRTqO0q1Og4=; b=nDZbdVhONHRmXNR6CVfZ6XI6t83EWA/0CgLB2/0AbkNv+mFfwyXCyMk87Bah/G7U/y r1ePep9wWwxkCASWn2n/9dKReqk0mwu69TxweIeCJ5TIbWHFZ/b2TYB2MYvQTy6XYxZ/ xJc4YBp5QMQuiU01nqltGyPNbFKK/qPC3fDrM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:sender:to:subject:mime-version:content-type :x-google-sender-auth; b=lnKoM4eoLULEcr0gVVO1CML5aW0HgiBY7wHnKZSuX71pLzoCcVt4DZJeHQRydAxpCo 8rsWjo9LHFYCFaij2IJ2o9MmiykudMrMzZo48o+PftSOihhrg8YJQD1qBAElixFJ74F9 1Dm/0K3wDlY5WR3I40oAIXYv6sUYYuHBvEEw0= Received: by 10.150.12.3 with SMTP id 3mr1385291ybl.17.1216472157477; Sat, 19 Jul 2008 05:55:57 -0700 (PDT) Received: by 10.150.96.1 with HTTP; Sat, 19 Jul 2008 05:55:57 -0700 (PDT) Message-ID: Date: Sat, 19 Jul 2008 14:55:57 +0200 Sender: martin.jansen@gmail.com To: internals MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_20819_4590833.1216472157494" X-Google-Sender-Auth: 7906f68a1ee00a26 Subject: New string functions: str_startswith() and str_endswith() From: martin@divbyzero.net ("Martin Jansen") ------=_Part_20819_4590833.1216472157494 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Attached you'll find a patch against PHP_5_3 that implements two new string functions: str_startswith(haystack, needle [, case_sensitivity]) checks if haystack starts with needle. The check is performed case-insensitively, but this can be overridden by passing TRUE as the value for the third parameter. The second function str_endswith(haystack, needle [, case_sensitivity]) checks if haystack ends with needle and has the same semantics regarding case-sensitivity. I admit that both functions can be easily implemented in userland with already existing functions. At the same time I like them because they make the common tasks of prefix and suffix checks easy and convenient. I won't mind if you guys don't like the idea (I did it mainly for personal entertainment and learning about PHP internals), but if you are interested I'll happily provide a patch for HEAD, too. Also since this is my first foray into PHP internals, comments and corrections are more then appreciated. Martin ------=_Part_20819_4590833.1216472157494 Content-Type: text/x-diff; name=php5.3-strings.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fiu839q90 Content-Disposition: attachment; filename=php5.3-strings.patch SW5kZXg6IGV4dC9zdGFuZGFyZC9iYXNpY19mdW5jdGlvbnMuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl OiAvcmVwb3NpdG9yeS9waHAtc3JjL2V4dC9zdGFuZGFyZC9iYXNpY19mdW5jdGlvbnMuYyx2CnJl dHJpZXZpbmcgcmV2aXNpb24gMS43MjUuMi4zMS4yLjY0LjIuMzcKZGlmZiAtdSAtcjEuNzI1LjIu MzEuMi42NC4yLjM3IGJhc2ljX2Z1bmN0aW9ucy5jCi0tLSBleHQvc3RhbmRhcmQvYmFzaWNfZnVu Y3Rpb25zLmMJMTcgSnVsIDIwMDggMTk6Mjk6MzQgLTAwMDAJMS43MjUuMi4zMS4yLjY0LjIuMzcK KysrIGV4dC9zdGFuZGFyZC9iYXNpY19mdW5jdGlvbnMuYwkxOSBKdWwgMjAwOCAxMjozMzoxMiAt MDAwMApAQCAtMjgyNyw2ICsyODI3LDE4IEBACiAJWkVORF9BUkdfSU5GTygwLCBsZW5ndGgpCiAJ WkVORF9BUkdfSU5GTygwLCBjYXNlX3NlbnNpdGl2aXR5KQogWkVORF9FTkRfQVJHX0lORk8oKQor CitzdGF0aWMKK1pFTkRfQkVHSU5fQVJHX0lORk9fRVgoYXJnaW5mb19zdHJfc3RhcnRzd2l0aCwg MCwgMCwgMikKKwlaRU5EX0FSR19JTkZPKDAsIGhheXN0YWNrKQorCVpFTkRfQVJHX0lORk8oMCwg bmVlZGxlKQorWkVORF9FTkRfQVJHX0lORk8oKQorCitzdGF0aWMKK1pFTkRfQkVHSU5fQVJHX0lO Rk9fRVgoYXJnaW5mb19zdHJfZW5kc3dpdGgsIDAsIDAsIDIpCisgICAgWkVORF9BUkdfSU5GTygw LCBoYXlzdGFjaykKKyAgICBaRU5EX0FSR19JTkZPKDAsIG5lZWRsZSkKK1pFTkRfRU5EX0FSR19J TkZPKCkKIC8qIH19fSAqLwogLyoge3t7IHN5c2xvZy5jICovCiAjaWZkZWYgSEFWRV9TWVNMT0df SApAQCAtMzE0Niw2ICszMTU4LDggQEAKIAlQSFBfRkUoc3RyX3NwbGl0LAkJCQkJCQkJCQkJCQkJ YXJnaW5mb19zdHJfc3BsaXQpCiAJUEhQX0ZFKHN0cnBicmssCQkJCQkJCQkJCQkJCQkJYXJnaW5m b19zdHJwYnJrKQogCVBIUF9GRShzdWJzdHJfY29tcGFyZSwJCQkJCQkJCQkJCQkJYXJnaW5mb19z dWJzdHJfY29tcGFyZSkKKwlQSFBfRkUoc3RyX3N0YXJ0c3dpdGgsCQkJCQkJCQkJCQkJCWFyZ2lu Zm9fc3RyX3N0YXJ0c3dpdGgpCisJUEhQX0ZFKHN0cl9lbmRzd2l0aCwJCQkJCQkJCQkJCQkJYXJn aW5mb19zdHJfZW5kc3dpdGgpCiAKICNpZmRlZiBIQVZFX1NUUkNPTEwKIAlQSFBfRkUoc3RyY29s bCwJCQkJCQkJCQkJCQkJCQlhcmdpbmZvX3N0cmNvbGwpCkluZGV4OiBleHQvc3RhbmRhcmQvcGhw X3N0cmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L3BocC1zcmMvZXh0L3N0 YW5kYXJkL3BocF9zdHJpbmcuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS44Ny4yLjIuMi4zLjIu MgpkaWZmIC11IC1yMS44Ny4yLjIuMi4zLjIuMiBwaHBfc3RyaW5nLmgKLS0tIGV4dC9zdGFuZGFy ZC9waHBfc3RyaW5nLmgJMTkgSmFuIDIwMDggMTk6Mjc6MjEgLTAwMDAJMS44Ny4yLjIuMi4zLjIu MgorKysgZXh0L3N0YW5kYXJkL3BocF9zdHJpbmcuaAkxOSBKdWwgMjAwOCAxMjozMzoxMiAtMDAw MApAQCAtOTEsNiArOTEsOCBAQAogUEhQX0ZVTkNUSU9OKHN0cl9zcGxpdCk7CiBQSFBfRlVOQ1RJ T04oc3RycGJyayk7CiBQSFBfRlVOQ1RJT04oc3Vic3RyX2NvbXBhcmUpOworUEhQX0ZVTkNUSU9O KHN0cl9zdGFydHN3aXRoKTsKK1BIUF9GVU5DVElPTihzdHJfZW5kc3dpdGgpOwogI2lmZGVmIEhB VkVfU1RSQ09MTAogUEhQX0ZVTkNUSU9OKHN0cmNvbGwpOwogI2VuZGlmCkluZGV4OiBleHQvc3Rh bmRhcmQvc3RyaW5nLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvcGhwLXNyYy9l eHQvc3RhbmRhcmQvc3RyaW5nLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNDQ1LjIuMTQuMi42 OS4yLjMxCmRpZmYgLXUgLXIxLjQ0NS4yLjE0LjIuNjkuMi4zMSBzdHJpbmcuYwotLS0gZXh0L3N0 YW5kYXJkL3N0cmluZy5jCTE1IEp1bCAyMDA4IDE0OjQ2OjExIC0wMDAwCTEuNDQ1LjIuMTQuMi42 OS4yLjMxCisrKyBleHQvc3RhbmRhcmQvc3RyaW5nLmMJMTkgSnVsIDIwMDggMTI6MzM6MTMgLTAw MDAKQEAgLTUxNzAsNiArNTE3MCw1OCBAQAogfQogLyogfX19ICovCiAKKy8qIHt7eyBwcm90byBi b29sIHN0cl9zdGFydHN3aXRoKHN0cmluZyBoYXlzdGFjaywgc3RyaW5nIG5lZWRsZSBbLCBib29s IGNhc2Vfc2Vuc2l0aXZpdHldKQorICAgQmluYXJ5IHNhZmUgb3B0aW9uYWxseSBjYXNlIHNlbnNp dGl2ZSBjaGVjayBpZiBoYXlzdGFjayBzdGFydHMgd2l0aCBuZWVkbGUgKi8KK1BIUF9GVU5DVElP TihzdHJfc3RhcnRzd2l0aCkKK3sKKwljaGFyICpuZWVkbGUsICpoYXlzdGFjazsKKwlpbnQgbmVl ZGxlX2xlbiwgaGF5c3RhY2tfbGVuLCByZXR2YWw7CisJemVuZF9ib29sIGNzID0gMDsKKworCWlm ICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpIFRTUk1MU19DQywgInNzfGIi LCAmaGF5c3RhY2ssICZoYXlzdGFja19sZW4sICZuZWVkbGUsICZuZWVkbGVfbGVuLCAmY3MpID09 IEZBSUxVUkUpIHsKKwkJUkVUVVJOX0ZBTFNFOworCX0KKworCWlmIChuZWVkbGVfbGVuID4gaGF5 c3RhY2tfbGVuKSB7CisJCVJFVFVSTl9GQUxTRTsKKwl9CisKKwlpZiAoY3MpIHsKKwkJcmV0dmFs ID0gemVuZF9iaW5hcnlfc3RybmNtcChuZWVkbGUsIG5lZWRsZV9sZW4sIGhheXN0YWNrLCBoYXlz dGFja19sZW4sIG5lZWRsZV9sZW4pOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHplbmRfYmluYXJ5 X3N0cm5jYXNlY21wKG5lZWRsZSwgbmVlZGxlX2xlbiwgaGF5c3RhY2ssIGhheXN0YWNrX2xlbiwg bmVlZGxlX2xlbik7CisJfQorCisJUkVUVVJOX0JPT0wocmV0dmFsID09IDApOworfQorLyogfX19 ICovCisKKy8qIHt7eyBwcm90byBib29sIHN0cl9lbmRzd2l0aChzdHJpbmcgaGF5c3RhY2ssIHN0 cmluZyBuZWVkbGUgWywgYm9vbCBjYXNlX3NlbnNpdGl2aXR5XSkKKyAgIEJpbmFyeSBzYWZlIG9w dGlvbmFsbHkgY2FzZSBzZW5zaXRpdmUgY2hlY2sgaWYgaGF5c3RhY2sgZW5kcyB3aXRoIG5lZWRs ZSAqLworUEhQX0ZVTkNUSU9OKHN0cl9lbmRzd2l0aCkKK3sKKwljaGFyICpuZWVkbGUsICpoYXlz dGFjazsKKwlpbnQgbmVlZGxlX2xlbiwgaGF5c3RhY2tfbGVuLCByZXR2YWw7CisJemVuZF9ib29s IGNzID0gMDsKKwkKKwlpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSBU U1JNTFNfQ0MsICJzc3xiIiwgJmhheXN0YWNrLCAmaGF5c3RhY2tfbGVuLCAmbmVlZGxlLCAmbmVl ZGxlX2xlbiwgJmNzKSA9PSBGQUlMVVJFKSB7CisJCVJFVFVSTl9GQUxTRTsKKwl9CisKKwlpZiAo bmVlZGxlX2xlbiA+IGhheXN0YWNrX2xlbikgeworCQlSRVRVUk5fRkFMU0U7CisJfQorCisJaWYg KGNzKSB7CisJCXJldHZhbCA9IHplbmRfYmluYXJ5X3N0cm5jbXAobmVlZGxlLCBuZWVkbGVfbGVu LCBoYXlzdGFjayArIChoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuKSwgbmVlZGxlX2xlbiwgbmVl ZGxlX2xlbik7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gemVuZF9iaW5hcnlfc3RybmNhc2VjbXAo bmVlZGxlLCBuZWVkbGVfbGVuLCBoYXlzdGFjayArIChoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVu KSwgbmVlZGxlX2xlbiwgbmVlZGxlX2xlbik7CQkgCisJfQorCisJUkVUVVJOX0JPT0wocmV0dmFs ID09IDApOworfQorLyogfX19ICovCisKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiB0YWIt d2lkdGg6IDQKSW5kZXg6IGV4dC9zdGFuZGFyZC90ZXN0cy9zdHJpbmdzL3N0cl9lbmRzd2l0aC5w aHB0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KUkNTIGZpbGU6IGV4dC9zdGFuZGFyZC90ZXN0cy9zdHJpbmdzL3N0cl9l bmRzd2l0aC5waHB0CmRpZmYgLU4gZXh0L3N0YW5kYXJkL3Rlc3RzL3N0cmluZ3Mvc3RyX2VuZHN3 aXRoLnBocHQKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBleHQv c3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9zdHJfZW5kc3dpdGgucGhwdAkxOSBKdWwgMjAwOCAxMjoz MzoxNCAtMDAwMApAQCAtMCwwICsxLDI3IEBACistLVRFU1QtLQorc3RyX2VuZHN3aXRoKCkgZnVu Y3Rpb24KKy0tRklMRS0tCis8P3BocAordmFyX2R1bXAoc3RyX2VuZHN3aXRoKCJhIiwgImEiKSk7 Cit2YXJfZHVtcChzdHJfZW5kc3dpdGgoIiIsICIiKSk7Cit2YXJfZHVtcChzdHJfZW5kc3dpdGgo ImFiIiwgImIiKSk7Cit2YXJfZHVtcChzdHJfZW5kc3dpdGgoImEiLCAiYWIiKSk7Cit2YXJfZHVt cChzdHJfZW5kc3dpdGgoLTEsIDEpKTsKK3Zhcl9kdW1wKHN0cl9lbmRzd2l0aCgiYWJjIiwgImFi YyIpKTsKK3Zhcl9kdW1wKHN0cl9lbmRzd2l0aCgiaGVsbG8iLCAibGEiKSk7Cit2YXJfZHVtcChz dHJfZW5kc3dpdGgoIkFCQ2QiLCAiRCIpKTsKK3Zhcl9kdW1wKHN0cl9lbmRzd2l0aCgiQUJDZCIs ICJEIiwgdHJ1ZSkpOwordmFyX2R1bXAoc3RyX2VuZHN3aXRoKCJIZWxs9iIsICL2IikpOwordmFy X2R1bXAoc3RyX2VuZHN3aXRoKCJhYmMiLCAiIikpOworLS1FWFBFQ1QtLQorYm9vbCh0cnVlKQor Ym9vbCh0cnVlKQorYm9vbCh0cnVlKQorYm9vbChmYWxzZSkKK2Jvb2wodHJ1ZSkKK2Jvb2wodHJ1 ZSkKK2Jvb2woZmFsc2UpCitib29sKHRydWUpCitib29sKGZhbHNlKQorYm9vbCh0cnVlKQorYm9v bCh0cnVlKQpJbmRleDogZXh0L3N0YW5kYXJkL3Rlc3RzL3N0cmluZ3Mvc3RyX3N0YXJ0c3dpdGgu cGhwdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBleHQvc3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9zdHJf c3RhcnRzd2l0aC5waHB0CmRpZmYgLU4gZXh0L3N0YW5kYXJkL3Rlc3RzL3N0cmluZ3Mvc3RyX3N0 YXJ0c3dpdGgucGhwdAotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysr IGV4dC9zdGFuZGFyZC90ZXN0cy9zdHJpbmdzL3N0cl9zdGFydHN3aXRoLnBocHQJMTkgSnVsIDIw MDggMTI6MzM6MTQgLTAwMDAKQEAgLTAsMCArMSwyNyBAQAorLS1URVNULS0KK3N0cl9zdGFydHN3 aXRoKCkgZnVuY3Rpb24KKy0tRklMRS0tCis8P3BocAordmFyX2R1bXAoc3RyX3N0YXJ0c3dpdGgo ImEiLCAiYSIpKTsKK3Zhcl9kdW1wKHN0cl9zdGFydHN3aXRoKCIiLCAiIikpOwordmFyX2R1bXAo c3RyX3N0YXJ0c3dpdGgoImFiIiwgImIiKSk7Cit2YXJfZHVtcChzdHJfc3RhcnRzd2l0aCgiYSIs ICJhYiIpKTsKK3Zhcl9kdW1wKHN0cl9zdGFydHN3aXRoKC0xLCAxKSk7Cit2YXJfZHVtcChzdHJf c3RhcnRzd2l0aCgiYSIsIG51bGwpKTsKK3Zhcl9kdW1wKHN0cl9zdGFydHN3aXRoKCJhYmMiLCAi YWJjIikpOwordmFyX2R1bXAoc3RyX3N0YXJ0c3dpdGgoIsQiLCAixCIpKTsKK3Zhcl9kdW1wKHN0 cl9zdGFydHN3aXRoKCJBIiwgImEiKSk7Cit2YXJfZHVtcChzdHJfc3RhcnRzd2l0aCgiQSIsICJh IiwgdHJ1ZSkpOwordmFyX2R1bXAoc3RyX3N0YXJ0c3dpdGgoImEiLCAiQSIpKTsKKy0tRVhQRUNU LS0KK2Jvb2wodHJ1ZSkKK2Jvb2wodHJ1ZSkKK2Jvb2woZmFsc2UpCitib29sKGZhbHNlKQorYm9v bChmYWxzZSkKK2Jvb2wodHJ1ZSkKK2Jvb2wodHJ1ZSkKK2Jvb2wodHJ1ZSkKK2Jvb2wodHJ1ZSkK K2Jvb2woZmFsc2UpCitib29sKHRydWUpCg== ------=_Part_20819_4590833.1216472157494--