2 * $Id: cdr.c,v 0.0.0.1 2004/11/26
4 * DEBUG: section 5 CDR codeing
6 * -------------------------------------------------------------------
8 * Open Real-Time Ethernet
10 * Copyright (C) 2001-2006
11 * Department of Control Engineering FEE CTU Prague, Czech Republic
12 * http://dce.felk.cvut.cz
13 * http://www.ocera.org
15 * Author: Petr Smolik petr.smolik@wo.cz
17 * Project Responsible: Zdenek Hanzalek
18 * --------------------------------------------------------------------
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * This module maintains a hash table of key/value pairs.
31 * Keys can be strings of any size, or numbers up to size
32 * unsigned long (HASHKEYTYPE).
33 * Values should be a pointer to some data you wish to store.
35 * Original of source was from ORBit: A CORBA v2.2 ORB
41 #define CDR_GROW_AMOUNT 128
44 CDR_buffer_init(CDR_Codec *codec, const unsigned int size)
47 if(codec->release_buffer) {
51 codec->buffer=(CORBA_octet *)MALLOC(size);
54 codec->rptr=codec->wptr=0;
55 codec->release_buffer=CORBA_TRUE;
62 CDR_buffer_grow(CDR_Codec *codec, const unsigned int growth)
64 unsigned int real_growth,quot;
66 if(codec->release_buffer) {
67 quot = growth / CDR_GROW_AMOUNT;
68 real_growth=CDR_GROW_AMOUNT * (quot+1);
70 codec->buffer=(CORBA_octet *)REALLOC(codec->buffer,
79 CDR_buffer_puts(CDR_Codec *codec, const void *data, const unsigned int len)
81 if(codec->wptr+len > codec->wptr_max) {
85 memcpy(&codec->buffer[codec->wptr], data, len);
92 CDR_buffer_gets(CDR_Codec *codec, void *dest, const unsigned int len)
94 if(codec->rptr+len > codec->buf_len) {
98 memcpy(dest, &codec->buffer[codec->rptr], len);
105 CDR_buffer_put(CDR_Codec *codec, void *datum)
107 if(codec->wptr+1 > codec->wptr_max) {
111 codec->buffer[codec->wptr++]=*(unsigned char *)datum;
116 CDR_buffer_get(CDR_Codec *codec, void *dest)
118 if(codec->rptr+1 > codec->buf_len) {
122 *(CORBA_octet *)dest=codec->buffer[codec->rptr++];
126 #define CDR_buffer_put2(codec, datum) CDR_buffer_putn(codec, datum, 2)
127 #define CDR_buffer_put4(codec, datum) CDR_buffer_putn(codec, datum, 4)
128 #define CDR_buffer_put8(codec, datum) CDR_buffer_putn(codec, datum, 8)
129 #define CDR_buffer_put16(codec, datum) CDR_buffer_putn(codec, datum, 16)
130 #define CDR_buffer_get2(codec, dest) CDR_buffer_getn(codec, dest, 2)
131 #define CDR_buffer_get4(codec, dest) CDR_buffer_getn(codec, dest, 4)
132 #define CDR_buffer_get8(codec, dest) CDR_buffer_getn(codec, dest, 8)
133 #define CDR_buffer_get16(codec, dest) CDR_buffer_getn(codec, dest, 16)
136 CDR_buffer_getn(CDR_Codec *codec, void *dest, int bsize)
138 codec->rptr = (unsigned long)ALIGN_ADDRESS(codec->rptr, bsize);
139 if(codec->host_endian==codec->data_endian)
140 memcpy(dest, codec->buffer + codec->rptr, bsize);
142 rtps_byteswap(dest, codec->buffer + codec->rptr, bsize);
143 codec->rptr += bsize;
149 CDR_buffer_putn(CDR_Codec *codec, void *datum, int bsize)
151 unsigned long forward,i;
153 forward = (unsigned long)ALIGN_ADDRESS(codec->wptr, bsize);
154 if (forward+bsize > codec->wptr_max) {
160 codec->buffer[i++] = '\0';
162 codec->wptr = forward;
163 if(codec->host_endian==codec->data_endian)
164 memcpy(codec->buffer + codec->wptr, datum, bsize);
166 rtps_byteswap(codec->buffer + codec->wptr, datum, bsize);
167 codec->wptr += bsize;
172 #define CDR_swap2(d,s) rtps_byteswap((d), (s), 2)
173 #define CDR_swap4(d,s) rtps_byteswap((d), (s), 4)
174 #define CDR_swap8(d,s) rtps_byteswap((d), (s), 8)
175 #define CDR_swap16(d,s) rtps_byteswap((d), (s), 16)
178 CDR_put_short(CDR_Codec *codec, CORBA_short s)
180 return CDR_buffer_put2(codec, &s);
184 CDR_get_short(CDR_Codec *codec, CORBA_short *s)
186 return CDR_buffer_get2(codec, s);
190 CDR_put_ushort(CDR_Codec *codec, CORBA_unsigned_short us)
192 return CDR_buffer_put2(codec, &us);
196 CDR_get_ushort(CDR_Codec *codec, CORBA_unsigned_short *us)
198 return CDR_buffer_get2(codec, us);
202 CDR_put_long(CDR_Codec *codec, CORBA_long l)
204 return CDR_buffer_put4(codec, &l);
208 CDR_get_long(CDR_Codec *codec, CORBA_long *l)
210 return CDR_buffer_get4(codec, l);
214 CDR_put_ulong(CDR_Codec *codec, CORBA_unsigned_long ul)
216 return CDR_buffer_put4(codec, &ul);
220 CDR_get_ulong(CDR_Codec *codec, CORBA_unsigned_long *ul)
222 return CDR_buffer_get4(codec, ul);
225 #ifdef HAVE_CORBA_LONG_LONG
227 CDR_get_long_long(CDR_Codec *codec, CORBA_long_long *ul)
229 return CDR_buffer_get8(codec, ul);
233 CDR_put_long_long(CDR_Codec *codec, CORBA_long_long ll)
235 return CDR_buffer_put8(codec, &ll);
239 CDR_put_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long ll)
241 return CDR_buffer_put8(codec, &ll);
245 CDR_get_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long *ull)
247 return CDR_buffer_get8(codec, ull);
252 CDR_put_float(CDR_Codec *codec, CORBA_float f)
254 return CDR_buffer_put4(codec, &f);
258 CDR_get_float(CDR_Codec *codec, CORBA_float *f)
260 return CDR_buffer_get4(codec, f);
264 CDR_put_double(CDR_Codec *codec, CORBA_double d)
266 return CDR_buffer_put8(codec, &d);
270 CDR_get_double(CDR_Codec *codec, CORBA_double *d)
272 return CDR_buffer_get8(codec, d);
276 CDR_put_long_double(CDR_Codec *codec, CORBA_long_double ld)
278 return CDR_buffer_put16(codec, &ld);
282 CDR_put_octet(CDR_Codec *codec, CORBA_octet datum)
284 return CDR_buffer_put(codec, &datum);
288 CDR_get_octet(CDR_Codec *codec, CORBA_octet *datum)
290 return(CDR_buffer_get(codec, datum));
294 CDR_put_octets(CDR_Codec *codec, void *data, unsigned long len)
296 return CDR_buffer_puts(codec, data, len);
300 CDR_put_char(CDR_Codec *codec, CORBA_char c)
302 return CDR_buffer_put(codec, &c);
306 CDR_get_char(CDR_Codec *codec, CORBA_char *c)
308 return CDR_buffer_get(codec, c);
312 CDR_put_boolean(CDR_Codec *codec, CORBA_boolean datum)
315 return CDR_buffer_put(codec, &datum);
319 CDR_get_boolean(CDR_Codec *codec, CORBA_boolean *b)
321 return CDR_buffer_get(codec, b);
325 CDR_put_string(CDR_Codec *codec, const char *str)
331 if (CDR_put_ulong(codec, len)==CORBA_FALSE) return -1;
332 return CDR_buffer_puts(codec, str, len);
336 CDR_get_string_static(CDR_Codec *codec,CORBA_char **str)
338 CORBA_unsigned_long len;
340 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
343 if((codec->rptr + len) > codec->buf_len)
346 *str = ((CORBA_char *)codec->buffer) + codec->rptr;
354 CDR_get_string(CDR_Codec *codec, CORBA_char **str)
356 CORBA_unsigned_long len;
358 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
366 if(CDR_buffer_gets(codec, *str, len)==CORBA_FALSE) {
371 if((*str)[len-1]!='\0') {
379 CDR_get_string_buff(CDR_Codec *codec, CORBA_char *str)
381 CORBA_unsigned_long len;
383 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
389 if(CDR_buffer_gets(codec, str, len)==CORBA_FALSE) {
393 if(str[len-1]!='\0') {
401 CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul)
403 return(CDR_get_ulong(codec, (CORBA_unsigned_long *)ul));
407 CDR_codec_init_static(CDR_Codec *codec)
409 memset(codec, 0, sizeof(CDR_Codec));
411 codec->host_endian = FLAG_ENDIANNESS;
421 c=MALLOC(sizeof(CDR_Codec));
422 CDR_codec_init_static(c);
428 CDR_codec_release_buffer(CDR_Codec *codec)
430 if(codec->release_buffer)
436 CDR_codec_free(CDR_Codec *codec)
438 CDR_codec_release_buffer(codec);