| | 95 | #define xrealloc(ptr, size) ({ \ |
|---|
| | 96 | void *xrealloc_newptr; \ |
|---|
| | 97 | size_t xrealloc_sz = (size); \ |
|---|
| | 98 | \ |
|---|
| | 99 | xrealloc_newptr = realloc((ptr), xrealloc_sz); \ |
|---|
| | 100 | if (xrealloc_newptr == NULL) \ |
|---|
| | 101 | err(255, "cannot realloc to %zu bytes", \ |
|---|
| | 102 | xrealloc_sz); \ |
|---|
| | 103 | (xrealloc_newptr); \ |
|---|
| | 104 | }) |
|---|
| | 105 | |
|---|
| | 106 | #define str_save(s) ({ \ |
|---|
| | 107 | const char *str_save_s = (s); \ |
|---|
| | 108 | \ |
|---|
| | 109 | (str_nsave(str_save_s, strlen(str_save_s))); \ |
|---|
| | 110 | }) |
|---|
| | 111 | |
|---|
| | 112 | #define str_nsave(s, n) ({ \ |
|---|
| | 113 | char *str_nsave_ptr; \ |
|---|
| | 114 | size_t str_nsave_sz = (n); \ |
|---|
| | 115 | \ |
|---|
| | 116 | str_nsave_ptr = xmalloc(str_nsave_sz + 1); \ |
|---|
| | 117 | memcpy(str_nsave_sz, (s), str_nsave_sz); \ |
|---|
| | 118 | str_nsave_ptr[str_nsave_sz] = '\0'; \ |
|---|
| | 119 | (str_nsave_ptr); \ |
|---|
| | 120 | }) |
|---|
| | 121 | |
|---|
| | 122 | #define str_add(d, s) ({ \ |
|---|
| | 123 | const char *str_add_s = (s); \ |
|---|
| | 124 | \ |
|---|
| | 125 | (str_nadd((d), str_add_s, strlen(str_add_s))); \ |
|---|
| | 126 | }) |
|---|
| | 127 | |
|---|
| | 128 | #define str_nadd(d, s, n) ({ \ |
|---|
| | 129 | char *str_nadd_ptr = (d), *str_nadd_newptr; \ |
|---|
| | 130 | size_t str_nadd_sz, str_nadd_addsz = (n); \ |
|---|
| | 131 | \ |
|---|
| | 132 | str_nadd_sz = strlen(str_nadd_ptr); \ |
|---|
| | 133 | str_nadd_newptr = xrealloc(str_nadd_ptr, \ |
|---|
| | 134 | str_nadd_sz + str_nadd_addsz + 1); \ |
|---|
| | 135 | str_nadd_ptr = str_nadd_newptr + str_nadd_sz; \ |
|---|
| | 136 | memcpy(str_nadd_ptr, (s), str_nadd_addsz); \ |
|---|
| | 137 | str_nadd_ptr[str_nadd_addsz] = '\0'; \ |
|---|
| | 138 | (str_nadd_newptr); \ |
|---|
| | 139 | }) |
|---|
| | 140 | |
|---|