summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/lib/util_unistr.c127
2 files changed, 129 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 6171eb5a46..79abdf5f56 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -426,6 +426,8 @@ BOOL load_unix_unicode_map(const char *unix_char_set);
char *unicode_to_unix(char *dst, const smb_ucs2_t *src, size_t dst_len);
char *unicode_to_dos(char *dst, const smb_ucs2_t *src, size_t dst_len);
size_t wstrlen(const smb_ucs2_t *src);
+int wstrcmp(const smb_ucs2_t *s1, const smb_ucs2_t *s2);
+int wstrncmp(const smb_ucs2_t *s1, const smb_ucs2_t *s2, size_t len);
/*The following definitions come from libsmb/clientgen.c */
diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c
index fca9d8bfda..00f6ba4897 100644
--- a/source3/lib/util_unistr.c
+++ b/source3/lib/util_unistr.c
@@ -764,3 +764,130 @@ smb_ucs2_t *safe_wstrcat(smb_ucs2_t *dest, const smb_ucs2_t *src, size_t maxleng
dest[ucs2_dest_len + ucs2_src_len] = 0;
return dest;
}
+
+/*******************************************************************
+ Compare the two strings s1 and s2. len is in ucs2 units.
+********************************************************************/
+
+int wstrcmp(const smb_ucs2_t *s1, const smb_ucs2_t *s2)
+{
+ smb_ucs2_t c1, c2;
+
+ for (;;) {
+ c1 = *s1++;
+ c2 = *s2++;
+
+ if (c1 != c2)
+ return c1 - c2;
+
+ if (c1 == 0)
+ return 0;
+ }
+ return 0;
+}
+
+/*******************************************************************
+ Compare the first n characters of s1 to s2. len is in ucs2 units.
+********************************************************************/
+
+int wstrncmp(const smb_ucs2_t *s1, const smb_ucs2_t *s2, size_t len)
+{
+ smb_ucs2_t c1, c2;
+
+ for (; len != 0; --len) {
+ c1 = *s1++;
+ c2 = *s2++;
+
+ if (c1 != c2)
+ return c1 - c2;
+
+ if (c1 == 0)
+ return 0;
+
+ }
+ return 0;
+}
+
+/*******************************************************************
+ Search string s2 from s1.
+********************************************************************/
+
+smb_ucs2_t *wstrstr(const smb_ucs2_t *s1, const smb_ucs2_t *s2)
+{
+ size_t len = wstrlen(s2);
+
+ if (!*s2)
+ return (smb_ucs2_t *)s1;
+
+ for(;*s1; s1++) {
+ if (*s1 == *s2) {
+ if (wstrncmp(s1, s2, len) == 0)
+ return (smb_ucs2_t *)s1;
+ }
+ }
+ return NULL;
+}
+
+/*******************************************************************
+ Search for ucs2 char c from the beginning of s.
+********************************************************************/
+
+smb_ucs2_t *wstrchr(const smb_ucs2_t *s, smb_ucs2_t c)
+{
+ do {
+ if (*s == c)
+ return (smb_ucs2_t *)s;
+ } while (*s++);
+
+ return NULL;
+}
+
+/*******************************************************************
+ Search for ucs2 char c from the end of s.
+********************************************************************/
+
+smb_ucs2_t *wstrrchr(const smb_ucs2_t *s, smb_ucs2_t c)
+{
+ smb_ucs2_t *retval = 0;
+
+ do {
+ if (*s == c)
+ retval = (smb_ucs2_t *)s;
+ } while (*s++);
+
+ return retval;
+}
+
+/*******************************************************************
+ Search token from s1 separated by any ucs2 char of s2.
+********************************************************************/
+
+smb_ucs2_t *wstrtok(smb_ucs2_t *s1, const smb_ucs2_t *s2)
+{
+ static smb_ucs2_t *s = NULL;
+ smb_ucs2_t *q;
+
+ if (!s1) {
+ if (!s)
+ return NULL;
+ s1 = s;
+ }
+
+ for (q = s1; *s1; s1++) {
+ smb_ucs2_t *p = wstrchr(s2, *s1);
+ if (p) {
+ if (s1 != q) {
+ s = s1 + 1;
+ *s1 = '\0';
+ return q;
+ }
+ q = s1 + 1;
+ }
+ }
+
+ s = NULL;
+ if (*q)
+ return q;
+
+ return NULL;
+}