1#include "fns.h"2#include "mpc.h"34/* This file provides some custom fold functions for dealing with5 * MPD commands taking variadic arguments, if these are needed6 * elsewhere at some point the concept needs to be generalized. */78static mpc_val_t *9mpdf_argvfold(int n, mpc_val_t **xs)10{11 int i;12 mpd_command_t *cmd;1314 cmd = mpd_new_command(NULL, (size_t)n);15 for (i = 0; i < n; i++) {16 cmd->argv[i] = xmalloc(sizeof(mpd_argument_t));17 cmd->argv[i]->type = MPD_VAL_STR;18 cmd->argv[i]->v.sval = (char *)xs[i];19 }2021 return cmd;22}2324static mpc_val_t *25mpdf_cmdfold(int n, mpc_val_t **xs)26{27 size_t i, j, oldargc;28 mpd_command_t *cmd;2930 assert(n >= 3);31 cmd = (mpd_command_t *)xs[n - 1];32 cmd->name = (char *)xs[0];3334 n -= 2;35 oldargc = cmd->argc;36 cmd->argc += (size_t)n;3738 cmd->argv = xrealloc(cmd->argv, sizeof(mpd_argument_t *) * cmd->argc);39 memmove(&cmd->argv[n], cmd->argv, sizeof(mpd_argument_t *) * oldargc);4041 for (i = 0, j = 1; i < (size_t)n; i++, j++) {42 cmd->argv[i] = xmalloc(sizeof(mpd_argument_t));43 cmd->argv[i]->type = MPD_VAL_STR;44 cmd->argv[i]->v.sval = xs[j];45 }4647 return cmd;48}4950mpdf_fold(tagtypes, MPD_ARG_STRING)5152static mpc_parser_t *53mpd_ping(void)54{55 return mpd_cmd_noarg("ping");56}5758static mpc_parser_t *59mpd_tagtypes_clear(void)60{61 return mpc_and(2, mpdf_tagtypes, mpc_string("tagtypes"),62 mpd_argument(mpc_string("clear")), free);63}6465static mpc_parser_t *66mpd_tagtypes_all(void)67{68 return mpc_and(2, mpdf_tagtypes, mpc_string("tagtypes"),69 mpd_argument(mpc_string("all")), free);70}7172static mpc_parser_t *73mpd_tagtypes_disable(void)74{75 mpc_parser_t *args;7677 args = mpc_many1(mpdf_argvfold, mpd_argument(mpd_string()));78 return mpc_and(3, mpdf_cmdfold, mpc_string("tagtypes"),79 mpd_argument(mpc_string("disable")), args, free, free);80}8182static mpc_parser_t *83mpd_tagtypes_enable(void)84{85 mpc_parser_t *args;8687 args = mpc_many1(mpdf_argvfold, mpd_argument(mpd_string()));88 return mpc_and(3, mpdf_cmdfold, mpc_string("tagtypes"),89 mpd_argument(mpc_string("enable")), args, free, free);90}9192static mpc_parser_t *93mpd_tagtypes(void)94{95 return mpd_cmd_noarg("tagtypes");96}9798mpc_parser_t *99mpd_connection_cmds(void)100{101 return mpc_or(6, mpd_ping(), mpd_tagtypes_all(), mpd_tagtypes_clear(),102 mpd_tagtypes_disable(), mpd_tagtypes_enable(),103 mpd_tagtypes());104}