More configuration options for dynamic alloc
diff --git a/pb.h b/pb.h
index d6cb1d4..6f84385 100644
--- a/pb.h
+++ b/pb.h
@@ -10,6 +10,9 @@
  * uncommenting the lines, or on the compiler command line.      *
  *****************************************************************/
 
+/* Enable support for dynamically allocated fields */
+/* #define PB_ENABLE_MALLOC 1 */
+
 /* Define this if your CPU architecture is big endian, i.e. it
  * stores the most-significant byte first. */
 /* #define __BIG_ENDIAN__ 1 */
@@ -340,6 +343,17 @@
     pb_extension_t *next;
 };
 
+/* Memory allocation functions to use. You can define pb_realloc and
+ * pb_free to custom functions if you want. */
+#ifdef PB_ENABLE_MALLOC
+#   ifndef pb_realloc
+#       define pb_realloc(ptr, size) realloc(ptr, size)
+#   endif
+#   ifndef pb_free
+#       define pb_free(ptr) free(ptr)
+#   endif
+#endif
+
 /* These macros are used to declare pb_field_t's in the constant array. */
 /* Size of a structure member, in bytes. */
 #define pb_membersize(st, m) (sizeof ((st*)0)->m)
diff --git a/pb_decode.c b/pb_decode.c
index 7938d70..9a2abd6 100644
--- a/pb_decode.c
+++ b/pb_decode.c
@@ -480,7 +480,7 @@
     /* Allocate new or expand previous allocation */
     /* Note: on failure the old pointer will remain in the structure,
      * the message must be freed by caller also on error return. */
-    ptr = realloc(ptr, size);
+    ptr = pb_realloc(ptr, size);
     if (ptr == NULL)
         PB_RETURN_ERROR(stream, "realloc failed");
     
@@ -945,7 +945,7 @@
                 size_t count = *(size_t*)iter.pSize;
                 while (count--)
                 {
-                    free(*pItem);
+                    pb_free(*pItem);
                     *pItem++ = NULL;
                 }
             }
@@ -968,7 +968,7 @@
             }
             
             /* Release main item */
-            free(*(void**)iter.pData);
+            pb_free(*(void**)iter.pData);
             *(void**)iter.pData = NULL;
         }
     } while (pb_field_next(&iter));