diff --git a/g401302/project/g401302.uvopt b/g401302/project/g401302.uvopt
index dd76748..c727890 100644
--- a/g401302/project/g401302.uvopt
+++ b/g401302/project/g401302.uvopt
@@ -171,9 +171,24 @@
         <Bp>
           <Number>0</Number>
           <Type>0</Type>
+          <LineNumber>132</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134292266</Address>
+          <ByteObject>0</ByteObject>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>D:\shuwei\codewarehouse\water_g401\supwisdom\sp_card.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression></Expression>
+        </Bp>
+        <Bp>
+          <Number>1</Number>
+          <Type>0</Type>
           <LineNumber>296</LineNumber>
           <EnabledFlag>0</EnabledFlag>
-          <Address>134296380</Address>
+          <Address>134296360</Address>
           <ByteObject>0</ByteObject>
           <ManyObjects>0</ManyObjects>
           <SizeOfObject>0</SizeOfObject>
@@ -184,11 +199,11 @@
           <Expression>\\G401302_flow\../../supwisdom/sp_data.c\296</Expression>
         </Bp>
         <Bp>
-          <Number>1</Number>
+          <Number>2</Number>
           <Type>0</Type>
           <LineNumber>206</LineNumber>
           <EnabledFlag>1</EnabledFlag>
-          <Address>134291662</Address>
+          <Address>134291666</Address>
           <ByteObject>0</ByteObject>
           <ManyObjects>0</ManyObjects>
           <SizeOfObject>0</SizeOfObject>
@@ -716,9 +731,9 @@
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <Focus>0</Focus>
-      <ColumnNumber>1</ColumnNumber>
+      <ColumnNumber>0</ColumnNumber>
       <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>116</TopLine>
+      <TopLine>122</TopLine>
       <CurrentLine>132</CurrentLine>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\supwisdom\sp_card.c</PathWithFileName>
@@ -732,8 +747,8 @@
       <Focus>0</Focus>
       <ColumnNumber>0</ColumnNumber>
       <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>186</TopLine>
-      <CurrentLine>208</CurrentLine>
+      <TopLine>558</TopLine>
+      <CurrentLine>565</CurrentLine>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\supwisdom\sp_communicate.c</PathWithFileName>
       <FilenameWithoutPath>sp_communicate.c</FilenameWithoutPath>
@@ -744,10 +759,10 @@
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
+      <ColumnNumber>34</ColumnNumber>
       <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>551</TopLine>
-      <CurrentLine>558</CurrentLine>
+      <TopLine>592</TopLine>
+      <CurrentLine>607</CurrentLine>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\supwisdom\sp_consume.c</PathWithFileName>
       <FilenameWithoutPath>sp_consume.c</FilenameWithoutPath>
@@ -760,8 +775,8 @@
       <Focus>0</Focus>
       <ColumnNumber>0</ColumnNumber>
       <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>208</TopLine>
-      <CurrentLine>215</CurrentLine>
+      <TopLine>67</TopLine>
+      <CurrentLine>86</CurrentLine>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\supwisdom\sp_data.c</PathWithFileName>
       <FilenameWithoutPath>sp_data.c</FilenameWithoutPath>
@@ -1194,8 +1209,8 @@
       <Focus>0</Focus>
       <ColumnNumber>0</ColumnNumber>
       <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
+      <TopLine>762</TopLine>
+      <CurrentLine>767</CurrentLine>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\st_fw_lib\src\stm32f10x_spi.c</PathWithFileName>
       <FilenameWithoutPath>stm32f10x_spi.c</FilenameWithoutPath>
diff --git a/msgpack/cwpack.c b/msgpack/cwpack.c
index 496b4b3..774ceb7 100644
--- a/msgpack/cwpack.c
+++ b/msgpack/cwpack.c
@@ -1,18 +1,18 @@
 /*      CWPack - cwpack.c   */
 /*
  The MIT License (MIT)
- 
+
  Copyright (c) 2017 Claes Wihlborg
- 
+
  Permission is hereby granted, free of charge, to any person obtaining a copy of this
  software and associated documentation files (the "Software"), to deal in the Software
  without restriction, including without limitation the rights to use, copy, modify,
  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
  persons to whom the Software is furnished to do so, subject to the following conditions:
- 
+
  The above copyright notice and this permission notice shall be included in all copies or
  substantial portions of the Software.
- 
+
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
  BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
@@ -31,39 +31,40 @@
 
 #ifdef FORCE_NO_LIBRARY
 
-static void	*memcpy(void *dst, const void *src, size_t n)
+static void*	memcpy(void* dst, const void* src, size_t n)
 {
-    unsigned int i;
-    uint8_t *d=(uint8_t*)dst, *s=(uint8_t*)src;
-    for (i=0; i<n; i++)
-    {
-        *d++ = *s++;
-    }
-    return dst;
+  unsigned int i;
+  uint8_t* d;
+  uint8_t* s;
+  d=(uint8_t*)dst;
+  s=(uint8_t*)src;
+  for(i=0; i<n; i++)
+  {
+    *d++ = *s++;
+  }
+  return dst;
 }
 
 #endif
 
-
-
 /*************************   B Y T E   O R D E R   ****************************/
 
 
 static int test_byte_order(void)
 {
 #ifdef COMPILE_FOR_BIG_ENDIAN
-    const char *endianness = "1234";
-    if (*(uint32_t*)endianness != 0x31323334UL)
-        return CWP_RC_WRONG_BYTE_ORDER;
+  const char* endianness = "1234";
+  if(*(uint32_t*)endianness != 0x31323334UL)
+    return CWP_RC_WRONG_BYTE_ORDER;
 #else
 
 #ifdef COMPILE_FOR_LITTLE_ENDIAN
-    const char *endianness = "1234";
-    if (*(uint32_t*)endianness != 0x34333231UL)
-        return CWP_RC_WRONG_BYTE_ORDER;
+  const char* endianness = "1234";
+  if(*(uint32_t*)endianness != 0x34333231UL)
+    return CWP_RC_WRONG_BYTE_ORDER;
 #endif
 #endif
-    return CWP_RC_OK;
+  return CWP_RC_OK;
 }
 
 
@@ -71,20 +72,21 @@
 
 
 
-int cw_pack_context_init (cw_pack_context* pack_context, void* data, unsigned long length, pack_overflow_handler hpo)
+int cw_pack_context_init(cw_pack_context* pack_context, void* data, unsigned long length,
+                         pack_overflow_handler hpo)
 {
-    pack_context->start = pack_context->current = (uint8_t*)data;
-    pack_context->end = pack_context->start + length;
-    pack_context->be_compatible = false;
-    pack_context->err_no = 0;
-    pack_context->handle_pack_overflow = hpo;
-    pack_context->return_code = test_byte_order();
-    return pack_context->return_code;
+  pack_context->start = pack_context->current = (uint8_t*)data;
+  pack_context->end = pack_context->start + length;
+  pack_context->be_compatible = false;
+  pack_context->err_no = 0;
+  pack_context->handle_pack_overflow = hpo;
+  pack_context->return_code = test_byte_order();
+  return pack_context->return_code;
 }
 
-void cw_pack_set_compatibility (cw_pack_context* pack_context, bool be_compatible)
+void cw_pack_set_compatibility(cw_pack_context* pack_context, bool be_compatible)
 {
-    pack_context->be_compatible = be_compatible;
+  pack_context->be_compatible = be_compatible;
 }
 
 
@@ -94,314 +96,352 @@
 
 void cw_pack_unsigned(cw_pack_context* pack_context, uint64_t i)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (i < 128)
-        tryMove0(i);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
 
-    if (i < 256)
-        tryMove1(0xcc, i);
+  if(pack_context->return_code)
+    return;
 
-    if (i < 0x10000L)
-    {
-        tryMove2(0xcd, i);
-    }
-    if (i < 0x100000000LL)
-        tryMove4(0xce, i);
+  if(i < 128)
+    tryMove0(i);
 
-    tryMove8(0xcf,i);
+  if(i < 256)
+    tryMove1(0xcc, i);
+
+  if(i < 0x10000L)
+  {
+    tryMove2(0xcd, i);
+  }
+  if(i < 0x100000000LL)
+    tryMove4(0xce, i);
+
+  tryMove8(0xcf,i);
 }
 
 
 void cw_pack_signed(cw_pack_context* pack_context, int64_t i)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (i >127)
-    {
-        if (i < 256)
-            tryMove1(0xcc, i);
-        
-        if (i < 0x10000L)
-            tryMove2(0xcd, i);
-        
-        if (i < 0x100000000LL)
-            tryMove4(0xce, i);
-        
-        tryMove8(0xcf,i);
-    }
-    
-    if (i >= -32)
-        tryMove0(i);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
 
