This is a multipurpose question:
Also, please note this implementation can read past the end of a char array here:
for (w = (const void *)s; !HASZERO(*w); w++);
and therefore relies on undefined behaviour.