From cc362deb872b32671e87833a379ee3a9488dd776 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 30 Jan 2010 16:50:49 +0100 Subject: [PATCH] core_pe: Tried to improve speed of that newly converted cache module. --- core_pe/modules/cache/cache.c | 43 ++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/core_pe/modules/cache/cache.c b/core_pe/modules/cache/cache.c index b5ea4a2f..240a1f5d 100644 --- a/core_pe/modules/cache/cache.c +++ b/core_pe/modules/cache/cache.c @@ -4,14 +4,37 @@ */ #include "Python.h" #include "structmember.h" +#include "stdio.h" +#include "stdlib.h" + +/* I know that there strtol out there, but it requires a pointer to + * a char, which would in turn require me to buffer my chars around, + * making the whole process slower. + */ +static inline long +xchar_to_long(char c) +{ + if ((c >= 48) && (c <= 57)) { /* 0-9 */ + return c - 48; + } + else if ((c >= 65) && (c <= 70)) { /* A-F */ + return c - 55; + } + else if ((c >= 97) && (c <= 102)) { /* a-f */ + return c - 87; + } + return 0; +} static PyObject* cache_string_to_colors(PyObject *self, PyObject *args) { char *s; + Py_ssize_t char_count; PyObject *result; + int i; - if (!PyArg_ParseTuple(args, "s", &s)) { + if (!PyArg_ParseTuple(args, "s#", &s, &char_count)) { return NULL; } @@ -20,21 +43,15 @@ cache_string_to_colors(PyObject *self, PyObject *args) return NULL; } - while (*s) { - long r, g, b, whole_color; - char buffer[7]; + char_count = (char_count / 6) * 6; + for (i=0; i> 16; - g = (whole_color >> 8) & 0xff; - b = whole_color & 0xff; + r = (xchar_to_long(s[i]) << 4) + xchar_to_long(s[i+1]); + g = (xchar_to_long(s[i+2]) << 4) + xchar_to_long(s[i+3]); + b = (xchar_to_long(s[i+4]) << 4) + xchar_to_long(s[i+5]); color_tuple = PyTuple_New(3); pi = PyInt_FromLong(r);