1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
|
# SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
#
# SPDX-License-Identifier: GPL-3.0-or-later
import re
_no_import_x = True
_ns = None
_lines = []
_level = 0
_cname_re = re.compile('([A-Z0-9][a-z]+|[A-Z0-9]+(?![a-z])|[a-z]+)')
_cname_special_cases = {
# names in xproto.xml
'GCONTEXT': 'GContext',
'VISUALID': 'VisualID',
'VISUALTYPE': 'VisualType',
'RGB': 'RGB',
'FONTPROP': 'FontProp',
'CHARINFO': 'CharInfo',
'TIMECOORD': 'TimeCoord',
'COLORITEM': 'ColorItem',
'DECnet': 'DECnet',
# in render.xml
'GLYPHSET': 'GlyphSet',
'PICTFORMAT': 'PictFormat',
'DIRECTFORMAT': 'DirectFormat',
'PICTFORMINFO': 'PictFormInfo',
'PICTVISUAL': 'PictVisual',
'PICTDEPTH': 'PictDepth',
'PICTSCREEN': 'PictScreen',
'INDEXVALUE': 'IndexValue',
'POINTFIX': 'PointFix',
'LINEFIX': 'LineFix',
'GLYPHINFO': 'GlyphInfo',
'ANIMCURSORELT': 'AnimCursorElt',
'SPANFIX': 'SpanFix',
}
_simple_type_map = {
'uint8_t': 'uint8',
'uint16_t': 'uint16',
'uint32_t': 'uint32',
'uint64_t': 'uint64',
'int8_t': 'int8',
'int16_t': 'int16',
'int32_t': 'int32',
'int64_t': 'int64',
'char': 'byte', # []byte => string
'float': 'float32',
'double': 'float64',
}
# readonly
# ingore bigreq
_ext_names = ['Shm', 'XF86Dri', 'RandR', 'Xv', 'DPMS', 'Xinerama',
'Test', 'XCMisc', 'Res', 'XvMC', 'Composite', 'ScreenSaver',
'SELinux', 'XF86VidMode', 'Present', 'DRI3', 'Input',
'GenericEvent', 'Render', 'Xevie', 'XFixes', 'Glx', 'Sync',
'XPrint', 'Shape', 'xkb', 'Damage', 'DRI2', 'Record' ]
# xml filename => go pkg name
# if the value is '-', it means that the value is equal to the key
_ext_header_pkgname_map = {
'composite': '-',
'damage': '-',
'dpms': '-',
'dri2': '-',
'dri3': '-',
'ge': 'genericevent',
'glx': '-',
'present': '-',
'randr': '-',
'record': '-',
'render': '-',
'res': '-',
'screensaver': '-',
'shape': '-',
'shm': '-',
'sync': '-',
'xc_misc': 'xcmisc',
'xevie': '-',
'xf86dir': '-',
'xf86vidmode': '-',
'xfixes': '-',
'xinerama': '-',
'xinput': 'input',
'xkb': '-',
'xprint': '-',
'xselinux': 'selinux',
'xtest': 'test',
'xv': '-',
'xvmc': '-',
}
def is_int(x):
try:
int(x)
return True
except:
return False
def l(fmt, *args):
_lines[_level].append(fmt % args)
def todo(msg=''):
l('// TODO %s', msg)
def set_level(idx):
global _level
while len(_lines) <= idx:
_lines.append([])
_level = idx
def output_lines(fh):
for list in _lines:
for line in list:
fh.write(line)
fh.write('\n')
fh.close()
def set_namespace(val):
global _ns
_ns = val
def get_namespace():
global _ns
return _ns
def set_no_import_x(val):
global _no_import_x
_no_import_x = val
def lib_id(_id):
global _no_import_x
if _no_import_x:
return _id
else:
return "x." + _id
def get_type_name(name):
# type of name is tuple of str
if len(name) == 1:
# uintX intX
return _simple_type_map.get(name[0], name[0])
pkg_name, name = split_pkg_and_type(name)
type_name = ''.join([n_item(x) for x in name])
# check result
assert type_name[0].isupper()
global _ns
if _ns.is_ext and pkg_name != '' and pkg_name != get_go_pkg_name(_ns.ext_name):
# add pkg ident
type_name = pkg_name + '.' + type_name
return type_name
def split_pkg_and_type(name):
assert len(name) >= 2
if len(name) == 2 :
# ex. xcb COLORMAP
assert name[0] == 'xcb'
return ('x', name[1:])
elif len(name) >= 3:
assert name[0] == 'xcb'
global _ns
global _ext_names
if name[1] == _ns.ext_name or name[1] in _ext_names:
# name[1] is ext name
# ex. xcb RandR ScreenSize
return (get_go_pkg_name(name[1]), name[2:])
else:
# ex. xcb CreateWindow ValueList
return ('x', name[1:])
# go pkg name is _ns.ext_name.lower()
def get_go_pkg_name(ext_name):
# TODO adjust package name
return ext_name.lower()
def header_to_go_pkg_name(header):
global _ext_header_pkgname_map
pkg_name = _ext_header_pkgname_map[header]
if pkg_name == '-':
pkg_name = header
return pkg_name
def remove_prefix(name):
# remove xcb
if name[0] == 'xcb':
name = name[1:]
# remove ext name
if _ns.is_ext and name[0] == _ns.ext_name:
name = name[1:]
return name
def split_name(str):
split = _cname_re.finditer(str)
name_parts = [match.group(0) for match in split]
return name_parts
# value_list => value, list => ValueList
# CreateWindow => Create, Window => CreateWindow
def n_item(str):
'''
Does C-name conversion on a single string fragment.
Uses a regexp with some hard-coded special cases.
'''
if str in _cname_special_cases:
return _cname_special_cases[str]
else:
split = _cname_re.finditer(str)
name_parts = [match.group(0) for match in split]
return ''.join([x.title() for x in name_parts])
def get_request_name(name):
# print "get_request_name, name:", name
name = remove_prefix(name)
req_name = ''.join(name)
if not req_name[0].isupper():
raise Exception('first char of request name is not upper case')
return req_name
# field_name_test => FieldNameTest
def get_field_name(name):
if name is None:
return ''
return ''.join([x.title() for x in name.split('_')])
class FieldClassifyModel():
def do(self, field):
if field.type.is_pad:
# pad
if field.type.fixed_size():
return self.pad_FS(field)
else:
return self.pad_VS(field)
elif field.type.is_simple:
# simple
return self.simple(field)
elif field.type.is_container:
# containter
if field.type.fixed_size():
return self.container_FS(field)
else:
return self.container_VS(field)
elif field.type.is_list:
# list
if field.type.nmemb is None:
# VL
if field.type.member.fixed_size():
# MFS
return self.list_VL_MFS(field)
else:
# MVS
return self.list_VL_MVS(field)
else:
# CL
if field.type.member.fixed_size():
#MFS
return self.list_CL_MFS(field)
else:
#MVS
return self.list_CL_MVS(field)
def pad_FS(self, field):
raise Exception('abstract method not overridden!')
def pad_VS(self, field):
raise Exception('abstract method not overridden!')
def simple(self, field):
raise Exception('abstract method not overridden!')
def container_FS(self, field):
raise Exception('abstract method not overridden!')
def container_VS(self, field):
raise Exception('abstract method not overridden!')
def list_CL_MFS(self, field):
raise Exception('abstract method not overridden!')
def list_CL_MVS(self, field):
raise Exception('abstract method not overridden!')
def list_VL_MFS(self, field):
raise Exception('abstract method not overridden!')
def list_VL_MVS(self, field):
raise Exception('abstract method not overridden!')
|