[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