static void test_hash() { char **p; struct dn_ht *h; uintptr_t x = 0; uintptr_t x1 = 0; /* first, find and allocate */ h = dn_ht_init(NULL, 10, 0, hf, matchf, newfn); for (p = strings; *p; p++) { dn_ht_find(h, (uintptr_t)*p, DNHT_INSERT, NULL); } dn_ht_scan(h, doprint, 0); printf("/* second -- find without allocate */\n"); h = dn_ht_init(NULL, 10, 0, hf, matchf, NULL); for (p = strings; *p; p++) { void **y = newfn((uintptr_t)*p, 0, NULL); if (x == 0) x = (uintptr_t)y; else { if (x1 == 0) x1 = (uintptr_t)*p; } dn_ht_find(h, (uintptr_t)y, DNHT_INSERT | DNHT_KEY_IS_OBJ, NULL); } dn_ht_scan(h, doprint, 0); printf("remove %p gives %p\n", (void *)x, dn_ht_find(h, x, DNHT_KEY_IS_OBJ | DNHT_REMOVE, NULL)); printf("remove %p gives %p\n", (void *)x, dn_ht_find(h, x, DNHT_KEY_IS_OBJ | DNHT_REMOVE, NULL)); printf("remove %p gives %p\n", (void *)x, dn_ht_find(h, x1, DNHT_REMOVE, NULL)); printf("remove %p gives %p\n", (void *)x, dn_ht_find(h, x1, DNHT_REMOVE, NULL)); dn_ht_scan(h, doprint, 0); }
static void *riddle_new(t_symbol *s, int ac, t_atom *av) { /* IFBUILTIN remove: this is a bad hack */ t_pd *en = riddle_getenvironment(); t_newgimme newfn = (t_newgimme)zgetfn(en, s); if (!newfn) { loudbug_bug("riddle_new 1"); return (0); } else { t_riddle *rd = (t_riddle *)newfn(s, ac, av); int i, nslots; t_rdsource *inslot; t_rdsink *outslot; t_rdremote *re; if (!rd) return (0); rd->rd_private = getbytes(sizeof(*rd->rd_private)); rd->rd_disabled = 0; rd->rd_wasdisabled = 0; rd->rd_blockfn = (t_rdblockfn)zgetfn((t_pd *)rd, gensym("dspblock")); rd->rd_dspfn = (t_rddspfn)zgetfn((t_pd *)rd, gensym("_dsp")); if (!rd->rd_dspfn) loudbug_bug("riddle_new 2"); rd->rd_graphsr = (int)sys_getsr(); rd->rd_graphblock = sys_getblksize(); rd->rd_nsiginlets = obj_nsiginlets((t_object *)rd); rd->rd_nsigoutlets = obj_nsigoutlets((t_object *)rd); /* currently, rd_nremoteslots is incremented in rdbuffer_newreader(), which relies on calloc in pd_new(), LATER rethink */ nslots = rd->rd_nsiginlets + rd->rd_nremoteslots; rd->rd_inslots = getbytes(nslots * sizeof(*rd->rd_inslots)); for (i = 0, inslot = rd->rd_inslots; i < nslots; i++, inslot++) { inslot->so_riddle = rd; inslot->so_remote = 0; inslot->so_sourcecount = 0; inslot->so_pattern = 0; inslot->so_newpattern = 0; inslot->so_block = 0; inslot->so_newblock = 0; inslot->so_flags = 0; } rd->rd_remoteslots = rd->rd_inslots + rd->rd_nsiginlets; for (i = 0, inslot = rd->rd_remoteslots, re = rd->rd_remoteports; i < rd->rd_nremoteslots; i++, inslot++) { if (re = rdremote_nextreader(re)) inslot->so_remote = re; else { loudbug_bug("riddle_new 3"); break; /* FIXME this is fatal */ } } rd->rd_outslots = getbytes(rd->rd_nsigoutlets * sizeof(*rd->rd_outslots)); for (i = 0, outslot = rd->rd_outslots; i < rd->rd_nsigoutlets; i++, outslot++) { outslot->si_riddle = rd; outslot->si_outno = -1; outslot->si_pattern = 0; outslot->si_block = 0; outslot->si_flags = 0; outslot->si_outbuf[0].a_type = A_FLOAT; outslot->si_outbuf[1].a_type = A_SYMBOL; outslot->si_outbuf[1].a_w.w_symbol = rdps__; outslot->si_outbuf[2].a_type = A_FLOAT; outslot->si_outbuf[3].a_type = A_FLOAT; outslot->si_outbuf[3].a_w.w_float = 0.; outslot->si_feedchain = 0; outslot->si_isready = 0; } riddle_validatesinks(rd); for (i = 0, outslot = rd->rd_outslots; i < rd->rd_nsigoutlets; i++, outslot++) if (outslot->si_outno >= 0) outslot->si_feedchain = rdfeedchain_new(outslot->si_outno); rd->rd_idlepicker = rdpicker_attach(rd, gensym("_idle")); return (rd); } }