text: /* annoOption -- optionSpec-style param plus its value */
  
  #include "annoOption.h"
  
  struct annoOption *annoOptionCloneList(struct annoOption *list)
  /* Return a newly allocated copy of list. */
  {
  struct annoOption *newList = NULL, *afo;
  for (afo = list;  afo != NULL;  afo = afo->next)
      {
      struct annoOption *newAfo = CloneVar(afo);
      newAfo->spec.name = cloneString(afo->spec.name);
      newAfo->value = NULL;
      unsigned opFlags = opFlags;
      if (opFlags & OPTION_MULTI)
  	{
  	switch (opFlags & OPTION_TYPE_MASK)
  	    {
  	    case OPTION_STRING:
  		newAfo->value = slNameCloneList((struct slName *)(afo->value));
  		break;
  	    default:
  		errAbort("annoOptionCloneList: OPTION_MULTI implemented only for "
  			 "OPTION_STRING (not 0x%x)", opFlags);
  	    }
  	}
      else
  	{
  	switch (opFlags & OPTION_TYPE_MASK)
  	    {
  	    // For numeric singleton values, we are overloading value.
  	    case OPTION_DOUBLE:
  	    case OPTION_FLOAT:
  	    case OPTION_LONG_LONG:
  	    case OPTION_INT:
  	    case OPTION_BOOLEAN:
  		newAfo->value = afo->value;
  		break;
  	    case OPTION_STRING:
  		newAfo->value = cloneString((char *)afo->value);
  		break;
  	    default:
  		errAbort("annoOptionCloneList: unrecognized op type 0x%x", opFlags);
  	    }
  	}
      slAddHead(&newList, newAfo);
      }
  slReverse(&newList);
  return newList;
  }
  
  void annoOptionFreeList(struct annoOption **pList)
  /* Free the same things that we clone above. */
  {
  if (pList == NULL)
      return;
  struct annoOption *afo, *nextAfo;
  for (afo = *pList;  afo != NULL;  afo = nextAfo)
      {
      nextAfo = afo->next;
      freeMem(afo->spec.name);
      unsigned opFlags = opFlags;
      if (opFlags & OPTION_MULTI)
  	{
  	switch (opFlags & OPTION_TYPE_MASK)
  	    {
  	    case OPTION_STRING:
  		slNameFreeList(&(afo->value));
  		break;
  	    default:
  		errAbort("annoOptionFreeList: OPTION_MULTI implemented only for "
  			 "OPTION_STRING (not 0x%x)", opFlags);
  	    }
  	}
      else
  	{
  	switch (opFlags & OPTION_TYPE_MASK)
  	    {
  	    // No need to free overloaded numeric values
  	    case OPTION_DOUBLE:
  	    case OPTION_FLOAT:
  	    case OPTION_LONG_LONG:
  	    case OPTION_INT:
  	    case OPTION_BOOLEAN:
  		break;
  	    case OPTION_STRING:
  		freeMem(afo->value);
  		break;
  	    default:
  		errAbort("annoOptionFreeList: unrecognized op type 0x%x", opFlags);
  	    }
  	}
      freeMem(afo);
      }
  *pList = NULL;
  }
  
  