[Tinyos-2-commits]
CVS: tinyos-2.x/support/sdk/c message.c, 1.1.2.2,
1.1.2.3 message.h, 1.1.2.2, 1.1.2.3
David Gay
idgay at users.sourceforge.net
Wed May 3 16:27:18 PDT 2006
Update of /cvsroot/tinyos/tinyos-2.x/support/sdk/c
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11452
Modified Files:
Tag: tinyos-2_0_devel-BRANCH
message.c message.h
Log Message:
comment message.h
add failure callback fn
Index: message.c
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/c/Attic/message.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** message.c 2 May 2006 23:12:59 -0000 1.1.2.2
--- message.c 3 May 2006 23:27:10 -0000 1.1.2.3
***************
*** 47,54 ****
--- 47,69 ----
}
+ static void (*failfn)(void);
+
void tmsg_fail(void)
{
+ if (failfn)
+ failfn();
}
+ void (*tmsg_set_fail(void (*fn)(void)))(void)
+ {
+ void (*oldfn)(void) = failfn;
+
+ failfn = fn;
+
+ return oldfn;
+ }
+
+ /* Check if a specified bit field is in range for a buffer, and invoke
+ tmsg_fail if not. Return TRUE if in range, FALSE otherwise */
static int boundsp(tmsg_t *msg, size_t offset, size_t length)
{
***************
*** 60,63 ****
--- 75,80 ----
}
+ /* Convert 2's complement 'length' bit integer 'x' from unsigned to signed
+ */
static int64_t u2s(uint64_t x, size_t length)
{
***************
*** 78,86 ****
size_t shift = 0;
! // all in one byte case
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> bit_offset) & ((1 << length) - 1);
! // get some high order bits
if (offset > 0)
{
--- 95,103 ----
size_t shift = 0;
! /* all in one byte case */
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> bit_offset) & ((1 << length) - 1);
! /* get some high order bits */
if (offset > 0)
{
***************
*** 98,102 ****
}
! // data from last byte
if (length > 0)
x |= (uint64_t)(msg->data[byte_offset] & ((1 << length) - 1)) << shift;
--- 115,119 ----
}
! /* data from last byte */
if (length > 0)
x |= (uint64_t)(msg->data[byte_offset] & ((1 << length) - 1)) << shift;
***************
*** 119,123 ****
size_t shift = 0;
! // all in one byte case
if (length + bit_offset <= 8)
{
--- 136,140 ----
size_t shift = 0;
! /* all in one byte case */
if (length + bit_offset <= 8)
{
***************
*** 128,132 ****
}
! // set some high order bits
if (bit_offset > 0)
{
--- 145,149 ----
}
! /* set some high order bits */
if (bit_offset > 0)
{
***************
*** 145,149 ****
}
! // data for last byte
if (length > 0)
msg->data[byte_offset] =
--- 162,166 ----
}
! /* data for last byte */
if (length > 0)
msg->data[byte_offset] =
***************
*** 166,175 ****
size_t bit_offset = offset & 7;
! // All in one byte case
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> (8 - bit_offset - length)) &
((1 << length) - 1);
! // get some high order bits
if (bit_offset > 0)
{
--- 183,192 ----
size_t bit_offset = offset & 7;
! /* All in one byte case */
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> (8 - bit_offset - length)) &
((1 << length) - 1);
! /* get some high order bits */
if (bit_offset > 0)
{
***************
*** 185,189 ****
}
! // data from last byte
if (length > 0)
x |= msg->data[byte_offset] >> (8 - length);
--- 202,206 ----
}
! /* data from last byte */
if (length > 0)
x |= msg->data[byte_offset] >> (8 - length);
***************
*** 207,211 ****
size_t bit_offset = offset & 7;
! // all in one byte case
if (length + bit_offset <= 8) {
size_t mask = ((1 << length) - 1) << (8 - bit_offset - length);
--- 224,228 ----
size_t bit_offset = offset & 7;
! /* all in one byte case */
if (length + bit_offset <= 8) {
size_t mask = ((1 << length) - 1) << (8 - bit_offset - length);
***************
*** 216,220 ****
}
! // set some high order bits
if (bit_offset > 0)
{
--- 233,237 ----
}
! /* set some high order bits */
if (bit_offset > 0)
{
***************
*** 233,237 ****
}
! // data for last byte
if (length > 0)
{
--- 250,254 ----
}
! /* data for last byte */
if (length > 0)
{
Index: message.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/c/Attic/message.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** message.h 2 May 2006 23:12:59 -0000 1.1.2.2
--- message.h 3 May 2006 23:27:10 -0000 1.1.2.3
***************
*** 16,41 ****
--- 16,147 ----
#include <stdlib.h>
+ /** The type of message buffers */
typedef struct tmsg tmsg_t;
+ /** Invoke the function set by tmsg_set_fail.
+ * tmsg_fail is called by the tmsg_read and tmsg_write functions when an
+ * out-of-buffer access is attempted.
+ */
void tmsg_fail(void);
+ /** Set the function that tmsg_fail should call, and return the previous
+ * function. If the function is NULL, tmsg_fail does nothing.
+ */
+ void (*tmsg_set_fail(void (*fn)(void)))(void);
+
+ /**
+ * Create a message buffer from array 'packet' of 'len' bytes
+ */
tmsg_t *new_tmsg(void *packet, size_t len);
+
+ /**
+ * Free a message buffer. This does NOT free the underlying array.
+ */
void free_tmsg(tmsg_t *msg);
+
+ /**
+ * Return underlying array of a message buffer
+ */
void *tmsg_data(tmsg_t *msg);
+
+ /**
+ * Return length of a message buffer
+ */
size_t tmsg_length(tmsg_t *msg);
+ /**
+ * Read an unsigned little-endian integer of 'bit_length' bits from bit offset
+ * 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
uint64_t tmsg_read_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length);
+
+ /**
+ * Read a signed little-endian integer of 'bit_length' bits from bit offset
+ * 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
int64_t tmsg_read_le(tmsg_t *msg, size_t bit_offset, size_t bit_length);
+
+ /**
+ * Write an unsigned little-endian integer of 'bit_length' bits to bit offset
+ * 'bit_offset'.
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value);
+
+ /**
+ * Write a signed little-endian integer of 'bit_length' bits to bit offset
+ * 'bit_offset'.
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_le(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value);
+ /**
+ * Read an unsigned big-endian integer of 'bit_length' bits from bit offset
+ * 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
uint64_t tmsg_read_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length);
+
+ /**
+ * Read a signed big-endian integer of 'bit_length' bits from bit offset
+ * 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
int64_t tmsg_read_be(tmsg_t *msg, size_t bit_offset, size_t bit_length);
+
+ /**
+ * Write an unsigned big-endian integer of 'bit_length' bits to bit offset
+ * 'bit_offset'.
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value);
+
+ /**
+ * Write a signed big-endian integer of 'bit_length' bits to bit offset
+ * 'bit_offset'.
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_be(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value);
+ /**
+ * Read a 32-bit IEEE float stored in little-endian format (bit 31: sign,
+ * bits 30-23: exponent, bits 22-0: mantissa) from bit offset 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
float tmsg_read_float_le(tmsg_t *msg, size_t offset);
+
+ /**
+ * Write a 32-bit IEEE float in little-endian format (bit 31: sign,
+ * bits 30-23: exponent, bits 22-0: mantissa) to bit offset 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_float_le(tmsg_t *msg, size_t offset, float x);
+
+ /**
+ * Read a 32-bit IEEE float stored in big-endian format (bit 31: sign,
+ * bits 30-23: exponent, bits 22-0: mantissa) from bit offset 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and 0 is returned.
+ */
float tmsg_read_float_be(tmsg_t *msg, size_t offset);
+
+ /**
+ * Write a 32-bit IEEE float in big-endian format (bit 31: sign,
+ * bits 30-23: exponent, bits 22-0: mantissa) to bit offset 'bit_offset'
+ * If the specified field is out of range for the buffer, tmsg_fail is called
+ * and no write occurs.
+ */
void tmsg_write_float_be(tmsg_t *msg, size_t offset, float x);
More information about the Tinyos-2-commits
mailing list