
#include <ctype.h>

void push(int);
int pop(void);

/*--------------------------------------------------------------------

FUNCTION: intopost - converts infix to postfix

A.  Push a ( on the stack.  This sentinel allows us to detect when we have
flushed out the stack on completion in step I.

--- Perform steps B through H for each character in the infix string ---

B.  Ignore white space.

C.  Pass alphabetic characters through to postfix list.

D.  Push any ( on the stack.  These sentinels allows us to detect when we
have flushed out the stack when handling ) and operators.

E.  Have a ) so pop off the stack and put into postfix list until a ( is
popped.  Discard that (.

F.  Have a * or /.  Pop off any operators of equal or higher precedence
and put them into postfix list.  If a ( or lower precedence operator (such
as + or -) is popped, put it back and stop looking.  Push new * or /.

G.  Have a + or -.  Pop off any operators of equal or higher precedence
(that includes all of them) and put them into postfix list.  If a ( is
popped, put it back and stop looking.  Push new + or -.

H.  Report unknown character on input.

------

I.  Have processed all input characters.  Now flush stack until we find
the matching ( put there in step A.

J.  Terminate the postfix list.

--------------------------------------------------------------------*/

void intopost(const char *infix, char *postfix)
{
	int st;

/*A*/	push('(');
	while (*infix != '\0') {

#ifdef TRACE
printf("*infix: %c\n", *infix);
#endif

/*B*/		if (isspace(*infix)) {
			;
		}
/*C*/		else if (isalpha(*infix)) {
			*postfix++ = *infix;
		}
/*D*/		else if (*infix == '(') {
			push('(');
		}
/*E*/		else if (*infix == ')') {
			while ((st = pop()) != '(')
				*postfix++ = st;
		}
/*F*/		else if (*infix == '*' || *infix == '/') {
			while (1) {
				if ((st = pop()) == '(' || st == '+'
				    || st == '-') {
					push(st);
					break;
				}
				*postfix++ = st;
			}
			push(*infix);
		}
/*G*/		else if (*infix == '+' || *infix == '-') {
			while (1) {
				if ((st = pop()) == '(') {
					push(st);
					break;
				}
				*postfix++ = st;
			}
			push(*infix);
		}
/*H*/		else {
			printf("Unknown input character %c\n", *infix);
		}

		++infix;
		continue;
	}

/*I*/	while ((st = pop()) != '(')
		*postfix++ = st;

/*J*/	*postfix = '\0';
}

