/*====================================================================* * * size_t dataspec (char const * string, void * memory, size_t extent); * * memory.h * * encode a memory region with a variable-length hexadecimal string; * return the number of bytes encoded or terminate the program on * error; * * the number of octets in string must equal the memory extent or * an error will occur; octets may be seperated by semi-colons; * empty octets are illegal; * * Motley Tools by Charles Maier ; * Copyright (c) 2001-2006 by Charles Maier Associates; * Licensed under the Internet Software Consortium License; * *--------------------------------------------------------------------*/ #ifndef DATASPEC_SOURCE #define DATASPEC_SOURCE #include #include #include "../tools/memory.h" #include "../tools/number.h" #include "../tools/error.h" size_t dataspec (char const * string, void * memory, size_t extent) { char const * number = string; byte * origin = (byte *) (memory); byte * offset = (byte *) (memory); if (! number) { error (1, EFAULT, "dataspec"); } #ifdef WIN32 while (isspace ((unsigned char)* number)) { number++; } #endif while ((* number) && (extent)) { unsigned digit = 0; #ifdef WIN32 if (isspace ((unsigned char)* number)) { break; } #endif if ((offset > origin) && (* number == HEX_EXTENDER)) { number++; } if ((digit = todigit (* number++)) >= RADIX_HEX) { error (1, EINVAL, "Have '%s' but need a hex digit", string); } * offset = digit << 4; if (! * number) { error (1, EINVAL, "Have '%s' but need another hex digit", string); } if ((digit = todigit (* number++)) >= 0x10) { error (1, EINVAL, "Have '%s' but need valid hex data", string); } * offset |= digit; offset++; extent--; } #ifdef WIN32 while (isspace ((unsigned char)* number)) { number++; } #endif if (* number && ! extent) { error (1, EINVAL, "'%s' exceeds %d bytes", string, (unsigned) (offset - origin - extent)); } if (* number) { error (1, EINVAL, "String '%s' contains trash", string); } return (offset - origin); } #endif