]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[script] Add SubString function to the script string library
authorRichard Maw <mawr8@cs.man.ac.uk>
Wed, 10 Mar 2010 20:28:09 +0000 (20:28 +0000)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Wed, 10 Mar 2010 20:28:09 +0000 (20:28 +0000)
Adds the SubString function which returns a string segment. The two paramiters
are the sub-string start and end indicies. Negative start and end values return
a NULL, as does start index being beyond the end index. Start being beyond the
end of the string returns an empty string.

src/plugins/splash/script/script-lib-string.c

index 833a37713de9705e0cea7dacd383270de10e0752..dbd63fe7b18d640cacb10ed06d7a6e8d9302c4e5 100644 (file)
@@ -25,6 +25,7 @@
 #include "script-execute.h"
 #include "script-object.h"
 #include "script-lib-string.h"
+#include "ply-utils.h"
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -62,6 +63,38 @@ static script_return_t script_lib_string_char_at (script_state_t *state,
   return script_return_obj(script_obj_new_string (charstring));
 }
 
+static script_return_t script_lib_string_sub_string (script_state_t *state,
+                                                     void           *user_data)
+{
+  char *text = script_obj_as_string (state->this);
+  int start = script_obj_hash_get_number (state->local, "start");
+  int end = script_obj_hash_get_number (state->local, "end");
+  int text_count;
+  char* substring;
+  script_obj_t *substring_obj;
+
+  if (!text || start < 0 || end < start)
+    {
+      free (text);
+      return script_return_obj_null ();
+    }
+
+  for (text_count = 0; text_count < start; text_count++)
+    {
+      if (text[text_count] == '\0')
+        {
+          free (text);
+          return script_return_obj(script_obj_new_string (""));
+        }
+    }
+
+  substring = strndup(&text[text_count], end - start);
+  substring_obj = script_obj_new_string (substring);
+  free (substring);
+  free (text);
+  return script_return_obj(substring_obj);
+}
+
 script_lib_string_data_t *script_lib_string_setup (script_state_t *state)
 {
   script_lib_string_data_t *data = malloc (sizeof (script_lib_string_data_t));
@@ -73,6 +106,13 @@ script_lib_string_data_t *script_lib_string_setup (script_state_t *state)
                               NULL,
                               "index",
                               NULL);
+  script_add_native_function (string_hash,
+                              "SubString",
+                              script_lib_string_sub_string,
+                              NULL,
+                              "start",
+                              "end",
+                              NULL);
   script_obj_unref (string_hash);
   data->script_main_op = script_parse_string (script_lib_string_string, "script-lib-string.script");
   script_return_t ret = script_execute (state, data->script_main_op);