-
Notifications
You must be signed in to change notification settings - Fork 113
/
3.getword.c
130 lines (111 loc) · 2.35 KB
/
3.getword.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
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
struct key {
char *word;
int count;
} keytab[] = {
{ "auto", 0 }, { "break", 0 }, { "case", 0 }, { "char", 0 },
{ "const", 0 }, { "continue", 0 }, { "default", 0 }, { "double", 0 }, { "else", 0 },
{ "enum", 0 }, { "extern", 0 }, { "float", 0 }, { "for", 0 },
{ "goto", 0 }, { "if", 0 }, { "int", 0 }, { "long", 0 },
{ "register", 0 }, { "return", 0 }, { "short", 0 }, { "signed", 0 },
{ "sizeof", 0 }, { "static", 0 }, { "struct", 0 }, { "switch", 0 },
{ "typedef", 0 }, { "union", 0 }, { "unsigned", 0 }, { "void", 0 },
{ "volatile", 0 }, { "while", 0 }
};
#define NKEYS (sizeof keytab / sizeof keytab[0])
int getword(char *, int);
int binsearch(char *, struct key *, int);
// gcc 3.getword.c getch.c
main()
{
int n;
char word[MAXWORD];
while (getword(word, MAXWORD) != EOF) {
if (isalpha(word[0]))
if ((n = binsearch(word, keytab, NKEYS)) >= 0)
keytab[n].count++;
}
for (n = 0; n < NKEYS; n++)
if (keytab[n].count > 0)
printf("%4d %s\n",
keytab[n].count, keytab[n].word);
return 0;
}
int binsearch(char *word, struct key tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
int getword(char *word, int lim)
{
int c, getch(void);
void ungetch(int);
char *w = word;
while (isspace(c = getch()))
;
if (c != EOF)
*w++ = c;
if (c == '/') {
*w = getch();
if (*w == '/') {
for ( ; --lim > 0; w++) {
if ((*w = getch()) == '\n') {
*++w = '\0';
return c;
}
}
} else if (*w == '*') {
for ( ; --lim > 0; w++) {
if ((*w = getch()) == '*') {
if ((*++w = getch()) == '/') {
*++w = '\0';
return c;
}
}
}
} else {
ungetch(*w);
}
}
if (c == '\'') {
*w++ = getch();
*w++ = getch();
*w = '\0';
return c;
}
if (c == '"')
for ( ; --lim > 0; w++)
if ((*w = getch()) == '"') {
*++w = '\0';
return c;
}
if (!isalpha(c) && c != '_') {
*w = '\0';
return c;
}
for ( ; --lim > 0; w++)
if (!isalnum(*w = getch()) && *w != '_') {
ungetch(*w);
break;
}
*w = '\0';
return word[0];
}
// for test sizeof return int double register
/* sizeof struct void while break
*/