diff --git a/mongoose.c b/mongoose.c
index fef0251b1231846a7f4fda6dd8cc74264af2a936..39902172ab907a8bd94e62b6ce813708a13d628b 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -8888,6 +8888,11 @@ struct mg_connection *mg_connect_ws(struct mg_mgr *mgr,
 /* Amalgamated: #include "mongoose/src/internal.h" */
 /* Amalgamated: #include "mongoose/src/util.h" */
 
+/* For platforms with limited libc */
+#ifndef MAX
+#define MAX(a,b) ((a) > (b)? (a): (b))
+#endif
+
 const char *mg_skip(const char *s, const char *end, const char *delims,
                     struct mg_str *v) {
   v->p = s;
@@ -9056,19 +9061,19 @@ int mg_hexdump(const void *buf, int len, char *dst, int dst_len) {
   for (i = 0; i < len; i++) {
     idx = i % 16;
     if (idx == 0) {
-      if (i > 0) n += snprintf(dst + n, dst_len - n, "  %s\n", ascii);
-      n += snprintf(dst + n, dst_len - n, "%04x ", i);
+      if (i > 0) n += snprintf(dst + n, MAX(dst_len - n, 0), "  %s\n", ascii);
+      n += snprintf(dst + n, MAX(dst_len - n, 0), "%04x ", i);
     }
     if (dst_len - n < 0) {
       return n;
     }
-    n += snprintf(dst + n, dst_len - n, " %02x", p[i]);
+    n += snprintf(dst + n, MAX(dst_len - n, 0), " %02x", p[i]);
     ascii[idx] = p[i] < 0x20 || p[i] > 0x7e ? '.' : p[i];
     ascii[idx + 1] = '\0';
   }
 
-  while (i++ % 16) n += snprintf(dst + n, dst_len - n, "%s", "   ");
-  n += snprintf(dst + n, dst_len - n, "  %s\n\n", ascii);
+  while (i++ % 16) n += snprintf(dst + n, MAX(dst_len - n, 0), "%s", "   ");
+  n += snprintf(dst + n, MAX(dst_len - n, 0), "  %s\n\n", ascii);
 
   return n;
 }