hexencode.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*====================================================================*
  2. *
  3. * size_t hexencode (void * memory, size_t extent, char const * string);
  4. *
  5. * memory.h
  6. *
  7. * encode a hexadecimal string into a fixed length memory region;
  8. * return the number of bytes encoded or 0 on error; an error will
  9. * occur of the entire region cannot be encoded or the entire
  10. * string cannot be converted due to illegal or excessive digits;
  11. *
  12. * permit an optional HEX_EXTENDER character between successive
  13. * octets; constant character HEX_EXTENDER is defined in number.h;
  14. *
  15. * Motley Tools by Charles Maier;
  16. * Copyright (c) 2001-2006 by Charles Maier Associates;
  17. * Licensed under the Internet Software Consortium License;
  18. *
  19. *--------------------------------------------------------------------*/
  20. #ifndef HEXENCODE_SOURCE
  21. #define HEXENCODE_SOURCE
  22. #include <errno.h>
  23. #include <ctype.h>
  24. #include "../tools/memory.h"
  25. #include "../tools/number.h"
  26. size_t hexencode (void * memory, register size_t extent, register char const * string)
  27. {
  28. register byte * origin = (byte *)(memory);
  29. register byte * offset = (byte *)(memory);
  30. unsigned radix = RADIX_HEX;
  31. unsigned digit = 0;
  32. while ((extent) && (*string))
  33. {
  34. unsigned field = HEX_DIGITS;
  35. unsigned value = 0;
  36. if ((offset > origin) && (*string == HEX_EXTENDER))
  37. {
  38. string++;
  39. }
  40. while (field--)
  41. {
  42. if ((digit = todigit (*string)) < radix)
  43. {
  44. value *= radix;
  45. value += digit;
  46. string++;
  47. continue;
  48. }
  49. errno = EINVAL;
  50. return (0);
  51. }
  52. *offset = value;
  53. offset++;
  54. extent--;
  55. }
  56. #if defined (WIN32)
  57. while (isspace (*string))
  58. {
  59. string++;
  60. }
  61. #endif
  62. if ((extent) || (*string))
  63. {
  64. errno = EINVAL;
  65. return (0);
  66. }
  67. return (offset - origin);
  68. }
  69. #endif