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