1#include <ctype.h>2#include <err.h>3#include <stddef.h>4#include <stdlib.h>5#include <string.h>67#include <sys/types.h>89#include "fns.h"1011void *12xmalloc(size_t size)13{14 void *r;1516 if (!(r = malloc(size)))17 err(EXIT_FAILURE, "malloc failed");1819 return r;20}2122char *23xstrdup(char *s)24{25 char *r;2627 if (!(r = strdup(s)))28 err(EXIT_FAILURE, "strdup failed");2930 return r;31}3233void *34xrealloc(void *ptr, size_t size)35{36 void *r;3738 if (!(r = realloc(ptr, size)))39 err(EXIT_FAILURE, "realloc failed");4041 return r;42}4344char *45lowercase(char *str)46{47 size_t i;4849 for (i = 0; i < strlen(str); i++)50 str[i] = (char)tolower(str[i]);5152 return str;53}5455mpd_range_t *56mpd_new_range(size_t start, ssize_t end)57{58 mpd_range_t *range;5960 range = xmalloc(sizeof(*range));61 range->start = start;62 range->end = end;6364 return range;65}6667mpd_command_t *68mpd_new_command(char *name, size_t argc)69{70 mpd_command_t *cmd;7172 cmd = xmalloc(sizeof(*cmd));73 cmd->name = name; /* might be NULL */74 cmd->argc = argc;7576 if (argc > 0)77 cmd->argv = xmalloc(sizeof(mpd_argument_t *) * argc);78 else79 cmd->argv = NULL;8081 return cmd;82}8384static void85mpd_free_argument(mpd_argument_t *arg)86{87 if (arg->type == MPD_VAL_STR || arg->type == MPD_VAL_EXPR_STR)88 free(arg->v.sval);89 else if (arg->type == MPD_VAL_CMD)90 mpd_free_command(arg->v.cmdval);91 else if (arg->type == MPD_VAL_EXPR)92 mpd_free_expression(arg->v.eval);93 free(arg);94}9596void97mpd_free_command(mpd_command_t *cmd)98{99 size_t i;100101 if (cmd->name)102 free(cmd->name);103 for (i = 0; i < cmd->argc; i++)104 mpd_free_argument(cmd->argv[i]);105 if (cmd->argv)106 free(cmd->argv);107 free(cmd);108}