/*******************************************************************\

Module:

Author: Daniel Kroening, kroening@cs.cmu.edu

\*******************************************************************/

#include <iostream>

#include "general.h"
#include "cmdline.h"

/*******************************************************************\

Function:

  Inputs:

 Outputs:

 Purpose:

\*******************************************************************/

cmdlinet::cmdlinet()
 {
 }

/*******************************************************************\

Function:

  Inputs:

 Outputs:

 Purpose:

\*******************************************************************/

cmdlinet::~cmdlinet()
 {
  clear();
 }

void cmdlinet::clear()
 {
  options.clear();
  args.clear();
 }

bool cmdlinet::isset(char option)
 {
  int i;

  i=getoptnr(option);
  if(i<0) return FALSE;
  return options[i].isset;
 }

bool cmdlinet::isset(const char *option)
 {
  int i;

  i=getoptnr(option);
  if(i<0) return FALSE;
  return options[i].isset;
 }

const char *cmdlinet::getval(char option)
 {
  int i;

  i=getoptnr(option);
  if(i<0) return (const char *)NULL;
  return options[i].value.c_str();
 }

const char *cmdlinet::getval(const char *option)
 {
  int i;

  i=getoptnr(option);
  if(i<0) return (const char *)NULL;
  return options[i].value.c_str();
 }

int cmdlinet::getoptnr(char option)
 {
  for(unsigned i=0; i<options.size(); i++)
    if(options[i].optchar==option)
      return i;
  
  return -1;
 }

int cmdlinet::getoptnr(const char *option)
 {
  for(unsigned i=0; i<options.size(); i++)
    if(options[i].optstring==option)
      return i;
  
  return -1;
 }

bool cmdlinet::parse(int argc, char **argv, const char *optstring)
 {
  clear();

  while(optstring[0]!=0)
   {
    optiont option;

    if(optstring[0]==':')
     {
      std::cerr << "cmdlinet::parse: Invalid option string" << std::endl;
      abort();
     }

    if(optstring[0]=='(')
     {
      option.islong=TRUE;
      option.optchar=0;
      option.isset=FALSE;
      option.value="";
      option.optstring="";

      for(optstring++; optstring[0]!=')' && optstring[0]!=0; optstring++)
        option.optstring+=optstring[0];

      if(optstring[0]==')') optstring++;
     }
    else
     {
      option.islong=FALSE;
      option.optchar=optstring[0];
      option.optstring="";
      option.isset=FALSE;
      option.value="";

      optstring++;
     }

    if(optstring[0]==':')
     {
      option.hasval=TRUE;
      optstring++;
     }
    else
      option.hasval=FALSE;

    options.push_back(option);
   }

  for(int i=1; i<argc; i++)
   {
    if(argv[i][0]!='-')
      args.push_back(argv[i]);
    else
     {
      int optnr;

      if(argv[i][1]=='-')
        optnr=getoptnr(argv[i]+2);
      else
        optnr=getoptnr(argv[i][1]);
   
      if(optnr<0) return TRUE;
      options[optnr].isset=TRUE;
      if(options[optnr].hasval)
       {
        if(argv[i][2]==0 || options[optnr].islong)
         {
          i++;
          if(i==argc) return TRUE;
          if(argv[i][0]=='-') return TRUE;
          options[optnr].value=argv[i];
         }
        else
          options[optnr].value=argv[i]+2;
       }
     }
   }

  return FALSE;
 }


syntax highlighted by Code2HTML, v. 0.9.1