diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2008-02-10 04:57:45 +0000 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2008-02-10 04:57:45 +0000 |
commit | ec93d800236017db668e1b01db0ae7988782cdb1 (patch) | |
tree | 2945613bd70d196dda326e28c80e47b2e98801b2 | |
parent | 43901a8e104f861b6c763d3cb0f5e1192a829616 (diff) | |
download | numpy-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.src | 44 |
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# |