-    if (i >= -128)
-        tryMove1(0xd0, i);
-    
-    if (i >= -32768)
-        tryMove2(0xd1,i);
+  if(i >127)
+  {
+    if(i < 256)
+      tryMove1(0xcc, i);
 
-    if (i >= (int64_t)0xffffffff80000000LL)
-        tryMove4(0xd2,i);
+    if(i < 0x10000L)
+      tryMove2(0xcd, i);
 
-    tryMove8(0xd3,i);
+    if(i < 0x100000000LL)
+      tryMove4(0xce, i);
+
+    tryMove8(0xcf,i);
+  }
+
+  if(i >= -32)
+    tryMove0(i);
+
+  if(i >= -128)
+    tryMove1(0xd0, i);
+
+  if(i >= -32768)
+    tryMove2(0xd1,i);
+
+  if(i >= (int64_t)0xffffffff80000000LL)
+    tryMove4(0xd2,i);
+
+  tryMove8(0xd3,i);
 }
 
 
 void cw_pack_float(cw_pack_context* pack_context, float f)
 {
-    if (pack_context->return_code)
-        return;
-    
-    uint32_t tmp = *((uint32_t*)&f);
-    tryMove4(0xca,tmp);
+  uint32_t tmp;
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  tmp = *((uint32_t*)&f);
+  tryMove4(0xca,tmp);
 }
 
 
 void cw_pack_double(cw_pack_context* pack_context, double d)
 {
-    if (pack_context->return_code)
-        return;
-    
-    uint64_t tmp = *((uint64_t*)&d);
-    tryMove8(0xcb,tmp);
+  uint64_t tmp;
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  tmp = *((uint64_t*)&d);
+  tryMove8(0xcb,tmp);
 }
 
 
-void cw_pack_real (cw_pack_context* pack_context, double d)
+void cw_pack_real(cw_pack_context* pack_context, double d)
 {
-    float f = (float)d;
-    double df = f;
-    if (df == d)
-        cw_pack_float (pack_context, f);
-    else
-        cw_pack_double (pack_context, d);
+  float f = (float)d;
+  double df = f;
+  if(df == d)
+    cw_pack_float(pack_context, f);
+  else
+    cw_pack_double(pack_context, d);
 }
 
 
 void cw_pack_nil(cw_pack_context* pack_context)
 {
-    if (pack_context->return_code)
-        return;
-    
-    tryMove0(0xc0);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  tryMove0(0xc0);
 }
 
 
-void cw_pack_true (cw_pack_context* pack_context)
+void cw_pack_true(cw_pack_context* pack_context)
 {
-    if (pack_context->return_code)
-        return;
-    
-    tryMove0(0xc3);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  tryMove0(0xc3);
 }
 
 
-void cw_pack_false (cw_pack_context* pack_context)
+void cw_pack_false(cw_pack_context* pack_context)
 {
-    if (pack_context->return_code)
-        return;
-    
-    tryMove0(0xc2);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  tryMove0(0xc2);
 }
 
 
 void cw_pack_boolean(cw_pack_context* pack_context, bool b)
 {
-    if (pack_context->return_code)
-        return;
-    
-    tryMove0(b? 0xc3: 0xc2);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+  tryMove0(b? 0xc3: 0xc2);
 }
 
 
 void cw_pack_array_size(cw_pack_context* pack_context, uint32_t n)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (n < 16)
-        tryMove0(0x90 | n);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
 
-    if (n < 65536)
-        tryMove2(0xdc, n);
+  if(n < 16)
+    tryMove0(0x90 | n);
 
-    tryMove4(0xdd, n);
+  if(n < 65536)
+    tryMove2(0xdc, n);
+
+  tryMove4(0xdd, n);
 }
 
 
 void cw_pack_map_size(cw_pack_context* pack_context, uint32_t n)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (n < 16)
-        tryMove0(0x80 | n);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
 
-    if (n < 65536)
-        tryMove2(0xde, n);
+  if(pack_context->return_code)
+    return;
 
-    tryMove4(0xdf, n);
+  if(n < 16)
+    tryMove0(0x80 | n);
+
+  if(n < 65536)
+    tryMove2(0xde, n);
+
+  tryMove4(0xdf, n);
 }
 
 
 void cw_pack_str(cw_pack_context* pack_context, const char* v, uint32_t l)
 {
-    if (pack_context->return_code)
-        return;
-    
-    uint8_t *p;
-    
-    if (l < 32)             // Fixstr
-    {
-        cw_pack_reserve_space(l+1);
-        *p = (uint8_t)(0xa0 + l);
-        memcpy(p+1,v,l);
-        return;
-    }
-    if (l < 256 && !pack_context->be_compatible)       // Str 8
-    {
-        cw_pack_reserve_space(l+2);
-        *p++ = (uint8_t)(0xd9);
-        *p = (uint8_t)(l);
-        memcpy(p+1,v,l);
-        return;
-    }
-    if (l < 65536)     // Str 16
-    {
-        cw_pack_reserve_space(l+3)
-        *p++ = (uint8_t)0xda;
-        cw_store16(l);
-        memcpy(p+2,v,l);
-        return;
-    }
-    // Str 32
-    cw_pack_reserve_space(l+5)
-    *p++ = (uint8_t)0xdb;
-    cw_store32(l);
-    memcpy(p+4,v,l);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
     return;
+
+  if(l < 32)              // Fixstr
+  {
+    cw_pack_reserve_space(l+1);
+    *p = (uint8_t)(0xa0 + l);
+    memcpy(p+1,v,l);
+    return;
+  }
+  if(l < 256 && !pack_context->be_compatible)        // Str 8
+  {
+    cw_pack_reserve_space(l+2);
+    *p++ = (uint8_t)(0xd9);
+    *p = (uint8_t)(l);
+    memcpy(p+1,v,l);
+    return;
+  }
+  if(l < 65536)      // Str 16
+  {
+    cw_pack_reserve_space(l+3)
+    *p++ = (uint8_t)0xda;
+    cw_store16(l);
+    memcpy(p+2,v,l);
+    return;
+  }
+  // Str 32
+  cw_pack_reserve_space(l+5)
+  *p++ = (uint8_t)0xdb;
+  cw_store32(l);
+  memcpy(p+4,v,l);
+  return;
 }
 
 
 void cw_pack_bin(cw_pack_context* pack_context, const void* v, uint32_t l)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (pack_context->be_compatible)
-    {
-        cw_pack_str( pack_context, v, l);
-        return;
-    }
-    
-    uint8_t *p;
-    
-    if (l < 256)            // Bin 8
-    {
-        cw_pack_reserve_space(l+2);
-        *p++ = (uint8_t)(0xc4);
-        *p = (uint8_t)(l);
-        memcpy(p+1,v,l);
-        return;
-    }
-    if (l < 65536)     // Bin 16
-    {
-        cw_pack_reserve_space(l+3)
-        *p++ = (uint8_t)0xc5;
-        cw_store16(l);
-        memcpy(p+2,v,l);
-        return;
-    }
-    // Bin 32
-    cw_pack_reserve_space(l+5)
-    *p++ = (uint8_t)0xc6;
-    cw_store32(l);
-    memcpy(p+4,v,l);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
     return;
+
+  if(pack_context->be_compatible)
+  {
+    cw_pack_str(pack_context, v, l);
+    return;
+  }
+  if(l < 256)             // Bin 8
+  {
+    cw_pack_reserve_space(l+2);
+    *p++ = (uint8_t)(0xc4);
+    *p = (uint8_t)(l);
+    memcpy(p+1,v,l);
+    return;
+  }
+  if(l < 65536)      // Bin 16
+  {
+    cw_pack_reserve_space(l+3)
+    *p++ = (uint8_t)0xc5;
+    cw_store16(l);
+    memcpy(p+2,v,l);
+    return;
+  }
+  // Bin 32
+  cw_pack_reserve_space(l+5)
+  *p++ = (uint8_t)0xc6;
+  cw_store32(l);
+  memcpy(p+4,v,l);
+  return;
 }
 
 
