Daniel Shahaf wrote: > Julian Foad wrote on Tue, 20 Apr 2010 at 11:49 +0100: > > Hmm... I wonder if we could do something with a macro that takes the > > whole block of code to be executed as an argument, like: > > A code block inside a macro call??
Well, I tried it and it works and I kind of like it... but really I tried it for fun and I'm not sure if we should be seriously considering anything like this. > Perhaps we write a macro in the > style of SVN_DBG --- one that is "pseudo-variadic"... > > For example (not tested): > > #define SVN_ITER_ARRAY2(element_type, element_name, array, iterpool, > pool, func_name, (arg1, arg2)) \ > SVN_ITER_ARRAY(element_type, element_name, array, iterpool, pool, > func_name(arg1, arg2)) I think you mean something like (with a backslash after every line): #define SVN_ITER_ARRAY2(element_type, element_name, array, iterpool, pool, func_name, arg_list) SVN_ITER_ARRAY(element_type, element_name, array, iterpool, pool, { svn_error_t *__err = func_name arg_list; if (__err->apr_err == SVN_ERR_ITER_BREAK) { svn_error_clear(err); break; } SVN_ERR(__err); } And I think the advantages of your SVN_ITER_ARRAY2 are: * not taking a code block as an argument, thus avoiding the surprise (and possible confusion of syntax-highlighting editors etc.); and its disadvantages are: * the body of the loop has to be expressed as a single function call, which adds a considerable overhead for simple operations. - Julian > where SVN_ITER_ARRAY() is the macro you defined: > > > #define SVN_ITER_ARRAY(element_type, element_name, array, \ > > iterpool_name, /* as subpool of */ pool, \ > > code_block) \ > > { apr_pool_t *iterpool_name = ... \ > > for (...) \ > > { \ > > element_type element_name = ...; \ > > apr_pool_clear(iterpool_name); \ > > code_block \ > > } \ > > apr_pool_destroy(iterpool_name); \ > > } > > > > :-) > > Daniel > > > Usage: > > SVN_ITER_ARRAY(svn_node_t *, node, nodes_array, > > iterpool, existing_pool, > > { > > if (node->kind == svn_node_file) > > SVN_ERR(bar(node, blah, iterpool)); > > else > > break; /* breaks the iteration */ > > } ) /* macro ends here */ > > > > Hmm... > > > > - Julian > > > > > >