2 * $Id: cdr.c,v 0.0.0.1 2004/11/26
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
19 * Modified for FORB by Michal Sojka <sojkam1@fel.cvut.cz>, 2008
20 * --------------------------------------------------------------------
22 * This program is free software; you can redistribute it and/or modify
23 * it under the terms of the GNU General Public License as published by
24 * the Free Software Foundation; either version 2 of the License, or
25 * (at your option) any later version.
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU General Public License for more details.
32 * Original of source was from ORBit: A CORBA v2.2 ORB
38 #include "forb_endian.h"
41 #define ALIGN_ADDRESS(this, boundary) \
42 ((void*)((( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))))
44 #define CDR_GROW_AMOUNT 128
47 CDR_buffer_init(CDR_Codec *codec, const unsigned int size, const unsigned int first)
50 if(codec->release_buffer) {
51 forb_free(codec->buffer);
57 codec->buffer=(CORBA_octet *)forb_malloc(size);
63 CDR_buffer_reset(codec, first);
64 codec->release_buffer=CORBA_TRUE;
70 CDR_buffer_reset(CDR_Codec *codec, const unsigned int first)
72 if (first > codec->buf_len) {
75 codec->rptr = codec->wptr = codec->wptr_last = first;
80 CDR_buffer_prepend(CDR_Codec *codec, const unsigned int len)
82 if (codec->rptr < len) {
87 codec->wptr = codec->rptr;
94 CDR_buffer_grow(CDR_Codec *codec, const unsigned int growth)
96 unsigned int real_growth,quot;
98 if(codec->release_buffer) {
99 quot = growth / CDR_GROW_AMOUNT;
100 real_growth=CDR_GROW_AMOUNT * (quot+1);
102 codec->buffer=(CORBA_octet *)REALLOC(codec->buffer,
111 CDR_buffer_puts(CDR_Codec *codec, const void *data, const unsigned int len)
113 if(codec->wptr+len > codec->wptr_max) {
117 memcpy(&codec->buffer[codec->wptr], data, len);
119 if (codec->wptr > codec->wptr_last) codec->wptr_last = codec->wptr;
125 CDR_buffer_gets(CDR_Codec *codec, void *dest, const unsigned int len)
127 if(codec->rptr+len > codec->buf_len) {
131 memcpy(dest, &codec->buffer[codec->rptr], len);
138 CDR_buffer_put(CDR_Codec *codec, void *datum)
140 if(codec->wptr+1 > codec->wptr_max) {
144 codec->buffer[codec->wptr++]=*(unsigned char *)datum;
145 if (codec->wptr > codec->wptr_last) codec->wptr_last = codec->wptr;
150 CDR_buffer_get(CDR_Codec *codec, void *dest)
152 if(codec->rptr+1 > codec->buf_len) {
156 *(CORBA_octet *)dest=codec->buffer[codec->rptr++];
160 #define CDR_buffer_put2(codec, datum) CDR_buffer_putn(codec, datum, 2)
161 #define CDR_buffer_put4(codec, datum) CDR_buffer_putn(codec, datum, 4)
162 #define CDR_buffer_put8(codec, datum) CDR_buffer_putn(codec, datum, 8)
163 #define CDR_buffer_put16(codec, datum) CDR_buffer_putn(codec, datum, 16)
164 #define CDR_buffer_get2(codec, dest) CDR_buffer_getn(codec, dest, 2)
165 #define CDR_buffer_get4(codec, dest) CDR_buffer_getn(codec, dest, 4)
166 #define CDR_buffer_get8(codec, dest) CDR_buffer_getn(codec, dest, 8)
167 #define CDR_buffer_get16(codec, dest) CDR_buffer_getn(codec, dest, 16)
170 CDR_buffer_getn(CDR_Codec *codec, void *dest, int bsize)
172 codec->rptr = (unsigned long)ALIGN_ADDRESS(codec->rptr, bsize);
173 if(codec->host_endian==codec->data_endian)
174 memcpy(dest, codec->buffer + codec->rptr, bsize);
176 forb_byteswap(dest, codec->buffer + codec->rptr, bsize);
177 codec->rptr += bsize;
183 CDR_buffer_putn(CDR_Codec *codec, void *datum, int bsize)
185 unsigned long forward,i;
187 forward = (unsigned long)ALIGN_ADDRESS(codec->wptr, bsize);
188 if (forward+bsize > codec->wptr_max) {
194 codec->buffer[i++] = '\0';
196 codec->wptr = forward;
197 if(codec->host_endian==codec->data_endian)
198 memcpy(codec->buffer + codec->wptr, datum, bsize);
200 forb_byteswap(codec->buffer + codec->wptr, datum, bsize);
201 codec->wptr += bsize;
202 if (codec->wptr > codec->wptr_last) codec->wptr_last = codec->wptr;
207 CORBA_boolean CDR_put_align(CDR_Codec *codec, unsigned bsize)
209 unsigned long forward,i;
211 forward = (unsigned long)ALIGN_ADDRESS(codec->wptr, bsize);
212 if (forward+bsize > codec->wptr_max) {
218 codec->buffer[i++] = '\0';
220 codec->wptr = forward;
221 if (codec->wptr > codec->wptr_last) codec->wptr_last = codec->wptr;
225 CORBA_boolean CDR_get_align(CDR_Codec *codec, unsigned bsize)
227 codec->rptr = (unsigned long)ALIGN_ADDRESS(codec->rptr, bsize);
228 return codec->rptr <= codec->wptr_max;
231 #define CDR_swap2(d,s) forb_byteswap((d), (s), 2)
232 #define CDR_swap4(d,s) forb_byteswap((d), (s), 4)
233 #define CDR_swap8(d,s) forb_byteswap((d), (s), 8)
234 #define CDR_swap16(d,s) forb_byteswap((d), (s), 16)
237 CDR_put_short(CDR_Codec *codec, CORBA_short s)
239 return CDR_buffer_put2(codec, &s);
243 CDR_get_short(CDR_Codec *codec, CORBA_short *s)
245 return CDR_buffer_get2(codec, s);
249 CDR_put_ushort(CDR_Codec *codec, CORBA_unsigned_short us)
251 return CDR_buffer_put2(codec, &us);
255 CDR_get_ushort(CDR_Codec *codec, CORBA_unsigned_short *us)
257 return CDR_buffer_get2(codec, us);
261 CDR_put_long(CDR_Codec *codec, CORBA_long l)
263 return CDR_buffer_put4(codec, &l);
267 CDR_get_long(CDR_Codec *codec, CORBA_long *l)
269 return CDR_buffer_get4(codec, l);
273 CDR_put_ulong(CDR_Codec *codec, CORBA_unsigned_long ul)
275 return CDR_buffer_put4(codec, &ul);
279 CDR_get_ulong(CDR_Codec *codec, CORBA_unsigned_long *ul)
281 return CDR_buffer_get4(codec, ul);
284 //#ifdef HAVE_CORBA_LONG_LONG
286 CDR_get_long_long(CDR_Codec *codec, CORBA_long_long *ul)
288 return CDR_buffer_get8(codec, ul);
292 CDR_put_long_long(CDR_Codec *codec, CORBA_long_long ll)
294 return CDR_buffer_put8(codec, &ll);
298 CDR_put_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long ll)
300 return CDR_buffer_put8(codec, &ll);
304 CDR_get_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long *ull)
306 return CDR_buffer_get8(codec, ull);
308 //#endif /* HAVE_CORBA_LONG_LONG */
311 CDR_put_float(CDR_Codec *codec, CORBA_float f)
313 return CDR_buffer_put4(codec, &f);
317 CDR_get_float(CDR_Codec *codec, CORBA_float *f)
319 return CDR_buffer_get4(codec, f);
323 CDR_put_double(CDR_Codec *codec, CORBA_double d)
325 return CDR_buffer_put8(codec, &d);
329 CDR_get_double(CDR_Codec *codec, CORBA_double *d)
331 return CDR_buffer_get8(codec, d);
335 CDR_put_long_double(CDR_Codec *codec, CORBA_long_double ld)
337 return CDR_buffer_put16(codec, &ld);
341 CDR_put_octet(CDR_Codec *codec, CORBA_octet datum)
343 return CDR_buffer_put(codec, &datum);
347 CDR_get_octet(CDR_Codec *codec, CORBA_octet *datum)
349 return(CDR_buffer_get(codec, datum));
353 CDR_put_octets(CDR_Codec *codec, void *data, unsigned long len)
355 return CDR_buffer_puts(codec, data, len);
359 CDR_put_char(CDR_Codec *codec, CORBA_char c)
361 return CDR_buffer_put(codec, &c);
365 CDR_get_char(CDR_Codec *codec, CORBA_char *c)
367 return CDR_buffer_get(codec, c);
371 CDR_put_boolean(CDR_Codec *codec, CORBA_boolean datum)
374 return CDR_buffer_put(codec, &datum);
378 CDR_get_boolean(CDR_Codec *codec, CORBA_boolean *b)
380 return CDR_buffer_get(codec, b);
384 CDR_put_string(CDR_Codec *codec, const CORBA_char *str)
390 if (CDR_put_ulong(codec, len)==CORBA_FALSE) return -1;
391 return CDR_buffer_puts(codec, str, len);
395 CDR_get_string_static(CDR_Codec *codec,CORBA_char **str)
397 CORBA_unsigned_long len;
399 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
402 if((codec->rptr + len) > codec->buf_len)
405 *str = ((CORBA_char *)codec->buffer) + codec->rptr;
413 CDR_get_string(CDR_Codec *codec, CORBA_char **str)
415 CORBA_unsigned_long len;
417 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
423 *str=forb_malloc(len);
425 if(CDR_buffer_gets(codec, *str, len)==CORBA_FALSE) {
430 if((*str)[len-1]!='\0') {
438 CDR_get_string_buff(CDR_Codec *codec, CORBA_char *str)
440 CORBA_unsigned_long len;
442 if(CDR_get_ulong(codec, (CORBA_unsigned_long *)&len)==CORBA_FALSE)
448 if(CDR_buffer_gets(codec, str, len)==CORBA_FALSE) {
452 if(str[len-1]!='\0') {
460 CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul)
462 return(CDR_get_ulong(codec, (CORBA_unsigned_long *)ul));
466 CDR_codec_init_static(CDR_Codec *codec, forb_orb orb)
468 memset(codec, 0, sizeof(CDR_Codec));
470 codec->host_endian = FLAG_ENDIANNESS;
471 codec->data_endian = FLAG_ENDIANNESS;
478 CDR_codec_init(forb_orb orb)
482 c=forb_malloc(sizeof(CDR_Codec));
484 CDR_codec_init_static(c, orb);
491 CDR_codec_release_buffer(CDR_Codec *codec)
493 if(codec->release_buffer) {
494 forb_free(codec->buffer);
495 codec->release_buffer = CORBA_FALSE;
501 CDR_codec_free(CDR_Codec *codec)
503 CDR_codec_release_buffer(codec);