-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsanalaskuri.c
158 lines (133 loc) · 3.91 KB
/
sanalaskuri.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "bintree.h"
#include "sanalaskuri.h"
#include "dynchar.h"
BinTree *puu;
BinSilmu *silmu;
int main(int argc, char **argv) {
FILE *mista, *minne;
int i;
mista = stdin;
minne = stdout;
/* Tarkistetaan jos halutaan tulostaa ohjeet. h -vipu */
for(i=1; i < argc; i++) {
if(strstr(argv[i],"-h") || strstr(argv[i],"--help")) {
tulostaOhjeet(argv[0]);
return EXIT_SUCCESS;
}
}
/* Tarkistetaan jos tulostiedosto on määritelty. o -vipu */
for(i=1; i < argc; i++) {
if(strstr(argv[i],"-s") || strstr(argv[i],"--source")) {
if((i+1) < argc) {
if((mista=fopen(argv[i+1], "r")) == NULL) {
fprintf(stderr, "Tiedoston %s avaaminen ei onnistunut.\n", argv[i+1]);
return EXIT_FAILURE;
}
}
else {
tulostaOhjeet(argv[0]);
return EXIT_FAILURE;
}
break;
}
}
/* Tarkistetaan jos tulostiedosto on määritelty. o -vipu */
for(i=1; i < argc; i++) {
if(strstr(argv[i],"-o") || strstr(argv[i],"--out")) {
if((i+1) < argc) {
if((minne=fopen(argv[i+1], "w")) == NULL) {
fprintf(stderr, "Tiedoston %s avaaminen ei onnistunut.\n", argv[i+1]);
return EXIT_FAILURE;
}
}
else {
tulostaOhjeet(argv[0]);
return EXIT_FAILURE;
}
break;
}
}
/* Rakennetaan puu, luetaan sinne sanoja ja tulostetaan sanat. */
puu = buildTree();
lueSanoja(mista,puu);
tulostaSanat(minne,puu);
free(puu); /* vapautetaan, kun ei enää tarvita */
/* Suljetaan streamit. */
if(fclose(mista) == EOF || fclose(minne) == EOF) {
fprintf(stderr, "Tiedoston sulkeminen ei onnistunut.\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
int lueSanoja(FILE *fp, BinTree *puu) {
char *sana;
int pituus = 50;
int kasvatuspituus = 50;
char merkki;
int i = 0;
if((sana=calloc(pituus,sizeof(char))) == NULL ) {
fprintf(stderr,"Muistinvaraus merkkijonolle epäonnistui.\n");
return EXIT_FAILURE;
}
while(1) {
merkki=fgetc(fp);
if(!(isspace(merkki)) && merkki != EOF) {
/* Kasvatetaan taulukon pituutta jos tila meinaa loppua kesken.
* varaa tarvittaessa tilan myös viimeiselle '\0' -merkille
* */
if(i >= pituus) {
sana = extendChar(sana,pituus,kasvatuspituus);
pituus += kasvatuspituus;
}
/* Asetetaan merkki paikalleen ja kasvatetaan i:tä seuraavaa merkkiä varten. */
sana[i] = merkki;
i++;
}
/* Lisätään sana puuhun jos pituus on oikea,
* nollataan sananpituutta laskeva muuttuja i,
* lopetetaan lukeminen jos viimeinen luettu merkki oli EOF
* */
else {
if(i >= SANAN_MIN_PITUUS) {
/* Sanan viimeinen merkki on aina '\0' */
sana[i] = '\0';
if( (silmu=search(puu->root,sana)) == NULL )
addSilmu(puu,sana);
else
(silmu->count)++;
}
i = 0;
if(merkki == EOF) {
free(sana);
break;
}
}
}
return EXIT_SUCCESS;
}
int tulostaSanat(FILE *fp, BinTree *puu) {
if(puu == NULL)
printf("Puuta ei ole alustettu.");
else {
fprintf(fp,"\nSanat: lkm\n");
fprintf(fp,"******************************\n");
inorderTreeWalk(fp,puu->root);
fprintf(fp,"******************************\n");
fprintf(fp,"Eri sanoja yhteenä: %d\n",puu->items);
}
return EXIT_SUCCESS;
}
void tulostaOhjeet( const char *komento ) {
printf("Sanalaskuri versio %s\n", SANALASKURI_VERSION);
printf("Ohjelman käyttö: %s [-s tiedosto] [-o tulostiedosto] \n", komento);
printf("\nOhjelman mahdolliset parametrit:\n");
printf("%-30s%s","-h / --help","Tulostaa tämän ohjeen.\n");
printf("%-30s%s","-s / --source <tiedosto>","Tiedosto, josta sanoja luetaan.\n");
printf("%-30s%s","-o / --out <tiedosto>","Tiedosto, johon tulokset tallennetaan.\n");
printf("\nJos parametrejä -s tai -o ei anneta, olettaa ohjelma syötteen tulevan standarista syöttövirrasta\ntai tulostuksen menevän standardiin tulostusvirtaan.\n");
printf("Jos syötettä annetaan näppäimistöllä, voidaan sanojen antaminen lopettaa painamalla CTRL-D\n");
}