#include "perl_xmmsclient.h" MODULE = Audio::XMMSClient::Collection PACKAGE = Audio::XMMSClient::Collection PREFIX = xmmsc_coll_ xmmsc_coll_t * xmmsc_coll_new (class, type, ...) xmmsc_coll_type_t type PREINIT: int i, nargs; HV *args; HE *iter; CODE: RETVAL = xmmsc_coll_new (type); nargs = items - 2; if (nargs == 1) { if (!SvOK (ST (2)) || !SvROK (ST (2)) || !(SvTYPE (SvRV (ST (2))) == SVt_PVHV)) croak ("expected hash reference or hash"); args = (HV *)SvRV (ST (2)); hv_iterinit (args); while ((iter = hv_iternext (args))) { xmmsc_coll_attribute_set (RETVAL, HePV (iter, PL_na), SvPV_nolen (HeVAL (iter))); } } else { if (nargs % 2 != 0) croak ("expected even number of attributes/values"); for (i = 2; i <= nargs; i += 2) { xmmsc_coll_attribute_set (RETVAL, SvPV_nolen (ST (i)), SvPV_nolen (ST (i+1))); } } OUTPUT: RETVAL xmmsc_coll_t * xmmsc_coll_parse (class, const char *pattern) PREINIT: int ret; CODE: ret = xmmsc_coll_parse (pattern, &RETVAL); POSTCALL: if (RETVAL == 0) XSRETURN_UNDEF; OUTPUT: RETVAL void DESTROY (coll) xmmsc_coll_t *coll CODE: xmmsc_coll_unref (coll); void xmmsc_coll_set_idlist (coll, ...) xmmsc_coll_t *coll PREINIT: int i; unsigned int *ids; INIT: ids = (unsigned int *)malloc (sizeof (unsigned int) * items); for (i = 0; i < items - 1; i++) { ids[i] = SvUV (ST (i + 1)); if (ids[i] == 0) { free (ids); croak("0 is an invalid mlib id"); } } ids[items - 1] = 0; C_ARGS: coll, ids CLEANUP: free (ids); void xmmsc_coll_add_operand (coll, op) xmmsc_coll_t *coll xmmsc_coll_t *op void xmmsc_coll_remove_operand (coll, op) xmmsc_coll_t *coll xmmsc_coll_t *op int xmmsc_coll_idlist_append (coll, id) xmmsc_coll_t *coll unsigned int id INIT: if (id == 0) { croak ("0 is an invalid mlib id"); } int xmmsc_coll_idlist_insert (coll, index, id) xmmsc_coll_t *coll unsigned int index unsigned int id INIT: if (index > xmmsc_coll_idlist_get_size (coll)) { croak ("inserting id after end of idlist"); } if (id == 0) { croak ("0 is an invalid mlib id"); } int xmmsc_coll_idlist_move (coll, from, to) xmmsc_coll_t *coll unsigned int from unsigned int to PREINIT: size_t idlist_len; INIT: idlist_len = xmmsc_coll_idlist_get_size (coll); if (from > idlist_len) { croak ("trying to move id from after the idlists end"); } if (to >= idlist_len) { croak ("trying to move id to after the idlists end"); } int xmmsc_coll_idlist_clear (coll) xmmsc_coll_t *coll NO_OUTPUT int xmmsc_coll_idlist_get_index (xmmsc_coll_t *coll, unsigned int index, OUTLIST uint32_t val) INIT: PERL_UNUSED_VAR (targ); if (index > xmmsc_coll_idlist_get_size (coll)) { croak ("trying to get an id from behind the idlists end"); } POSTCALL: if (RETVAL == 0) XSRETURN_UNDEF; int xmmsc_coll_idlist_set_index (coll, index, val) xmmsc_coll_t *coll unsigned int index uint32_t val PREINIT: size_t idlist_len; INIT: idlist_len = xmmsc_coll_idlist_get_size (coll); if (idlist_len == 0 || index > idlist_len - 1) { croak ("trying to set an id after the end of the idlist"); } size_t xmmsc_coll_idlist_get_size (coll) xmmsc_coll_t *coll xmmsc_coll_type_t xmmsc_coll_get_type (coll) xmmsc_coll_t *coll void xmmsc_coll_get_idlist (coll) xmmsc_coll_t *coll PREINIT: uint32_t *ret; size_t size; unsigned int i = 0; PPCODE: ret = xmmsc_coll_get_idlist (coll); if (ret == NULL) XSRETURN_UNDEF; size = xmmsc_coll_idlist_get_size (coll); EXTEND (sp, size); while (ret[i] != 0) { PUSHs (sv_2mortal (newSVuv (ret[i]))); ++i; } void operands (coll) xmmsc_coll_t *coll ALIAS: operand_list = 1 PREINIT: xmmsc_coll_t *op; PPCODE: PERL_UNUSED_VAR (ix); for (xmmsc_coll_operand_list_first (coll); xmmsc_coll_operand_list_entry (coll, &op); xmmsc_coll_operand_list_next (coll)) { xmmsc_coll_ref (op); XPUSHs (sv_2mortal (perl_xmmsclient_new_sv_from_ptr (op, "Audio::XMMSClient::Collection"))); } int xmmsc_coll_operand_list_first (coll) xmmsc_coll_t *coll int xmmsc_coll_operand_list_valid (coll) xmmsc_coll_t *coll NO_OUTPUT int xmmsc_coll_operand_list_entry (xmmsc_coll_t *coll, OUTLIST xmmsc_coll_t *op) INIT: PERL_UNUSED_VAR (targ); POSTCALL: xmmsc_coll_ref (op); if (RETVAL == 0) XSRETURN_UNDEF; int xmmsc_coll_operand_list_next (coll) xmmsc_coll_t *coll int xmmsc_coll_operand_list_save (coll) xmmsc_coll_t *coll int xmmsc_coll_operand_list_restore (coll) xmmsc_coll_t *coll void xmmsc_coll_attribute_set (coll, key, value) xmmsc_coll_t *coll const char *key const char *value int xmmsc_coll_attribute_remove (coll, key) xmmsc_coll_t *coll const char *key NO_OUTPUT int xmmsc_coll_attribute_get (xmmsc_coll_t *coll, const char *key, OUTLIST char *val) INIT: PERL_UNUSED_VAR (targ); POSTCALL: if (RETVAL == 0) XSRETURN_UNDEF; void xmmsc_coll_attribute_list (xmmsc_coll_t *coll) PREINIT: const char *key; const char *value; PPCODE: xmmsc_coll_attribute_list_first (coll); while (xmmsc_coll_attribute_list_valid (coll)) { xmmsc_coll_attribute_list_entry (coll, &key, &value); EXTEND (sp, 2); mPUSHp (key, strlen (key)); mPUSHp (value, strlen (value)); xmmsc_coll_attribute_list_next (coll); } xmmsc_coll_t * xmmsc_coll_universe (class="optional") C_ARGS: /* void */ BOOT: PERL_UNUSED_VAR (items);