From 16c2c412f3062924ad7869068730b2c56afbcff8 Mon Sep 17 00:00:00 2001 From: sinanmohd Date: Mon, 1 May 2023 22:12:45 +0530 Subject: 6.1.1: 6.1 but with pointers instead of array indices --- 6.1.1/Makefile | 11 ++++++++++ 6.1.1/getch.c | 23 ++++++++++++++++++++ 6.1.1/getch.h | 2 ++ 6.1.1/key.c | 23 ++++++++++++++++++++ 6.1.1/key.h | 13 +++++++++++ 6.1.1/main.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6.1.1/word.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 6.1.1/word.h | 1 + 8 files changed, 205 insertions(+) create mode 100644 6.1.1/Makefile create mode 100644 6.1.1/getch.c create mode 100644 6.1.1/getch.h create mode 100644 6.1.1/key.c create mode 100644 6.1.1/key.h create mode 100644 6.1.1/main.c create mode 100644 6.1.1/word.c create mode 100644 6.1.1/word.h diff --git a/6.1.1/Makefile b/6.1.1/Makefile new file mode 100644 index 0000000..eaee48d --- /dev/null +++ b/6.1.1/Makefile @@ -0,0 +1,11 @@ +objects = main.o getch.o word.o key.o + +keys : $(objects) + cc -o keys $(objects) + +main.o : word.h key.h +word.o : getch.h + +.PHONY : clean +clean : + rm keys $(objects) diff --git a/6.1.1/getch.c b/6.1.1/getch.c new file mode 100644 index 0000000..2b86efe --- /dev/null +++ b/6.1.1/getch.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include +#include "getch.h" + +#define MAXBUFF 100 + +char buff[MAXBUFF]; +static size_t top; + +void ungetch(char c) +{ + if (top < MAXBUFF) + buff[top++] = c; + else + error(EXIT_FAILURE, ENOBUFS , "getch"); +} + +char getch(void) +{ + return (top > 0) ? buff[--top] : getchar(); +} diff --git a/6.1.1/getch.h b/6.1.1/getch.h new file mode 100644 index 0000000..cbfe8ad --- /dev/null +++ b/6.1.1/getch.h @@ -0,0 +1,2 @@ +void ungetch(char c); +char getch(void); diff --git a/6.1.1/key.c b/6.1.1/key.c new file mode 100644 index 0000000..f6384fe --- /dev/null +++ b/6.1.1/key.c @@ -0,0 +1,23 @@ +#include +#include "key.h" + +struct key * +bsearch(char *word, struct key tab[], int n) +{ + int cond; + struct key *low, *high, *mid; + + low = tab; + high = tab + n - 1; + while (low <= high) { + mid = low + (high-low) / 2; + if ((cond = strcmp(word, mid->word)) < 0) + high = mid - 1; + else if (cond > 0) + low = mid + 1; + else + return mid; + } + + return NULL; +} diff --git a/6.1.1/key.h b/6.1.1/key.h new file mode 100644 index 0000000..1b46587 --- /dev/null +++ b/6.1.1/key.h @@ -0,0 +1,13 @@ +#ifndef KEY_H + +#define NKEYS (sizeof(keytab) / sizeof(keytab[0])) + +struct key { + const char *word; + int count; +}; + +#define KEY_H +#endif + +struct key *bsearch(char *word, struct key tab[], int n); diff --git a/6.1.1/main.c b/6.1.1/main.c new file mode 100644 index 0000000..3d35bb0 --- /dev/null +++ b/6.1.1/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "word.h" +#include "key.h" + +#define MAXWORD 100 + +struct key keytab[] = { + "#define", 0, + "#elif", 0, + "#else", 0, + "#endif", 0, + "#error", 0, + "#if", 0, + "#ifdef", 0, + "#ifndef", 0, + "#include", 0, + "#pragma", 0, + "#undef", 0, + "auto", 0, + "break", 0, + "case", 0, + "char", 0, + "const", 0, + "continue", 0, + "default", 0, + "do", 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, +}; + +int main(void) +{ + char word[MAXWORD]; + struct key *p; + + while (getword(word, MAXWORD) != EOF) + if (isalpha(word[0]) || word[0] == '#') + if ((p = bsearch(word, keytab, NKEYS)) != NULL) + p->count++; + + for (p = keytab; p < keytab + NKEYS; ++p) + if(p->count > 0) + printf("%4d %s\n", p->count, p->word); + + return 0; +} diff --git a/6.1.1/word.c b/6.1.1/word.c new file mode 100644 index 0000000..538198f --- /dev/null +++ b/6.1.1/word.c @@ -0,0 +1,63 @@ +#include +#include +#include "getch.h" +#include "word.h" + +char scomment(); + +int getword(char *word, int lim) +{ + int instr = 0; + char *w = word; + + while (isblank(*w = getch()) || *w == '"' || *w == '/') { + if (*w == '"') { + while ((*w = getch()) != '"' && *w != EOF) + ; + if (*w == EOF) + ungetch(*w); + } else if (*w == '/' && !scomment()) { + break; + } + } + + if (isalpha(*w)) { + while ((isalnum(*w) || *w == '_') && --lim > 0) + *++w = getch(); + ungetch(*w--); + } else if (*w == '#' && --lim > 0) { + do { + *++w = getch(); + } while (isalpha(*w) && --lim > 0); + ungetch(*w--); + } + + *++w = '\0'; + return word[0]; +} + +char scomment() +{ + char c; + + switch (c = getch()) { + case '/' : + while ((c = getch()) != EOF && c != '\n') + ; + if (c == EOF) + ungetch(c); + + return '/'; + case '*' : + while ((c = getch()) != EOF && !(c == '*' && (c = getch()) == '/')) + if (c == '*') + ungetch(c); + if (c == EOF) + ungetch(c); + + return '*'; + default: + ungetch(c); + return 0; + } +} diff --git a/6.1.1/word.h b/6.1.1/word.h new file mode 100644 index 0000000..5714c50 --- /dev/null +++ b/6.1.1/word.h @@ -0,0 +1 @@ +int getword(char *word, int len); -- cgit v1.2.3