buffer.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "structures/buffer.h"
  2. // Inline extern prototypes
  3. bool LSUP_buffer_eq(const LSUP_Buffer *buf1, const LSUP_Buffer *buf2);
  4. LSUP_Buffer *LSUP_buffer_new(size_t size)
  5. {
  6. LSUP_Buffer *buf;
  7. CRITICAL(buf = malloc(sizeof(LSUP_Buffer)));
  8. LSUP_buffer_init(buf, size);
  9. return buf;
  10. }
  11. int LSUP_buffer_init(LSUP_Buffer *buf, size_t size)
  12. {
  13. TRACE("Buffer Size: %lu\n", size);
  14. CRITICAL(buf->addr = malloc(size * sizeof(char)));
  15. buf->size = size;
  16. return 0;
  17. }
  18. /**
  19. * Print a byte string of a given length in a human-readable format.
  20. *
  21. * The string is printed in Python style: printable characters are output
  22. * literally, and non-printable ones as hex sequences.
  23. */
  24. void LSUP_buffer_print(const LSUP_Buffer *buf) {
  25. for (size_t i = 0; i < buf->size; i++) {
  26. char chr = ((char*)buf->addr)[i];
  27. if (isprint(chr)) {
  28. fputc(chr, stdout);
  29. } else {
  30. printf("\\x%02x", chr);
  31. }
  32. }
  33. printf("\n");
  34. }
  35. void LSUP_buffer_done(LSUP_Buffer *buf){
  36. if (buf->addr != NULL) {
  37. TRACE(STR, "Freeing buffer.");
  38. free(buf->addr);
  39. }
  40. }