/*====================================================================* * * size_t ipv4spec (char const *string, void * memory); * * memory.h * * encode a 4-byte memory region with the equivalent of an IPv4 * dotted decimal string; all field delimiters must be present * but individual fields may have leading zeros or be empty; * * 0.0.0.0 0x00, 0x00, 0x00, 0x00 * 127...1 0x7F, 0x00, 0x00, 0x01 * 192.168.099.000 0xC0, 0xA8, 0x63, 0x00 * * Motley Tools by Charles Maier ; * Copyright (c) 2001-2006 by Charles Maier Associates; * Licensed under the Internet Software Consortium License; * *--------------------------------------------------------------------*/ #ifndef IPV4SPEC_SOURCE #define IPV4SPEC_SOURCE #include #include "../tools/memory.h" #include "../tools/number.h" #include "../tools/error.h" size_t ipv4spec (char const * string, void * memory) { char const * number = string; byte * origin = (byte *) (memory); byte * offset = (byte *) (memory); byte * extent = offset + IPv4_LEN; unsigned radix = RADIX_DEC; unsigned digit = 0; while ((* number) && (offset < extent)) { unsigned value = 0; if (offset > origin) { if (* number == DEC_EXTENDER) { number++; } } while ((digit = todigit (* number)) < radix) { value *= radix; value += digit; if (value >> 8) { error (1, ERANGE, "IPv4 '%s' octet %d exceeds 8 bits", string, (unsigned) (offset - origin) + 1); } number++; } * offset++ = value; } #if defined (WIN32) while (isspace ((unsigned char)* number)) { number++; } #endif if (offset < extent) { error (1, EINVAL, "IPv4 '%s' has only %d octets", string, (unsigned) (offset - origin)); } if (* number) { error (1, EINVAL, "IPv4 '%s' contains trash '%s'", string, number); } return (offset - origin); } /*====================================================================* * demo/test program; *--------------------------------------------------------------------*/ #if 0 #include char const * program_name = "ipv4spec"; int main (int argc, char * argv []) { byte memory [4]; char string [16]; while (* ++ argv) { ipv4spec (* argv, memory); hexdecode (memory, sizeof (memory), string, sizeof (string)); printf ("%s %s\n", string, * argv); } return (0); } #endif /*====================================================================* * *--------------------------------------------------------------------*/ #endif