fork download
  1. #include <stdio.h>
  2.  
  3. struct callback {
  4. void (*call) (char, void *);
  5. void * data;
  6. };
  7.  
  8. void with_characters_from(FILE * file, struct callback const * callbacks, size_t count) {
  9. int c;
  10. while ((c = fgetc(file)) != EOF) {
  11. char character = c & 0xFF;
  12. for (size_t i = 0; i < count; ++i) {
  13. callbacks[i].call(character, callbacks[i].data);
  14. }
  15. }
  16. }
  17.  
  18. struct counter_data {
  19. char const character;
  20. unsigned count;
  21. };
  22.  
  23. void counter (char character, void * vptr) {
  24. struct counter_data * data = vptr;
  25. if (character == data->character) {
  26. ++(data->count);
  27. }
  28. }
  29.  
  30. int main() {
  31. struct counter_data data [2] = {
  32. {'a', 0}, {'x', 0}};
  33. struct callback callbacks [2] = {
  34. {&counter, &(data [0])},
  35. {&counter, &(data [1])}};
  36. with_characters_from (stdin, callbacks, 2);
  37. printf("Counted %c %u times \n", data [0].character, data [0].count);
  38. printf("Counted %c %u times \n", data [1].character, data [1].count);
  39. return 0;
  40. }
Success #stdin #stdout 0s 2160KB
stdin
A bear is awesome. Unfortunately, I cannot make up a sentence with an x right now!
stdout
Counted a 7 times 
Counted x 1 times