2 * vim:ts=4:sw=4:expandtab
4 * i3 - an improved dynamic tiling window manager
5 * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
19 * The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of
20 * the called functions returns NULL, meaning that there is no more memory available
23 void *smalloc(size_t size) {
24 void *result = malloc(size);
26 err(EXIT_FAILURE, "malloc(%zd)", size);
30 void *scalloc(size_t num, size_t size) {
31 void *result = calloc(num, size);
33 err(EXIT_FAILURE, "calloc(%zd, %zd)", num, size);
37 void *srealloc(void *ptr, size_t size) {
38 void *result = realloc(ptr, size);
39 if (result == NULL && size > 0)
40 err(EXIT_FAILURE, "realloc(%zd)", size);
44 char *sstrdup(const char *str) {
45 char *result = strdup(str);
47 err(EXIT_FAILURE, "strdup()");
51 char *sstrndup(const char *str, size_t size) {
52 char *result = strndup(str, size);
54 err(EXIT_FAILURE, "strndup()");
58 int sasprintf(char **strp, const char *fmt, ...) {
63 if ((result = vasprintf(strp, fmt, args)) == -1)
64 err(EXIT_FAILURE, "asprintf(%s)", fmt);
69 ssize_t writeall(int fd, const void *buf, size_t count) {
72 while (written < count) {
73 const ssize_t n = write(fd, ((char *)buf) + written, count - written);
75 if (errno == EINTR || errno == EAGAIN)
85 ssize_t writeall_nonblock(int fd, const void *buf, size_t count) {
88 while (written < count) {
89 const ssize_t n = write(fd, ((char *)buf) + written, count - written);
91 if (errno == EAGAIN) {
93 } else if (errno == EINTR) {
104 ssize_t swrite(int fd, const void *buf, size_t count) {
107 n = writeall(fd, buf, count);
109 err(EXIT_FAILURE, "Failed to write %d", fd);