-void cw_pack_ext (cw_pack_context* pack_context, int8_t type, const void* v, uint32_t l)
+void cw_pack_ext(cw_pack_context* pack_context, int8_t type, const void* v, uint32_t l)
 {
-    if (pack_context->return_code)
-        return;
-    
-    if (pack_context->be_compatible)
-        PACK_ERROR(CWP_RC_ILLEGAL_CALL);
-    
-    uint8_t *p;
-    
-    switch (l)
-    {
-        case 1:                                         // Fixext 1
-            cw_pack_reserve_space(3);
-            *p++ = (uint8_t)0xd4;
-            *p++ = (uint8_t)type;
-            *p++ = *(uint8_t*)v;
-            return;
-        case 2:                                         // Fixext 2
-            cw_pack_reserve_space(4);
-            *p++ = (uint8_t)0xd5;
-            break;
-        case 4:                                         // Fixext 4
-            cw_pack_reserve_space(6);
-            *p++ = (uint8_t)0xd6;
-            break;
-        case 8:                                         // Fixext 8
-            cw_pack_reserve_space(10);
-            *p++ = (uint8_t)0xd7;
-            break;
-        case 16:                                        // Fixext16
-            cw_pack_reserve_space(18);
-            *p++ = (uint8_t)0xd8;
-            break;
-        default:
-            if (l < 256)                                // Ext 8
-            {
-                cw_pack_reserve_space(l+3);
-                *p++ = (uint8_t)0xc7;
-                *p++ = (uint8_t)(l);
-            }
-            else if (l < 65536)                         // Ext 16
-            {
-                cw_pack_reserve_space(l+4)
-                *p++ = (uint8_t)0xc8;
-                cw_store16(l);
-                p += 2;
-            }
-            else                                        // Ext 32
-            {
-                cw_pack_reserve_space(l+6)
-                *p++ = (uint8_t)0xc9;
-                cw_store32(l);
-                p += 4;
-            }
-    }
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  if(pack_context->return_code)
+    return;
+
+  if(pack_context->be_compatible)
+    PACK_ERROR(CWP_RC_ILLEGAL_CALL);
+
+  switch(l)
+  {
+  case 1:                                         // Fixext 1
+    cw_pack_reserve_space(3);
+    *p++ = (uint8_t)0xd4;
     *p++ = (uint8_t)type;
-    memcpy(p,v,l);
+    *p++ = *(uint8_t*)v;
+    return;
+  case 2:                                         // Fixext 2
+    cw_pack_reserve_space(4);
+    *p++ = (uint8_t)0xd5;
+    break;
+  case 4:                                         // Fixext 4
+    cw_pack_reserve_space(6);
+    *p++ = (uint8_t)0xd6;
+    break;
+  case 8:                                         // Fixext 8
+    cw_pack_reserve_space(10);
+    *p++ = (uint8_t)0xd7;
+    break;
+  case 16:                                        // Fixext16
+    cw_pack_reserve_space(18);
+    *p++ = (uint8_t)0xd8;
+    break;
+  default:
+    if(l < 256)                                 // Ext 8
+    {
+      cw_pack_reserve_space(l+3);
+      *p++ = (uint8_t)0xc7;
+      *p++ = (uint8_t)(l);
+    }
+    else if(l < 65536)                          // Ext 16
+    {
+      cw_pack_reserve_space(l+4)
+      *p++ = (uint8_t)0xc8;
+      cw_store16(l);
+      p += 2;
+    }
+    else                                        // Ext 32
+    {
+      cw_pack_reserve_space(l+6)
+      *p++ = (uint8_t)0xc9;
+      cw_store32(l);
+      p += 4;
+    }
+  }
+  *p++ = (uint8_t)type;
+  memcpy(p,v,l);
 }
 
 
-void cw_pack_insert (cw_pack_context* pack_context, const void* v, uint32_t l)
+void cw_pack_insert(cw_pack_context* pack_context, const void* v, uint32_t l)
 {
-    uint8_t *p;
-    cw_pack_reserve_space(l);
-    memcpy(p,v,l);
+  int rc;
+  uint8_t* p;
+  uint8_t* nyp;
+  cw_pack_reserve_space(l);
+  memcpy(p,v,l);
 }
 
 /*******************************   U N P A C K   **********************************/
 
 
-int cw_unpack_context_init (cw_unpack_context* unpack_context, void* data, unsigned long length, unpack_underflow_handler huu)
+int cw_unpack_context_init(cw_unpack_context* unpack_context, void* data,
+                           unsigned long length, unpack_underflow_handler huu)
 {
-    unpack_context->start = unpack_context->current = (uint8_t*)data;
-    unpack_context->end = unpack_context->start + length;
-    unpack_context->return_code = test_byte_order();
-    unpack_context->err_no = 0;
-    unpack_context->handle_unpack_underflow = huu;
-    return unpack_context->return_code;
+  unpack_context->start = unpack_context->current = (uint8_t*)data;
+  unpack_context->end = unpack_context->start + length;
+  unpack_context->return_code = test_byte_order();
+  unpack_context->err_no = 0;
+  unpack_context->handle_unpack_underflow = huu;
+  return unpack_context->return_code;
 }
 
 
@@ -409,264 +449,274 @@
 
 
 
