static void fold (const void * array, unsigned size, unsigned count, void (* callback) (void *, const void *), void * initial) { const char * p = array; while (count --) { callback(initial, p); p += size; } } static void add_integers (void * accumulator, const void * value) { *(unsigned *) accumulator += *(const unsigned *) value; } static unsigned sum_array (const unsigned * array, unsigned count) { unsigned result = 0; fold(array, sizeof *array, count, &add_integers, &result); return result; } static void initialize_array (unsigned * array, unsigned count) { unsigned p; for (p = 0; p < count; p ++) array[p] = p; } unsigned hundred (void) { unsigned values[10]; initialize_array(values, sizeof values / sizeof *values); unsigned p, sum = sum_array(values, sizeof values / sizeof *values); for (p = 0; p < (sizeof values / sizeof *values); p ++) values[p] = 10 - p; return sum + sum_array(values, sizeof values / sizeof *values); }