Exercise 5.19 - undcl does not add redundant parentheses#

Question#

Modify undcl so that it does not add redundant parentheses to declarations.

/* Modify undcl so that it does not add redundant parenthesiss to declarations */

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

#define MAXTOKEN 100

enum { NAME,PARENS,BRACKETS};

void dcl(void);
void dirdcl(void);


int gettoken(void);
int nexttoken(void);
int tokentype;
char token[MAXTOKEN];   /* last token string */
char out[1000];

/* undcl: convert word description to declaration */

int main(void)
{
    int type;
    char temp[MAXTOKEN];

    while(gettoken()!= EOF)
    {
        strcpy(out,token);
    
        while((type=gettoken()) != '\n')
            if(type == PARENS || type == BRACKETS)
                strcat(out,token);
            else if(type == '*')
            {
                if((type = nexttoken()) == PARENS || type == BRACKETS)
        sprintf(temp,"(*%s)",out);
                else
                    sprintf(temp,"*%s",out);
                strcpy(out,temp);
            }
            else if (type == NAME)
            {
                sprintf(temp," %s %s",token,out);
                strcpy(out,temp);
            }
            else
                printf("invalid input at %s \n",token);
        printf("%s\n",out);
    }
    return 0;
}

enum { NO, YES};

int gettoken(void);

/* nexttoken: get the next token and push it back */
int nexttoken(void)
{
    int type;
    extern int prevtoken;

    type = gettoken();
    prevtoken = YES;
    return type;
}

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


extern int tokentype;   /* type of last token */
extern char token[];    /* last token string */
int prevtoken = NO; /* there is no previous token */

int gettoken(void)  /* return next token */
{
    int c,getch(void);
    void ungetch(int);
    char *p = token;

    if(prevtoken == YES)
    {
        prevtoken = NO;
        return tokentype;
    }

    while((c=getch()) == ' ' || c == '\t')
        ;

    if(c == '(')
    {
        if((c=getch()) == ')')
        {
            strcpy(token,"()");
            return tokentype = PARENS;
        }
        else
        {
            ungetch(c);
            return tokentype = '(';
        }
    }
    else if (c == '[')
    {
        for(*p++ = c; (*p++ = getch()) != ']';)
            ;
        *p = '\0';
        return tokentype = BRACKETS;
    }
    else if (isalpha(c))
    {
        for(*p++ = c; isalnum(c=getch());)
            *p++ =c;
        *p = '\0';
        ungetch(c);
        return tokentype = NAME;
    }
    else
        return tokentype = c;
}

#define BUFSIZE 100
char buf[BUFSIZE];  /* buffer for ungetch */
int bufp = 0;

int getch(void)     /* get a(possibly pushed back) character */
{
    return (bufp > 0) ? buf[--bufp]: getchar();
}

void ungetch(int c)
{
    if(bufp >= BUFSIZE)
        printf("ungetch: too many characters \n");
    else
        buf[bufp++] =c;
}
    

Explanation#