#include #include #include #include "emotion.h" #include "journal.h" #define TOPICS 10 // go through all elements of argv[2] and beyond // and join them together in a string char *extract_handler_msg(int argc, char **argv) { int cur = 0; // allocate an empty slot to start with. char *res = malloc(cur); // iterate through each argument for(int i = 2; argv[i] != NULL; i++) { // catch it, get its length char *word = argv[i]; int wordlen = strlen(word); // increase the size of our current things by // arg length + 1 (for a whitespace) cur += wordlen; res = realloc(res, cur + 1); // only prepend our whitespace if we AREN'T // at the first argument. if(i != 2) { res[cur - wordlen] = ' '; cur++; } // merge our current results with the current arg for(int j = 0; j < wordlen; j++) { res[cur - wordlen + j] = word[j]; } } return res; } int main(int argc, char** argv) { if(argc < 2) { printf("usage: %s topic message\n", argv[0]); return 0; } char *topic = argv[1]; const char* topics[TOPICS] = { "emotion" }; void (*handlers[])(FILE*, char*) = { handle_emotion, }; if(strcmp(topic, "list") == 0) { // list all topics for(int i = 0; topics[i] != NULL; i++) printf("%s ", topics[i]); printf("\n"); return 0; } for(int i = 0; topics[i] != NULL; i++) { const char* cur_topic = topics[i]; if(strcmp(topic, cur_topic) == 0) { void (*fun_ptr)(FILE*, char*) = handlers[i]; FILE* journal_file = journal_open(topic); char *handler_message = extract_handler_msg(argc, argv); printf("'%s'\n", handler_message); // the joined args[2] and beyond come as the // second argument fun_ptr(journal_file, handler_message); journal_close(journal_file); free(handler_message); printf("done\n"); return 0; } } printf("topic %s not found\n", topic); return 0; }