hex.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
  2. /* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
  3. /* Copyright (C) 2014 OSCAR lab, Stony Brook University
  4. 2017 University of North Carolina at Chapel Hill
  5. This file is part of Graphene Library OS.
  6. Graphene Library OS is free software: you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation, either version 3 of the
  9. License, or (at your option) any later version.
  10. Graphene Library OS is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  16. #ifndef HEX_H
  17. #define HEX_H
  18. /* This function is a helper for debug printing.
  19. * It accepts a pointer to a numerical value, and
  20. * formats it as a hex string, for printing.
  21. * size is the number of bytes pointed to by hex.
  22. * str is the caller-provided buffer, len is the length of the buffer.
  23. * The len must be at least (size * 2)+1.
  24. *
  25. * Note that it does not normalize for endianness, and pads to the
  26. * size the compiler things the string is.
  27. */
  28. #include <assert.h>
  29. static inline __attribute__((always_inline))
  30. char * __bytes2hexstr(void * hex, size_t size, char *str, size_t len)
  31. {
  32. static char * ch = "0123456789abcdef";
  33. assert(len >= size * 2 + 1);
  34. for (size_t i = 0 ; i < size ; i++) {
  35. unsigned char h = ((unsigned char *) hex)[i];
  36. str[i * 2] = ch[h / 16];
  37. str[i * 2 + 1] = ch[h % 16];
  38. }
  39. str[size * 2] = 0;
  40. return str;
  41. }
  42. #define IS_INDEXABLE(arg) (sizeof((arg)[0]))
  43. #define IS_ARRAY(arg) (IS_INDEXABLE(arg) > 0 && (((void *) &(arg)) == ((void *) (arg))))
  44. /*
  45. * BYTES2HEXSTR converts an array into a hexadecimal string and fills into a
  46. * given buffer. The buffer size is given as an extra argument.
  47. */
  48. #define BYTES2HEXSTR(array, str, len) ({ \
  49. COMPILE_TIME_ASSERT(IS_ARRAY(array)); \
  50. __bytes2hexstr((array), sizeof(array), str, len);})
  51. /*
  52. * ALLOCA_BYTES2HEXSTR uses __alloca to allocate a buffer on the current frame
  53. * and then fills the hexadecimal string into the buffer.
  54. * This buffer can only be used within the caller frame (function).
  55. */
  56. #define ALLOCA_BYTES2HEXSTR(array) \
  57. (BYTES2HEXSTR(array, __alloca(sizeof(array) * 2 + 1), sizeof(array) * 2 + 1))
  58. #endif // HEX_H