Skip to content

Commit 3a9d5e6

Browse files
committed
//WIP
1 parent 725a186 commit 3a9d5e6

File tree

7 files changed

+169
-0
lines changed

7 files changed

+169
-0
lines changed

Diff for: Chapter-6/Exercise 6-4/buffer.c

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
#define BUFSIZE 100
4+
5+
int buf[BUFSIZE]; /* buffer for ungetch */
6+
int bufp = 0; /* buffer pointer (not a real pointer) */
7+
8+
int getch(void) /* get a (possibly pushed back) character */ {
9+
return (bufp > 0) ? buf[--bufp] : getchar();
10+
}
11+
12+
void ungetch(int c) /* push character back on input */ {
13+
if (bufp >= BUFSIZE)
14+
printf("ungetch : too many characters\n");
15+
else
16+
buf[bufp++] = c;
17+
}
18+
19+
void ungets(char s[]) /* push string s back to input */ {
20+
int i = strlen(s);
21+
while (i > 0) ungetch(s[--i]);
22+
}

Diff for: Chapter-6/Exercise 6-4/buffer.h

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef BUFFER_H
2+
#define BUFFER_H
3+
4+
int getch(void);
5+
6+
void ungetch(int);
7+
8+
void ungets(char []);
9+
10+
#endif

Diff for: Chapter-6/Exercise 6-4/io.c

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <ctype.h>
5+
#include "buffer.h"
6+
#include "io.h"
7+
8+
char *_strdup(char *s) { /* make a duplicate of s */
9+
char *p;
10+
11+
p = (char *) malloc(strlen(s) + 1); /* +1 for '\0' */
12+
if (p != NULL)
13+
strcpy(p, s);
14+
return p;
15+
}
16+
17+
/* _strndup: make a duplicate of at most 6 characters of s*/
18+
char *_strndup(char *s, int n) {
19+
char *p;
20+
21+
p = (char *) malloc(n +1);
22+
if (p != NULL)
23+
strncpy(p, s, n);
24+
return p;
25+
}
26+
27+
/* getword: get next word or character from input */
28+
int getword(char *word, int lim) {
29+
int c;
30+
char *w = word;
31+
32+
/* skip the whitespaces */
33+
while (isspace(c = getch()))
34+
;
35+
if (c != EOF)
36+
*w++ = c;
37+
if (!isalpha(c)) {
38+
*w = '\0';
39+
return c;
40+
}
41+
42+
while (--lim) {
43+
if (!isalnum(*w = getch())) {
44+
ungetch(*w);
45+
break;
46+
}
47+
w++;
48+
}
49+
*w = '\0';
50+
return word[0];
51+
}

Diff for: Chapter-6/Exercise 6-4/io.h

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef IO_H
2+
#define IO_H
3+
4+
char *_strdup(char *s);
5+
char *_strndup(char *s, int n);
6+
7+
int getword(char *word, int lim);
8+
9+
#endif

Diff for: Chapter-6/Exercise 6-4/main.c

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include <stdio.h>
2+
#include <ctype.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
#include "tree.h"
6+
#include "io.h"
7+
8+
#define MAXWORD 100
9+
10+
int getword(char *, int);
11+
12+
/* word frequency count */
13+
int main(int argc, char **argv) {
14+
struct tnode *root;
15+
char word[MAXWORD];
16+
17+
root = NULL;
18+
while (getword(word, MAXWORD) != EOF)
19+
if (isalpha(word[0]))
20+
root = addtree(root, word);
21+
treeprint(root);
22+
return 0;
23+
}

Diff for: Chapter-6/Exercise 6-4/tree.c

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
#include <stdlib.h>
4+
#include "io.h"
5+
#include "tree.h"
6+
7+
/* addtree: add a node with w, at or below p */
8+
struct tnode *addtree(struct tnode *p, char *w) {
9+
int cond;
10+
11+
if (p == NULL) { /* a new word has arrived */
12+
p = talloc();
13+
p -> word = _strdup(w);
14+
p -> count = 1;
15+
p -> left = p -> right = NULL;
16+
} else if ((cond = strcmp(w, p -> word)) == 0)
17+
p -> count++; /* repeated word */
18+
else if (cond < 0)
19+
p -> left = addtree(p -> left, w);
20+
else
21+
p -> right = addtree(p -> right, w);
22+
return p;
23+
}
24+
25+
/* treeprint: in-order print of tree p */
26+
void treeprint(struct tnode *p) {
27+
if (p != NULL) {
28+
treeprint(p -> left);
29+
printf("%4d %s\n", p -> count, p -> word);
30+
treeprint(p -> right);
31+
}
32+
}
33+
34+
/* talloc: make a tnode */
35+
struct tnode *talloc(void) {
36+
return (struct tnode *) malloc(sizeof(struct tnode));
37+
}

Diff for: Chapter-6/Exercise 6-4/tree.h

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef TREE_H
2+
#define TREE_H
3+
4+
struct tnode { /* the tree node: */
5+
char *word; /* points to the text */
6+
int count; /* number of occurences */
7+
struct tnode *left; /* left child */
8+
struct tnode *right; /* right child */
9+
};
10+
11+
struct tnode *addtree(struct tnode *, char *);
12+
13+
void treeprint(struct tnode *p);
14+
15+
struct tnode *talloc(void);
16+
17+
#endif

0 commit comments

Comments
 (0)