From: Christian Linhart Date: Wed, 3 Sep 2014 11:22:40 +0000 (+0200) Subject: generator: sumof with nested expression X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=761a208c4ad626f0e84ee10e44fe2e4af3ee10d4;p=free-sw%2Fxcb%2Flibxcb generator: sumof with nested expression Support sumof with a nested expression. The nested expression is computed for every list-element and the result of the computation is added to the sum. This way, sumof can be applied to a list of structs, and, e.g., compute the sum of a specific field of that struct. example: len bar generated tmpvar: int xcb_pre_tmp_1; /* sumof length */ int xcb_pre_tmp_2; /* sumof loop counter */ int64_t xcb_pre_tmp_3; /* sumof sum */ const xcb_input_sumof_test_element_t* xcb_pre_tmp_4; /* sumof list ptr */ generated code: /* mylist2 */ /* sumof start */ xcb_pre_tmp_1 = _aux->len; xcb_pre_tmp_3 = 0; xcb_pre_tmp_4 = xcb_input_sumof_test_field_access_mylist_1(_aux); for ( xcb_pre_tmp_2 = 0; xcb_pre_tmp_2 < xcb_pre_tmp_1; xcb_pre_tmp_2++) { xcb_pre_tmp_3 += xcb_pre_tmp_4->bar; xcb_pre_tmp_4++; } /* sumof end. Result is in xcb_pre_tmp_3 */ xcb_block_len += xcb_pre_tmp_3 * sizeof(uint16_t); Message-ID: <1409743361-466-5-git-send-email-chris@demorecorder.com> Patch-Thread-Subject: [Xcb] xinput: make ListInputDevices work, sumof with nested expr, ... Patch-Set: ListInputDevices Patch-Number: libxcb 5/6 Patch-Version: V1 Signed-off-by: Christian Linhart --- diff --git a/src/c_client.py b/src/c_client.py index 5f1d2af..ea7173f 100644 --- a/src/c_client.py +++ b/src/c_client.py @@ -8,6 +8,7 @@ import sys import errno import time import re +import copy # Jump to the bottom of this file for the main routine @@ -1633,7 +1634,30 @@ def _c_accessor_get_expr(expr, field_mapping): "for ( %s = 0; %s < %s; %s++) {", loopvar, loopvar, lengthvar, loopvar ) _c_pre.indent() - _c_pre.code( "%s += *%s;", sumvar, listvar ) + + if expr.rhs == None: + _c_pre.code( "%s += *%s;", sumvar, listvar ) + else: + #sumof has a nested expression which + #has to be evaluated in the context of this list element + + #field mapping for the subexpression needs to include + #the fields of the list-member type + scoped_field_mapping = field_mapping.copy() + scoped_field_mapping.update( + _c_helper_field_mapping( + field.type.member, + [( listvar, '', field.type.member )] ) ) + + #cause pre-code of the subexpression be added right here + _c_pre.end() + #compute the subexpression + rhs_expr_str = _c_accessor_get_expr(expr.rhs, scoped_field_mapping) + #resume with our code + _c_pre.start() + #output the summation expression + _c_pre.code( "%s += %s;", sumvar, rhs_expr_str ) + _c_pre.code( "%s++;", listvar ); _c_pre.pop_indent() _c_pre.code( "}" )