X-Git-Url: http://git.maemo.org/git/?p=mardrone;a=blobdiff_plain;f=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVP_SDK%2FATcodec%2FATcodec_Memory.c;fp=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVP_SDK%2FATcodec%2FATcodec_Memory.c;h=adc3aa6a23092d1593fb90f81bcd01346e5e2484;hp=0000000000000000000000000000000000000000;hb=9ec9bc13b75d30bc45535c54a652934debfcea92;hpb=ae0a3c2dc0898400aca0dd6b439c5db8044db7b2 diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Memory.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Memory.c new file mode 100644 index 0000000..adc3aa6 --- /dev/null +++ b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Memory.c @@ -0,0 +1,234 @@ +/** + * @file ATcodec_Memory.c + * @author aurelien.morelle@parrot.fr + * @date 2006/12/06 + */ + +#include + +#include + +// Macros +#define ATCODEC_MEMORY_SIZE_ASSERT(mem, size_inc) \ + do \ + { \ + VP_OS_ASSERT((unsigned)mem->current-(unsigned)mem->start + size_inc*mem->char_size < mem->size); \ + } \ + while(0) + +#define ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem) \ + do \ + { \ + VP_OS_ASSERT(mem); \ + VP_OS_ASSERT(mem->start); \ + VP_OS_ASSERT(mem->char_size); \ + VP_OS_ASSERT(mem->get); \ + VP_OS_ASSERT(mem->put); \ + } \ + while(0) + +#define ATCODEC_MEMORY_PUT_STRUCT_ASSERT(mem) \ + do \ + { \ + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); \ + VP_OS_ASSERT(mem->size); \ + } \ + while(0) + +// Static get/put + +static int +static_atcodec_getchar (char **str) +{ + VP_OS_ASSERT(str); + VP_OS_ASSERT(*str); + + return *((*str)++); +} + +static void +static_atcodec_putchar (char **str, int c) +{ + VP_OS_ASSERT(str); + VP_OS_ASSERT(*str); + + *((*str)++) = (char)c; +} + +// Init + +void +ATcodec_Memory_Init (ATcodec_Memory_t *mem, const char *start, int size, int char_size, ATcodec_Getchar get, ATcodec_Putchar put) +{ + VP_OS_ASSERT(mem); + VP_OS_ASSERT(start); + VP_OS_ASSERT(char_size); + + mem->start = start; + mem->size = size; + mem->char_size = char_size; + + mem->current = (char *)start; + + mem->get = (get && size ? get : static_atcodec_getchar); + mem->put = (put ? put : static_atcodec_putchar); +} + + +// Put + +void +ATcodec_Memory_Put_Char (ATcodec_Memory_t *mem, int character) +{ + ATCODEC_MEMORY_PUT_STRUCT_ASSERT(mem); + ATCODEC_MEMORY_SIZE_ASSERT(mem, 1); + + mem->put(&mem->current, character); +} + +// \todo Does source string need to be passed like an ATcodec_Memory_t ? +void +ATcodec_Memory_Put_String (ATcodec_Memory_t *mem, const char *str) +{ + char *s = (char *)str; + + VP_OS_ASSERT(s); + ATCODEC_MEMORY_PUT_STRUCT_ASSERT(mem); + + if(*s) + { + do + { + ATCODEC_MEMORY_SIZE_ASSERT(mem, 1); + mem->put(&mem->current, *s++); + } + while ( *s ); + } +} + +void +ATcodec_Memory_Raw_Put_Int (ATcodec_Memory_t *mem, int value) +{ + ATCODEC_MEMORY_PUT_STRUCT_ASSERT(mem); + + ATcodec_Memory_Put_Char(mem, (value>>24) & 0xFF); + + value &= 0x00FFFFFF; + ATcodec_Memory_Put_Char(mem, (value>>16) & 0xFF); + + value &= 0x0000FFFF; + ATcodec_Memory_Put_Char(mem, (value>>8) & 0xFF); + + value &= 0x000000FF; + ATcodec_Memory_Put_Char(mem, value & 0xFF); +} + +void +ATcodec_Memory_Str_Put_Int (ATcodec_Memory_t *mem, int value) +{ + int i; + + ATCODEC_MEMORY_PUT_STRUCT_ASSERT(mem); + + if (value < 0) + { + ATcodec_Memory_Put_Char(mem, '-'); + value = -value; + } + + for ( i=1 ; value >= 10*i ; i*=10 ); + + while (value) + { + VP_OS_ASSERT(i); + ATcodec_Memory_Put_Char(mem, '0'+(char)(value/i)); + value -= i*(value/i); + i /= 10; + } + + for ( ; i ; i/=10 ) + ATcodec_Memory_Put_Char(mem, '0'); +} + +// Get + +int +ATcodec_Memory_Get_Char (ATcodec_Memory_t *mem) +{ + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); + + return mem->get(&mem->current); +} + +void +ATcodec_Memory_Unget_Char (ATcodec_Memory_t *mem) +{ + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); + + mem->current -= mem->char_size; + VP_OS_ASSERT((unsigned)mem->current >= (unsigned)mem->start); +} + +// \todo Does destination string need to be passed like an ATcodec_Memory_t ? +void +ATcodec_Memory_Get_String (ATcodec_Memory_t *mem, char *dst) +{ + int c; + + VP_OS_ASSERT(dst); + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); + + do + { + c = mem->get(&mem->current); + *dst++ = c; + } + while ( c ); +} + +int +ATcodec_Memory_Raw_Get_Int (ATcodec_Memory_t *mem) +{ + unsigned val; + + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); + + val = (unsigned) ATcodec_Memory_Get_Char(mem); + val = ((unsigned)(ATcodec_Memory_Get_Char(mem) & 0xFF)) | (val << 8); + val = ((unsigned)(ATcodec_Memory_Get_Char(mem) & 0xFF)) | (val << 8); + val = ((unsigned)(ATcodec_Memory_Get_Char(mem) & 0xFF)) | (val << 8); + + return val; +} + +int +ATcodec_Memory_Str_Get_Int (ATcodec_Memory_t *mem) +{ + int neg, val; + char c; + + ATCODEC_MEMORY_GET_STRUCT_ASSERT(mem); + + c = (char) ATcodec_Memory_Get_Char(mem); + neg = (c == '-' ? 0 : -1); + + if (!neg) + c = (char) ATcodec_Memory_Get_Char(mem); // skips '-' character + + VP_OS_ASSERT(c >= '0' && c <= '9'); // not supported + + val = 0; + do + { + val = 10*val + c-'0'; + c = (char) ATcodec_Memory_Get_Char(mem); // processes next characters + } + while (c >= '0' && c <= '9'); + + ATcodec_Memory_Unget_Char(mem); // ungets last non-num character + + if(!neg) + val = -val; + + return val; +}