#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
#define OUTLEN 1000
#define MAXBUFF 100
enum { NAME, PARENS, BRACKETS };
enum { NO, YES };
void err(char *s);
int gettoken(void);
int peaktoken(void);
char tokentype;
char token[MAXTOKEN];
char prevtoken;
char out[OUTLEN];
char buff[MAXBUFF];
static size_t top;
void err(char *s)
{
printf("fatal error: %s\n", s);
exit(1);
}
int gettoken(void)
{
char c, *p = token;
char getch(void);
void ungetch(char);
if (prevtoken == YES) {
prevtoken = NO;
return tokentype;
}
while(isblank(c = getch()))
;
if (c == '/') { /* ignore comments */
if ((c = getch()) == '/') {
while ((c = getch()) != '\n')
;
} else if (c == '*') {
while (getch() != '*' || (c = getch()) != '/')
if (c == '*')
ungetch('*');
return gettoken();
} else {
ungetch(c);
c = '/';
}
}
if (c == '(') {
if ((c = getch()) == ')') {
strcpy(token, "()");
return tokentype = PARENS;
} else {
ungetch(c);
return tokentype = '(';
}
} else if (c == '[') {
for (*p++ = '['; (*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;
}
}
void ungetch(char c)
{
if (top < MAXBUFF)
buff[top++] = c;
else
err("buff: stack overflow");
}
char getch(void)
{
return (top > 0) ? buff[--top] : getchar();
}
int peaktoken()
{
char type;
type = gettoken();
prevtoken = YES;
return type;
}
int main(void)
{
int err;
char type;
char temp[OUTLEN + MAXTOKEN];
while (gettoken() != EOF) {
err = 0;
strcpy(out, token);
while ((type = gettoken()) != '\n') {
if (type == PARENS || type == BRACKETS ) {
strcat(out, token);
} else if (type == '*') {
if ((type = peaktoken()) == 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);
out[0] = '\0'; /* rust sisters btfo */
strncat(out, temp, OUTLEN - 1);
} else {
err = 1;
printf("err: invalid input at %s\n", token);
while ((type = gettoken()) != '\n')
;
ungetch('\n');
}
}
if (!err)
printf("%s\n", out);
}
return 0;
}