예제 #1
0
int goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
{
  int optnr;
  cmdlinet::optiont option;
  
  if(has_prefix(opt_string, "--")) // starts with -- ?
  {
    if(opt_string.size()==3) // still "short"
    {
      option.islong=false;
      option.optchar=opt_string[2];
      optnr=getoptnr(option.optchar);
    }
    else
    {
      option.islong=true;
      option.optstring=std::string(opt_string, 2, std::string::npos);
      option.optchar=0;
      optnr=getoptnr(option.optstring);
    }
  }
  else if(has_prefix(opt_string, "-")) // starts with - ?
  {
    if(opt_string.size()==2)
    {
      option.islong=false;
      option.optchar=opt_string[1];
      optnr=getoptnr(option.optchar);
    }
    else
    {
      option.islong=true;
      option.optstring=std::string(opt_string, 1, std::string::npos);
      option.optchar=0;
      optnr=getoptnr(option.optstring);
    }
  }
  else
  {
    assert(false);
    return -1;
  }

  if(optnr==-1)
  {
    // new
    options.push_back(option);
    return options.size()-1;
  }
  
  return optnr;
}
예제 #2
0
void ms_cl_cmdlinet::process_non_cl_option(
  const std::string &s)
{
  cmdlinet::optiont option;

  option.isset=true;
  option.islong=true;
  option.optstring=std::string(s, 2, std::string::npos);
  option.optchar=0;

  int optnr=getoptnr(s);

  if(optnr==-1)
  {
    options.push_back(option);
    optnr=options.size()-1;
  }

  options[optnr].isset=true;
      
  for(unsigned j=0; non_ms_cl_options[j]!=NULL; j++)
    if(s==non_ms_cl_options[j])
      return;

  // unrecognized option
  std::cout << "Warning: uninterpreted non-CL option `"
            << s << "'" << std::endl;
}
예제 #3
0
bool gcc_cmdlinet::parse(int argc, const char **argv)
{
  for(int i=1; i<argc; i++)
  {
    int optnr;
    cmdlinet::optiont option;
    option.isset=true;

    if(strcmp(argv[i], "-")==0 ||
       argv[i][0]!='-')
    {
      args.push_back(argv[i]);
      continue;
    }    

    if(strncmp(argv[i], "--", 2)==0)
    {
      if(strlen(argv[i])==3)
      {
        option.islong=false;
        option.optchar=argv[i][2];
        optnr=getoptnr(option.optchar);
      }
      else
      {
        option.islong=true;
        option.optstring=argv[i]+2;
        option.optchar=0;
        optnr=getoptnr(option.optstring);
      }
    }
    else
    {
      if(strlen(argv[i])==2)
      {
        option.islong=false;
        option.optchar=argv[i][1];
        optnr=getoptnr(option.optchar);
      }
      else
      {
        option.islong=true;
        option.optstring=argv[i]+1;
        option.optchar=0;
        optnr=getoptnr(option.optstring);
      }
    }
    
    // new?
    if(optnr==-1)
    {
      options.push_back(option);
      optnr=options.size()-1;
    }

    options[optnr].isset=true;
    
    if( // options that don't have any arguments
      strcmp(argv[i], "--dot")==0 || // NON-GCC
      strcmp(argv[i], "--show-symbol-table")==0 || // NON-GCC
      strcmp(argv[i], "--show-function-table")==0 || // NON-GCC
      strcmp(argv[i], "--ppc-macos")==0 || // NON-GCC
      strcmp(argv[i], "--i386-linux")==0 || // NON-GCC
      strcmp(argv[i], "--i386-win32")==0 || // NON-GCC
      strcmp(argv[i], "--i386-macos")==0 || // NON-GCC
      strcmp(argv[i], "--winx64")==0 || // NON_GCC
      strcmp(argv[i], "--string-abstraction")==0 || // NON-GCC
      strcmp(argv[i], "--no-library")==0 || // NON-GCC
      strcmp(argv[i], "--16")==0 || // NON-GCC
      strcmp(argv[i], "--32")==0 || // NON-GCC
      strcmp(argv[i], "--64")==0 || // NON-GCC
      strcmp(argv[i], "--little-endian")==0 || // NON-GCC
      strcmp(argv[i], "--big-endian")==0 || // NON-GCC
      strcmp(argv[i], "--unsigned-char")==0 || // NON-GCC
      strcmp(argv[i], "--no-arch")==0 || // NON-GCC            
      strcmp(argv[i], "--xml")==0 || // NON-GCC
      strcmp(argv[i], "--partial-inlining")==0 || // NON-GCC
      strcmp(argv[i], "-h")==0 || strcmp(argv[i], "--help")==0 || // NON-GCC
      strcmp(argv[i], "-?")==0 || // NON-GCC
      strcmp(argv[i], "-r")==0 || // for ld mimicking
      strcmp(argv[i], "-c")==0 || strcmp(argv[i], "-S")==0 ||
      strcmp(argv[i], "-E")==0 || strcmp(argv[i], "-combine")==0 ||
      strcmp(argv[i], "-pipe")==0 || strcmp(argv[i], "-pass-exit-codes")==0 ||
      strcmp(argv[i], "-v")==0 || strcmp(argv[i], "-###")==0 ||
      strcmp(argv[i], "-help")==0 || strcmp(argv[i], "-target-help")==0 ||
      strcmp(argv[i], "--version")==0 || strcmp(argv[i], "-ansi")==0 ||
      strcmp(argv[i], "-trigraphs")==0 ||
      strcmp(argv[i], "-no-integrated-cpp")==0 ||
      strcmp(argv[i], "-traditional")==0 ||
      strcmp(argv[i], "-traditional-cpp")==0 ||
      strcmp(argv[i], "-nostdinc++")==0 || strcmp(argv[i], "-gen-decls")==0 ||
      strcmp(argv[i], "-pedantic")==0 ||
      strcmp(argv[i], "-pedantic-errors")==0 ||
      strcmp(argv[i], "-w")==0 || strcmp(argv[i], "-dumpspecs")==0 ||
      strcmp(argv[i], "-dumpmachine")==0 ||
      strcmp(argv[i], "-dumpversion")==0 || strcmp(argv[i], "-g")==0 ||
      strcmp(argv[i], "-gcoff")==0 || strcmp(argv[i], "-gdwarf-2")==0 ||
      strcmp(argv[i], "-ggdb")==0 || strcmp(argv[i], "-gstabs")==0 ||
      strcmp(argv[i], "-gstabs+")==0 || strcmp(argv[i], "-gvms")==0 ||
      strcmp(argv[i], "-gxcoff")==0 || strcmp(argv[i], "-gxcoff+")==0 ||
      strcmp(argv[i], "-p")==0 || strcmp(argv[i], "-pg")==0 ||
      strcmp(argv[i], "-print-libgcc-file-name")==0 ||
      strcmp(argv[i], "-print-multi-directory")==0 ||
      strcmp(argv[i], "-print-multi-lib")==0 ||
      strcmp(argv[i], "-print-search-dirs")==0 || strcmp(argv[i], "-Q")==0 ||
      strcmp(argv[i], "-save-temps")==0 || strcmp(argv[i], "-time")==0 ||
      strcmp(argv[i], "-O")==0 || strcmp(argv[i], "-O0")==0 ||        
      strcmp(argv[i], "-O1")==0 || strcmp(argv[i], "-O2")==0 ||
      strcmp(argv[i], "-O3")==0 || strcmp(argv[i], "-Os")==0 ||
      strcmp(argv[i], "-C")==0 || strcmp(argv[i], "-E")==0 ||
      strcmp(argv[i], "-H")==0 || strcmp(argv[i], "-M")==0 ||
      strcmp(argv[i], "-MM")==0 || strcmp(argv[i], "-MF")==0 ||
      strcmp(argv[i], "-MG")==0 || strcmp(argv[i], "-MP")==0 ||
      strcmp(argv[i], "-MQ")==0 || strcmp(argv[i], "-MT")==0 ||
      strcmp(argv[i], "-MD")==0 || strcmp(argv[i], "-MMD")==0 ||
      strcmp(argv[i], "-nostdinc")==0 || strcmp(argv[i], "-P")==0 ||
      strcmp(argv[i], "-remap")==0 || strcmp(argv[i], "-undef")==0 ||
      strcmp(argv[i], "-nostdinc")==0 || 
      strcmp(argv[i], "-nostartfiles")==0 ||
      strcmp(argv[i], "-nodefaultlibs")==0 ||
      strcmp(argv[i], "-nostdlib")==0 || strcmp(argv[i], "-pie")==0 ||
      strcmp(argv[i], "-rdynamic")==0 || strcmp(argv[i], "-s")==0 ||
      strcmp(argv[i], "-static")==0 || 
      strcmp(argv[i], "-static-libgcc")==0 || strcmp(argv[i], "-shared")==0 ||
      strcmp(argv[i], "-symbolic")==0 ||
      strcmp(argv[i], "-Bprefix")==0 ||
      strcmp(argv[i], "-iquotedir")==0 ||
      strcmp(argv[i], "-EB")==0 ||
      strcmp(argv[i], "-EL")==0
    )
    {
      // nothing; is added and recognized.
    }
    else if(strncmp(argv[i], "-f", 2)==0) // f-options
    {
    }
    else if(strncmp(argv[i], "-W", 2)==0) // W-options
    {
      // "Wp,..." is s special case
      if(strncmp(argv[i], "-Wp,", 4)==0)
      {
        option.optstring="Wp,";
        option.optchar=0;
        optnr=getoptnr(option.optstring);
        if(optnr==-1)
        {
          options.push_back(option);
          optnr=options.size()-1;
        }
        options[optnr].isset=true;
        options[optnr].values.push_back(argv[i]+4);
      }
    }
    else if(strncmp(argv[i], "-m", 2)==0) // m-options
    {
    }
    else if( // options that have a separated _or_ concatenated argument
        strncmp(argv[i], "-o", 2)==0 ||
        strncmp(argv[i], "-x", 2)==0 ||
        strncmp(argv[i], "-I", 2)==0 ||
        strncmp(argv[i], "-V", 2)==0 ||
        strncmp(argv[i], "-D", 2)==0 ||
        strncmp(argv[i], "-L", 2)==0 ||
        strncmp(argv[i], "-MF", 3)==0
    )
    {
      options[optnr].hasval=true;
      if(strlen(argv[i])==2)
      {
        options[optnr].optstring="";
        options[optnr].optchar=argv[i][1];
        if(i!=argc-1)
        {
          options[optnr].values.push_back(argv[i+1]);
          i++;
        }
        else
          options[optnr].values.push_back("");
      }
      else
      {
        option=options[optnr];
        option.optstring="";
        option.optchar=argv[i][1];
        optnr=getoptnr(option.optchar);
        if(optnr==-1)
        {
          options.push_back(option);
          optnr = options.size()-1;
        }
        options[optnr].isset=true;
        
        options[optnr].values.push_back(argv[i]+2);
      }
    } 
    else if( // options that have a separated argument
        strcmp(argv[i], "--verbosity")==0 || // NON-GCC
        strcmp(argv[i], "--function")==0 || // NON-GCC
        strcmp(argv[i], "-aux-info")==0 ||
        strcmp(argv[i], "--param")==0 ||
        strcmp(argv[i], "-idirafter")==0 ||
        strcmp(argv[i], "-include")==0 ||
        strcmp(argv[i], "-imacros")==0 ||
        strcmp(argv[i], "-iprefix")==0 ||
        strcmp(argv[i], "-iwithprefix")==0 ||
        strcmp(argv[i], "-iwithprefixbefore")==0 ||
        strcmp(argv[i], "-isystem")==0 ||
        strcmp(argv[i], "-isysroot")==0 ||
        strcmp(argv[i], "-Xpreprocessor")==0 ||
        strcmp(argv[i], "-Xassembler")==0 ||
        strcmp(argv[i], "-Xlinker")==0 ||
        strcmp(argv[i], "-u")==0 ||
        strcmp(argv[i], "-V")==0 ||
        strcmp(argv[i], "-b")==0
    )
    {
      options[optnr].hasval=true;

      if(i!=argc-1)
      {
        options[optnr].values.push_back(argv[i+1]);
        i++;
      }
      else
        options[optnr].values.push_back("");
    }
    else if( // options that have a concatonated argument
      strncmp(argv[i], "-d", 2)==0 ||
      strncmp(argv[i], "-g", 2)==0 ||
      strncmp(argv[i], "-A", 2)==0 ||
      strncmp(argv[i], "-U", 2)==0 ||
      strncmp(argv[i], "-l", 2)==0
    )
    {
      option = options[optnr];
      option.optstring = "";  
      option.optchar = argv[i][1];
      optnr=getoptnr(option.optchar);
      if(optnr==-1)
      {
        options.push_back(option);
        optnr = options.size()-1;
      }
      options[optnr].isset=true;
      if(strlen(argv[i])>2)
      {
        options[optnr].hasval = true;
        options[optnr].values.push_back(argv[i]+2);
      }
    }
    else if( // options that have an = argument
      strncmp(argv[i], "-std", 4)==0 ||
      strncmp(argv[i], "-print-file-name", 16)==0 ||
      strncmp(argv[i], "-print-prog-name", 16)==0 ||
      strncmp(argv[i], "-specs", 6)==0 ||
      strncmp(argv[i], "--sysroot", 9)==0
    )
    {
      const char *inx=strchr(argv[i], '=');
      if(inx!=NULL)
      {
        option = options[optnr];
        option.optstring = 
          option.optstring.substr(0, option.optstring.find("=",0)-1);
        optnr=getoptnr(option.optstring);
        if(optnr==-1)
        {
          options.push_back(option);
          optnr = options.size()-1;
        }
        options[optnr].isset=true;
                  
        options[optnr].hasval = true;
        options[optnr].values.push_back(inx+1);
      }
    }
    else
    { // unrecognized option
      std::cout << "Warning: uninterpreted gcc option '" << argv[i] << "'" << std::endl;
    }
  }

  return false;
}
예제 #4
0
void ms_cl_cmdlinet::process_cl_option(const std::string &s)
{
  if(s=="") return;

  if(s[0]!='/' && s[0]!='-')
  {
    args.push_back(s);
    return;
  }

  for(unsigned j=0; ms_cl_flags[j]!=NULL; j++)
  {
    if(std::string(s, 1, std::string::npos)==ms_cl_flags[j])
    {
      cmdlinet::optiont option;
      int optnr;

      if(s.size()==2)
      {
        option.islong=false;
        option.optstring="";
        option.optchar=s[1];
        optnr=getoptnr(option.optchar);
      }
      else
      {
        option.islong=true;
        option.optstring=std::string(s, 1, std::string::npos);
        option.optchar=0;
        optnr=getoptnr(option.optstring);
      }

      if(optnr==-1)
      {
        options.push_back(option);
        optnr=options.size()-1;
      }

      options[optnr].isset=true;
      return;
    }
  }
  
  for(unsigned j=0; ms_cl_prefixes[j]!=NULL; j++)
  {
    std::string ms_cl_prefix=ms_cl_prefixes[j];

    if(std::string(s, 1, ms_cl_prefix.size())==ms_cl_prefix)
    {
      cmdlinet::optiont option;
      
      int optnr;

      if(ms_cl_prefix.size()==1)
      {
        option.islong=false;
        option.optstring="";
        option.optchar=ms_cl_prefix[0];
        optnr=getoptnr(option.optchar);
      }
      else
      {
        option.islong=true;
        option.optstring=ms_cl_prefix;
        option.optchar=0;
        optnr=getoptnr(option.optstring);
      }

      if(optnr==-1)
      {
        options.push_back(option);
        optnr=options.size()-1;
      }

      options[optnr].isset=true;
      options[optnr].values.push_back(
        std::string(s, ms_cl_prefix.size()+1, std::string::npos));

      return;
    }
  }

  // unrecognized option
  std::cout << "Warning: uninterpreted CL option `"
            << s << "'" << std::endl;
}