From d91feeb7909231c5e1b671f49bd0d4993b371cde Mon Sep 17 00:00:00 2001 From: Olaf Bergmann Date: Sun, 11 Jul 2010 19:56:58 +0200 Subject: [PATCH] Carsten\'s encode functions for pseudo-fp --- encode.c | 29 ++++++++--------------------- encode.h | 23 +++++++++++++++++------ 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/encode.c b/encode.c index 88f6bb45..dc394a4d 100644 --- a/encode.c +++ b/encode.c @@ -1,6 +1,6 @@ /* encode.c -- encoding and decoding of CoAP data types * - * (c) 2010 Olaf Bergmann + * (c) 2010 Carsten Bormann */ #ifndef NDEBUG @@ -9,24 +9,11 @@ #include "encode.h" -unsigned int -coap_pseudo_encode( unsigned int val ) { - unsigned int e = 0; - - if ( val < HIBIT ) - return val; - - if ( val > MAX_VALUE ) { -#ifndef NDEBUG - fprintf(stderr, "cannot encode value %u\n", val); -#endif - return ( 1 << N ) - 1; - } - - while ( HIBIT < (val & ~0xff) ) { - val = val >> 1; - e += 1; - } - - return (val & ~EMASK) | e; +/* Carsten suggested this when fls() is not available: */ +int coap_fls(unsigned int i) { + int n; + for (n = 0; i; n++) + i >>= 1; + return n; } + diff --git a/encode.h b/encode.h index ee68b324..47fe9b3d 100644 --- a/encode.h +++ b/encode.h @@ -1,12 +1,16 @@ /* encode.h -- encoding and decoding of CoAP data types * - * (c) 2010 Olaf Bergmann + * (c) 2010 Carsten Bormann */ #ifndef _COAP_ENCODE_H_ #define _COAP_ENCODE_H_ -#include "encode.h" +#if (BSD >= 199103) +# include +#else +# include +#endif #define N 8 #define E 4 @@ -15,10 +19,17 @@ #define MMASK ((1 << N) - 1 - EMASK) #define MAX_VALUE ( (1 << N) - (1 << E) ) * (1 << ((1 << E) - 1)) -/* internal function, better use macro COAP_PSEUDOFP_ENCODE() instead */ -unsigned int coap_pseudo_encode( unsigned int val ); +#define COAP_PSEUDOFP_DECODE_8_4(r) (r < HIBIT ? r : (r & MMASK) << (r & EMASK)) -#define COAP_PSEUDOFP_ENCODE(r) coap_pseudo_encode( (r) ) -#define COAP_PSEUDOFP_DECODE(r) (r < HIBIT ? r : (r & MMASK) << (r & EMASK)) +#if 0 +/* include this only if fls() is not available */ +extern int coap_fls(unsigned int i); +#else +#define coap_fls(i) fls(i) +#endif + +/* ls and s must be integer variables */ +#define COAP_PSEUDOFP_ENCODE_8_4_DOWN(v,ls) (v < HIBIT ? v : (ls = coap_fls(v) - N, (v >> ls) & MMASK) + ls) +#define COAP_PSEUDOFP_ENCODE_8_4_UP(v,ls,s) (v < HIBIT ? v : (ls = coap_fls(v) - N, (s = (((v + ((1<> ls) & MMASK)), s == 0 ? HIBIT + ls + 1 : s + ls)) #endif /* _COAP_ENCODE_H_ */