OptionParser.cpp revision 269024
1279264Sdelphij//===-- source/Host/common/OptionParser.cpp ---------------------*- C++ -*-===//
2238405Sjkim//
3238405Sjkim//                     The LLVM Compiler Infrastructure
4238405Sjkim//
5238405Sjkim// This file is distributed under the University of Illinois Open Source
6238405Sjkim// License. See LICENSE.TXT for details.
7238405Sjkim//
8238405Sjkim//===----------------------------------------------------------------------===//
9238405Sjkim
10238405Sjkim#include "lldb/Host/OptionParser.h"
11238405Sjkim
12238405Sjkim#if (!defined( _MSC_VER ) && defined( _WIN32 ))
13238405Sjkim#define _BSD_SOURCE // Required so that getopt.h defines optreset
14238405Sjkim#endif
15238405Sjkim#include "lldb/Host/HostGetOpt.h"
16238405Sjkim
17238405Sjkimusing namespace lldb_private;
18238405Sjkim
19238405Sjkimvoid
20238405SjkimOptionParser::Prepare()
21238405Sjkim{
22238405Sjkim#ifdef __GLIBC__
23238405Sjkim    optind = 0;
24238405Sjkim#else
25238405Sjkim    optreset = 1;
26238405Sjkim    optind = 1;
27238405Sjkim#endif
28238405Sjkim}
29238405Sjkim
30238405Sjkimvoid
31238405SjkimOptionParser::EnableError(bool error)
32238405Sjkim{
33238405Sjkim    opterr = error ? 1 : 0;
34238405Sjkim}
35238405Sjkim
36238405Sjkimint
37238405SjkimOptionParser::Parse (int argc,
38238405Sjkim                     char * const argv [],
39238405Sjkim                     const char *optstring,
40238405Sjkim                     const Option *longopts,
41279264Sdelphij                     int *longindex)
42279264Sdelphij{
43238405Sjkim    return getopt_long_only(argc, argv, optstring, (const option*)longopts, longindex);
44238405Sjkim}
45238405Sjkim
46238405Sjkimchar*
47238405SjkimOptionParser::GetOptionArgument()
48238405Sjkim{
49238405Sjkim    return optarg;
50238405Sjkim}
51238405Sjkim
52238405Sjkimint
53279264SdelphijOptionParser::GetOptionIndex()
54279264Sdelphij{
55279264Sdelphij    return optind;
56238405Sjkim}
57279264Sdelphij
58279264Sdelphijint
59279264SdelphijOptionParser::GetOptionErrorCause()
60279264Sdelphij{
61279264Sdelphij    return optopt;
62279264Sdelphij}
63238405Sjkim
64279264Sdelphijstd::string
65279264SdelphijOptionParser::GetShortOptionString(struct option *long_options)
66279264Sdelphij{
67279264Sdelphij    std::string s;
68279264Sdelphij    int i=0;
69238405Sjkim    bool done = false;
70279264Sdelphij    while (!done)
71238405Sjkim    {
72238405Sjkim        if (long_options[i].name    == 0 &&
73238405Sjkim            long_options[i].has_arg == 0 &&
74238405Sjkim            long_options[i].flag    == 0 &&
75238405Sjkim            long_options[i].val     == 0)
76238405Sjkim        {
77238405Sjkim            done = true;
78238405Sjkim        }
79238405Sjkim        else
80238405Sjkim        {
81238405Sjkim            if (long_options[i].flag == NULL &&
82238405Sjkim                isalpha(long_options[i].val))
83238405Sjkim            {
84238405Sjkim                s.append(1, (char)long_options[i].val);
85238405Sjkim                switch (long_options[i].has_arg)
86238405Sjkim                {
87238405Sjkim                    default:
88238405Sjkim                    case no_argument:
89238405Sjkim                        break;
90238405Sjkim
91238405Sjkim                    case optional_argument:
92238405Sjkim                        s.append(2, ':');
93238405Sjkim                        break;
94238405Sjkim                    case required_argument:
95238405Sjkim                        s.append(1, ':');
96238405Sjkim                        break;
97238405Sjkim                }
98238405Sjkim            }
99238405Sjkim            ++i;
100238405Sjkim        }
101238405Sjkim    }
102238405Sjkim    return s;
103238405Sjkim}
104238405Sjkim