From d2dbbc56761f279a9988e3e2ebbdd532ac7a30cc Mon Sep 17 00:00:00 2001 From: Christian Linhart Date: Wed, 3 Sep 2014 13:22:39 +0200 Subject: [PATCH] generator: sumof: support any type, generate explicit code A sumof-expression now generates explicit code ( for-loop etc ) instead of calling xcb_sumof. This way, it supports any type which can be added. Previously, only uint_8 was supported. Here's an example and the generated code: xml: len declaration of tempvars at the start of enclosing function: int xcb_pre_tmp_1; /* sumof length */ int xcb_pre_tmp_2; /* sumof loop counter */ int64_t xcb_pre_tmp_3; /* sumof sum */ const uint16_t* xcb_pre_tmp_4; /* sumof list ptr */ code: /* mylist2 */ /* sumof start */ xcb_pre_tmp_1 = _aux->len; xcb_pre_tmp_3 = 0; xcb_pre_tmp_4 = xcb_input_sumof_test_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; xcb_pre_tmp_4++; } /* sumof end. Result is in xcb_pre_tmp_3 */ xcb_block_len += xcb_pre_tmp_3 * sizeof(uint8_t); This patch is also a preparation for sumof which can access fields of lists of struct, etc. Message-ID: <1409743361-466-4-git-send-email-chris@demorecorder.com> Patch-Thread-Subject: [Xcb] xinput: make ListInputDevices work, sumof with nested expr, ... Patch-Set: ListInputDevices Patch-Number: libxcb 4/6 Patch-Version: V1 Signed-off-by: Christian Linhart --- src/c_client.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/c_client.py b/src/c_client.py index c8a1a03..0dd053d 100644 --- a/src/c_client.py +++ b/src/c_client.py @@ -1611,7 +1611,34 @@ def _c_accessor_get_expr(expr, field_mapping): c_length_func = "%s(%s)" % (field.c_length_name, list_name) # note: xcb_sumof() has only been defined for integers c_length_func = _c_accessor_get_expr(field.type.expr, field_mapping) - return 'xcb_sumof(%s, %s)' % (list_name, c_length_func) + # create explicit code for computing the sum. + # This works for all C-types which can be added to int64_t with += + _c_pre.start() + lengthvar = _c_pre.get_tempvarname() + loopvar = _c_pre.get_tempvarname() + sumvar = _c_pre.get_tempvarname() + listvar = _c_pre.get_tempvarname() + _c_pre.tempvar("int %s; /* sumof length */", lengthvar) + _c_pre.tempvar("int %s; /* sumof loop counter */", loopvar) + _c_pre.tempvar("int64_t %s; /* sumof sum */", sumvar) + _c_pre.tempvar( + "const %s* %s; /* sumof list ptr */", field.c_field_type, listvar) + _c_pre.code("/* sumof start */") + _c_pre.code("%s = %s;", lengthvar, c_length_func) + _c_pre.code("%s = 0;", sumvar) + _c_pre.code("%s = %s;", listvar, list_name) + _c_pre.code( + "for (%s = 0; %s < %s; %s++) {", + loopvar, loopvar, lengthvar, loopvar) + _c_pre.indent() + _c_pre.code("%s += *%s;", sumvar, listvar) + _c_pre.code("%s++;", listvar); + _c_pre.pop_indent() + _c_pre.code("}") + _c_pre.code("/* sumof end. Result is in %s */", sumvar) + _c_pre.end() + return sumvar; + # return 'xcb_sumof(%s, %s)' % (list_name, c_length_func) elif expr.op != None: return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) + ' ' + expr.op + ' ' + -- 2.34.1