Guest User

Untitled

a guest
Dec 4th, 2017
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef unsigned long long ULL;
  6. #define BUFFER_SIZE ((int)(0x80 * sizeof(void*) * sizeof(ULL)))
  7.  
  8. #define sb_free(a) ((a) ? free(stb__sbraw(a)), 0 : 0)
  9. #define sb_push(a, v) (stb__sbmaybegrow(a, 1), (a)[stb__sbn(a)++] = (v))
  10. #define sb_count(a) ((a) ? stb__sbn(a) : 0)
  11. #define sb_add(a, n) (stb__sbmaybegrow(a,n), stb__sbn(a)+=(n), &(a)[stb__sbn(a) - (n)])
  12. #define sb_last(a) ((a)[stb__sbn(a) - 1])
  13.  
  14. #define stb__sbraw(a) ((int *) (a) - 2)
  15. #define stb__sbm(a) stb__sbraw(a)[0]
  16. #define stb__sbn(a) stb__sbraw(a)[1]
  17.  
  18. #define stb__sbneedgrow(a, n) ((a) == 0 || stb__sbn(a) + (n) >= stb__sbm(a))
  19. #define stb__sbmaybegrow(a, n) (stb__sbneedgrow(a, (n)) ? stb__sbgrow(a, n) : 0)
  20. #define stb__sbgrow(a, n) ((a) = stb__sbgrowf((a), (n), sizeof(*(a))))
  21.  
  22. static void * stb__sbgrowf(void *arr, int increment, int itemsize) {
  23. int dbl_cur = arr ? 2 * stb__sbm(arr) : 0;
  24. int min_needed = sb_count(arr) + increment;
  25. int m = dbl_cur > min_needed ? dbl_cur : min_needed;
  26. int *p = (int *) realloc(arr ? stb__sbraw(arr) : 0, itemsize * m + sizeof(int) * 2);
  27. if (p) {
  28. if (!arr)
  29. p[1] = 0;
  30. p[0] = m;
  31. return p + 2;
  32. } else {
  33. return (void *) (2 *sizeof(int));
  34. }
  35. }
  36.  
  37. int main (int argc, char **argv) {
  38. ULL nr = 0; char *buf = NULL;
  39. do {
  40. char *str = calloc(BUFFER_SIZE, sizeof(*str));
  41. nr = fread(str, sizeof(char), BUFFER_SIZE, stdin);
  42. while (*str) sb_push(buf, *str++);
  43. free(str - nr);
  44. } while (nr == BUFFER_SIZE);
  45. printf("%s\n", buf); free(buf);
  46. return 0;
  47. }
Add Comment
Please, Sign In to add comment