xref: /aosp_15_r20/external/pcre/maint/GenerateCommon.py (revision 22dc650d8ae982c6770746019a6f94af92b0f024)
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