Major code style change to rename all files to lower case.
diff --git a/ndn-cpp/c/encoding/binary-xml-structure-decoder.c b/ndn-cpp/c/encoding/binary-xml-structure-decoder.c
new file mode 100644
index 0000000..2c114fe
--- /dev/null
+++ b/ndn-cpp/c/encoding/binary-xml-structure-decoder.c
@@ -0,0 +1,149 @@
+/**
+ * @author: Jeff Thompson
+ * See COPYING for copyright and distribution information.
+ */
+
+#include "../util/ndn_memory.h"
+#include "binary-xml.h"
+#include "binary-xml-decoder.h"
+#include "binary-xml-structure-decoder.h"
+
+void ndn_BinaryXmlStructureDecoder_init(struct ndn_BinaryXmlStructureDecoder *self) 
+{
+  self->gotElementEnd = 0;
+  self->offset = 0;
+  self->level = 0;
+  self->state = ndn_BinaryXmlStructureDecoder_READ_HEADER_OR_CLOSE;
+  self->headerLength = 0;
+  self->useHeaderBuffer = 0;
+  self->nBytesToRead = 0;
+}
+
+/**
+ * Set the state to READ_HEADER_OR_CLOSE and set up to start reading the header.
+ */
+static inline void startHeader(struct ndn_BinaryXmlStructureDecoder *self)
+{
+  self->headerLength = 0;
+  self->useHeaderBuffer = 0;
+  self->state = ndn_BinaryXmlStructureDecoder_READ_HEADER_OR_CLOSE;    
+}
+
+ndn_Error ndn_BinaryXmlStructureDecoder_findElementEnd
+  (struct ndn_BinaryXmlStructureDecoder *self, unsigned char *input, unsigned int inputLength) 
+{
+  if (self->gotElementEnd)
+    // Someone is calling when we already got the end.
+    return 0;
+  
+  struct ndn_BinaryXmlDecoder decoder;
+  ndn_BinaryXmlDecoder_init(&decoder, input, inputLength);
+  
+  while (1) {
+    if (self->offset >= inputLength)
+      // All the cases assume we have some input. Return and wait for more.
+      return 0;
+    
+    if (self->state == ndn_BinaryXmlStructureDecoder_READ_HEADER_OR_CLOSE) {
+      // First check for CLOSE.
+      if (self->headerLength == 0 && input[self->offset] == ndn_BinaryXml_CLOSE) {
+        ++self->offset;
+        // Close the level.
+        --self->level;
+        if (self->level == 0) {
+          // Finished.
+          self->gotElementEnd = 1;
+          return 0;
+        }
+        if (self->level < 0)
+          return NDN_ERROR_findElementEnd_unexpected_close_tag;
+          
+        // Get ready for the next header.
+        startHeader(self);
+        continue;
+      }
+        
+      unsigned int startingHeaderLength = self->headerLength;
+      while (1) {
+        if (self->offset >= inputLength) {
+          // We can't get all of the header bytes from this input. Save in headerBuffer.
+          if (self->headerLength > sizeof(self->headerBuffer))
+            return NDN_ERROR_cannot_store_more_header_bytes_than_the_size_of_headerBuffer;
+          self->useHeaderBuffer = 1;
+          unsigned int nNewBytes = self->headerLength - startingHeaderLength;
+          ndn_memcpy(self->headerBuffer + startingHeaderLength, input + (self->offset - nNewBytes), nNewBytes);
+            
+          return 0;
+        }
+        unsigned int headerByte = (unsigned int)input[self->offset++];
+        ++self->headerLength;
+        if (headerByte & ndn_BinaryXml_TT_FINAL)
+          // Break and read the header.
+          break;
+      }
+        
+      unsigned int type;
+      unsigned int value;
+      if (self->useHeaderBuffer) {
+        // Copy the remaining bytes into headerBuffer.
+        if (self->headerLength > sizeof(self->headerBuffer))
+          return NDN_ERROR_cannot_store_more_header_bytes_than_the_size_of_headerBuffer;
+        unsigned int nNewBytes = self->headerLength - startingHeaderLength;
+        ndn_memcpy(self->headerBuffer + startingHeaderLength, input + (self->offset - nNewBytes), nNewBytes);
+
+        // Use a local decoder just for the headerBuffer.
+        struct ndn_BinaryXmlDecoder bufferDecoder;
+        ndn_BinaryXmlDecoder_init(&bufferDecoder, self->headerBuffer, sizeof(self->headerBuffer));
+        if (ndn_BinaryXmlDecoder_decodeTypeAndValue(&bufferDecoder, &type, &value))
+          return NDN_ERROR_findElementEnd_cannot_read_header_type_and_value;
+      }
+      else {
+        // We didn't have to use the headerBuffer.
+        ndn_BinaryXmlDecoder_seek(&decoder, self->offset - self->headerLength);
+        if (ndn_BinaryXmlDecoder_decodeTypeAndValue(&decoder, &type, &value))
+          return NDN_ERROR_findElementEnd_cannot_read_header_type_and_value;
+      }
+        
+      // Set the next state based on the type.
+      if (type == ndn_BinaryXml_DATTR)
+        // We already consumed the item. READ_HEADER_OR_CLOSE again.
+        // Binary XML has rules about what must follow an attribute, but we are just scanning.
+        startHeader(self);
+      else if (type == ndn_BinaryXml_DTAG || type == ndn_BinaryXml_EXT) {
+        // Start a new level and READ_HEADER_OR_CLOSE again.
+        ++self->level;
+        startHeader(self);
+      }
+      else if (type == ndn_BinaryXml_TAG || type == ndn_BinaryXml_ATTR) {
+        if (type == ndn_BinaryXml_TAG)
+          // Start a new level and read the tag.
+          ++self->level;
+        // Minimum tag or attribute length is 1.
+        self->nBytesToRead = value + 1;
+        self->state = ndn_BinaryXmlStructureDecoder_READ_BYTES;
+        // Binary XML has rules about what must follow an attribute, but we are just scanning.
+      }
+      else if (type == ndn_BinaryXml_BLOB || type == ndn_BinaryXml_UDATA) {
+        self->nBytesToRead = value;
+        self->state = ndn_BinaryXmlStructureDecoder_READ_BYTES;
+      }
+      else
+        return NDN_ERROR_findElementEnd_unrecognized_header_type;
+    }  
+    else if (self->state == ndn_BinaryXmlStructureDecoder_READ_BYTES) {
+      unsigned int nRemainingBytes = inputLength - self->offset;
+      if (nRemainingBytes < self->nBytesToRead) {
+        // Need more.
+        self->offset += nRemainingBytes;
+        self->nBytesToRead -= nRemainingBytes;
+        return 0;
+      }
+      // Got the bytes. Read a new header or close.
+      self->offset += self->nBytesToRead;
+      startHeader(self);
+    }
+    else
+      // We don't expect this to happen.
+      return NDN_ERROR_findElementEnd_unrecognized_state;
+  }
+}