7. Runt Functionality

These are core words and functions designed to integrate ftlists into runt and graforge.

7.1. loader

The loader for all the runt words is done with load_ftlist. Like all runt graforge loaders, this expects the graforge runt pointer pw.

<<runt_funcdefs>>=
int load_ftlist(runt_vm *vm, runt_ptr pw);
<<runt_funcs>>=
<<wordfuncs>>
int load_ftlist(runt_vm *vm, runt_ptr pw)
{
    runt_cell *c;
<<words>>
    return RUNT_OK;
}

7.2. ftlist_new

The runt word ftlist_new allocates a new ftlist using graforge, then pushes it onto the stack.

<<words>>=
runt_keyword_define(vm,
                    "ftlist_new",
                    10,
                    rproc_ftlist_new,
                    &c);
runt_cell_data(vm, c, pw);
<<wordfuncs>>=
static runt_int rproc_ftlist_new(runt_vm *vm, runt_ptr p)
{
    gf_patch *patch;
    sp_ftlist *ftlst;
    int rc;
    runt_stacklet *s;

    patch = rgf_get_patch(p);
    rc = runt_ppush(vm, &s);
    RUNT_ERROR_CHECK(rc);

    ftlst = malloc(sp_ftlist_sizeof());
    sp_ftlist_init(ftlst);

    rgf_append_ftlist(patch, ftlst);
    rgf_stacklet_ftlist(vm, s, ftlst);
    return RUNT_OK;
}

7.3. rgf_get_ftlist

Pops an ftlist from the runt stack, and does some light type checking.

<<runt_funcdefs>>=
runt_int rgf_get_ftlist(runt_vm *vm, sp_ftlist **ftl);
<<runt_funcs>>=
runt_int rgf_get_ftlist(runt_vm *vm, sp_ftlist **ftl)
{
    runt_int rc;
    runt_stacklet *s;

    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    if(s->t != FTLIST_TYPE) {
        runt_print(vm, "Parameter does not seem to be an ftlist\n");
        *ftl = NULL;
        return RUNT_NOT_OK;
    }
    *ftl = runt_to_cptr(s->p);
    return RUNT_OK;
}

7.4. rgf_append_ftlist

Allocates and appends an ftlist to the current graforge pointer list.

<<runt_funcdefs>>=
void rgf_append_ftlist(gf_patch *patch, sp_ftlist *ftl);
<<runt_funcs>>=
static void free_ftlist(gf_pointer *p)
{
    sp_ftlist *ftlst;

    ftlst = gf_pointer_data(p);
    sp_ftlist_clean(ftlst);
    free(ftlst);
}
void rgf_append_ftlist(gf_patch *patch, sp_ftlist *ftl)
{
    gf_patch_append_userdata(patch, free_ftlist, ftl);
}

7.5. type id

The type id is used inside the stacklet as a means for soft type checking. It it send to be END + 111, where ENDis the the last id of the default ugens (retrived via rgf_get_end).

This type ID represented as a macro FTLIST_TYPE.

<<runt_macros>>=
#define FTLIST_TYPE (rgf_get_end() + 111)

7.6. rgf_stacklet_ftlist

Configures a runt stacklet (presumably being pushed) to encapsulate an ftlist. The most important thing here is the type id, which is set to be FTLIST_TYPE.

<<runt_funcdefs>>=
void rgf_stacklet_ftlist(runt_vm *vm,
                         runt_stacklet *s,
                         sp_ftlist *ftl);
<<runt_funcs>>=
void rgf_stacklet_ftlist(runt_vm *vm,
                         runt_stacklet *s,
                         sp_ftlist *ftl)
{
    runt_stacklet_init(vm, s);
    s->p = runt_mk_cptr(vm, ftl);
    s->t = FTLIST_TYPE;
}



prev | home | next