15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import getopt
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from idl_log import ErrOut, InfoOut, WarnOut
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OptionMap = { }
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetOption(name):
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if name not in OptionMap:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise RuntimeError('Could not find option "%s".' % name)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OptionMap[name].Get()
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Option(object):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, desc, default = None, callfunc = None,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               testfunc = None, cookie = None):
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Verify this option is not a duplicate
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if name in OptionMap:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise RuntimeError('Option "%s" already exists.' % name)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.desc = desc
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.default = default
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.value = default
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.callfunc = callfunc
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.testfunc = testfunc
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.cookie = cookie
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OptionMap[name] = self
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Set(self, value):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.testfunc:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if not self.testfunc(self, value): return False
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # If this is a boolean option, set it to true
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.default is None:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.value = True
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.value = value
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.callfunc:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.callfunc(self)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Get(self):
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.value
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def DumpOption(option):
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if len(option.name) > 1:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out = '  --%-15.15s\t%s' % (option.name, option.desc)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out = '   -%-15.15s\t%s' % (option.name, option.desc)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if option.default:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out = '%s\n\t\t\t(Default: %s)\n' % (out, option.default)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfoOut.Log(out)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def DumpHelp(option=None):
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfoOut.Log('Usage:')
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for opt in sorted(OptionMap.keys()):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DumpOption(OptionMap[opt])
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(0)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Default IDL options
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# -h : Help, prints options
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# --verbose : use verbose output
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# --test : test this module
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Option('h', 'Help', callfunc=DumpHelp)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Option('help', 'Help', callfunc=DumpHelp)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Option('verbose', 'Verbose')
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Option('test', 'Test the IDL scripts')
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def ParseOptions(args):
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  short_opts= ""
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  long_opts = []
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Build short and long option lists
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for name in sorted(OptionMap.keys()):
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    option = OptionMap[name]
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(name) > 1:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if option.default is None:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        long_opts.append('%s' % name)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        long_opts.append('%s=' % name)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if option.default is None:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        short_opts += name
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        short_opts += '%s:' % name
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opts, filenames = getopt.getopt(args, short_opts, long_opts)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for opt, val in opts:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(opt) == 2: opt = opt[1:]
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if opt[0:2] == '--': opt = opt[2:]
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OptionMap[opt].Set(val)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  except getopt.error, e:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ErrOut.Log('Illegal option: %s\n' % str(e))
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DumpHelp()
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sys.exit(-1)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return filenames
109