Encoders
Hub for Computer Whizzes Register to join us

Encoders > More... > C > Program

/* Program to count the occurrences of each C keyword. */

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXWORD	100
#define NKEYS		(sizeof keytab/sizeof(struct key))

int getword(char*,int);
int binsearch(char*,struct key*,int);

struct key
{
	char *word;
	int count;
}keytab[]={
                        "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,
		};

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(!isalpha(c))
	{
		*w='\0';
		return c;
	}
        for(;--lim>0;w++)
		if(!isalnum(*w = getch()))
		{
			ungetch(*w);
			break;
		}
	*w = '\0';
	return word[0];
}
 
char buf[100];
int bufp=0;

int getch(void)
{
        return(bufp>0)?buf[--bufp]:getchar();
}

void ungetch(int c)
{
        if(bufp>=100)
                printf("error: buffer overflow\n");
	else
		buf[bufp++]=c;
}