update nearly all FSF copyright year lists to include 2010
[pspp] / lib / uninorm / u-normcmp.h
index 288bcab86050c590281196e27c06672a92f15f6c..5cda5db39a2d1ba64edf16a7449ab01300ee9060 100644 (file)
@@ -1,5 +1,5 @@
-/* Normalization insensitive comparison of UTF-8 strings.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+/* Normalization insensitive comparison of Unicode strings.
+   Copyright (C) 2009-2010 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2009.
 
    This program is free software: you can redistribute it and/or modify it
 
 int
 FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
-      uninorm_t nf, int *result)
+      uninorm_t nf, int *resultp)
 {
+  UNIT buf1[2048 / sizeof (UNIT)];
+  UNIT buf2[2048 / sizeof (UNIT)];
   UNIT *norms1;
   size_t norms1_length;
   UNIT *norms2;
@@ -26,35 +28,37 @@ FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
   int cmp;
 
   /* Normalize S1.  */
-  norms1 = U_NORMALIZE (nf, s1, n1, NULL, &norms1_length);
+  norms1_length = sizeof (buf1) / sizeof (UNIT);
+  norms1 = U_NORMALIZE (nf, s1, n1, buf1, &norms1_length);
   if (norms1 == NULL)
-    return errno;
+    /* errno is set here.  */
+    return -1;
 
   /* Normalize S2.  */
-  norms2 = U_NORMALIZE (nf, s2, n2, NULL, &norms2_length);
+  norms2_length = sizeof (buf2) / sizeof (UNIT);
+  norms2 = U_NORMALIZE (nf, s2, n2, buf2, &norms2_length);
   if (norms2 == NULL)
     {
-      int saved_errno = errno;
-      free (norms1);
-      return saved_errno;
+      if (norms1 != buf1)
+        {
+          int saved_errno = errno;
+          free (norms1);
+          errno = saved_errno;
+        }
+      return -1;
     }
 
   /* Compare the normalized strings.  */
-  cmp = U_CMP (norms1, norms2, MIN (norms1_length, norms2_length));
-  if (cmp == 0)
-    {
-      if (norms1_length < norms2_length)
-       cmp = -1;
-      else if (norms1_length > norms2_length)
-       cmp = 1;
-    }
-  else if (cmp > 0)
+  cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length);
+  if (cmp > 0)
     cmp = 1;
   else if (cmp < 0)
     cmp = -1;
 
-  free (norms2);
-  free (norms1);
-  *result = cmp;
+  if (norms2 != buf2)
+    free (norms2);
+  if (norms1 != buf1)
+    free (norms1);
+  *resultp = cmp;
   return 0;
 }