int sporth_sget(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *ftname; uint32_t index = 0; slist_d *sl; char **str = NULL; switch(pd->mode){ case PLUMBER_CREATE: str = malloc(sizeof(char *)); plumber_add_ugen(pd, SPORTH_SGET, str); if(sporth_check_args(stack, "fs") != SPORTH_OK) { plumber_print(pd,"Not enough arguments for sget\n"); return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); index = sporth_stack_pop_float(stack); if(plumber_ftmap_search_userdata(pd,ftname, (void *)&sl) != PLUMBER_OK) { plumber_print(pd, "Could not find ftable %s\n", ftname); return PLUMBER_NOTOK; } if(index > sl->len - 1) { plumber_print(pd, "Index %d exceeds slist length %d\n", index, sl->len); return PLUMBER_NOTOK; } *str = sl->list[index]; sporth_stack_push_string(stack, &sl->list[index]); break; case PLUMBER_INIT: str = pd->last->ud; sporth_stack_pop_string(stack); sporth_stack_pop_float(stack); sporth_stack_push_string(stack, str); break; case PLUMBER_COMPUTE: sporth_stack_pop_float(stack); break; case PLUMBER_DESTROY: str = pd->last->ud; free(str); break; default: plumber_print(pd,"Error: Unknown mode!"); break; } return PLUMBER_OK; }
int sporth_fexec(sporth_stack *stack, void *ud) { plumber_data *pd = ud; sporth_fload_d *fexec; sporth_fload_d *fload; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "fexec: creating\n"); #endif fexec = malloc(sizeof(sporth_fload_d)); plumber_add_ugen(pd, SPORTH_FEXEC, fexec); if(sporth_check_args(stack, "s") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for fclose\n"); stack->error++; return PLUMBER_NOTOK; } fexec->name = sporth_stack_pop_string(stack); if(plumber_ftmap_search_userdata(pd, fexec->name, (void *)&fload) == PLUMBER_NOTOK) { stack->error++; return PLUMBER_NOTOK; } fexec->fun = fload->fun; fexec->fun(pd, stack, &fexec->ud); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "fexec: initialising\n"); #endif fexec = pd->last->ud; fexec->name = sporth_stack_pop_string(stack); fexec->fun(pd, stack, &fexec->ud); break; case PLUMBER_COMPUTE: fexec = pd->last->ud; fexec->fun(pd, stack, &fexec->ud); break; case PLUMBER_DESTROY: fexec = pd->last->ud; fexec->fun(pd, stack, &fexec->ud); free(fexec); break; default: fprintf(stderr, "fexec: unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_fclose(sporth_stack *stack, void *ud) { plumber_data *pd = ud; sporth_fclose_d *fclose; sporth_fload_d *fload; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "fclose: creating\n"); #endif fclose = malloc(sizeof(sporth_fclose_d)); plumber_add_ugen(pd, SPORTH_FCLOSE, fclose); if(sporth_check_args(stack, "s") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for fclose\n"); stack->error++; return PLUMBER_NOTOK; } fclose->name = sporth_stack_pop_string(stack); if(plumber_ftmap_search_userdata(pd, fclose->name, (void *)&fload) == PLUMBER_NOTOK) { stack->error++; return PLUMBER_NOTOK; } fclose->handle = fload->handle; break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "fclose: initialising\n"); #endif fclose = pd->last->ud; fclose->name = sporth_stack_pop_string(stack); break; case PLUMBER_COMPUTE: break; case PLUMBER_DESTROY: #ifdef DEBUG_MODE fprintf(stderr, "fclose: destroying\n"); #endif fclose= pd->last->ud; dlclose(fclose->handle); free(fclose); break; default: fprintf(stderr, "fclose: unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_slick(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *ftname; uint32_t index = 0; slist_d *sl; char **str = NULL; switch(pd->mode){ case PLUMBER_CREATE: str = malloc(sizeof(char *)); plumber_add_ugen(pd, SPORTH_SLICK, str); if(sporth_check_args(stack, "s") != SPORTH_OK) { plumber_print(pd,"Not enough arguments for slick\n"); return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); if(plumber_ftmap_search_userdata(pd,ftname, (void *)&sl) != PLUMBER_OK) { plumber_print(pd, "Could not find ftable %s\n", ftname); return PLUMBER_NOTOK; } index = (uint32_t)(((SPFLOAT)sp_rand(pd->sp) / SP_RANDMAX) * sl->len); *str = sl->list[index]; sporth_stack_push_string(stack, &sl->list[index]); break; case PLUMBER_INIT: str = pd->last->ud; sporth_stack_pop_string(stack); sporth_stack_push_string(stack, str); break; case PLUMBER_COMPUTE: break; case PLUMBER_DESTROY: str = pd->last->ud; free(str); break; default: plumber_print(pd,"Error: Unknown mode!"); break; } return PLUMBER_OK; }
int sporth_set(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *ftname; SPFLOAT **var; SPFLOAT val; switch(pd->mode){ case PLUMBER_CREATE: var = malloc(sizeof(SPFLOAT *)); plumber_add_ugen(pd, SPORTH_SET, var); if(sporth_check_args(stack, "fs") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for get\n"); return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); val = sporth_stack_pop_float(stack); if(plumber_ftmap_search_userdata(pd, ftname, (void **)var) == PLUMBER_NOTOK) { fprintf(stderr, "set: could not find table '%s'\n", ftname); stack->error++; return PLUMBER_NOTOK; } **var = val; break; case PLUMBER_INIT: var = pd->last->ud; sporth_stack_pop_string(stack); val = sporth_stack_pop_float(stack); **var = val; break; case PLUMBER_COMPUTE: var = pd->last->ud; val = sporth_stack_pop_float(stack); **var = val; break; case PLUMBER_DESTROY: var = pd->last->ud; free(var); break; default: fprintf(stderr,"Error: Unknown mode!"); break; } return PLUMBER_OK; }