Home | History | Annotate | Download | only in generators
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import getopt
      6 import sys
      7 
      8 from idl_log import ErrOut, InfoOut, WarnOut
      9 
     10 OptionMap = { }
     11 
     12 
     13 def GetOption(name):
     14   if name not in OptionMap:
     15     raise RuntimeError('Could not find option "%s".' % name)
     16   return OptionMap[name].Get()
     17 
     18 class Option(object):
     19   def __init__(self, name, desc, default = None, callfunc = None,
     20                testfunc = None, cookie = None):
     21 
     22     # Verify this option is not a duplicate
     23     if name in OptionMap:
     24       raise RuntimeError('Option "%s" already exists.' % name)
     25     self.name = name
     26     self.desc = desc
     27     self.default = default
     28     self.value = default
     29     self.callfunc = callfunc
     30     self.testfunc = testfunc
     31     self.cookie = cookie
     32     OptionMap[name] = self
     33 
     34   def Set(self, value):
     35     if self.testfunc:
     36       if not self.testfunc(self, value): return False
     37     # If this is a boolean option, set it to true
     38     if self.default is None:
     39       self.value = True
     40     else:
     41       self.value = value
     42     if self.callfunc:
     43       self.callfunc(self)
     44     return True
     45 
     46   def Get(self):
     47     return self.value
     48 
     49 
     50 def DumpOption(option):
     51   if len(option.name) > 1:
     52     out = '  --%-15.15s\t%s' % (option.name, option.desc)
     53   else:
     54     out = '   -%-15.15s\t%s' % (option.name, option.desc)
     55   if option.default:
     56     out = '%s\n\t\t\t(Default: %s)\n' % (out, option.default)
     57   InfoOut.Log(out)
     58 
     59 def DumpHelp(option=None):
     60   InfoOut.Log('Usage:')
     61   for opt in sorted(OptionMap.keys()):
     62     DumpOption(OptionMap[opt])
     63   sys.exit(0)
     64 
     65 #
     66 # Default IDL options
     67 #
     68 # -h : Help, prints options
     69 # --verbose : use verbose output
     70 # --test : test this module
     71 #
     72 Option('h', 'Help', callfunc=DumpHelp)
     73 Option('help', 'Help', callfunc=DumpHelp)
     74 Option('verbose', 'Verbose')
     75 Option('test', 'Test the IDL scripts')
     76 
     77 def ParseOptions(args):
     78   short_opts= ""
     79   long_opts = []
     80 
     81   # Build short and long option lists
     82   for name in sorted(OptionMap.keys()):
     83     option = OptionMap[name]
     84     if len(name) > 1:
     85       if option.default is None:
     86         long_opts.append('%s' % name)
     87       else:
     88         long_opts.append('%s=' % name)
     89     else:
     90       if option.default is None:
     91         short_opts += name
     92       else:
     93         short_opts += '%s:' % name
     94 
     95   try:
     96     opts, filenames = getopt.getopt(args, short_opts, long_opts)
     97 
     98     for opt, val in opts:
     99       if len(opt) == 2: opt = opt[1:]
    100       if opt[0:2] == '--': opt = opt[2:]
    101       OptionMap[opt].Set(val)
    102 
    103   except getopt.error, e:
    104     ErrOut.Log('Illegal option: %s\n' % str(e))
    105     DumpHelp()
    106     sys.exit(-1)
    107 
    108   return filenames
    109