#include #include #include #include #include "helpers.h" #include "tree.h" #define BUFFER_SIZE 12 #define MIN_WORD_LENGTH 2 int ignore_case = 0; /* Jos true, niin kaikki kirjaimet muutetaan pieniksi */ char *input_filename = NULL; /* Mahdollisen syötetiedoston nimi */ char *output_filename = NULL; /* Mahdollisen tulostiedoston nimi */ FILE *source = NULL; /* Syötevirta, jota luetaan */ FILE *destination = NULL; /* Tulostevirta, jonne kirjoitetaan */ char *word_buffer = NULL; /* read_word() funktion käyttämä puskuri */ TreeNode *root = NULL; /* Sanabinääripuun juurisolmu */ /* Puun lehtien tulostusfunktio. Välitetään tree_inorder()-funktiolle. Ks. node_handler_func tree.h:sta. */ void print_node(TreeNode *node) { if (*node->word == '\0') { /* Juurisolmua ei tulosteta. */ return; } fprintf(destination, "%d\t%s\n", node->frequency, node->word); } /* Tulostaa ohjelman käyttö-ohjeet stdiniin. */ void print_help() { printf("Sanalaskuri\n"); printf("===========\n"); printf("Sanalaskuri lukee annetusta syötteestä sanojen esiintymistiheyden. \n"); printf("Käyttö: sanalaskuri -hc [syötetiedosto [tulostetiedosto]]\n\n"); printf("Mikäli syöte- tai tulostetiedostoa ei määritellä, käytetään standardisyöttö- ja tulostusvirtaa.\n\n"); printf("Parametrit:\n"); printf("\t-h : tämä ohje\n"); printf("\t-c : samaista isot ja pienet kirjaimet\n"); printf("\t[syötetiedosto] : lue syöte tästä tiedostosta\n"); printf("\t[tulostetiedosto] : tulosta tiedot tähän tiedostoon\n\n"); #ifndef NDEBUG printf("\nOhjelma on käännetty debug-tilassa.\n\n"); #endif } /* Lukee komentoriviparametrit ja säätää ohjelman toiminnan vastaamaan näitä. sanalaskuri -hc [syötetiedosto [tulostetiedosto]] */ void parse_parameters(int argc, char **argv) { int i; if (argc == 1) { print_help(); return; } for(i = 1; i= (BUFFER_SIZE * reallocs)) { /* kasvatetaan puskurin kokoa */ reallocs++; word_buffer = realloc(word_buffer, sizeof(char) * (BUFFER_SIZE * reallocs) + 1); debug_print("word_bufferille varattiin lisää muistia. Uusi koko: %d\n", BUFFER_SIZE*reallocs +1); ; } if (word_buffer != NULL) { word_buffer[len] = (char)c; len++; } } } debug_print("read_word luki %d merkkiä eli sanan %s", len, word_buffer); /* Lisätään sanan loppuun terminaattori */ word_buffer[len] = '\0'; } /* Pääohjelma */ int main(int argc, char **argv) { int done = 0; parse_parameters(argc, argv); setup_io(); /* Luodaan puun juurisolmu */ root = create_node("\0"); while ( !done ) { read_word(source); if (word_buffer == NULL) { done = 1; break; } if (strlen(word_buffer) == 1) { done = 1; break; } if (strlen(word_buffer) >= MIN_WORD_LENGTH) { if (ignore_case) { convert_lowercase(word_buffer); } insert_word(root, word_buffer); } } /* Tulostetaan puu. Käydään lehdet sisäkkäisläpikäynnillä läpi */ tree_inorder(root, &print_node); delete_tree(root); close_io(); free(word_buffer); return 0; }