-void cw_unpack_next (cw_unpack_context* unpack_context)
+void cw_unpack_next(cw_unpack_context* unpack_context)
 {
-    if (unpack_context->return_code)
-        return;
+  uint64_t    tmpu64;
+  uint32_t    tmpu32;
+  uint16_t    tmpu16;
+  uint8_t*    p;
+  uint8_t c;
+  uint8_t* nyp;
+  int rc;
 
-    uint64_t    tmpu64;
-    uint32_t    tmpu32;
-    uint16_t    tmpu16;
-    uint8_t*    p;
-    
+  if(unpack_context->return_code)
+    return;
+
 #define buffer_end_return_code  CWP_RC_END_OF_INPUT;
-    cw_unpack_assert_space(1);
-    uint8_t c = *p;
+  cw_unpack_assert_space(1);
+  c = *p;
 #undef buffer_end_return_code
 #define buffer_end_return_code  CWP_RC_BUFFER_UNDERFLOW;
-    switch (c)
-    {
-        case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
-        case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
-        case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
-        case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
-        case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
-        case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
-        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
-        case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
-        case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
-        case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
-        case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
-        case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
-        case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
-        case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
-        case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
-        case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
-                    getDDItem(CWP_ITEM_POSITIVE_INTEGER, i64, c);       return;  // positive fixnum
-        case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
-        case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
-                    getDDItem(CWP_ITEM_MAP, map.size, c & 0x0f);        return;  // fixmap
-        case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
-        case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
-                    getDDItem(CWP_ITEM_ARRAY, array.size, c & 0x0f);    return;  // fixarray
-        case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
-        case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
-        case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
-        case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
-                    getDDItem(CWP_ITEM_STR, str.length, c & 0x1f);              // fixraw
-                    cw_unpack_assert_blob(str);
-        case 0xc0:  unpack_context->item.type = CWP_ITEM_NIL;           return;  // nil
-        case 0xc2:  getDDItem(CWP_ITEM_BOOLEAN, boolean, false);        return;  // false
-        case 0xc3:  getDDItem(CWP_ITEM_BOOLEAN, boolean, true);         return;  // true
-        case 0xc4:  getDDItem1(CWP_ITEM_BIN, bin.length, uint8_t);              // bin 8
-                    cw_unpack_assert_blob(bin);
-        case 0xc5:  getDDItem2(CWP_ITEM_BIN, bin.length, uint16_t);             // bin 16
-                    cw_unpack_assert_blob(bin);
-        case 0xc6:  getDDItem4(CWP_ITEM_BIN, bin.length, uint32_t);             // bin 32
-                    cw_unpack_assert_blob(bin);
-        case 0xc7:  getDDItem1(CWP_ITEM_EXT, ext.length, uint8_t);              // ext 8
-                    cw_unpack_assert_space(1);
-                    unpack_context->item.type = *(int8_t*)p;
-                    cw_unpack_assert_blob(ext);
-        case 0xc8:  getDDItem2(CWP_ITEM_EXT, ext.length, uint16_t);             // ext 16
-                    cw_unpack_assert_space(1);
-                    unpack_context->item.type = *(int8_t*)p;
-                    cw_unpack_assert_blob(ext);
-        case 0xc9:  getDDItem4(CWP_ITEM_EXT, ext.length, uint32_t);             // ext 32
-                    cw_unpack_assert_space(1);
-                    unpack_context->item.type = *(int8_t*)p;
-                    cw_unpack_assert_blob(ext);
-        case 0xca:  unpack_context->item.type = CWP_ITEM_FLOAT;                 // float
-                    cw_unpack_assert_space(4);
-                    cw_load32(p);
-                    unpack_context->item.as.real = *(float*)&tmpu32;     return;
-        case 0xcb:  getDDItem8(CWP_ITEM_DOUBLE);                         return;  // double
-        case 0xcc:  getDDItem1(CWP_ITEM_POSITIVE_INTEGER, u64, uint8_t); return;  // unsigned int  8
-        case 0xcd:  getDDItem2(CWP_ITEM_POSITIVE_INTEGER, u64, uint16_t); return; // unsigned int 16
-        case 0xce:  getDDItem4(CWP_ITEM_POSITIVE_INTEGER, u64, uint32_t); return; // unsigned int 32
-        case 0xcf:  getDDItem8(CWP_ITEM_POSITIVE_INTEGER);               return;  // unsigned int 64
-        case 0xd0:  getDDItem1(CWP_ITEM_NEGATIVE_INTEGER, i64, int8_t);          // signed int  8
-                    if (unpack_context->item.as.i64 >= 0)
-                        unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
-                    return;
-        case 0xd1:  getDDItem2(CWP_ITEM_NEGATIVE_INTEGER, i64, int16_t);        // signed int 16
-                    if (unpack_context->item.as.i64 >= 0)
-                        unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
-                    return;
-        case 0xd2:  getDDItem4(CWP_ITEM_NEGATIVE_INTEGER, i64, int32_t);        // signed int 32
-                    if (unpack_context->item.as.i64 >= 0)
-                        unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
-                    return;
-        case 0xd3:  getDDItem8(CWP_ITEM_NEGATIVE_INTEGER);						// signed int 64
-                    if (unpack_context->item.as.i64 >= 0)
-                        unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
-                    return;
-        case 0xd4:  getDDItemFix(1);                                            // fixext 1
-        case 0xd5:  getDDItemFix(2);                                            // fixext 2
-        case 0xd6:  getDDItemFix(4);                                            // fixext 4
-        case 0xd7:  getDDItemFix(8);                                            // fixext 8
-        case 0xd8:  getDDItemFix(16);                                           // fixext 16
-        case 0xd9:  getDDItem1(CWP_ITEM_STR, str.length, uint8_t);              // str 8
-                    cw_unpack_assert_blob(str);
-        case 0xda:  getDDItem2(CWP_ITEM_STR, str.length, uint16_t);             // str 16
-                    cw_unpack_assert_blob(str);
-        case 0xdb:  getDDItem4(CWP_ITEM_STR, str.length, uint32_t);             // str 32
-                    cw_unpack_assert_blob(str);
-        case 0xdc:  getDDItem2(CWP_ITEM_ARRAY, array.size, uint16_t);   return;  // array 16
-        case 0xdd:  getDDItem4(CWP_ITEM_ARRAY, array.size, uint32_t);   return;  // array 32
-        case 0xde:  getDDItem2(CWP_ITEM_MAP, map.size, uint16_t);       return;  // map 16
-        case 0xdf:  getDDItem4(CWP_ITEM_MAP, map.size, uint32_t);       return;  // map 32
-        case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
-        case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
-        case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
-        case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
-                    getDDItem(CWP_ITEM_NEGATIVE_INTEGER, i64, (int8_t)c); return;    // negative fixnum
-        default:
-                    UNPACK_ERROR(CWP_RC_MALFORMED_INPUT)
-    }
+  switch(c)
+  {
+  case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
+  case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+  case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
+  case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
+  case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
+  case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+  case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
+  case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
+  case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
+  case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
+  case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
+  case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
+  case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
+  case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
+  case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
+  case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
+    getDDItem(CWP_ITEM_POSITIVE_INTEGER, i64, c);       return;  // positive fixnum
+  case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
+  case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
+    getDDItem(CWP_ITEM_MAP, map.size, c & 0x0f);        return;  // fixmap
+  case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
+  case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
+    getDDItem(CWP_ITEM_ARRAY, array.size, c & 0x0f);    return;  // fixarray
+  case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
+  case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
+  case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
+  case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+    getDDItem(CWP_ITEM_STR, str.length, c & 0x1f);              // fixraw
+    cw_unpack_assert_blob(str);
+  case 0xc0:  unpack_context->item.type = CWP_ITEM_NIL;           return;  // nil
+  case 0xc2:  getDDItem(CWP_ITEM_BOOLEAN, boolean, false);        return;  // false
+  case 0xc3:  getDDItem(CWP_ITEM_BOOLEAN, boolean, true);         return;  // true
+  case 0xc4:  getDDItem1(CWP_ITEM_BIN, bin.length, uint8_t);              // bin 8
+    cw_unpack_assert_blob(bin);
+  case 0xc5:  getDDItem2(CWP_ITEM_BIN, bin.length, uint16_t);             // bin 16
+    cw_unpack_assert_blob(bin);
+  case 0xc6:  getDDItem4(CWP_ITEM_BIN, bin.length, uint32_t);             // bin 32
+    cw_unpack_assert_blob(bin);
+  case 0xc7:  getDDItem1(CWP_ITEM_EXT, ext.length, uint8_t);              // ext 8
+    cw_unpack_assert_space(1);
+    unpack_context->item.type = *(int8_t*)p;
+    cw_unpack_assert_blob(ext);
+  case 0xc8:  getDDItem2(CWP_ITEM_EXT, ext.length, uint16_t);             // ext 16
+    cw_unpack_assert_space(1);
+    unpack_context->item.type = *(int8_t*)p;
+    cw_unpack_assert_blob(ext);
+  case 0xc9:  getDDItem4(CWP_ITEM_EXT, ext.length, uint32_t);             // ext 32
+    cw_unpack_assert_space(1);
+    unpack_context->item.type = *(int8_t*)p;
+    cw_unpack_assert_blob(ext);
+  case 0xca:  unpack_context->item.type = CWP_ITEM_FLOAT;                 // float
+    cw_unpack_assert_space(4);
+    cw_load32(p);
+    unpack_context->item.as.real = *(float*)&tmpu32;     return;
+  case 0xcb:  getDDItem8(CWP_ITEM_DOUBLE);                         return;  // double
+  case 0xcc:  getDDItem1(CWP_ITEM_POSITIVE_INTEGER, u64, uint8_t);
+    return;  // unsigned int  8
+  case 0xcd:  getDDItem2(CWP_ITEM_POSITIVE_INTEGER, u64, uint16_t);
+    return; // unsigned int 16
+  case 0xce:  getDDItem4(CWP_ITEM_POSITIVE_INTEGER, u64, uint32_t);
+    return; // unsigned int 32
+  case 0xcf:  getDDItem8(CWP_ITEM_POSITIVE_INTEGER);
+    return;  // unsigned int 64
+  case 0xd0:  getDDItem1(CWP_ITEM_NEGATIVE_INTEGER, i64, int8_t);          // signed int  8
+    if(unpack_context->item.as.i64 >= 0)
+      unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
+    return;
+  case 0xd1:  getDDItem2(CWP_ITEM_NEGATIVE_INTEGER, i64, int16_t);        // signed int 16
+    if(unpack_context->item.as.i64 >= 0)
+      unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
+    return;
+  case 0xd2:  getDDItem4(CWP_ITEM_NEGATIVE_INTEGER, i64, int32_t);        // signed int 32
+    if(unpack_context->item.as.i64 >= 0)
+      unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
+    return;
+  case 0xd3:  getDDItem8(CWP_ITEM_NEGATIVE_INTEGER);						// signed int 64
+    if(unpack_context->item.as.i64 >= 0)
+      unpack_context->item.type = CWP_ITEM_POSITIVE_INTEGER;
+    return;
+  case 0xd4:  getDDItemFix(1);                                            // fixext 1
+  case 0xd5:  getDDItemFix(2);                                            // fixext 2
+  case 0xd6:  getDDItemFix(4);                                            // fixext 4
+  case 0xd7:  getDDItemFix(8);                                            // fixext 8
+  case 0xd8:  getDDItemFix(16);                                           // fixext 16
+  case 0xd9:  getDDItem1(CWP_ITEM_STR, str.length, uint8_t);              // str 8
+    cw_unpack_assert_blob(str);
+  case 0xda:  getDDItem2(CWP_ITEM_STR, str.length, uint16_t);             // str 16
+    cw_unpack_assert_blob(str);
+  case 0xdb:  getDDItem4(CWP_ITEM_STR, str.length, uint32_t);             // str 32
+    cw_unpack_assert_blob(str);
+  case 0xdc:  getDDItem2(CWP_ITEM_ARRAY, array.size, uint16_t);   return;  // array 16
+  case 0xdd:  getDDItem4(CWP_ITEM_ARRAY, array.size, uint32_t);   return;  // array 32
+  case 0xde:  getDDItem2(CWP_ITEM_MAP, map.size, uint16_t);       return;  // map 16
+  case 0xdf:  getDDItem4(CWP_ITEM_MAP, map.size, uint32_t);       return;  // map 32
+  case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
+  case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
+  case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
+  case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
+    getDDItem(CWP_ITEM_NEGATIVE_INTEGER, i64, (int8_t)c); return;    // negative fixnum
+  default:
+    UNPACK_ERROR(CWP_RC_MALFORMED_INPUT)
+  }
 }
 
 #define cw_skip_bytes(n)                                \
-    cw_unpack_assert_space((n));                          \
-    break;
+  cw_unpack_assert_space((n));                          \
+  break;
 
