[PD-dev] dogensym voodoo
Jonathan Wilkes
jancsika at yahoo.com
Sat Sep 7 00:24:27 CEST 2013
On 09/06/2013 04:29 PM, Jonathan Wilkes wrote:
> Hi list,
> Can someone explain the symhash voodoo in the dogensym function of
> m_class.c?
>
> To me it looks like sym1 could be referring to a location in
> the symhash array which isn't yet initialized, so I can't
> wrap my head around why sym2->s_name doesn't just
> crash Pd.
Ah I see-- global array gets initialized to zero. Then the
while loop won't execute until something that is nonzero
exists at that index.
Nevermind!
Best,
Jonathan
>
> Code below for easy reference:
>
> /* ---------------- the symbol table ------------------------ */
>
> #define HASHSIZE 1024
>
> static t_symbol *symhash[HASHSIZE];
>
> t_symbol *dogensym(const char *s, t_symbol *oldsym)
> {
> t_symbol **sym1, *sym2;
> unsigned int hash1 = 0, hash2 = 0;
> int length = 0;
> const char *s2 = s;
> while (*s2)
> {
> hash1 += *s2;
> hash2 += hash1;
> length++;
> s2++;
> }
> sym1 = symhash + (hash2 & (HASHSIZE-1));
> while (sym2 = *sym1)
> {
> if (!strcmp(sym2->s_name, s)) return(sym2);
> sym1 = &sym2->s_next;
> }
> if (oldsym) sym2 = oldsym;
> else
> {
> sym2 = (t_symbol *)t_getbytes(sizeof(*sym2));
> sym2->s_name = t_getbytes(length+1);
> sym2->s_next = 0;
> sym2->s_thing = 0;
> strcpy(sym2->s_name, s);
> }
> *sym1 = sym2;
> return (sym2);
> }
>
> _______________________________________________
> Pd-dev mailing list
> Pd-dev at iem.at
> http://lists.puredata.info/listinfo/pd-dev
>
>
More information about the Pd-dev
mailing list