Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * Exercise 4-9. Our getch and ungetch do not handle a pushed-back EOF
3 5dc21454 2023-07-14 jrmu * correctly. Decide what their properties ought to be if an EOF is pushed
4 5dc21454 2023-07-14 jrmu * back, then implement your design.
5 5dc21454 2023-07-14 jrmu *
6 5dc21454 2023-07-14 jrmu * EOF is defined as -1, so we need to change the buffer from an array of
7 5dc21454 2023-07-14 jrmu * chars to an array of ints. The functions are otherwise identical
8 5dc21454 2023-07-14 jrmu */
9 5dc21454 2023-07-14 jrmu
10 5dc21454 2023-07-14 jrmu #include <stdio.h>
11 5dc21454 2023-07-14 jrmu #include <string.h>
12 5dc21454 2023-07-14 jrmu
13 5dc21454 2023-07-14 jrmu #define MAXLEN 1000 /* max size of buffer */
14 5dc21454 2023-07-14 jrmu
15 5dc21454 2023-07-14 jrmu int getch(void);
16 5dc21454 2023-07-14 jrmu void ungetch(int);
17 5dc21454 2023-07-14 jrmu void ungets(char []);
18 5dc21454 2023-07-14 jrmu
19 5dc21454 2023-07-14 jrmu int main() {
20 5dc21454 2023-07-14 jrmu char s[MAXLEN];
21 5dc21454 2023-07-14 jrmu int i = 0;
22 5dc21454 2023-07-14 jrmu char c;
23 5dc21454 2023-07-14 jrmu while ((s[i++] = c = getch()) != EOF) {
24 5dc21454 2023-07-14 jrmu if (c == '*') {
25 5dc21454 2023-07-14 jrmu ungets("test");
26 5dc21454 2023-07-14 jrmu i--;
27 5dc21454 2023-07-14 jrmu }
28 5dc21454 2023-07-14 jrmu }
29 5dc21454 2023-07-14 jrmu s[i] = '\0';
30 5dc21454 2023-07-14 jrmu printf("%s\n", s);
31 5dc21454 2023-07-14 jrmu }
32 5dc21454 2023-07-14 jrmu
33 5dc21454 2023-07-14 jrmu #define BUFSIZE 100
34 5dc21454 2023-07-14 jrmu
35 5dc21454 2023-07-14 jrmu int buf[BUFSIZE]; /* buffer for ungetch */
36 5dc21454 2023-07-14 jrmu int bufp = 0;
37 5dc21454 2023-07-14 jrmu
38 5dc21454 2023-07-14 jrmu /* get a (possibly pushed back) character */
39 5dc21454 2023-07-14 jrmu int getch(void) {
40 5dc21454 2023-07-14 jrmu return (bufp > 0) ? buf[--bufp] : getchar();
41 5dc21454 2023-07-14 jrmu }
42 5dc21454 2023-07-14 jrmu
43 5dc21454 2023-07-14 jrmu /* push character back on input */
44 5dc21454 2023-07-14 jrmu void ungetch(int c) {
45 5dc21454 2023-07-14 jrmu if (bufp >= BUFSIZE)
46 5dc21454 2023-07-14 jrmu printf("ungetch: too many characters\n");
47 5dc21454 2023-07-14 jrmu else
48 5dc21454 2023-07-14 jrmu buf[bufp++] = c;
49 5dc21454 2023-07-14 jrmu }
50 5dc21454 2023-07-14 jrmu
51 5dc21454 2023-07-14 jrmu void ungets(char s[]) {
52 5dc21454 2023-07-14 jrmu int i = strlen(s);
53 5dc21454 2023-07-14 jrmu while (i > 0)
54 5dc21454 2023-07-14 jrmu ungetch(s[--i]);
55 5dc21454 2023-07-14 jrmu }