-void cw_skip_items (cw_unpack_context* unpack_context, long item_count)
+void cw_skip_items(cw_unpack_context* unpack_context, long item_count)
 {
-    if (unpack_context->return_code)
-        return;
-    
-    uint32_t    tmpu32;
-    uint16_t    tmpu16;
-    uint8_t*    p;
-    
-    while (item_count-- > 0)
-    {
+  uint32_t    tmpu32;
+  uint16_t    tmpu16;
+  uint8_t*    p;
+  uint8_t c;
+  uint8_t* nyp;
+  int rc;
+
+  if(unpack_context->return_code)
+    return;
+
+  while(item_count-- > 0)
+  {
 #undef buffer_end_return_code
 #define buffer_end_return_code  CWP_RC_END_OF_INPUT;
-        cw_unpack_assert_space(1);
-        uint8_t c = *p;
+    cw_unpack_assert_space(1);
+    c = *p;
 
 #undef buffer_end_return_code
 #define buffer_end_return_code  CWP_RC_BUFFER_UNDERFLOW;
-        switch (c)
-        {
-            case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
-            case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
-            case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
-            case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
-            case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
-            case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
-            case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
-            case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
-            case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
-            case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
-            case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
-            case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
-            case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
-            case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
-            case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
-            case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
-                                                                // unsigned fixint
-            case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
-            case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
-            case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
-            case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
-                                                                // signed fixint
-            case 0xc0:                                          // nil
-            case 0xc2:                                          // false
-            case 0xc3:  break;                                  // true
-            case 0xcc:                                          // unsigned int  8
-            case 0xd0:	cw_skip_bytes(1);                       // signed int  8
-            case 0xcd:                                          // unsigned int 16
-            case 0xd1:                                          // signed int 16
-            case 0xd4:  cw_skip_bytes(2);                       // fixext 1
-            case 0xd5:  cw_skip_bytes(3);                       // fixext 2
-            case 0xca:                                          // float
-            case 0xce:                                          // unsigned int 32
-            case 0xd2:  cw_skip_bytes(4);                       // signed int 32
-            case 0xd6:  cw_skip_bytes(5);                       // fixext 4
-            case 0xcb:                                          // double
-            case 0xcf:                                          // unsigned int 64
-            case 0xd3:  cw_skip_bytes(8);                       // signed int 64
-            case 0xd7:  cw_skip_bytes(9);                       // fixext 8
-            case 0xd8:  cw_skip_bytes(17);                      // fixext 16
-            case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
-            case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
-            case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
-            case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
-                cw_skip_bytes(c & 0x1f);                        // fixstr
-            case 0xd9:                                          // str 8
-            case 0xc4:                                          // bin 8
-                cw_unpack_assert_space(1);
-                tmpu32 = *p;
-                cw_skip_bytes(tmpu32);
-                
-            case 0xda:                                          // str 16
-            case 0xc5:                                          // bin 16
-                cw_unpack_assert_space(2);
-                cw_load16(p);
-                cw_skip_bytes(tmpu16);
-                
-            case 0xdb:                                          // str 32
-            case 0xc6:                                          // bin 32
-                cw_unpack_assert_space(4);
-                cw_load32(p);
-                cw_skip_bytes(tmpu32);
-                
-            case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
-            case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
-                item_count += 2*(c & 15);                       // FixMap
-                break;
+    switch(c)
+    {
+    case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
+    case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+    case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
+    case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
+    case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
+    case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+    case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
+    case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
+    case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
+    case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
+    case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
+    case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
+    case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
+    case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
+    case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
+    case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
+    // unsigned fixint
+    case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
+    case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
+    case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
+    case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
+    // signed fixint
+    case 0xc0:                                          // nil
+    case 0xc2:                                          // false
+    case 0xc3:  break;                                  // true
+    case 0xcc:                                          // unsigned int  8
+    case 0xd0:	cw_skip_bytes(1);                       // signed int  8
+    case 0xcd:                                          // unsigned int 16
+    case 0xd1:                                          // signed int 16
+    case 0xd4:  cw_skip_bytes(2);                       // fixext 1
+    case 0xd5:  cw_skip_bytes(3);                       // fixext 2
+    case 0xca:                                          // float
+    case 0xce:                                          // unsigned int 32
+    case 0xd2:  cw_skip_bytes(4);                       // signed int 32
+    case 0xd6:  cw_skip_bytes(5);                       // fixext 4
+    case 0xcb:                                          // double
+    case 0xcf:                                          // unsigned int 64
+    case 0xd3:  cw_skip_bytes(8);                       // signed int 64
+    case 0xd7:  cw_skip_bytes(9);                       // fixext 8
+    case 0xd8:  cw_skip_bytes(17);                      // fixext 16
+    case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
+    case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
+    case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
+    case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+      cw_skip_bytes(c & 0x1f);                        // fixstr
+    case 0xd9:                                          // str 8
+    case 0xc4:                                          // bin 8
+      cw_unpack_assert_space(1);
+      tmpu32 = *p;
+      cw_skip_bytes(tmpu32);
 
-            case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
-            case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
-                item_count += c & 15;                           // FixArray
-                break;
-                
-            case 0xdc:                                          // array 16
-                cw_unpack_assert_space(2);
-                cw_load16(p);
-                item_count += tmpu16;
-                break;
-                
-            case 0xde:                                          // map 16
-                cw_unpack_assert_space(2);
-                cw_load16(p);
-                item_count += 2*tmpu16;
-                break;
-                
-            case 0xdd:                                          // array 32
-                cw_unpack_assert_space(4);
-                cw_load32(p);
-                item_count += tmpu32;
-                break;
-                
-            case 0xdf:                                          // map 32
-                cw_unpack_assert_space(4);
-                cw_load32(p);
-                item_count += 2*tmpu32;
-                break;
-                
-            case 0xc7:                                          // ext 8
-                cw_unpack_assert_space(1);
-                tmpu32 = *p;
-                cw_skip_bytes(tmpu32 +1);
-                
-            case 0xc8:                                          // ext 16
-                cw_unpack_assert_space(2);
-                cw_load16(p);
-                cw_skip_bytes(tmpu16 +1);
-                
-            case 0xc9:                                          // ext 32
-                cw_unpack_assert_space(4);
-                cw_load32(p);
-                cw_skip_bytes(tmpu32 +1);
-                
-            default:                                            // illegal
-                UNPACK_ERROR(CWP_RC_MALFORMED_INPUT)
-        }
+    case 0xda:                                          // str 16
+    case 0xc5:                                          // bin 16
+      cw_unpack_assert_space(2);
+      cw_load16(p);
+      cw_skip_bytes(tmpu16);
+
+    case 0xdb:                                          // str 32
+    case 0xc6:                                          // bin 32
+      cw_unpack_assert_space(4);
+      cw_load32(p);
+      cw_skip_bytes(tmpu32);
+
+    case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
+    case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
+      item_count += 2*(c & 15);                       // FixMap
+      break;
+
+    case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
+    case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
+      item_count += c & 15;                           // FixArray
+      break;
+
+    case 0xdc:                                          // array 16
+      cw_unpack_assert_space(2);
+      cw_load16(p);
+      item_count += tmpu16;
+      break;
+
+    case 0xde:                                          // map 16
+      cw_unpack_assert_space(2);
+      cw_load16(p);
+      item_count += 2*tmpu16;
+      break;
+
+    case 0xdd:                                          // array 32
+      cw_unpack_assert_space(4);
+      cw_load32(p);
+      item_count += tmpu32;
+      break;
+
+    case 0xdf:                                          // map 32
+      cw_unpack_assert_space(4);
+      cw_load32(p);
+      item_count += 2*tmpu32;
+      break;
+
+    case 0xc7:                                          // ext 8
+      cw_unpack_assert_space(1);
+      tmpu32 = *p;
+      cw_skip_bytes(tmpu32 +1);
+
+    case 0xc8:                                          // ext 16
+      cw_unpack_assert_space(2);
+      cw_load16(p);
+      cw_skip_bytes(tmpu16 +1);
+
+    case 0xc9:                                          // ext 32
+      cw_unpack_assert_space(4);
+      cw_load32(p);
+      cw_skip_bytes(tmpu32 +1);
+
+    default:                                            // illegal
+      UNPACK_ERROR(CWP_RC_MALFORMED_INPUT)
     }
-    return;
+  }
+  return;
 }
 
 /* end cwpack.c */
diff --git a/msgpack/cwpack.h b/msgpack/cwpack.h
index c297d56..6e90dea 100644
--- a/msgpack/cwpack.h
+++ b/msgpack/cwpack.h
@@ -1,18 +1,18 @@
 /*      CWPack - cwpack.h   */
 /*
  The MIT License (MIT)
- 
+
  Copyright (c) 2017 Claes Wihlborg
- 
+
  Permission is hereby granted, free of charge, to any person obtaining a copy of this
  software and associated documentation files (the "Software"), to deal in the Software
  without restriction, including without limitation the rights to use, copy, modify,
  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
  persons to whom the Software is furnished to do so, subject to the following conditions:
- 
+
  The above copyright notice and this permission notice shall be included in all copies or
  substantial portions of the Software.
- 
+
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
  BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
@@ -54,39 +54,42 @@
 
 typedef int (*pack_overflow_handler)(struct cw_pack_context*, unsigned long);
 
-typedef struct cw_pack_context {
-    uint8_t*                start;
-    uint8_t*                current;
-    uint8_t*                end;
-    bool                    be_compatible;
-    int                     return_code;
-    int                     err_no;          /* handlers can save error here */
-    pack_overflow_handler   handle_pack_overflow;
+typedef struct cw_pack_context
+{
+  uint8_t*                start;
+  uint8_t*                current;
+  uint8_t*                end;
+  bool                    be_compatible;
+  int                     return_code;
+  int                     err_no;          /* handlers can save error here */
+  pack_overflow_handler   handle_pack_overflow;
 } cw_pack_context;
 
 
-int cw_pack_context_init (cw_pack_context* pack_context, void* data, unsigned long length, pack_overflow_handler hpo);
-void cw_pack_set_compatibility (cw_pack_context* pack_context, bool be_compatible);
+int cw_pack_context_init(cw_pack_context* pack_context, void* data, unsigned long length,
+                         pack_overflow_handler hpo);
+void cw_pack_set_compatibility(cw_pack_context* pack_context, bool be_compatible);
 
-void cw_pack_nil (cw_pack_context* pack_context);
-void cw_pack_true (cw_pack_context* pack_context);
-void cw_pack_false (cw_pack_context* pack_context);
-void cw_pack_boolean (cw_pack_context* pack_context, bool b);
+void cw_pack_nil(cw_pack_context* pack_context);
+void cw_pack_true(cw_pack_context* pack_context);
+void cw_pack_false(cw_pack_context* pack_context);
+void cw_pack_boolean(cw_pack_context* pack_context, bool b);
 
-void cw_pack_signed (cw_pack_context* pack_context, int64_t i);
-void cw_pack_unsigned (cw_pack_context* pack_context, uint64_t i);
+void cw_pack_signed(cw_pack_context* pack_context, int64_t i);
+void cw_pack_unsigned(cw_pack_context* pack_context, uint64_t i);
 
-void cw_pack_float (cw_pack_context* pack_context, float f);
-void cw_pack_double (cw_pack_context* pack_context, double d);
-void cw_pack_real (cw_pack_context* pack_context, double d);   /* Pack as float if precision isn't destroyed */
+void cw_pack_float(cw_pack_context* pack_context, float f);
+void cw_pack_double(cw_pack_context* pack_context, double d);
+void cw_pack_real(cw_pack_context* pack_context,
+                  double d);    /* Pack as float if precision isn't destroyed */
 
-void cw_pack_array_size (cw_pack_context* pack_context, uint32_t n);
-void cw_pack_map_size (cw_pack_context* pack_context, uint32_t n);
-void cw_pack_str (cw_pack_context* pack_context, const char* v, uint32_t l);
-void cw_pack_bin (cw_pack_context* pack_context, const void* v, uint32_t l);
-void cw_pack_ext (cw_pack_context* pack_context, int8_t type, const void* v, uint32_t l);
+void cw_pack_array_size(cw_pack_context* pack_context, uint32_t n);
+void cw_pack_map_size(cw_pack_context* pack_context, uint32_t n);
+void cw_pack_str(cw_pack_context* pack_context, const char* v, uint32_t l);
+void cw_pack_bin(cw_pack_context* pack_context, const void* v, uint32_t l);
+void cw_pack_ext(cw_pack_context* pack_context, int8_t type, const void* v, uint32_t l);
 
-void cw_pack_insert (cw_pack_context* pack_context, const void* v, uint32_t l);
+void cw_pack_insert(cw_pack_context* pack_context, const void* v, uint32_t l);
 
 
 /*****************************   U N P A C K   ********************************/
@@ -94,73 +97,78 @@
 
 typedef enum
 {
-    CWP_ITEM_MIN_RESERVED_EXT       = -128,
-    CWP_ITEM_MAX_RESERVED_EXT       = -1,
-    CWP_ITEM_MIN_USER_EXT           = 0,
-    CWP_ITEM_MAX_USER_EXT           = 127,
-    CWP_ITEM_NIL                    = 300,
-    CWP_ITEM_BOOLEAN                = 301,
-    CWP_ITEM_POSITIVE_INTEGER       = 302,
-    CWP_ITEM_NEGATIVE_INTEGER       = 303,
-    CWP_ITEM_FLOAT                  = 304,
-    CWP_ITEM_DOUBLE                 = 305,
-    CWP_ITEM_STR                    = 306,
-    CWP_ITEM_BIN                    = 307,
-    CWP_ITEM_ARRAY                  = 308,
-    CWP_ITEM_MAP                    = 309,
-    CWP_ITEM_EXT                    = 310,
-    CWP_NOT_AN_ITEM                 = 999,
+  CWP_ITEM_MIN_RESERVED_EXT       = -128,
+  CWP_ITEM_MAX_RESERVED_EXT       = -1,
+  CWP_ITEM_MIN_USER_EXT           = 0,
+  CWP_ITEM_MAX_USER_EXT           = 127,
+  CWP_ITEM_NIL                    = 300,
+  CWP_ITEM_BOOLEAN                = 301,
+  CWP_ITEM_POSITIVE_INTEGER       = 302,
+  CWP_ITEM_NEGATIVE_INTEGER       = 303,
+  CWP_ITEM_FLOAT                  = 304,
+  CWP_ITEM_DOUBLE                 = 305,
+  CWP_ITEM_STR                    = 306,
+  CWP_ITEM_BIN                    = 307,
+  CWP_ITEM_ARRAY                  = 308,
+  CWP_ITEM_MAP                    = 309,
+  CWP_ITEM_EXT                    = 310,
+  CWP_NOT_AN_ITEM                 = 999,
 } cwpack_item_types;
 
 
-typedef struct {
-    const void*     start;
-    uint32_t        length;
+typedef struct
+{
+  const void*     start;
+  uint32_t        length;
 } cwpack_blob;
 
 
-typedef struct {
-    uint32_t    size;
+typedef struct
+{
+  uint32_t    size;
 } cwpack_container;
 
 
-typedef struct {
-    cwpack_item_types   type;
-    union
-    {
-        bool            boolean;
-        uint64_t        u64;
-        int64_t         i64;
-        float           real;
-        double          long_real;
-        cwpack_container array;
-        cwpack_container map;
-        cwpack_blob     str;
-        cwpack_blob     bin;
-        cwpack_blob     ext;
-    } as;
+typedef struct
+{
+  cwpack_item_types   type;
+  union
+  {
+    bool            boolean;
+    uint64_t        u64;
+    int64_t         i64;
+    float           real;
+    double          long_real;
+    cwpack_container array;
+    cwpack_container map;
+    cwpack_blob     str;
+    cwpack_blob     bin;
+    cwpack_blob     ext;
+  } as;
 } cwpack_item;
 
 struct cw_unpack_context;
 
 typedef int (*unpack_underflow_handler)(struct cw_unpack_context*, unsigned long);
 
-typedef struct cw_unpack_context {
-    cwpack_item                 item;
-    uint8_t*                    start;
-    uint8_t*                    current;
-    uint8_t*                    end;             /* logical end of buffer */
-    int                         return_code;
-    int                         err_no;          /* handlers can save error here */
-    unpack_underflow_handler    handle_unpack_underflow;
+typedef struct cw_unpack_context
+{
+  cwpack_item                 item;
+  uint8_t*                    start;
+  uint8_t*                    current;
+  uint8_t*                    end;             /* logical end of buffer */
+  int                         return_code;
+  int                         err_no;          /* handlers can save error here */
+  unpack_underflow_handler    handle_unpack_underflow;
 } cw_unpack_context;
 
 
 
-int cw_unpack_context_init (cw_unpack_context* unpack_context, void* data, unsigned long length, unpack_underflow_handler huu);
+int cw_unpack_context_init(cw_unpack_context* unpack_context, void* data,
+                           unsigned long length, unpack_underflow_handler huu);
 
-void cw_unpack_next (cw_unpack_context* unpack_context);
-void cw_skip_items (cw_unpack_context* unpack_context, long item_count);
+void cw_unpack_next(cw_unpack_context* unpack_context);
+void cw_skip_items(cw_unpack_context* unpack_context, long item_count);
 
 
 #endif  /* CWPack_H__ */
diff --git a/msgpack/cwpack_defines.h b/msgpack/cwpack_defines.h
index b2f29f6..4f4ab57 100644
--- a/msgpack/cwpack_defines.h
+++ b/msgpack/cwpack_defines.h
@@ -1,18 +1,18 @@
 /*      CWPack - cwpack_defines.h   */
 /*
  The MIT License (MIT)
- 
+
  Copyright (c) 2017 Claes Wihlborg
- 
+
  Permission is hereby granted, free of charge, to any person obtaining a copy of this
  software and associated documentation files (the "Software"), to deal in the Software
  without restriction, including without limitation the rights to use, copy, modify,
  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
  persons to whom the Software is furnished to do so, subject to the following conditions:
- 
+
  The above copyright notice and this permission notice shall be included in all copies or
  substantial portions of the Software.
- 
+
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
  BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
@@ -34,7 +34,7 @@
  */
 
 /* #define FORCE_ALIGNMENT */
- 
+
 
 /*************************   C   S Y S T E M   L I B R A R Y   ****************/
 
@@ -50,7 +50,7 @@
 /*************************   B Y T E   O R D E R   ****************************/
 
 /*
- * The pack/unpack routines are written in three versions: for big endian, for 
+ * The pack/unpack routines are written in three versions: for big endian, for
  * little endian and insensitive to byte order. As you can get some speed gain
  * if the byte order is known, we try that when we can certainly detect it.
  * Define COMPILE_FOR_BIG_ENDIAN or COMPILE_FOR_LITTLE_ENDIAN if you know.
@@ -96,10 +96,10 @@
 
 
 #define PACK_ERROR(error_code)                          \
-{                                                       \
+  {                                                       \
     pack_context->return_code = error_code;             \
     return;                                             \
-}
+  }
 
 
 
@@ -114,114 +114,109 @@
 #ifdef COMPILE_FOR_LITTLE_ENDIAN
 
 #define cw_store16(d)                                       \
-    *(uint16_t*)p = (uint16_t)((((d) >> 8) & 0x0ff) | (d) << 8)
+  *(uint16_t*)p = (uint16_t)((((d) >> 8) & 0x0ff) | (d) << 8)
 
 #define cw_store32(x)                                       \
-    *(uint32_t*)p =                                         \
-        ((uint32_t)((((uint32_t)(x)) >> 24) |               \
-        (((uint32_t)(x) & 0x00ff0000) >>  8) |              \
-        (((uint32_t)(x) & 0x0000ff00) <<  8) |              \
-        (((uint32_t)(x)) << 24)));                          \
+  *(uint32_t*)p =                                         \
+      ((uint32_t)((((uint32_t)(x)) >> 24) |               \
+                  (((uint32_t)(x) & 0x00ff0000) >>  8) |              \
+                  (((uint32_t)(x) & 0x0000ff00) <<  8) |              \
+                  (((uint32_t)(x)) << 24)));                          \
 
 #define cw_store64(x)                                       \
-    *(uint64_t*)p =                                         \
-        ((uint64_t)(                                        \
-        (((((uint64_t)(x)) >> 40) |                         \
-        (((uint64_t)(x)) << 24)) & 0x0000ff000000ff00ULL) | \
-        (((((uint64_t)(x)) >> 24) |                         \
-        (((uint64_t)(x)) << 40)) & 0x00ff000000ff0000ULL) | \
-        (((uint64_t)(x) & 0x000000ff00000000ULL) >>  8) |   \
-        (((uint64_t)(x) & 0x00000000ff000000ULL) <<  8) |   \
-        (((uint64_t)(x)) >> 56) |                           \
-        (((uint64_t)(x)) << 56)));                          \
+  *(uint64_t*)p =                                         \
+      ((uint64_t)(                                        \
+          (((((uint64_t)(x)) >> 40) |                         \
+            (((uint64_t)(x)) << 24)) & 0x0000ff000000ff00ULL) | \
+          (((((uint64_t)(x)) >> 24) |                         \
+            (((uint64_t)(x)) << 40)) & 0x00ff000000ff0000ULL) | \
+          (((uint64_t)(x) & 0x000000ff00000000ULL) >>  8) |   \
+          (((uint64_t)(x) & 0x00000000ff000000ULL) <<  8) |   \
+          (((uint64_t)(x)) >> 56) |                           \
+          (((uint64_t)(x)) << 56)));                          \
 
 #else   /* Byte order undetermined */
 
 #define cw_store16(d)           \
-    *p = (uint8_t)(d >> 8);     \
-    p[1] = (uint8_t)d;
+  *p = (uint8_t)(d >> 8);     \
+  p[1] = (uint8_t)d;
 
 #define cw_store32(d)           \
-    *p = (uint8_t)(d >> 24);    \
-    p[1] = (uint8_t)(d >> 16);  \
-    p[2] = (uint8_t)(d >> 8);   \
-    p[3] = (uint8_t)d;
+  *p = (uint8_t)(d >> 24);    \
+  p[1] = (uint8_t)(d >> 16);  \
+  p[2] = (uint8_t)(d >> 8);   \
+  p[3] = (uint8_t)d;
 
 #define cw_store64(z)           \
-    *p = (uint8_t)(z >> 56);    \
-    p[1] = (uint8_t)(z >> 48);  \
-    p[2] = (uint8_t)(z >> 40);  \
-    p[3] = (uint8_t)(z >> 32);  \
-    p[4] = (uint8_t)(z >> 24);  \
-    p[5] = (uint8_t)(z >> 16);  \
-    p[6] = (uint8_t)(z >> 8);   \
-    p[7] = (uint8_t)z;
+  *p = (uint8_t)(z >> 56);    \
+  p[1] = (uint8_t)(z >> 48);  \
+  p[2] = (uint8_t)(z >> 40);  \
+  p[3] = (uint8_t)(z >> 32);  \
+  p[4] = (uint8_t)(z >> 24);  \
+  p[5] = (uint8_t)(z >> 16);  \
+  p[6] = (uint8_t)(z >> 8);   \
+  p[7] = (uint8_t)z;
 #endif
 #endif
 
 
 
 #define cw_pack_reserve_space(more)                                                         \
-{                                                                                           \
+  {                                                                                           \
     p = pack_context->current;                                                              \
-    uint8_t* nyp = p + more;                                                                \
+    nyp = p + more;                                                                \
     if (nyp > pack_context->end)                                                            \
     {                                                                                       \
-        if (!pack_context->handle_pack_overflow)                                            \
-            PACK_ERROR(CWP_RC_BUFFER_OVERFLOW)                                              \
-        int rc = pack_context->handle_pack_overflow (pack_context, (unsigned long)(more));  \
-        if (rc)                                                                             \
-            PACK_ERROR(rc)                                                                  \
+      if (!pack_context->handle_pack_overflow)                                            \
+        PACK_ERROR(CWP_RC_BUFFER_OVERFLOW)                                              \
+        rc = pack_context->handle_pack_overflow (pack_context, (unsigned long)(more));  \
+      if (rc)                                                                             \
+        PACK_ERROR(rc)                                                                  \
         p = pack_context->current;                                                          \
-        nyp = p + more;                                                                     \
+      nyp = p + more;                                                                     \
     }                                                                                       \
     pack_context->current = nyp;                                                            \
-}
+  }
 
 
 #define tryMove0(t)                                     \
-{                                                       \
-    uint8_t *p;                                         \
+  {                                                       \
     cw_pack_reserve_space(1)                            \
     *p = (uint8_t)(t);                                  \
     return;                                             \
-}
+  }
 
 #define tryMove1(t,d)                                   \
-{                                                       \
-    uint8_t *p;                                         \
+  {                                               		\
     cw_pack_reserve_space(2)                            \
     *p++ = (uint8_t)t;                                  \
     *p = (uint8_t)d;                                    \
     return;                                             \
-}
+  }
 
 #define tryMove2(t,d)                                   \
-{                                                       \
-    uint8_t *p;                                         \
+  {                                                   	\
     cw_pack_reserve_space(3)                            \
     *p++ = (uint8_t)t;                                  \
     cw_store16(d);                                      \
     return;                                             \
-}
+  }
 
 #define tryMove4(t,d)                                   \
-{                                                       \
-    uint8_t *p;                                         \
+  {                                                		\
     cw_pack_reserve_space(5)                            \
     *p++ = (uint8_t)t;                                  \
     cw_store32(d);                                      \
     return;                                             \
-}
+  }
 
 #define tryMove8(t,d)                                   \
-{                                                       \
-    uint8_t *p;                                         \
+  {                                                   	\
     cw_pack_reserve_space(9)                            \
     *p++ = (uint8_t)t;                                  \
     cw_store64(d);                                      \
     return;                                             \
-}
+  }
 
 
 
@@ -231,11 +226,11 @@
 
 
 #define UNPACK_ERROR(error_code)                        \
-{                                                       \
+  {                                                       \
     unpack_context->item.type = CWP_NOT_AN_ITEM;        \
     unpack_context->return_code = error_code;           \
     return;                                             \
-}
+  }
 
 
 
@@ -250,47 +245,47 @@
 #ifdef COMPILE_FOR_LITTLE_ENDIAN
 
 #define cw_load16(ptr)                                          \
-    tmpu16 = *(uint16_t*)ptr;                                   \
-    tmpu16 = (uint16_t)((tmpu16<<8) | (tmpu16>>8))
+  tmpu16 = *(uint16_t*)ptr;                                   \
+  tmpu16 = (uint16_t)((tmpu16<<8) | (tmpu16>>8))
 
 #define cw_load32(ptr)                                          \
-    tmpu32 = *(uint32_t*)ptr;                                   \
-    tmpu32 = (tmpu32<<24) | ((tmpu32 & 0xff00)<<8) |            \
-            ((tmpu32 & 0xff0000)>>8) | (tmpu32>>24)
+  tmpu32 = *(uint32_t*)ptr;                                   \
+  tmpu32 = (tmpu32<<24) | ((tmpu32 & 0xff00)<<8) |            \
+           ((tmpu32 & 0xff0000)>>8) | (tmpu32>>24)
 
 #define cw_load64(ptr)                                          \
-    tmpu64 = *((uint64_t*)ptr);                                 \
-    tmpu64 =                   (                                \
-        (((tmpu64 >> 40) |                                      \
-        (tmpu64 << 24)) & 0x0000ff000000ff00ULL) |              \
-        (((tmpu64 >> 24) |                                      \
-        (tmpu64 << 40)) & 0x00ff000000ff0000ULL) |              \
-        ((tmpu64 & 0x000000ff00000000ULL) >>  8) |              \
-        ((tmpu64 & 0x00000000ff000000ULL) <<  8) |              \
-        (tmpu64 >> 56) |                                        \
-        (tmpu64 << 56)                              )
+  tmpu64 = *((uint64_t*)ptr);                                 \
+  tmpu64 =                   (                                \
+                             (((tmpu64 >> 40) |                                      \
+                               (tmpu64 << 24)) & 0x0000ff000000ff00ULL) |              \
+                             (((tmpu64 >> 24) |                                      \
+                               (tmpu64 << 40)) & 0x00ff000000ff0000ULL) |              \
+                             ((tmpu64 & 0x000000ff00000000ULL) >>  8) |              \
+                             ((tmpu64 & 0x00000000ff000000ULL) <<  8) |              \
+                             (tmpu64 >> 56) |                                        \
+                             (tmpu64 << 56)                              )
 
 #else /* Byte order undetermined */
 
 #define cw_load16(ptr)                                          \
-    tmpu16 = (uint16_t)((*ptr++) << 8);                         \
-    tmpu16 |= (uint16_t)(*ptr++)
+  tmpu16 = (uint16_t)((*ptr++) << 8);                         \
+  tmpu16 |= (uint16_t)(*ptr++)
 
 #define cw_load32(ptr)                                          \
-    tmpu32 = (uint32_t)(*ptr++ << 24);                          \
-    tmpu32 |= (uint32_t)(*ptr++ << 16);                         \
-    tmpu32 |= (uint32_t)(*ptr++ << 8);                          \
-    tmpu32 |= (uint32_t)(*ptr++)
+  tmpu32 = (uint32_t)(*ptr++ << 24);                          \
+  tmpu32 |= (uint32_t)(*ptr++ << 16);                         \
+  tmpu32 |= (uint32_t)(*ptr++ << 8);                          \
+  tmpu32 |= (uint32_t)(*ptr++)
 
 #define cw_load64(ptr)                                          \
-    tmpu64 = ((uint64_t)*ptr++) << 56;                          \
-    tmpu64 |= ((uint64_t)*ptr++) << 48;                         \
-    tmpu64 |= ((uint64_t)*ptr++) << 40;                         \
-    tmpu64 |= ((uint64_t)*ptr++) << 32;                         \
-    tmpu64 |= ((uint64_t)*ptr++) << 24;                         \
-    tmpu64 |= ((uint64_t)*ptr++) << 16;                         \
-    tmpu64 |= ((uint64_t)*ptr++) << 8;                          \
-    tmpu64 |= (uint64_t)*ptr++
+  tmpu64 = ((uint64_t)*ptr++) << 56;                          \
+  tmpu64 |= ((uint64_t)*ptr++) << 48;                         \
+  tmpu64 |= ((uint64_t)*ptr++) << 40;                         \
+  tmpu64 |= ((uint64_t)*ptr++) << 32;                         \
+  tmpu64 |= ((uint64_t)*ptr++) << 24;                         \
+  tmpu64 |= ((uint64_t)*ptr++) << 16;                         \
+  tmpu64 |= ((uint64_t)*ptr++) << 8;                          \
+  tmpu64 |= (uint64_t)*ptr++
 
 #endif
 #endif
@@ -298,66 +293,66 @@
 
 
 #define cw_unpack_assert_space(more)                                                                \
-{                                                                                                   \
+  {                                                                                                   \
     p = unpack_context->current;                                                                    \
-    uint8_t* nyp = p + more;                                                                        \
+    nyp = p + more;                                                                        \
     if (nyp > unpack_context->end)                                                                  \
     {                                                                                               \
-        if (!unpack_context->handle_unpack_underflow)                                               \
-            UNPACK_ERROR(buffer_end_return_code)                                                    \
-        int rc = unpack_context->handle_unpack_underflow (unpack_context, (unsigned long)(more));   \
-        if (rc != CWP_RC_OK)                                                                        \
-        {                                                                                           \
-            if (rc != CWP_RC_END_OF_INPUT)                                                          \
-                UNPACK_ERROR(rc)                                                                    \
-            else                                                                                    \
-                UNPACK_ERROR(buffer_end_return_code)                                                \
-        }                                                                                           \
-        p = unpack_context->current;                                                                \
-        nyp = p + more;                                                                             \
+      if (!unpack_context->handle_unpack_underflow)                                               \
+        UNPACK_ERROR(buffer_end_return_code)                                                    \
+        rc = unpack_context->handle_unpack_underflow (unpack_context, (unsigned long)(more));   \
+      if (rc != CWP_RC_OK)                                                                        \
+      {                                                                                           \
+        if (rc != CWP_RC_END_OF_INPUT)                                                          \
+          UNPACK_ERROR(rc)                                                                    \
+          else                                                                                    \
+            UNPACK_ERROR(buffer_end_return_code)                                                \
+          }                                                                                           \
+      p = unpack_context->current;                                                                \
+      nyp = p + more;                                                                             \
     }                                                                                               \
     unpack_context->current = nyp;                                                                  \
-}
+  }
 
 
 #define cw_unpack_assert_blob(blob)                                         \
-    cw_unpack_assert_space(unpack_context->item.as.blob.length);            \
-    unpack_context->item.as.blob.start = p;                                 \
-    return;
+  cw_unpack_assert_space(unpack_context->item.as.blob.length);            \
+  unpack_context->item.as.blob.start = p;                                 \
+  return;
 
 
 #define getDDItem(typ,var,val)                                              \
-    unpack_context->item.type = typ;                                        \
-    unpack_context->item.as.var = val;
+  unpack_context->item.type = typ;                                        \
+  unpack_context->item.as.var = val;
 
 #define getDDItem1(typ,var,cast)                                            \
-    unpack_context->item.type = typ;                                        \
-    cw_unpack_assert_space(1);                                              \
-    unpack_context->item.as.var = (cast)*p;
+  unpack_context->item.type = typ;                                        \
+  cw_unpack_assert_space(1);                                              \
+  unpack_context->item.as.var = (cast)*p;
 
 #define getDDItem2(typ,var,cast)                                            \
-    unpack_context->item.type = typ;                                        \
-    cw_unpack_assert_space(2);                                              \
-    cw_load16(p);                                                           \
-    unpack_context->item.as.var = (cast)tmpu16;
+  unpack_context->item.type = typ;                                        \
+  cw_unpack_assert_space(2);                                              \
+  cw_load16(p);                                                           \
+  unpack_context->item.as.var = (cast)tmpu16;
 
 #define getDDItem4(typ,var,cast)                                            \
-    unpack_context->item.type = typ;                                        \
-    cw_unpack_assert_space(4);                                              \
-    cw_load32(p);                                                           \
-    unpack_context->item.as.var = (cast)tmpu32;
+  unpack_context->item.type = typ;                                        \
+  cw_unpack_assert_space(4);                                              \
+  cw_load32(p);                                                           \
+  unpack_context->item.as.var = (cast)tmpu32;
 
 #define getDDItem8(typ)                                                     \
-    unpack_context->item.type = typ;                                        \
-    cw_unpack_assert_space(8);                                              \
-    cw_load64(p);                                                           \
-    unpack_context->item.as.u64 = tmpu64;
+  unpack_context->item.type = typ;                                        \
+  cw_unpack_assert_space(8);                                              \
+  cw_load64(p);                                                           \
+  unpack_context->item.as.u64 = tmpu64;
 
 #define getDDItemFix(len)                                                   \
-    cw_unpack_assert_space(1);                                              \
-    unpack_context->item.type = *(int8_t*)p;                                \
-    unpack_context->item.as.ext.length = len;                               \
-    cw_unpack_assert_blob(ext);
+  cw_unpack_assert_space(1);                                              \
+  unpack_context->item.type = *(int8_t*)p;                                \
+  unpack_context->item.as.ext.length = len;                               \
+  cw_unpack_assert_blob(ext);
 
 
 
