[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