]> granicus.if.org Git - php/commitdiff
(PHP substr_replace) New function.
authorAndrei Zmievski <andrei@php.net>
Tue, 16 Nov 1999 22:44:13 +0000 (22:44 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 16 Nov 1999 22:44:13 +0000 (22:44 +0000)
@- Added substr_replace() function. (Andrei)

ext/standard/basic_functions.c
ext/standard/php3_string.h
ext/standard/string.c

index 7e3687109fe14c66f4b9c8110b0cc2491c8d287d..1166f224b1895b6839b6d6a6b1b4172f8200365f 100644 (file)
@@ -134,6 +134,7 @@ function_entry basic_functions[] = {
        PHP_FE(stristr,                                                                 NULL)
        PHP_FE(strrchr,                                                                 NULL)
        PHP_FE(substr,                                                                  NULL)
+       PHP_FE(substr_replace,                                                  NULL)
        PHP_FE(quotemeta,                                                               NULL)
        PHP_FE(ucfirst,                                                                 NULL)
        PHP_FE(ucwords,                                                                 NULL)
index 6d39de002eea20eef6ede94693b64c3b5d33e103..d23dbb46f83d45c09ece121c0d766f51bdc8ada9 100644 (file)
@@ -85,6 +85,7 @@ PHP_FUNCTION(bin2hex);
 PHP_FUNCTION(similar_text);
 PHP_FUNCTION(strip_tags);
 PHP_FUNCTION(str_repeat);
+PHP_FUNCTION(substr_replace);
 
 extern PHPAPI char *php_strtoupper(char *s);
 extern PHPAPI char *php_strtolower(char *s);
index 37e84725950df2f497db91faf34d5c0dfd6eb018..1c6e57df5d62771b694ae58366432ad36a901253 100644 (file)
@@ -846,6 +846,88 @@ PHP_FUNCTION(substr)
 }
 /* }}} */
 
+
+/* {{{ proto string substr_replace(string str, int start [, int length [, string repl]])
+   Replace part of a string with another string */
+PHP_FUNCTION(substr_replace)
+{
+    zval**      string;
+    zval**      from;
+    zval**      len;
+    zval**      repl;
+    char*       result;
+       int         result_len;
+    int         argc;
+    int         l;
+    int         f;
+       
+       argc = ARG_COUNT(ht);
+
+       if ((argc == 2 && getParametersEx(2, &string, &from) == FAILURE) ||
+               (argc == 3 && getParametersEx(3, &string, &from, &len) == FAILURE) ||
+               (argc == 4 && getParametersEx(4, &string, &from, &len, &repl) == FAILURE) ||
+               argc < 2 || argc > 4) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_string_ex(string);
+       convert_to_long_ex(from);
+       f = (*from)->value.lval;
+
+       if (argc == 2) {
+               l = (*string)->value.str.len;
+       } else {
+               convert_to_long_ex(len);
+               l = (*len)->value.lval;
+               
+               if (argc == 4)
+                       convert_to_string_ex(repl);
+       }
+
+       /* if "from" position is negative, count start position from the end
+        * of the string
+        */
+       if (f < 0) {
+               f = (*string)->value.str.len + f;
+               if (f < 0) {
+                       f = 0;
+               }
+       }
+
+       /* if "length" position is negative, set it to the length
+        * needed to stop that many chars from the end of the string
+        */
+       if (l < 0) {
+               l = ((*string)->value.str.len - f) + l;
+               if (l < 0) {
+                       l = 0;
+               }
+       }
+
+       if (f >= (int)(*string)->value.str.len) {
+               RETURN_STRINGL((*string)->value.str.val, (*string)->value.str.len, 1);
+       }
+
+       if((f+l) > (int)(*string)->value.str.len) {
+               l = (int)(*string)->value.str.len - f;
+       }
+
+       if (argc == 4)
+               result_len = (*string)->value.str.len - l + (*repl)->value.str.len;
+       else
+               result_len = (*string)->value.str.len - l;
+       result = (char *)ecalloc(result_len + 1, sizeof(char *));
+
+       strncat(result, (*string)->value.str.val, f);
+       if (argc == 4)
+               strcat(result, (*repl)->value.str.val);
+       strcat(result, (*string)->value.str.val + f + l);
+
+       RETVAL_STRING(result, 0);
+}
+/* }}} */
+
+
 /* {{{ proto string quotemeta(string str)
    Quote meta characters */
 PHP_FUNCTION(quotemeta)