work on docs
[pspp] / src / libpspp / string-array.c
index a22ade6e10880e28fb47bbca5010ec63a3fa7737..d162593b2cfb4102dd30a959cb1fc306276f0241 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 
 #include "libpspp/array.h"
+#include "libpspp/i18n.h"
 #include "libpspp/str.h"
 
 #include "gl/xalloc.h"
@@ -234,6 +235,55 @@ string_array_sort (struct string_array *sa)
   qsort (sa->strings, sa->n, sizeof *sa->strings, compare_strings);
 }
 
+/* Removes all but one of any series of adjacent duplicate strings in SA. */
+void
+string_array_uniq (struct string_array *sa)
+{
+  if (!sa->n)
+    return;
+
+  size_t n = 1;
+  for (size_t i = 1; i < sa->n; i++)
+    {
+      char *s = sa->strings[i];
+      if (strcmp (sa->strings[n - 1], s))
+        sa->strings[n++] = s;
+      else
+        free (s);
+    }
+  sa->n = n;
+}
+
+/* Returns true if A and B contain the same strings in the same order,
+   false otherwise. */
+bool
+string_array_equal (const struct string_array *a,
+                    const struct string_array *b)
+{
+  if (a->n != b->n)
+    return false;
+
+  for (size_t i = 0; i < a->n; i++)
+    if (strcmp (a->strings[i], b->strings[i]))
+      return false;
+  return true;
+}
+
+/* Returns true if A and B contain the same strings in the same order,
+   false otherwise. */
+bool
+string_array_equal_case (const struct string_array *a,
+                         const struct string_array *b)
+{
+  if (a->n != b->n)
+    return false;
+
+  for (size_t i = 0; i < a->n; i++)
+    if (utf8_strcasecmp (a->strings[i], b->strings[i]))
+      return false;
+  return true;
+}
+
 /* Divides STRING into tokens at DELIMITERS and adds each token to SA. */
 void
 string_array_parse (struct string_array *sa, struct substring string,