1*22dc650dSSadaf Ebrahimi#! /usr/bin/python 2*22dc650dSSadaf Ebrahimi 3*22dc650dSSadaf Ebrahimi# PCRE2 UNICODE PROPERTY SUPPORT 4*22dc650dSSadaf Ebrahimi# ------------------------------ 5*22dc650dSSadaf Ebrahimi 6*22dc650dSSadaf Ebrahimi# This file is a Python module containing common lists and functions for the 7*22dc650dSSadaf Ebrahimi# GenerateXXX scripts that create various.c and .h files from Unicode data 8*22dc650dSSadaf Ebrahimi# files. It was created as part of a re-organizaton of these scripts in 9*22dc650dSSadaf Ebrahimi# December 2021. 10*22dc650dSSadaf Ebrahimi 11*22dc650dSSadaf Ebrahimi 12*22dc650dSSadaf Ebrahimiimport re 13*22dc650dSSadaf Ebrahimi 14*22dc650dSSadaf Ebrahimi 15*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 16*22dc650dSSadaf Ebrahimi# DATA LISTS 17*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 18*22dc650dSSadaf Ebrahimi 19*22dc650dSSadaf Ebrahimi# BIDI classes in the DerivedBidiClass.txt file, short and long identifiers. 20*22dc650dSSadaf Ebrahimi 21*22dc650dSSadaf Ebrahimibidi_classes = [ 22*22dc650dSSadaf Ebrahimi 'AL', 'Arabic_Letter', 23*22dc650dSSadaf Ebrahimi 'AN', 'Arabic_Number', 24*22dc650dSSadaf Ebrahimi 'B', 'Paragraph_Separator', 25*22dc650dSSadaf Ebrahimi 'BN', 'Boundary_Neutral', 26*22dc650dSSadaf Ebrahimi 'CS', 'Common_Separator', 27*22dc650dSSadaf Ebrahimi 'EN', 'European_Number', 28*22dc650dSSadaf Ebrahimi 'ES', 'European_Separator', 29*22dc650dSSadaf Ebrahimi 'ET', 'European_Terminator', 30*22dc650dSSadaf Ebrahimi 'FSI', 'First_Strong_Isolate', 31*22dc650dSSadaf Ebrahimi 'L', 'Left_To_Right', 32*22dc650dSSadaf Ebrahimi 'LRE', 'Left_To_Right_Embedding', 33*22dc650dSSadaf Ebrahimi 'LRI', 'Left_To_Right_Isolate', 34*22dc650dSSadaf Ebrahimi 'LRO', 'Left_To_Right_Override', 35*22dc650dSSadaf Ebrahimi 'NSM', 'Nonspacing_Mark', 36*22dc650dSSadaf Ebrahimi 'ON', 'Other_Neutral', 37*22dc650dSSadaf Ebrahimi 'PDF', 'Pop_Directional_Format', 38*22dc650dSSadaf Ebrahimi 'PDI', 'Pop_Directional_Isolate', 39*22dc650dSSadaf Ebrahimi 'R', 'Right_To_Left', 40*22dc650dSSadaf Ebrahimi 'RLE', 'Right_To_Left_Embedding', 41*22dc650dSSadaf Ebrahimi 'RLI', 'Right_To_Left_Isolate', 42*22dc650dSSadaf Ebrahimi 'RLO', 'Right_To_Left_Override', 43*22dc650dSSadaf Ebrahimi 'S', 'Segment_Separator', 44*22dc650dSSadaf Ebrahimi 'WS', 'White_Space' 45*22dc650dSSadaf Ebrahimi ] 46*22dc650dSSadaf Ebrahimi 47*22dc650dSSadaf Ebrahimi# Particular category property names, with comments. NOTE: If ever this list 48*22dc650dSSadaf Ebrahimi# is changed, the table called "catposstab" in the pcre2_auto_possess.c file 49*22dc650dSSadaf Ebrahimi# must be edited to keep in step. 50*22dc650dSSadaf Ebrahimi 51*22dc650dSSadaf Ebrahimicategory_names = [ 52*22dc650dSSadaf Ebrahimi 'Cc', 'Control', 53*22dc650dSSadaf Ebrahimi 'Cf', 'Format', 54*22dc650dSSadaf Ebrahimi 'Cn', 'Unassigned', 55*22dc650dSSadaf Ebrahimi 'Co', 'Private use', 56*22dc650dSSadaf Ebrahimi 'Cs', 'Surrogate', 57*22dc650dSSadaf Ebrahimi 'Ll', 'Lower case letter', 58*22dc650dSSadaf Ebrahimi 'Lm', 'Modifier letter', 59*22dc650dSSadaf Ebrahimi 'Lo', 'Other letter', 60*22dc650dSSadaf Ebrahimi 'Lt', 'Title case letter', 61*22dc650dSSadaf Ebrahimi 'Lu', 'Upper case letter', 62*22dc650dSSadaf Ebrahimi 'Mc', 'Spacing mark', 63*22dc650dSSadaf Ebrahimi 'Me', 'Enclosing mark', 64*22dc650dSSadaf Ebrahimi 'Mn', 'Non-spacing mark', 65*22dc650dSSadaf Ebrahimi 'Nd', 'Decimal number', 66*22dc650dSSadaf Ebrahimi 'Nl', 'Letter number', 67*22dc650dSSadaf Ebrahimi 'No', 'Other number', 68*22dc650dSSadaf Ebrahimi 'Pc', 'Connector punctuation', 69*22dc650dSSadaf Ebrahimi 'Pd', 'Dash punctuation', 70*22dc650dSSadaf Ebrahimi 'Pe', 'Close punctuation', 71*22dc650dSSadaf Ebrahimi 'Pf', 'Final punctuation', 72*22dc650dSSadaf Ebrahimi 'Pi', 'Initial punctuation', 73*22dc650dSSadaf Ebrahimi 'Po', 'Other punctuation', 74*22dc650dSSadaf Ebrahimi 'Ps', 'Open punctuation', 75*22dc650dSSadaf Ebrahimi 'Sc', 'Currency symbol', 76*22dc650dSSadaf Ebrahimi 'Sk', 'Modifier symbol', 77*22dc650dSSadaf Ebrahimi 'Sm', 'Mathematical symbol', 78*22dc650dSSadaf Ebrahimi 'So', 'Other symbol', 79*22dc650dSSadaf Ebrahimi 'Zl', 'Line separator', 80*22dc650dSSadaf Ebrahimi 'Zp', 'Paragraph separator', 81*22dc650dSSadaf Ebrahimi 'Zs', 'Space separator' 82*22dc650dSSadaf Ebrahimi ] 83*22dc650dSSadaf Ebrahimi 84*22dc650dSSadaf Ebrahimi# The Extended_Pictographic property is not found in the file where all the 85*22dc650dSSadaf Ebrahimi# others are (GraphemeBreakProperty.txt). It comes from the emoji-data.txt 86*22dc650dSSadaf Ebrahimi# file, but we list it here so that the name has the correct index value. 87*22dc650dSSadaf Ebrahimi 88*22dc650dSSadaf Ebrahimibreak_properties = [ 89*22dc650dSSadaf Ebrahimi 'CR', ' 0', 90*22dc650dSSadaf Ebrahimi 'LF', ' 1', 91*22dc650dSSadaf Ebrahimi 'Control', ' 2', 92*22dc650dSSadaf Ebrahimi 'Extend', ' 3', 93*22dc650dSSadaf Ebrahimi 'Prepend', ' 4', 94*22dc650dSSadaf Ebrahimi 'SpacingMark', ' 5', 95*22dc650dSSadaf Ebrahimi 'L', ' 6 Hangul syllable type L', 96*22dc650dSSadaf Ebrahimi 'V', ' 7 Hangul syllable type V', 97*22dc650dSSadaf Ebrahimi 'T', ' 8 Hangul syllable type T', 98*22dc650dSSadaf Ebrahimi 'LV', ' 9 Hangul syllable type LV', 99*22dc650dSSadaf Ebrahimi 'LVT', '10 Hangul syllable type LVT', 100*22dc650dSSadaf Ebrahimi 'Regional_Indicator', '11', 101*22dc650dSSadaf Ebrahimi 'Other', '12', 102*22dc650dSSadaf Ebrahimi 'ZWJ', '13', 103*22dc650dSSadaf Ebrahimi 'Extended_Pictographic', '14' 104*22dc650dSSadaf Ebrahimi ] 105*22dc650dSSadaf Ebrahimi 106*22dc650dSSadaf Ebrahimi# List of files from which the names of Boolean properties are obtained, along 107*22dc650dSSadaf Ebrahimi# with a list of regex patterns for properties to be ignored, and a list of 108*22dc650dSSadaf Ebrahimi# extra pattern names to add. 109*22dc650dSSadaf Ebrahimi 110*22dc650dSSadaf Ebrahimibool_propsfiles = ['PropList.txt', 'DerivedCoreProperties.txt', 'emoji-data.txt'] 111*22dc650dSSadaf Ebrahimibool_propsignore = [r'^Other_', r'^Hyphen$'] 112*22dc650dSSadaf Ebrahimibool_propsextras = ['ASCII', 'Bidi_Mirrored'] 113*22dc650dSSadaf Ebrahimi 114*22dc650dSSadaf Ebrahimi 115*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 116*22dc650dSSadaf Ebrahimi# GET BOOLEAN PROPERTY NAMES 117*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 118*22dc650dSSadaf Ebrahimi 119*22dc650dSSadaf Ebrahimi# Get a list of Boolean property names from a number of files. 120*22dc650dSSadaf Ebrahimi 121*22dc650dSSadaf Ebrahimidef getbpropslist(): 122*22dc650dSSadaf Ebrahimi bplist = [] 123*22dc650dSSadaf Ebrahimi bplast = "" 124*22dc650dSSadaf Ebrahimi 125*22dc650dSSadaf Ebrahimi for filename in bool_propsfiles: 126*22dc650dSSadaf Ebrahimi try: 127*22dc650dSSadaf Ebrahimi file = open('Unicode.tables/' + filename, 'r') 128*22dc650dSSadaf Ebrahimi except IOError: 129*22dc650dSSadaf Ebrahimi print(f"** Couldn't open {'Unicode.tables/' + filename}\n") 130*22dc650dSSadaf Ebrahimi sys.exit(1) 131*22dc650dSSadaf Ebrahimi 132*22dc650dSSadaf Ebrahimi for line in file: 133*22dc650dSSadaf Ebrahimi line = re.sub(r'#.*', '', line) 134*22dc650dSSadaf Ebrahimi data = list(map(str.strip, line.split(';'))) 135*22dc650dSSadaf Ebrahimi if len(data) <= 1 or data[1] == bplast: 136*22dc650dSSadaf Ebrahimi continue 137*22dc650dSSadaf Ebrahimi bplast = data[1] 138*22dc650dSSadaf Ebrahimi for pat in bool_propsignore: 139*22dc650dSSadaf Ebrahimi if re.match(pat, bplast) != None: 140*22dc650dSSadaf Ebrahimi break 141*22dc650dSSadaf Ebrahimi else: 142*22dc650dSSadaf Ebrahimi if bplast not in bplist: 143*22dc650dSSadaf Ebrahimi bplist.append(bplast) 144*22dc650dSSadaf Ebrahimi 145*22dc650dSSadaf Ebrahimi file.close() 146*22dc650dSSadaf Ebrahimi 147*22dc650dSSadaf Ebrahimi bplist.extend(bool_propsextras) 148*22dc650dSSadaf Ebrahimi bplist.sort() 149*22dc650dSSadaf Ebrahimi return bplist 150*22dc650dSSadaf Ebrahimi 151*22dc650dSSadaf Ebrahimibool_properties = getbpropslist() 152*22dc650dSSadaf Ebrahimibool_props_list_item_size = (len(bool_properties) + 31) // 32 153*22dc650dSSadaf Ebrahimi 154*22dc650dSSadaf Ebrahimi 155*22dc650dSSadaf Ebrahimi 156*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 157*22dc650dSSadaf Ebrahimi# COLLECTING PROPERTY NAMES AND ALIASES 158*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 159*22dc650dSSadaf Ebrahimi 160*22dc650dSSadaf Ebrahimiscript_names = ['Unknown'] 161*22dc650dSSadaf Ebrahimiabbreviations = {} 162*22dc650dSSadaf Ebrahimi 163*22dc650dSSadaf Ebrahimidef collect_property_names(): 164*22dc650dSSadaf Ebrahimi global script_names 165*22dc650dSSadaf Ebrahimi global abbreviations 166*22dc650dSSadaf Ebrahimi 167*22dc650dSSadaf Ebrahimi names_re = re.compile(r'^[0-9A-F]{4,6}(?:\.\.[0-9A-F]{4,6})? +; ([A-Za-z_]+) #') 168*22dc650dSSadaf Ebrahimi 169*22dc650dSSadaf Ebrahimi last_script_name = "" 170*22dc650dSSadaf Ebrahimi with open("Unicode.tables/Scripts.txt") as f: 171*22dc650dSSadaf Ebrahimi for line in f: 172*22dc650dSSadaf Ebrahimi match_obj = names_re.match(line) 173*22dc650dSSadaf Ebrahimi 174*22dc650dSSadaf Ebrahimi if match_obj == None or match_obj.group(1) == last_script_name: 175*22dc650dSSadaf Ebrahimi continue 176*22dc650dSSadaf Ebrahimi 177*22dc650dSSadaf Ebrahimi last_script_name = match_obj.group(1) 178*22dc650dSSadaf Ebrahimi script_names.append(last_script_name) 179*22dc650dSSadaf Ebrahimi 180*22dc650dSSadaf Ebrahimi # Sometimes there is comment in the line 181*22dc650dSSadaf Ebrahimi # so splitting around semicolon is not enough 182*22dc650dSSadaf Ebrahimi value_alias_re = re.compile(r' *([A-Za-z_]+) *; *([A-Za-z_]+) *; *([A-Za-z_]+)(?: *; *([A-Za-z_ ]+))?') 183*22dc650dSSadaf Ebrahimi 184*22dc650dSSadaf Ebrahimi with open("Unicode.tables/PropertyValueAliases.txt") as f: 185*22dc650dSSadaf Ebrahimi for line in f: 186*22dc650dSSadaf Ebrahimi match_obj = value_alias_re.match(line) 187*22dc650dSSadaf Ebrahimi 188*22dc650dSSadaf Ebrahimi if match_obj == None: 189*22dc650dSSadaf Ebrahimi continue 190*22dc650dSSadaf Ebrahimi 191*22dc650dSSadaf Ebrahimi if match_obj.group(1) == "sc": 192*22dc650dSSadaf Ebrahimi if match_obj.group(2) == match_obj.group(3): 193*22dc650dSSadaf Ebrahimi abbreviations[match_obj.group(3)] = () 194*22dc650dSSadaf Ebrahimi elif match_obj.group(4) == None: 195*22dc650dSSadaf Ebrahimi abbreviations[match_obj.group(3)] = (match_obj.group(2),) 196*22dc650dSSadaf Ebrahimi else: 197*22dc650dSSadaf Ebrahimi abbreviations[match_obj.group(3)] = (match_obj.group(2), match_obj.group(4)) 198*22dc650dSSadaf Ebrahimi 199*22dc650dSSadaf Ebrahimi # We can also collect Boolean property abbreviations into the same dictionary 200*22dc650dSSadaf Ebrahimi 201*22dc650dSSadaf Ebrahimi bin_alias_re = re.compile(r' *([A-Za-z_]+) *; *([A-Za-z_]+)(?: *; *([A-Za-z_]+))?') 202*22dc650dSSadaf Ebrahimi with open("Unicode.tables/PropertyAliases.txt") as f: 203*22dc650dSSadaf Ebrahimi for line in f: 204*22dc650dSSadaf Ebrahimi match_obj = bin_alias_re.match(line) 205*22dc650dSSadaf Ebrahimi if match_obj == None: 206*22dc650dSSadaf Ebrahimi continue 207*22dc650dSSadaf Ebrahimi 208*22dc650dSSadaf Ebrahimi if match_obj.group(2) != match_obj.group(1) and match_obj.group(2) in bool_properties: 209*22dc650dSSadaf Ebrahimi if match_obj.group(3) == None: 210*22dc650dSSadaf Ebrahimi abbreviations[match_obj.group(2)] = (match_obj.group(1),) 211*22dc650dSSadaf Ebrahimi else: 212*22dc650dSSadaf Ebrahimi abbreviations[match_obj.group(2)] = (match_obj.group(1), match_obj.group(3)) 213*22dc650dSSadaf Ebrahimi 214*22dc650dSSadaf Ebrahimicollect_property_names() 215*22dc650dSSadaf Ebrahimi 216*22dc650dSSadaf Ebrahimi 217*22dc650dSSadaf Ebrahimi 218*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 219*22dc650dSSadaf Ebrahimi# REORDERING SCRIPT NAMES 220*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 221*22dc650dSSadaf Ebrahimi 222*22dc650dSSadaf Ebrahimiscript_abbrevs = [] 223*22dc650dSSadaf Ebrahimi 224*22dc650dSSadaf Ebrahimidef reorder_scripts(): 225*22dc650dSSadaf Ebrahimi global script_names 226*22dc650dSSadaf Ebrahimi global script_abbrevs 227*22dc650dSSadaf Ebrahimi global abbreviations 228*22dc650dSSadaf Ebrahimi 229*22dc650dSSadaf Ebrahimi for name in script_names: 230*22dc650dSSadaf Ebrahimi abbrevs = abbreviations[name] 231*22dc650dSSadaf Ebrahimi script_abbrevs.append(name if len(abbrevs) == 0 else abbrevs[0]) 232*22dc650dSSadaf Ebrahimi 233*22dc650dSSadaf Ebrahimi extended_script_abbrevs = set() 234*22dc650dSSadaf Ebrahimi with open("Unicode.tables/ScriptExtensions.txt") as f: 235*22dc650dSSadaf Ebrahimi names_re = re.compile(r'^[0-9A-F]{4,6}(?:\.\.[0-9A-F]{4,6})? +; ([A-Za-z_ ]+) #') 236*22dc650dSSadaf Ebrahimi 237*22dc650dSSadaf Ebrahimi for line in f: 238*22dc650dSSadaf Ebrahimi match_obj = names_re.match(line) 239*22dc650dSSadaf Ebrahimi 240*22dc650dSSadaf Ebrahimi if match_obj == None: 241*22dc650dSSadaf Ebrahimi continue 242*22dc650dSSadaf Ebrahimi 243*22dc650dSSadaf Ebrahimi for name in match_obj.group(1).split(" "): 244*22dc650dSSadaf Ebrahimi extended_script_abbrevs.add(name) 245*22dc650dSSadaf Ebrahimi 246*22dc650dSSadaf Ebrahimi new_script_names = [] 247*22dc650dSSadaf Ebrahimi new_script_abbrevs = [] 248*22dc650dSSadaf Ebrahimi 249*22dc650dSSadaf Ebrahimi for idx, abbrev in enumerate(script_abbrevs): 250*22dc650dSSadaf Ebrahimi if abbrev in extended_script_abbrevs: 251*22dc650dSSadaf Ebrahimi new_script_names.append(script_names[idx]) 252*22dc650dSSadaf Ebrahimi new_script_abbrevs.append(abbrev) 253*22dc650dSSadaf Ebrahimi 254*22dc650dSSadaf Ebrahimi for idx, abbrev in enumerate(script_abbrevs): 255*22dc650dSSadaf Ebrahimi if abbrev not in extended_script_abbrevs: 256*22dc650dSSadaf Ebrahimi new_script_names.append(script_names[idx]) 257*22dc650dSSadaf Ebrahimi new_script_abbrevs.append(abbrev) 258*22dc650dSSadaf Ebrahimi 259*22dc650dSSadaf Ebrahimi script_names = new_script_names 260*22dc650dSSadaf Ebrahimi script_abbrevs = new_script_abbrevs 261*22dc650dSSadaf Ebrahimi 262*22dc650dSSadaf Ebrahimireorder_scripts() 263*22dc650dSSadaf Ebrahimiscript_list_item_size = (script_names.index('Unknown') + 31) // 32 264*22dc650dSSadaf Ebrahimi 265*22dc650dSSadaf Ebrahimi 266*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 267*22dc650dSSadaf Ebrahimi# DERIVED LISTS 268*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 269*22dc650dSSadaf Ebrahimi 270*22dc650dSSadaf Ebrahimi# Create general character property names from the first letters of the 271*22dc650dSSadaf Ebrahimi# particular categories. 272*22dc650dSSadaf Ebrahimi 273*22dc650dSSadaf Ebrahimigcn_set = set(category_names[i][0] for i in range(0, len(category_names), 2)) 274*22dc650dSSadaf Ebrahimigeneral_category_names = list(gcn_set) 275*22dc650dSSadaf Ebrahimigeneral_category_names.sort() 276*22dc650dSSadaf Ebrahimi 277*22dc650dSSadaf Ebrahimi 278*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 279*22dc650dSSadaf Ebrahimi# FUNCTIONS 280*22dc650dSSadaf Ebrahimi# --------------------------------------------------------------------------- 281*22dc650dSSadaf Ebrahimi 282*22dc650dSSadaf Ebrahimiimport sys 283*22dc650dSSadaf Ebrahimi 284*22dc650dSSadaf Ebrahimi# Open an output file, using the command's argument or a default. Write common 285*22dc650dSSadaf Ebrahimi# preliminary header information. 286*22dc650dSSadaf Ebrahimi 287*22dc650dSSadaf Ebrahimidef open_output(default): 288*22dc650dSSadaf Ebrahimi if len(sys.argv) > 2: 289*22dc650dSSadaf Ebrahimi print('** Too many arguments: just give a file name') 290*22dc650dSSadaf Ebrahimi sys.exit(1) 291*22dc650dSSadaf Ebrahimi if len(sys.argv) == 2: 292*22dc650dSSadaf Ebrahimi output_name = sys.argv[1] 293*22dc650dSSadaf Ebrahimi else: 294*22dc650dSSadaf Ebrahimi output_name = default 295*22dc650dSSadaf Ebrahimi try: 296*22dc650dSSadaf Ebrahimi file = open(output_name, "w") 297*22dc650dSSadaf Ebrahimi except IOError: 298*22dc650dSSadaf Ebrahimi print("** Couldn't open %s" % output_name) 299*22dc650dSSadaf Ebrahimi sys.exit(1) 300*22dc650dSSadaf Ebrahimi 301*22dc650dSSadaf Ebrahimi script_name = sys.argv[0] 302*22dc650dSSadaf Ebrahimi i = script_name.rfind('/') 303*22dc650dSSadaf Ebrahimi if i >= 0: 304*22dc650dSSadaf Ebrahimi script_name = script_name[i+1:] 305*22dc650dSSadaf Ebrahimi 306*22dc650dSSadaf Ebrahimi file.write("""\ 307*22dc650dSSadaf Ebrahimi/************************************************* 308*22dc650dSSadaf Ebrahimi* Perl-Compatible Regular Expressions * 309*22dc650dSSadaf Ebrahimi*************************************************/ 310*22dc650dSSadaf Ebrahimi 311*22dc650dSSadaf Ebrahimi/* PCRE is a library of functions to support regular expressions whose syntax 312*22dc650dSSadaf Ebrahimiand semantics are as close as possible to those of the Perl 5 language. 313*22dc650dSSadaf Ebrahimi 314*22dc650dSSadaf Ebrahimi Written by Philip Hazel 315*22dc650dSSadaf Ebrahimi Original API code Copyright (c) 1997-2012 University of Cambridge 316*22dc650dSSadaf Ebrahimi New API code Copyright (c) 2016-2022 University of Cambridge 317*22dc650dSSadaf Ebrahimi 318*22dc650dSSadaf EbrahimiThis module is auto-generated from Unicode data files. DO NOT EDIT MANUALLY! 319*22dc650dSSadaf Ebrahimi""") 320*22dc650dSSadaf Ebrahimi 321*22dc650dSSadaf Ebrahimi file.write("Instead, modify the maint/%s script and run it to generate\n" 322*22dc650dSSadaf Ebrahimi "a new version of this code.\n\n" % script_name) 323*22dc650dSSadaf Ebrahimi 324*22dc650dSSadaf Ebrahimi file.write("""\ 325*22dc650dSSadaf Ebrahimi----------------------------------------------------------------------------- 326*22dc650dSSadaf EbrahimiRedistribution and use in source and binary forms, with or without 327*22dc650dSSadaf Ebrahimimodification, are permitted provided that the following conditions are met: 328*22dc650dSSadaf Ebrahimi 329*22dc650dSSadaf Ebrahimi * Redistributions of source code must retain the above copyright notice, 330*22dc650dSSadaf Ebrahimi this list of conditions and the following disclaimer. 331*22dc650dSSadaf Ebrahimi 332*22dc650dSSadaf Ebrahimi * Redistributions in binary form must reproduce the above copyright 333*22dc650dSSadaf Ebrahimi notice, this list of conditions and the following disclaimer in the 334*22dc650dSSadaf Ebrahimi documentation and/or other materials provided with the distribution. 335*22dc650dSSadaf Ebrahimi 336*22dc650dSSadaf Ebrahimi * Neither the name of the University of Cambridge nor the names of its 337*22dc650dSSadaf Ebrahimi contributors may be used to endorse or promote products derived from 338*22dc650dSSadaf Ebrahimi this software without specific prior written permission. 339*22dc650dSSadaf Ebrahimi 340*22dc650dSSadaf EbrahimiTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 341*22dc650dSSadaf EbrahimiAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 342*22dc650dSSadaf EbrahimiIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 343*22dc650dSSadaf EbrahimiARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 344*22dc650dSSadaf EbrahimiLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 345*22dc650dSSadaf EbrahimiCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 346*22dc650dSSadaf EbrahimiSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 347*22dc650dSSadaf EbrahimiINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 348*22dc650dSSadaf EbrahimiCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 349*22dc650dSSadaf EbrahimiARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 350*22dc650dSSadaf EbrahimiPOSSIBILITY OF SUCH DAMAGE. 351*22dc650dSSadaf Ebrahimi----------------------------------------------------------------------------- 352*22dc650dSSadaf Ebrahimi*/ 353*22dc650dSSadaf Ebrahimi\n""") 354*22dc650dSSadaf Ebrahimi return file 355*22dc650dSSadaf Ebrahimi 356*22dc650dSSadaf Ebrahimi# End of UcpCommon.py 357