/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include "util.h" void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); if (fmt[0] && fmt[strlen(fmt) - 1] == ':') { fputc(' ', stderr); perror(NULL); } else { fputc('\n', stderr); } exit(1); } void warn(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "warning: "); vfprintf(stderr, fmt, ap); va_end(ap); fputc('\n', stderr); } void * xmalloc(size_t size) { void *p = malloc(size); if (!p) die("malloc:"); return p; } void * xrealloc(void *ptr, size_t size) { void *p = realloc(ptr, size); if (!p) die("realloc:"); return p; } char * xstrdup(const char *s) { char *p = strdup(s); if (!p) die("strdup:"); return p; } char * str_trim(char *str) { char *end; while (isspace((unsigned char)*str)) str++; if (*str == '\0') return str; end = str + strlen(str) - 1; while (end > str && isspace((unsigned char)*end)) end--; end[1] = '\0'; return str; } int str_starts_with(const char *str, const char *prefix) { return strncmp(str, prefix, strlen(prefix)) == 0; } int str_ends_with(const char *str, const char *suffix) { size_t slen = strlen(str); size_t suflen = strlen(suffix); if (suflen > slen) return 0; return strcmp(str + slen - suflen, suffix) == 0; }