Return to codelength.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / miniupnpd / miniupnpc / src |
1.1 ! misho 1: /* $Id: codelength.h,v 1.3 2011/07/30 13:10:05 nanard Exp $ */ ! 2: /* Project : miniupnp ! 3: * Author : Thomas BERNARD ! 4: * copyright (c) 2005-2015 Thomas Bernard ! 5: * This software is subjet to the conditions detailed in the ! 6: * provided LICENCE file. */ ! 7: #ifndef CODELENGTH_H_INCLUDED ! 8: #define CODELENGTH_H_INCLUDED ! 9: ! 10: /* Encode length by using 7bit per Byte : ! 11: * Most significant bit of each byte specifies that the ! 12: * following byte is part of the code */ ! 13: ! 14: /* n : unsigned ! 15: * p : unsigned char * ! 16: */ ! 17: #define DECODELENGTH(n, p) n = 0; \ ! 18: do { n = (n << 7) | (*p & 0x7f); } \ ! 19: while((*(p++)&0x80) && (n<(1<<25))); ! 20: ! 21: /* n : unsigned ! 22: * READ : function/macro to read one byte (unsigned char) ! 23: */ ! 24: #define DECODELENGTH_READ(n, READ) \ ! 25: n = 0; \ ! 26: do { \ ! 27: unsigned char c; \ ! 28: READ(c); \ ! 29: n = (n << 7) | (c & 0x07f); \ ! 30: if(!(c&0x80)) break; \ ! 31: } while(n<(1<<25)); ! 32: ! 33: /* n : unsigned ! 34: * p : unsigned char * ! 35: * p_limit : unsigned char * ! 36: */ ! 37: #define DECODELENGTH_CHECKLIMIT(n, p, p_limit) \ ! 38: n = 0; \ ! 39: do { \ ! 40: if((p) >= (p_limit)) break; \ ! 41: n = (n << 7) | (*(p) & 0x7f); \ ! 42: } while((*((p)++)&0x80) && (n<(1<<25))); ! 43: ! 44: ! 45: /* n : unsigned ! 46: * p : unsigned char * ! 47: */ ! 48: #define CODELENGTH(n, p) if(n>=268435456) *(p++) = (n >> 28) | 0x80; \ ! 49: if(n>=2097152) *(p++) = (n >> 21) | 0x80; \ ! 50: if(n>=16384) *(p++) = (n >> 14) | 0x80; \ ! 51: if(n>=128) *(p++) = (n >> 7) | 0x80; \ ! 52: *(p++) = n & 0x7f; ! 53: ! 54: #endif /* CODELENGTH_H_INCLUDED */