/* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}