summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2008-02-10 04:57:45 +0000
committerCharles Harris <charlesr.harris@gmail.com>2008-02-10 04:57:45 +0000
commitec93d800236017db668e1b01db0ae7988782cdb1 (patch)
tree2945613bd70d196dda326e28c80e47b2e98801b2
parent43901a8e104f861b6c763d3cb0f5e1192a829616 (diff)
downloadnumpy-ec93d800236017db668e1b01db0ae7988782cdb1.tar.gz
Add inline string compare functions for strings and UCS4. The indirect merge
sort now works correctly for strings. The new functions use the const keyword, which may be a problem with very old C compilers.
-rw-r--r--numpy/core/src/_sortmodule.c.src44
1 files changed, 38 insertions, 6 deletions
diff --git a/numpy/core/src/_sortmodule.c.src b/numpy/core/src/_sortmodule.c.src
index 52cfe6219..573ee0f9c 100644
--- a/numpy/core/src/_sortmodule.c.src
+++ b/numpy/core/src/_sortmodule.c.src
@@ -38,13 +38,45 @@
#define NUMC_LT(p,q) ((((p).real==(q).real) ? ((p).imag < (q).imag): ((p).real < (q).real)))
#define NUMC_LE(p,q) ((((p).real==(q).real) ? ((p).imag <= (q).imag): ((p).real <= (q).real)))
#define NUMC_EQ(p,q) (((p).real==(q).real) && ((p).imag == (q).imag))
-#define STRING_LT(pa, pb, len) (strncmp(pa, pb, len) < 0)
-#define STRING_LE(pa, pb, len) (strncmp(pa, pb, len) <= 0)
-#define STRING_EQ(pa, pb, len) (strncmp(pa, pb, len) == 0)
-#define UNICODE_LT(pa, pb, len) (PyArray_CompareUCS4(pa, pb, len) < 0)
-#define UNICODE_LE(pa, pb, len) (PyArray_CompareUCS4(pa, pb, len) <= 0)
-#define UNICODE_EQ(pa, pb, len) (PyArray_CompareUCS4(pa, pb, len) == 0)
+#define STRING_LT(pa, pb, len) (compare_string(pa, pb, len) < 0)
+#define STRING_LE(pa, pb, len) (compare_string(pa, pb, len) <= 0)
+#define STRING_EQ(pa, pb, len) (compare_string(pa, pb, len) == 0)
+#define STRING_SWAP(pa, pb, n) {int i; for(i = 0; i < n; ++i) SWAP(pa[i], pb[i]);}
+#define STRING_COPY(pa, pb, n) {int i; for(i = 0; i < n; ++i) pa[i] = pb[i];}
+#define UNICODE_LT(pa, pb, len) (compare_ucs4(pa, pb, len) < 0)
+#define UNICODE_LE(pa, pb, len) (compare_ucs4(pa, pb, len) <= 0)
+#define UNICODE_EQ(pa, pb, len) (compare_ucs4(pa, pb, len) == 0)
+
+#include <stdio.h>
+
+static int inline
+compare_string(char *s1, char *s2, size_t len)
+{
+ const unsigned char *c1 = (unsigned char *)s1;
+ const unsigned char *c2 = (unsigned char *)s2;
+ size_t i;
+
+ for(i = 0; i < len; ++i) {
+ if (c1[i] != c2[i]) {
+ return (c1[i] > c2[i]) ? 1 : -1;
+ }
+ }
+ return 0;
+}
+
+static int inline
+compare_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
+{
+ size_t i;
+
+ for(i = 0; i < len; ++i) {
+ if (s1[i] != s2[i]) {
+ return (s1[i] > s2[i]) ? 1 : -1;
+ }
+ }
+ return 0;
+}
/**begin repeat
#TYPE=BOOL,BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE,CFLOAT,CDOUBLE,CLONGDOUBLE#