2 * $Id: cdr.c,v 0.0.0.1 2004/11/26
4 * DEBUG: section 5 CDR codeing
5 * AUTHOR: Petr Smolik petr.smolik@wo.cz
7 * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
8 * --------------------------------------------------------------------
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * This module maintains a hash table of key/value pairs.
21 * Keys can be strings of any size, or numbers up to size
22 * unsigned long (HASHKEYTYPE).
23 * Values should be a pointer to some data you wish to store.
25 * Original of source was from ORBit: A CORBA v2.2 ORB
31 #define CDR_GROW_AMOUNT 128
34 CDR_buffer_init(CDR_Codec *codec, const unsigned int size)
37 if(codec->release_buffer) {
41 codec->buffer=(CORBA_octet *)MALLOC(size);
44 codec->rptr=codec->wptr=0;
45 codec->release_buffer=CORBA_TRUE;
52 CDR_buffer_grow(CDR_Codec *codec, const unsigned int growth)
54 unsigned int real_growth,quot;
56 if(codec->release_buffer) {
57 quot = growth / CDR_GROW_AMOUNT;
58 real_growth=CDR_GROW_AMOUNT * (quot+1);
60 codec->buffer=(CORBA_octet *)REALLOC(codec->buffer,
69 CDR_buffer_puts(CDR_Codec *codec, const void *data, const unsigned int len)
71 if(codec->wptr+len > codec->wptr_max) {
75 memcpy(&codec->buffer[codec->wptr], data, len);
82 CDR_buffer_gets(CDR_Codec *codec, void *dest, const unsigned int len)
84 if(codec->rptr+len > codec->buf_len) {
88 memcpy(dest, &codec->buffer[codec->rptr], len);
95 CDR_buffer_put(CDR_Codec *codec, void *datum)
97 if(codec->wptr+1 > codec->wptr_max) {
101 codec->buffer[codec->wptr++]=*(unsigned char *)datum;
106 CDR_buffer_get(CDR_Codec *codec, void *dest)
108 if(codec->rptr+1 > codec->buf_len) {
112 *(CORBA_octet *)dest=codec->buffer[codec->rptr++];
116 #define CDR_buffer_put2(codec, datum) CDR_buffer_putn(codec, datum, 2)
117 #define CDR_buffer_put4(codec, datum) CDR_buffer_putn(codec, datum, 4)
118 #define CDR_buffer_put8(codec, datum) CDR_buffer_putn(codec, datum, 8)
119 #define CDR_buffer_put16(codec, datum) CDR_buffer_putn(codec, datum, 16)
120 #define CDR_buffer_get2(codec, dest) CDR_buffer_getn(codec, dest, 2)
121 #define CDR_buffer_get4(codec, dest) CDR_buffer_getn(codec, dest, 4)
122 #define CDR_buffer_get8(codec, dest) CDR_buffer_getn(codec, dest, 8)
123 #define CDR_buffer_get16(codec, dest) CDR_buffer_getn(codec, dest, 16)
126 CDR_buffer_getn(CDR_Codec *codec, void *dest, int bsize)
128 codec->rptr = (unsigned long)ALIGN_ADDRESS(codec->rptr, bsize);
129 if(codec->host_endian==codec->data_endian)
130 memcpy(dest, codec->buffer + codec->rptr, bsize);
132 rtps_byteswap(dest, codec->buffer + codec->rptr, bsize);
133 codec->rptr += bsize;
139 CDR_buffer_putn(CDR_Codec *codec, void *datum, int bsize)
141 unsigned long forward,i;
143 forward = (unsigned long)ALIGN_ADDRESS(codec->wptr, bsize);
144 if (forward+bsize > codec->wptr_max) {
150 codec->buffer[i++] = '\0';
152 codec->wptr = forward;
153 if(codec->host_endian==codec->data_endian)
154 memcpy(codec->buffer + codec->wptr, datum, bsize);
156 rtps_byteswap(codec->buffer + codec->wptr, datum, bsize);
157 codec->wptr += bsize;
162 #define CDR_swap2(d,s) rtps_byteswap((d), (s), 2)
163 #define CDR_swap4(d,s) rtps_byteswap((d), (s), 4)
164 #define CDR_swap8(d,s) rtps_byteswap((d), (s), 8)
165 #define CDR_swap16(d,s) rtps_byteswap((d), (s), 16)
168 CDR_put_short(CDR_Codec *codec, CORBA_short s)
170 return CDR_buffer_put2(codec, &s);
174 CDR_get_short(CDR_Codec *codec, CORBA_short *s)
176 return CDR_buffer_get2(codec, s);
180 CDR_put_ushort(CDR_Codec *codec, CORBA_unsigned_short us)
182 return CDR_buffer_put2(codec, &us);
186 CDR_get_ushort(CDR_Codec *codec, CORBA_unsigned_short *us)
188 return CDR_buffer_get2(codec, us);
192 CDR_put_long(CDR_Codec *codec, CORBA_long l)
194 return CDR_buffer_put4(codec, &l);
198 CDR_get_long(CDR_Codec *codec, CORBA_long *l)
200 return CDR_buffer_get4(codec, l);
204 CDR_put_ulong(CDR_Codec *codec, CORBA_unsigned_long ul)
206 return CDR_buffer_put4(codec, &ul);
210 CDR_get_ulong(CDR_Codec *codec, CORBA_unsigned_long *ul)
212 return CDR_buffer_get4(codec, ul);
215 #ifdef HAVE_CORBA_LONG_LONG
217 CDR_get_long_long(CDR_Codec *codec, CORBA_long_long *ul)
219 return CDR_buffer_get8(codec, ul);
223 CDR_put_long_long(CDR_Codec *codec, CORBA_long_long ll)
225 return CDR_buffer_put8(codec, &ll);
229 CDR_put_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long ll)
231 return CDR_buffer_put8(codec, &ll);
235 CDR_get_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long *ull)
237 return CDR_buffer_get8(codec, ull);
242 CDR_put_float(CDR_Codec *codec, CORBA_float f)
244 return CDR_buffer_put4(codec, &f);
248 CDR_put_double(CDR_Codec *codec, CORBA_double d)
250 return CDR_buffer_put8(codec, &d);
254 CDR_put_long_double(CDR_Codec *codec, CORBA_long_double ld)
256 return CDR_buffer_put16(codec, &ld);
260 CDR_put_octet(CDR_Codec *codec, CORBA_octet datum)
262 return CDR_buffer_put(codec, &datum);
266 CDR_get_octet(CDR_Codec *codec, CORBA_octet *datum)
268 return(CDR_buffer_get(codec, datum));
272 CDR_put_octets(CDR_Codec *codec, void *data, unsigned long len)
274 return CDR_buffer_puts(codec, data, len);
278 CDR_put_char(CDR_Codec *codec, CORBA_char c)
280 return CDR_buffer_put(codec, &c);
284 CDR_get_char(CDR_Codec *codec, CORBA_char *c)
286 return CDR_buffer_get(codec, c);
290 CDR_put_boolean(CDR_Codec *codec, CORBA_boolean datum)
293 return CDR_buffer_put(codec, &datum);
297 CDR_get_boolean(CDR_Codec *codec, CORBA_boolean *b)
299 return CDR_buffer_get(codec, b);
303 CDR_put_string(CDR_Codec *codec, const char *str)
309 if (CDR_put_ulong(codec, len)==CORBA_FALSE) return -1;
310 return CDR_buffer_puts(codec, str, len);
314 CDR_get_string_static(CDR_Codec *codec,CORBA_char **str)
316 CORBA_unsigned_long len;
318 if(CDR_get_ulong(codec, &len)==CORBA_FALSE)
321 if((codec->rptr + len) > codec->buf_len)
324 *str = ((CORBA_char *)codec->buffer) + codec->rptr;
332 CDR_get_string(CDR_Codec *codec, CORBA_char **str)
334 CORBA_unsigned_long len;
336 if(CDR_get_ulong(codec, &len)==CORBA_FALSE)
344 if(CDR_buffer_gets(codec, *str, len)==CORBA_FALSE) {
349 if((*str)[len-1]!='\0') {
357 CDR_get_string_buff(CDR_Codec *codec, CORBA_char *str)
359 CORBA_unsigned_long len;
361 if(CDR_get_ulong(codec, &len)==CORBA_FALSE)
367 if(CDR_buffer_gets(codec, str, len)==CORBA_FALSE) {
371 if(str[len-1]!='\0') {
379 CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul)
381 return(CDR_get_ulong(codec, ul));
385 CDR_codec_init_static(CDR_Codec *codec)
387 memset(codec, 0, sizeof(CDR_Codec));
389 codec->host_endian = FLAG_ENDIANNESS;
399 c=MALLOC(sizeof(CDR_Codec));
400 CDR_codec_init_static(c);
406 CDR_codec_release_buffer(CDR_Codec *codec)
408 if(codec->release_buffer)
414 CDR_codec_free(CDR_Codec *codec)
416 CDR_codec_release_buffer(codec);