summaryrefslogtreecommitdiff
path: root/src/select/select_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/select/select_generator.py')
-rw-r--r--src/select/select_generator.py278
1 files changed, 84 insertions, 194 deletions
diff --git a/src/select/select_generator.py b/src/select/select_generator.py
index 2d6afe8..9e92909 100644
--- a/src/select/select_generator.py
+++ b/src/select/select_generator.py
@@ -29,8 +29,8 @@ def shift_star(value_type, prop_name):
`lwc_string **str_array`
"""
star_i = value_type.find('*')
- v_type = value_type if star_i is -1 else value_type[:star_i]
- v_name = prop_name if star_i is -1 else value_type[star_i:] + prop_name
+ v_type = value_type if star_i == -1 else value_type[:star_i]
+ v_name = prop_name if star_i == -1 else value_type[star_i:] + prop_name
return (v_type, v_name)
class Text:
@@ -233,7 +233,7 @@ class CSSProperty:
for x in values:
if x[0] == v[0]:
value = CSSValue(*x)
- if len(v) is 2:
+ if len(v) == 2:
value.defaults = v[1]
if len(vals) > 1:
value.suffix = '_' + string.ascii_lowercase[i]
@@ -322,18 +322,16 @@ class CSSProperty:
"""
vals = []
for v in self.values:
+ star = '*' if pointer else ''
vt, vn = shift_star(v.type, v.name)
- vn += v.suffix
+ vn = star + vn + v.suffix
if pointer:
- vn = '*' + vn
if v.name == 'counter_arr' or v.name == 'content_item':
vt = 'const ' + vt
vals.append((vt, vn))
if v.bits is not None:
- bt, bn = shift_star(v.bits['type'], v.bits['name'])
- bn += v.suffix
- if pointer:
- bn = '*' + bn
+ bt = v.bits['type']
+ bn = star + v.bits['name'] + v.suffix
vals.append((bt, bn))
return vals
@@ -348,7 +346,7 @@ class CSSProperty:
bits_len = sum([ x['size'] for x in bits ])
comment = '/* {}bit{}: {} : {} */'.format(
bits_len,
- ('' if bits_len is 1 else 's'),
+ ('' if bits_len == 1 else 's'),
''.join([ b['letter'] * b['size'] for b in bits ]),
' | '.join([ b['name'] for b in bits ]))
rev_bits = list(reversed(bits))
@@ -406,7 +404,7 @@ class CSSGroup:
bin_size = 32 # We're using uint32_t as concrete bins.
bits_array = []
- props = sorted(self.props, key=(lambda x: x.bits_size), reverse=True)
+ props = sorted(self.props, key=(lambda x: (x.bits_size, x.name)), reverse=True)
for p in props:
for b in bits_array:
@@ -429,21 +427,12 @@ class CSSGroup:
return bits_array
- def get_idot_grp(self):
- """Make parameters for accessing bits and values in this group."""
- i_dot = '' if self.name is 'page' else 'i.'
- grp = '' if self.name is 'style' else '->{}{}'.format(
- '' if self.name is 'page' else i_dot, self.name)
- return (i_dot, grp)
-
def make_computed_h(self):
"""Output this group's text for the computed.h file."""
t = Text()
t.append()
- typedef = 'typedef ' if self.name is 'page' else ''
- t.append('{}struct css_computed_{}{} {{'.format(
- typedef, self.name, '' if self.name is 'page' else '_i'))
+ t.append('struct css_computed_style_i {')
t.comment()
commented = []
@@ -490,103 +479,28 @@ class CSSGroup:
t.append()
t.append(self.make_value_declaration(for_commented=False))
- if self.name is 'style':
- t.append()
- for g in css_groups:
- if g.name is not 'style' and g.name is not 'page':
- t.append('css_computed_{0} *{0};'.format(g.name))
-
t.indent(-1)
- t.append('}}{};'.format(
- ' css_computed_' + self.name if typedef else ''))
+ t.append('};')
- if self.name is not 'page':
- typedef = 'typedef ' if self.name is not 'style' else ''
- t.append()
- t.append('{}struct css_computed_{} {{'.format(
- typedef, self.name))
- t.indent(1)
- t.append('struct css_computed_' + self.name + '_i i;')
- t.append()
- t.append(self.make_value_declaration(for_commented=True))
- t.append()
+ t.append()
+ t.append('struct css_computed_style {')
+ t.indent(1)
+ t.append('struct css_computed_style_i i;')
+ t.append()
+ t.append(self.make_value_declaration(for_commented=True))
+ t.append()
- t.append('struct css_computed_' + self.name + ' *next;')
- t.append('uint32_t count;')
- t.append('uint32_t bin;')
- t.indent(-1)
- t.append('}}{};'.format(
- ' css_computed_' + self.name if typedef else ''))
+ t.append('struct css_computed_style *next;')
+ t.append('uint32_t count;')
+ t.append('uint32_t bin;')
+ t.indent(-1)
+ t.append('};')
return t.to_string()
def make_propset_h(self):
- """Output this group's property functions for the propset.h file.
-
- If group is not `style`, will also output the defaults
- and the ENSURE_{group} texts.
- """
+ """Output this group's property functions for the propset.h file."""
t = Text()
- i_dot, grp = self.get_idot_grp()
-
- if self.name is not 'style':
- t.append('static const css_computed_{0} default_{0} = {{'.format(
- self.name))
- t.indent(1)
-
- if self.name is not 'page':
- t.append('.i = {')
- t.indent(1)
-
- t.append('.bits = {')
- t.indent(1)
-
- bits_ops = []
- for b in self.bits_array:
- or_ops = []
- for p in b.contents:
- or_ops.append('({} << {})'.format(p.defaults, str(p.shift))
- if p.shift else p.defaults)
- bits_ops.append(' | '.join(or_ops))
-
- t.append(',\n'.join(bits_ops).split('\n'))
- t.indent(-1)
- t.append('},')
- t.append(',\n'.join(
- self.make_value_declaration(False, True)).split('\n'))
-
- if self.name is not 'page':
- t.indent(-1)
- t.append('},')
- t.append(',\n'.join(
- self.make_value_declaration(True, True) +
- [ '.next = NULL', '.count = 0', '.bin = UINT32_MAX' ]
- ).split('\n'))
-
- t.indent(-1)
- t.append('};')
-
- t.append()
- t.escape_newline()
- t.append('#define ENSURE_{} do {{'.format(self.name.upper()))
- t.indent(1)
- t.append('if (style->{}{} == NULL) {{'.format(i_dot, self.name))
- t.indent(1)
- t.append('style->{}{n} = malloc(sizeof(css_computed_{n}));'.format(
- i_dot, n=self.name))
- t.append('if (style->{}{} == NULL)'.format(i_dot, self.name))
- t.indent(1)
- t.append('return CSS_NOMEM;')
- t.indent(-1)
- t.append()
- t.append('memcpy(style->{}{n}, &default_{n}, '
- 'sizeof(css_computed_{n}));'.format(i_dot, n=self.name))
- t.indent(-1)
- t.append('}')
- t.indent(-1)
- t.append('} while(0)')
- t.escape_newline()
- t.append()
for p in sorted(self.props, key=(lambda x: x.name)):
defines, undefs = p.def_undefs
@@ -608,15 +522,7 @@ class CSSGroup:
t.append('{')
t.indent(1)
- t.append('uint32_t *bits;')
- t.append()
-
- if self.name is not 'style':
- t.append('ENSURE_{};'.format(self.name.upper()))
- t.append()
-
- t.append('bits = &style{}->{}bits[{}_INDEX];'.format(
- grp, i_dot, p.name.upper()))
+ t.append('uint32_t *bits = &style->i.bits[{}_INDEX];'.format(p.name.upper()))
t.append()
type_mask, shift_list, bits_comment = p.get_bits()
@@ -636,20 +542,18 @@ class CSSGroup:
old_n = 'old_' + v.name + v.suffix
old_t, old_n_shift = shift_star(v.type, old_n)
- if v.name is 'string':
- t.append('{} {} = style{}->{}{};'.format(
- old_t, old_n_shift,
- grp, i_dot, p.name + v.suffix))
+ if v.name == 'string':
+ t.append('{} {} = style->i.{};'.format(
+ old_t, old_n_shift, p.name + v.suffix))
t.append()
t.append('if ({} != NULL) {{'.format(v.name + v.suffix))
t.indent(1)
- t.append('style{}->{}{} = lwc_string_ref({});'.format(
- grp, i_dot, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->i.{} = lwc_string_ref({});'.format(
+ p.name + v.suffix, v.name + v.suffix))
t.indent(-1)
t.append('} else {')
t.indent(1)
- t.append('style{}->{}{} = NULL;'.format(
- grp, i_dot, p.name + v.suffix))
+ t.append('style->i.{} = NULL;'.format(p.name + v.suffix))
t.indent(-1)
t.append('}')
t.append()
@@ -658,12 +562,12 @@ class CSSGroup:
t.append('lwc_string_unref({});'.format(old_n))
t.indent(-1)
- elif v.name is 'string_arr' or v.name is 'counter_arr':
- iter_var = 's' if v.name is 'string_arr' else 'c'
- iter_deref = '*s' if v.name is 'string_arr' else 'c->name'
- t.append('{} {} = style{}->{};'.format(
+ elif v.name == 'string_arr' or v.name == 'counter_arr':
+ iter_var = 's' if v.name == 'string_arr' else 'c'
+ iter_deref = '*s' if v.name == 'string_arr' else 'c->name'
+ t.append('{} {} = style->{};'.format(
old_t, old_n_shift,
- grp, p.name + v.suffix))
+ p.name + v.suffix))
t.append('{} {};'.format(old_t,
shift_star(v.type, iter_var)[1]))
t.append()
@@ -674,8 +578,8 @@ class CSSGroup:
t.append('{0} = lwc_string_ref({0});'.format(iter_deref))
t.indent(-1)
t.append()
- t.append('style{}->{} = {};'.format(
- grp, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->{} = {};'.format(
+ p.name + v.suffix, v.name + v.suffix))
t.append()
t.append('/* Free existing array */')
t.append('if ({} != NULL) {{'.format(old_n))
@@ -693,8 +597,8 @@ class CSSGroup:
t.append('}')
elif not v.is_ptr:
- t.append('style{}->{}{} = {};'.format(
- grp, i_dot, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->i.{} = {};'.format(
+ p.name + v.suffix, v.name + v.suffix))
else:
raise ValueError('Cannot handle value ' + v.name +'!')
@@ -707,54 +611,38 @@ class CSSGroup:
return t.to_string()
- def make_propget_h(self):
- """Output this group's property functions for the propget.h file."""
- t = Text()
- i_dot, grp = self.get_idot_grp()
-
- for p in sorted(self.props, key=(lambda x: x.name)):
- defines, undefs = p.def_undefs
-
- t.append()
- t.append(defines)
-
- if p.name in overrides['get']:
- t.append(overrides['get'][p.name], pre_formatted=True)
- t.append(undefs)
- continue
+ def print_propget(self, t, p, only_bits=False):
+ vals = [] if only_bits else p.get_param_values(pointer=True)
+ params = ', '.join([ 'css_computed_style *style' ]
+ + [ ' '.join(x) for x in vals ])
- vals = p.get_param_values(pointer=True)
- params = ', '.join([ 'css_computed_style *style' ]
- + [ ' '.join(x) for x in vals ])
- t.append('static inline uint8_t get_{}(const {})'.format(
- p.name, params))
- t.append('{')
- t.indent(1)
-
- if self.name is not 'style':
- t.append('if (style{} != NULL) {{'.format(grp))
- t.indent(1)
+ underscore_bits = '_bits' if only_bits else ''
+ t.append('static inline uint8_t get_{}{}(const {})'.format(
+ p.name, underscore_bits, params))
+ t.append('{')
+ t.indent(1)
- t.append('uint32_t bits = style{}->{}bits[{}_INDEX];'.format(
- grp, i_dot, p.name.upper()))
- t.append('bits &= {}_MASK;'.format(p.name.upper()))
- t.append('bits >>= {}_SHIFT;'.format(p.name.upper()))
- t.append()
+ t.append('uint32_t bits = style->i.bits[{}_INDEX];'.format(
+ p.name.upper()))
+ t.append('bits &= {}_MASK;'.format(p.name.upper()))
+ t.append('bits >>= {}_SHIFT;'.format(p.name.upper()))
+ t.append()
- type_mask, shift_list, bits_comment = p.get_bits()
- t.append(bits_comment)
+ type_mask, shift_list, bits_comment = p.get_bits()
+ t.append(bits_comment)
+ if only_bits == False:
if p.condition:
t.append('if ((bits & {}) == {}) {{'.format(
type_mask, p.condition))
t.indent(1)
for v in p.values:
- this_idot = '' if v.is_ptr and v.name != 'string' else i_dot
- t.append('*{} = style{}->{}{};'.format(
- v.name + v.suffix, grp, this_idot, p.name + v.suffix))
+ i_dot = '' if v.is_ptr and v.name != 'string' else 'i.'
+ t.append('*{} = style->{}{};'.format(
+ v.name + v.suffix, i_dot, p.name + v.suffix))
for i, v in enumerate(list(reversed(shift_list))):
- if i is 0:
+ if i == 0:
t.append('*{} = bits >> {};'.format(v[0], v[1]))
else:
t.append('*{} = (bits & 0x{:x}) >> {};'.format(
@@ -763,29 +651,35 @@ class CSSGroup:
if p.condition:
t.indent(-1)
t.append('}')
+ t.append()
+
+ t.append('return (bits & {});'.format(type_mask))
+
+ t.indent(-1)
+ t.append('}')
+
+ def make_propget_h(self):
+ """Output this group's property functions for the propget.h file."""
+ t = Text()
+
+ for p in sorted(self.props, key=(lambda x: x.name)):
+ defines, undefs = p.def_undefs
t.append()
- t.append('return (bits & {});'.format(type_mask))
+ t.append(defines)
- if self.name is not 'style':
- t.indent(-1)
- t.append('}')
- t.append()
- t.append('/* Initial value */')
- for v in p.values:
- t.append('*{} = {};'.format(v.name + v.suffix, v.defaults))
- if v.bits is not None:
- t.append('*{} = {};'.format(
- v.bits['name'] + v.suffix, v.bits['defaults']))
- t.append('return {};'.format(p.defaults))
+ self.print_propget(t, p, True)
+
+ if p.name in overrides['get']:
+ t.append(overrides['get'][p.name], pre_formatted=True)
+ else:
+ self.print_propget(t, p)
- t.indent(-1)
- t.append('}')
t.append(undefs)
return t.to_string()
- def make_value_declaration(self, for_commented, defaults=False):
+ def make_value_declaration(self, for_commented):
"""Output declarations of values for this group's properties.
Args:
@@ -797,12 +691,8 @@ class CSSGroup:
for p in sorted(self.props, key=(lambda x: x.name)):
if bool(p.comments) == for_commented:
for v in p.values:
- if defaults:
- r.append('.{}{} = {}'.format(p.name, v.suffix,
- v.defaults))
- else:
- v_type, v_name = shift_star(v.type, p.name)
- r.append('{} {}{};'.format(v_type, v_name, v.suffix))
+ v_type, v_name = shift_star(v.type, p.name)
+ r.append('{} {}{};'.format(v_type, v_name, v.suffix))
return r
def make_text(self, filename):