| #include <stdio.h> |
| #include <Block.h> |
| |
| struct test1 |
| { |
| char test1_char; |
| int test1_int; |
| }; |
| |
| int called_from_block (int in_value) |
| { |
| return in_value * 2; |
| } |
| |
| int (^(block_maker (int in_ref_value, char *strptr))) (int, char *) |
| { |
| __block int by_ref = in_ref_value; |
| int nother_value = strptr[0]; |
| int test_value; |
| int test_value2; |
| |
| /* Breakpoint for first Block function. */ |
| int (^blockptr) (int, char *) = ^(int inval, char *strptr) { |
| inval = called_from_block (inval); |
| by_ref++; |
| return by_ref + inval + nother_value; |
| }; |
| |
| /* Breakpoint for second Block function. */ |
| int (^blockptr2) (int, char*) = ^(int inval, char *strptr) { return by_ref + inval + (int)strptr[0]; }; |
| |
| test_value = blockptr (0, "other_string"); |
| test_value2 = blockptr2 (5, "flibberty-gibbit"); |
| |
| return Block_copy (blockptr); |
| } |
| |
| int |
| block_taker (int (^myBlock)(int, char *), int other_input, char *instr) |
| { |
| return 5 * myBlock (other_input, instr); |
| } |
| |
| struct test1 |
| block_taker_struct (struct test1 (^myBlock) (int), int test1_int) |
| { |
| return myBlock (test1_int); |
| } |
| |
| struct test1 (^(block_maker_struct (int in_ref))) (int) |
| { |
| __block struct test1 by_ref; |
| int by_value = 2 * in_ref; |
| struct test1 test_value; |
| by_ref.test1_int = 1; |
| by_ref.test1_char = 'a'; |
| |
| /* Breakpoint for third Block function. */ |
| struct test1 (^blockptr) (int) = ^(int inint) { |
| struct test1 my_struct; |
| called_from_block (0); |
| if (by_value > 1) |
| my_struct.test1_char = 'a'; |
| else |
| my_struct.test1_char = 'b'; |
| my_struct.test1_int = inint + by_ref.test1_int; |
| by_ref.test1_int++; |
| return my_struct; |
| }; |
| |
| test_value = blockptr (0); |
| return Block_copy (blockptr); |
| } |
| |
| int main (int argc, char **argv) |
| { |
| int int_ret; |
| struct test1 test1_ret; |
| |
| int (^block_ptr) (int, char *) = (int (^) (int, char *)) block_maker (100, "some string"); |
| struct test1 (^struct_block_ptr) (int) = (struct test1 (^) (int)) block_maker_struct (100); |
| |
| int_ret = block_taker (block_ptr, 5, "some string"); |
| |
| test1_ret = block_taker_struct (struct_block_ptr, 10); |
| |
| return 0; |
| } |