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
Diff: ip4/ip4addr.c
- Revision:
- 193:47a953ab571b
- Parent:
- 187:122fc1996c86
- Child:
- 195:bd5b123143ca
--- 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)