bool Option::operator<(Option &aOther)
{
  if (name_ == 0 && aOther.getName() != 0)
    return false;
  else if (name_ != 0 && aOther.getName() == 0)
    return true;
  else if (name_ == 0 && aOther.getName() == 0)
  {
    if (order_ == -1)
      return false;
    if (aOther.getOrder() == -1)
      return true;
    
    return order_ < aOther.getOrder();
  }
  
  return strcmp(name_, aOther.getName()) < 0;
}
void OptionsList::usage()
{
  size_t len;
  char buffer[1024], *cp;

  cp = buffer;
  len = sprintf(buffer, "Usage: %s ", program_);
  cp += len;

  bool hasSimpleFlags = false;
	
  for (list<Option>::iterator iter = begin(); iter != end(); iter++)
  {
    Option *opt = &(*iter);
    if (opt->getName() != NULL &&
        !opt->hasArgument() &&
        (len = strlen(opt->getName())) == 1)
    {
      hasSimpleFlags = true;
      break;
    }
  }

  if (hasSimpleFlags)
  {
    *cp++ = '[';
    *cp++ = '-';
		
    for (list<Option>::iterator iter = begin(); iter != end(); iter++)
    {
      Option *opt = &(*iter);
      if (opt->getName() != NULL &&
          !opt->hasArgument() &&
          (len = strlen(opt->getName())) == 1)
      {
	strcpy(cp, opt->getName());
	cp += len;
      }
    }
		
    *cp++ = ']';
  }

  char staging[128], *cp2;
  for (list<Option>::iterator iter = begin(); iter != end(); iter++)
  {
    Option *opt = &(*iter);

    if (opt->getName() != NULL && !opt->hasArgument() && (len = strlen(opt->getName())) == 1)
      continue;
		
    *cp++ = ' ';

    cp2 = staging;
    if (!opt->isRequired())
    {
      *cp2++ = '[';
    }

    if (opt->getType() == Option::eList)
    {
      *cp2++ = '{';
    }
				
    if (opt->getName() != NULL && !opt->hasArgument() && strlen(opt->getName()) > 1)
    {
      len = sprintf(cp2, "-%s", opt->getName());
      cp2 += len;
    }
    else if (opt->getName() != NULL && opt->hasArgument())
    {
      len = sprintf(cp2, "-%s <%s>", opt->getName(), opt->getArgDesc());
      cp2 += len;
    }
    else if (opt->getName() == NULL)
    {
      len = sprintf(cp2, "<%s>", opt->getArgDesc());
      cp2 += len;
    }
		
    if (opt->getType() == Option::eList)
    {
      *cp2++ = '}';
      *cp2++ = '.';
      *cp2++ = '.';
      *cp2++ = '.';
    }
				
    if (!opt->isRequired())
    {
      *cp2++ = ']';
    }

    *cp2 = '\0';
		
    if (((cp2 - staging) + (cp - buffer)) > 79)
    {
      *cp++ = '\n';
      *cp = '\0';
			
      fputs(buffer, stderr);
      strcpy(buffer, "        ");
      cp = buffer + 8;
    }
		
    strcpy(cp, staging);
    cp += cp2 - staging;
  }

  *cp++ = '\n';
  *cp = '\0';
  fputs(buffer, stderr);
	

  for (list<Option>::iterator iter = begin(); iter != end(); iter++)
  {
    Option *opt = &(*iter);
    if (opt->getName() != NULL)
    {
      if (opt->hasArgument())
	sprintf(buffer, "-%-2.2s <%s>", opt->getName(), opt->getArgDesc());
      else
	sprintf(buffer, "-%-6.6s", opt->getName());
    }
    else if (opt->getOrder() >= 0)
    {
      sprintf(buffer, "<%s>", opt->getArgDesc());
    }
    else
    {
      sprintf(buffer, "<%s>...", opt->getArgDesc());
    }
		
    fprintf(stderr, "    %-20.20s : ", buffer);
    const char *cp = opt->getUsage();
    while (*cp != '\0')
    {
      if (*cp == '\n')
      {
	fputc(*cp, stderr);
	int count = 4 + 20 + 1;
	while (count--)
	  fputc(' ', stderr);
				
	fputc('>', stderr);
	fputc(' ', stderr);
      }
      else
      {
	fputc(*cp, stderr);
      }
			
      cp++;
    }
    fputc('\n', stderr);
  }

  exit(256);
}