aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plugin_string.c65
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;
}