From 8c9fc0fc4257384b2ee6afe8ffc0287d2f0074b4 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Wed, 3 Oct 2007 14:28:07 +0000 Subject: [PATCH] Separate code and provide "double" version. SVN revision: 31948 --- legacy/eet/src/lib/eet_data.c | 55 ++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/legacy/eet/src/lib/eet_data.c b/legacy/eet/src/lib/eet_data.c index 018a96c19d..2fd398de70 100644 --- a/legacy/eet/src/lib/eet_data.c +++ b/legacy/eet/src/lib/eet_data.c @@ -355,6 +355,46 @@ eet_data_put_string(const void *src, int *size_ret) return d; } +/** + * Fast lookups of simple doubles/floats. + * + * These aren't properly a cache because they don't store pre-calculated + * values, but have a so simple math that is almost as fast. + */ +static inline int +_eet_data_float_cache_get(char *s, int len, float *d) +{ + /* fast handle of simple case 0xMp+E*/ + if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) + { + int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); + int exponent = (s[5] - '0'); + + if (s[4] == '+') *d = (float)(mantisse << exponent); + else *d = (float)mantisse / (float)(1 << exponent); + + return 1; + } + return 0; +} + +static inline int +_eet_data_double_cache_get(char *s, int len, double *d) +{ + /* fast handle of simple case 0xMp+E*/ + if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) + { + int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); + int exponent = (s[5] - '0'); + + if (s[4] == '+') *d = (double)(mantisse << exponent); + else *d = (double)mantisse / (double)(1 << exponent); + + return 1; + } + return 0; +} + /* FLOAT TYPE */ static int eet_data_get_float(void *src, void *src_end, void *dst) @@ -371,17 +411,7 @@ eet_data_get_float(void *src, void *src_end, void *dst) len = 0; while ((p < (char *)src_end) && (*p != 0)) {len++; p++;} - /* fast handle of simple case 0xMp+E*/ - if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) - { - int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); - int exponent = 1 << (s[5] - '0'); - - if (s[4] == '+') *d = ((float)mantisse) * (float)exponent; - else *d = ((float)mantisse) / (float)exponent; - - return len + 1; - } + if (_eet_data_float_cache_get(s, len, d) != 0) return len + 1; str = alloca(len + 1); memcpy(str, s, len); @@ -425,6 +455,9 @@ eet_data_get_double(void *src, void *src_end, void *dst) p = s; len = 0; while ((p < (char *)src_end) && (*p != 0)) {len++; p++;} + + if (_eet_data_double_cache_get(s, len, d) != 0) return len + 1; + str = alloca(len + 1); memcpy(str, s, len); str[len] = '\0';