A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
193:47a953ab571b
Parent:
187:122fc1996c86
Child:
195:bd5b123143ca
diff -r 0dfa138a8e7d -r 47a953ab571b ip4/ip4addr.c
--- a/ip4/ip4addr.c	Fri Jan 22 13:24:08 2021 +0000
+++ b/ip4/ip4addr.c	Sun Jan 24 15:09:55 2021 +0000
@@ -34,13 +34,41 @@
     return HttpAddF("%d.%d.%d.%d", a3, a2, a1, a0); 
 }
 
-uint32_t Ip4AddrParse(const char* text)
+uint32_t Ip4AddrParse(const char* pText) //Returns 0 on error
 {
+    const char* p = pText;
     int ints[4];
-    sscanf(text, "%d.%d.%d.%d", &ints[3], &ints[2], &ints[1], &ints[0]);
-    return (ints[0] << 24) + (ints[1] << 16) + (ints[2] << 8) + ints[3];
+    int field = 0;
+    int word = 0;
+    while(true)
+    {
+        switch (*p)
+        {
+            case '.':
+                ints[field] = word;
+                field++;
+                if (field > 3) return 0;
+                word = 0;
+                break;
+            case '0': word *= 10; word += 0; break;
+            case '1': word *= 10; word += 1; break;
+            case '2': word *= 10; word += 2; break;
+            case '3': word *= 10; word += 3; break;
+            case '4': word *= 10; word += 4; break;
+            case '5': word *= 10; word += 5; break;
+            case '6': word *= 10; word += 6; break;
+            case '7': word *= 10; word += 7; break;
+            case '8': word *= 10; word += 8; break;
+            case '9': word *= 10; word += 9; break;
+            case 0:
+                ints[field] = word;
+                uint32_t addr4 = (ints[0] << 0) + (ints[1] << 8) + (ints[2] << 16) + (ints[3] << 24);
+                return addr4;
+            default: return 0;
+        }
+        p++;
+    }
 }
-
 void Ip4AddrFromDest(const int dest, uint32_t* pDstIp)
 {
     switch (dest)