str: New functions ss_starts_with() and ss_find_substring().
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 26 Nov 2018 00:41:44 +0000 (16:41 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 25 Dec 2018 19:36:17 +0000 (11:36 -0800)
These will have their first users in an upcoming commit.

src/libpspp/str.c
src/libpspp/str.h

index 5aa7e41594e9ab989ac7a77dcafe6d8802e49fa8..f31677b929156e01afbe0a5c3f04c6268bdda7f9 100644 (file)
@@ -691,6 +691,14 @@ ss_last (struct substring ss)
   return ss.length > 0 ? (unsigned char) ss.string[ss.length - 1] : EOF;
 }
 
+/* Returns true if SS starts with PREFIX, false otherwise. */
+bool
+ss_starts_with (struct substring ss, struct substring prefix)
+{
+  return (ss.length >= prefix.length
+          && !memcmp (ss.string, prefix.string, prefix.length));
+}
+
 /* Returns true if SS ends with SUFFIX, false otherwise. */
 bool
 ss_ends_with (struct substring ss, struct substring suffix)
@@ -733,6 +741,16 @@ ss_find_byte (struct substring ss, char c)
   return p != NULL ? p - ss.string : SIZE_MAX;
 }
 
+/* Returns the offset in HAYSTACK of the first instance of NEEDLE,
+   or SIZE_MAX if NEEDLE does not occur in HAYSTACK. */
+size_t
+ss_find_substring (struct substring haystack, struct substring needle)
+{
+  const char *p = memmem (haystack.string, haystack.length,
+                          needle.string, needle.length);
+  return p != NULL ? p - haystack.string : SIZE_MAX;
+}
+
 /* Compares A and B and returns a strcmp()-type comparison
    result. */
 int
index dd41ede819a04c27cc15407167f7f4106fa8bbc0..66552a396486133a7642366152f7d98b72151bf1 100644 (file)
@@ -122,10 +122,12 @@ char *ss_end (struct substring);
 int ss_at (struct substring, size_t idx);
 int ss_first (struct substring);
 int ss_last (struct substring);
+bool ss_starts_with (struct substring, struct substring prefix);
 bool ss_ends_with (struct substring, struct substring suffix);
 size_t ss_span (struct substring, struct substring skip_set);
 size_t ss_cspan (struct substring, struct substring stop_set);
 size_t ss_find_byte (struct substring, char);
+size_t ss_find_substring (struct substring, struct substring);
 int ss_compare (struct substring, struct substring);
 int ss_compare_case (struct substring, struct substring);
 int ss_equals (struct substring, struct substring);