memset (arc, 0, sizeof (*arc));
DEFUN (arc_add, (parent, child, count),       Sym * parent AND Sym * child AND unsigned long count){  static unsigned int maxarcs = 0;  Arc *arc, **newarcs;  DBG (TALLYDEBUG, printf ("[arc_add] %lu arcs from %s to %s\n",			   count, parent->name, child->name));  arc = arc_lookup (parent, child);  if (arc)    {      /*       * A hit: just increment the count.       */      DBG (TALLYDEBUG, printf ("[tally] hit %lu += %lu\n",			       arc->count, count));      arc->count += count;      return;    }  arc = (Arc *) xmalloc (sizeof (*arc));  arc->parent = parent;  arc->child = child;  arc->count = count;  /* If this isn't an arc for a recursive call to parent, then add it     to the array of arcs.  */  if (parent != child)    {      /* If we've exhausted space in our current array, get a new one	 and copy the contents.   We might want to throttle the doubling	 factor one day.  */      if (numarcs == maxarcs)	{	  /* Determine how much space we want to allocate.  */	  if (maxarcs == 0)	    maxarcs = 1;	  maxarcs *= 2;		  /* Allocate the new array.  */	  newarcs = (Arc **)xmalloc(sizeof (Arc *) * maxarcs);	  /* Copy the old array's contents into the new array.  */	  memcpy (newarcs, arcs, numarcs * sizeof (Arc *));	  /* Free up the old array.  */	  free (arcs);	  /* And make the new array be the current array.  */	  arcs = newarcs;	}      /* Place this arc in the arc array.  */      arcs[numarcs++] = arc;    }  /* prepend this child to the children of this parent: */  arc->next_child = parent->cg.children;  parent->cg.children = arc;  /* prepend this parent to the parents of this child: */  arc->next_parent = child->cg.parents;  child->cg.parents = arc;}