util.c (1452B)
1 /* See LICENSE file for copyright and license details. */ 2 3 #include <ctype.h> 4 #include <stdarg.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 9 #include "util.h" 10 11 void 12 die(const char *fmt, ...) 13 { 14 va_list ap; 15 16 va_start(ap, fmt); 17 vfprintf(stderr, fmt, ap); 18 va_end(ap); 19 if (fmt[0] && fmt[strlen(fmt) - 1] == ':') { 20 fputc(' ', stderr); 21 perror(NULL); 22 } else { 23 fputc('\n', stderr); 24 } 25 exit(1); 26 } 27 28 void 29 warn(const char *fmt, ...) 30 { 31 va_list ap; 32 33 va_start(ap, fmt); 34 fprintf(stderr, "warning: "); 35 vfprintf(stderr, fmt, ap); 36 va_end(ap); 37 fputc('\n', stderr); 38 } 39 40 void * 41 xmalloc(size_t size) 42 { 43 void *p = malloc(size); 44 45 if (!p) 46 die("malloc:"); 47 return p; 48 } 49 50 void * 51 xrealloc(void *ptr, size_t size) 52 { 53 void *p = realloc(ptr, size); 54 55 if (!p) 56 die("realloc:"); 57 return p; 58 } 59 60 char * 61 xstrdup(const char *s) 62 { 63 char *p = strdup(s); 64 65 if (!p) 66 die("strdup:"); 67 return p; 68 } 69 70 char * 71 str_trim(char *str) 72 { 73 char *end; 74 75 while (isspace((unsigned char)*str)) 76 str++; 77 if (*str == '\0') 78 return str; 79 end = str + strlen(str) - 1; 80 while (end > str && isspace((unsigned char)*end)) 81 end--; 82 end[1] = '\0'; 83 return str; 84 } 85 86 int 87 str_starts_with(const char *str, const char *prefix) 88 { 89 return strncmp(str, prefix, strlen(prefix)) == 0; 90 } 91 92 int 93 str_ends_with(const char *str, const char *suffix) 94 { 95 size_t slen = strlen(str); 96 size_t suflen = strlen(suffix); 97 98 if (suflen > slen) 99 return 0; 100 return strcmp(str + slen - suflen, suffix) == 0; 101 }