diff options
| -rw-r--r-- | plugin_string.c | 65 | 
1 files changed, 65 insertions, 0 deletions
diff --git a/plugin_string.c b/plugin_string.c index 5877709..c555464 100644 --- a/plugin_string.c +++ b/plugin_string.c @@ -65,12 +65,77 @@ static void my_strupper(RESULT * result, RESULT * arg1)      free(value);  } +static void my_strstr(RESULT * result, RESULT * arg1, RESULT * arg2) +{ +    char *p; +    double value; + +    char *haystack = R2S(arg1); +    char *needle = R2S(arg2); + +    p = strstr(haystack, needle); + +    if (p == NULL) { +	value = -1; +    } else { +	value = p - haystack; +    } + +    SetResult(&result, R_NUMBER, &value); +} + +static void my_substr(RESULT * result, int argc, RESULT * argv[]) +{ +    char *str, *p1, *p2; +    int pos, len; + +    if (argc < 2 || argc > 3) { +	error("substr(): wrong number of parameters"); +	SetResult(&result, R_STRING, ""); +	return; +    } + +    str = strdup(R2S(argv[0])); + +    pos = R2N(argv[1]); +    if (pos < 0) +	pos = 0; + +    if (argc == 3) { +	len = R2N(argv[2]); +	if (len < 0) +	    len = 0; +    } else { +	len = -1; +    } + +    p1 = str; +    while (pos > 0 && *p1 != '\0') { +	p1++; +	pos--; +    } + +    if (len >= 0) { +	p2 = p1; +	while (len > 0 && *p2 != '\0') { +	    p2++; +	    len--; +	} +	*p2 = '\0'; +    } + +    SetResult(&result, R_STRING, p1); +    free(str); +} +  int plugin_init_string(void)  {      /* register some basic string functions */      AddFunction("strlen", 1, my_strlen);      AddFunction("strupper", 1, my_strupper); +    AddFunction("strstr", 2, my_strstr); +    AddFunction("substr", -1, my_substr);      return 0;  }  | 
