-/*
- * Copyright (c) 1995-2004, Index Data.
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
* See the file LICENSE for details.
- *
- * $Id: matchstr.c,v 1.3 2004-12-30 00:14:00 adam Exp $
*/
/**
* \file matchstr.c
- * \brief Implements loose string matching
+ * \brief a couple of string utilities
*/
#if HAVE_CONFIG_H
#include <stdio.h>
#include <assert.h>
-#include <ctype.h>
#include <string.h>
-#include <yaz/yaz-util.h>
+#include <yaz/yaz-iconv.h>
+#include <yaz/matchstr.h>
-/*
- * Match strings, independently of case and occurences of '-'.
- * fairly inefficient - will be replaced with an indexing scheme for
- * the various subsystems if we get a bottleneck here.
- */
+int yaz_strcasecmp(const char *s1, const char *s2)
+{
+ return yaz_strncasecmp(s1, s2, strlen(s1) + 1);
+}
+
+int yaz_strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ while (n--)
+ {
+ unsigned char c1 = *s1++;
+ unsigned char c2 = *s2++;
+ if (yaz_isupper(c1))
+ c1 = yaz_tolower(c1);
+ if (yaz_isupper(c2))
+ c2 = yaz_tolower(c2);
+ if (c1 != c2)
+ return c1 - c2;
+ }
+ return 0;
+}
int yaz_matchstr(const char *s1, const char *s2)
{
while (*s1 && *s2)
{
- unsigned char c1 = *s1;
- unsigned char c2 = *s2;
+ unsigned char c1 = *s1;
+ unsigned char c2 = *s2;
if (c2 == '?')
return 0;
- if (c1 == '-')
- c1 = *++s1;
- if (c2 == '-')
- c2 = *++s2;
- if (!c1 || !c2)
- break;
+ if (c1 == '-')
+ c1 = *++s1;
+ if (c2 == '-')
+ c2 = *++s2;
+ if (!c1 || !c2)
+ break;
if (c2 != '.')
{
- if (isupper(c1))
- c1 = tolower(c1);
- if (isupper(c2))
- c2 = tolower(c2);
- if (c1 != c2)
- break;
+ if (yaz_isupper(c1))
+ c1 = yaz_tolower(c1);
+ if (yaz_isupper(c2))
+ c2 = yaz_tolower(c2);
+ if (c1 != c2)
+ break;
}
- s1++;
- s2++;
+ s1++;
+ s2++;
}
return *s1 || *s2;
}
return *a - *b;
}
-#ifdef __GNUC__
-#ifdef __CHECKER__
-void __assert_fail (const char *assertion, const char *file,
- unsigned int line, const char *function)
+int yaz_memcmp(const void *a, const void *b, size_t len_a, size_t len_b)
{
- fprintf (stderr, "%s in file %s line %d func %s\n",
- assertion, file, line, function);
- abort ();
+ size_t m_len = len_a < len_b ? len_a : len_b;
+ int r = memcmp(a, b, m_len);
+ if (r)
+ return r;
+ return len_a - len_b;
}
-#endif
-#endif
+
+int yaz_strcmp_null(const char *v1, const char *v2)
+{
+ if (v1)
+ {
+ if (v2)
+ return strcmp(v1, v2);
+ else
+ return 1;
+ }
+ else if (v2)
+ return -1;
+ return 0;
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+