#include <stdio.h>
struct callback {
void (*call) (char, void *);
void * data;
};
void with_characters_from(FILE * file, struct callback const * callbacks, size_t count) {
int c;
while ((c
= fgetc(file
)) != EOF
) { char character = c & 0xFF;
for (size_t i = 0; i < count; ++i) {
callbacks[i].call(character, callbacks[i].data);
}
}
}
struct counter_data {
char const character;
unsigned count;
};
void counter (char character, void * vptr) {
struct counter_data * data = vptr;
if (character == data->character) {
++(data->count);
}
}
int main() {
struct counter_data data [2] = {
{'a', 0}, {'x', 0}};
struct callback callbacks [2] = {
{&counter, &(data [0])},
{&counter, &(data [1])}};
with_characters_from (stdin, callbacks, 2);
printf("Counted %c %u times \n", data
[0].
character, data
[0].
count); printf("Counted %c %u times \n", data
[1].
character, data
[1].
count); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgY2FsbGJhY2sgewogIHZvaWQgKCpjYWxsKSAoY2hhciwgdm9pZCAqKTsKICB2b2lkICogZGF0YTsKfTsKCnZvaWQgd2l0aF9jaGFyYWN0ZXJzX2Zyb20oRklMRSAqIGZpbGUsIHN0cnVjdCBjYWxsYmFjayBjb25zdCAqIGNhbGxiYWNrcywgc2l6ZV90IGNvdW50KSB7CiAgaW50IGM7CiAgd2hpbGUgKChjID0gZmdldGMoZmlsZSkpICE9IEVPRikgewogICAgY2hhciBjaGFyYWN0ZXIgPSBjICYgMHhGRjsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBjYWxsYmFja3NbaV0uY2FsbChjaGFyYWN0ZXIsIGNhbGxiYWNrc1tpXS5kYXRhKTsKICAgIH0KICB9Cn0KCnN0cnVjdCBjb3VudGVyX2RhdGEgewogIGNoYXIgY29uc3QgY2hhcmFjdGVyOwogIHVuc2lnbmVkIGNvdW50Owp9OwoKdm9pZCBjb3VudGVyIChjaGFyIGNoYXJhY3Rlciwgdm9pZCAqIHZwdHIpIHsKICBzdHJ1Y3QgY291bnRlcl9kYXRhICogZGF0YSA9IHZwdHI7CiAgaWYgKGNoYXJhY3RlciA9PSBkYXRhLT5jaGFyYWN0ZXIpIHsKICAgICsrKGRhdGEtPmNvdW50KTsKICB9Cn0KCmludCBtYWluKCkgewogIHN0cnVjdCBjb3VudGVyX2RhdGEgZGF0YSBbMl0gPSB7CiAgICB7J2EnLCAwfSwgeyd4JywgMH19OwogIHN0cnVjdCBjYWxsYmFjayBjYWxsYmFja3MgWzJdID0gewogICAgeyZjb3VudGVyLCAmKGRhdGEgWzBdKX0sCiAgICB7JmNvdW50ZXIsICYoZGF0YSBbMV0pfX07CiAgd2l0aF9jaGFyYWN0ZXJzX2Zyb20gKHN0ZGluLCBjYWxsYmFja3MsIDIpOwogIHByaW50ZigiQ291bnRlZCAlYyAldSB0aW1lcyBcbiIsIGRhdGEgWzBdLmNoYXJhY3RlciwgZGF0YSBbMF0uY291bnQpOwogIHByaW50ZigiQ291bnRlZCAlYyAldSB0aW1lcyBcbiIsIGRhdGEgWzFdLmNoYXJhY3RlciwgZGF0YSBbMV0uY291bnQpOwogIHJldHVybiAwOwp9
QSBiZWFyIGlzIGF3ZXNvbWUuIFVuZm9ydHVuYXRlbHksIEkgY2Fubm90IG1ha2UgdXAgYSBzZW50ZW5jZSB3aXRoIGFuIHggcmlnaHQgbm93IQ==
A bear is awesome. Unfortunately, I cannot make up a sentence with an x right now!