#include <string.h>
#include "libpspp/array.h"
+#include "libpspp/i18n.h"
#include "libpspp/str.h"
#include "gl/xalloc.h"
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,
+ struct substring delimiters)
+{
+ size_t save_idx = 0;
+ struct substring token;
+ while (ss_tokenize (string, delimiters, &save_idx, &token))
+ string_array_append_nocopy (sa, ss_xstrdup (token));
+}
+
/* Returns a single string that consists of each of the strings in SA
concatenated, separated from each other with SEPARATOR.