cvs: php4 /ext/standard php_string.h string.c
| From: | Jeroen van Wolffelaar | Date: | Fri, 03 Aug 2001 22:12:46 +0000 |
| Subject: | cvs: php4 /ext/standard php_string.h string.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-6524@lists.php.net to get a copy of this message | ||
jeroen Fri Aug 3 18:12:46 2001 EDT
Modified files:
/php4/ext/standard string.c php_string.h
Log:
- Added new parameter to [l|r]trim, to specify _what_ to trim
@- Added optional second parameter to trim, chop and ltrim. You can
@ now specify which characters to trim (jeroen)
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.213 php4/ext/standard/string.c:1.214
--- php4/ext/standard/string.c:1.213 Fri Aug 3 05:50:38 2001
+++ php4/ext/standard/string.c Fri Aug 3 18:12:40 2001
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.213 2001/08/03 09:50:38 sas Exp $ */
+/* $Id: string.c,v 1.214 2001/08/03 22:12:40 jeroen Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -403,23 +403,62 @@
/* }}} */
#endif
+/* {{{ php_charmask
+ * Fills a 256-byte bytemask with input. You can specify a range like 'a..z',
+ * it needs to be incrementing.
+ */
+void php_charmask(unsigned char *input, int len, char *mask)
+{
+ unsigned char *end;
+ unsigned char c;
+
+ memset(mask, 0, 256);
+ for (end=input+len; input<end; input++) {
+ c=*input;
+ if (input+3<end && *(input+1) == '.' && *(input+2) == '.'
+ && *(input+3) >= c) {
+ memset(mask+c, 1, *(input+3) - c + 1);
+ input+=3;
+ } else
+ mask[c]=1;
+ }
+}
+/* }}} */
+
/* {{{ php_trim
+ Compatibility function, ports old-API to new one. (DEPRECATED)
+*/
+void php_trim(zval *str, zval *return_value, int mode)
+{
+ php_trim2(str, NULL, return_value, mode);
+}
+/* }}} */
+
+/* {{{ php_trim2
*/
-PHPAPI void php_trim(zval *str, zval * return_value, int mode)
+PHPAPI void php_trim2(zval *str, zval *what, zval *return_value, int mode)
/* mode 1 : trim left
mode 2 : trim right
mode 3 : trim left and right
+
+ what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0')
*/
{
register int i;
int len = str->value.str.len;
int trimmed = 0;
char *c = str->value.str.val;
+ char mask[256];
+
+ if (what) {
+ php_charmask(what->value.str.val, what->value.str.len, mask);
+ } else {
+ php_charmask(" \n\r\t\v\0", 6, mask);
+ }
if (mode & 1) {
for (i = 0; i < len; i++) {
- if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
- c[i] == '\t' || c[i] == '\v' || c[i] == '\0') {
+ if (mask[(unsigned char)c[i]]) {
trimmed++;
} else {
break;
@@ -430,8 +469,7 @@
}
if (mode & 2) {
for (i = len - 1; i >= 0; i--) {
- if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
- c[i] == '\t' || c[i] == '\v' || c[i] == '\0') {
+ if (mask[(unsigned char)c[i]]) {
len--;
} else {
break;
@@ -450,18 +488,19 @@
Remove trailing whitespace */
PHP_FUNCTION(chop)
{
- zval **str;
+ zval **str, **what;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
+ if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2)
WRONG_PARAM_COUNT;
- }
+ zend_get_parameters_ex(2, &str, &what);
convert_to_string_ex(str);
+ if (ZEND_NUM_ARGS() == 2)
+ convert_to_string_ex(str);
- if ((*str)->type == IS_STRING) {
- php_trim(*str, return_value, 2);
- return;
- }
- RETURN_FALSE;
+ /* convert_to_string_ex never fails (last line: op->type = IS_STRING),
+ so, not checking for that. */
+
+ php_trim2(*str, ZEND_NUM_ARGS()==2?*what:NULL, return_value, 2);
}
/* }}} */
@@ -469,18 +508,16 @@
Strip whitespace from the beginning and end of a string */
PHP_FUNCTION(trim)
{
- zval **str;
+ zval **str, **what;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
+ if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2)
WRONG_PARAM_COUNT;
- }
+ zend_get_parameters_ex(2, &str, &what);
convert_to_string_ex(str);
+ if (ZEND_NUM_ARGS() == 2)
+ convert_to_string_ex(str);
- if ((*str)->type == IS_STRING) {
- php_trim(*str, return_value, 3);
- return;
- }
- RETURN_FALSE;
+ php_trim2(*str, ZEND_NUM_ARGS()==2?*what:NULL, return_value, 3);
}
/* }}} */
@@ -488,17 +525,16 @@
Strip whitespace from the beginning of a string */
PHP_FUNCTION(ltrim)
{
- zval **str;
+ zval **str, **what;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
+ if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2)
WRONG_PARAM_COUNT;
- }
+ zend_get_parameters_ex(2, &str, &what);
convert_to_string_ex(str);
- if ((*str)->type == IS_STRING) {
- php_trim(*str, return_value, 1);
- return;
- }
- RETURN_FALSE;
+ if (ZEND_NUM_ARGS() == 2)
+ convert_to_string_ex(str);
+
+ php_trim2(*str, ZEND_NUM_ARGS()==2?*what:NULL, return_value, 1);
}
/* }}} */
Index: php4/ext/standard/php_string.h
diff -u php4/ext/standard/php_string.h:1.40 php4/ext/standard/php_string.h:1.41
--- php4/ext/standard/php_string.h:1.40 Fri Jul 20 23:26:31 2001
+++ php4/ext/standard/php_string.h Fri Aug 3 18:12:46 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_string.h,v 1.40 2001/07/21 03:26:31 sas Exp $ */
+/* $Id: php_string.h,v 1.41 2001/08/03 22:12:46 jeroen Exp $ */
/* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
@@ -112,6 +112,7 @@
PHPAPI char *php_str_to_str(char *haystack, int length, char *needle,
int needle_len, char *str, int str_len, int *_new_length);
PHPAPI void php_trim(pval *str, pval *return_value, int mode);
+void php_trim2(zval *str, zval *what, zval *return_value, int mode);
PHPAPI void php_strip_tags(char *rbuf, int len, int state, char *allow, int allow_len);
PHPAPI void php_char_to_str(char *str, uint len, char from, char *to, int to_len, pval *result);