#include <stdio.h>
#include <stdbool.h>
#include "stack.h"

//
// NOTE: helper functions for parsing
//
bool isWhitespace(char c)
{
	return(c == ' ' || c == '\t' || c == '\n' || c == '\r' );
}

char *eatAllWhitespaces(char *At)
{
	while(*At && isWhitespace(*At))
		At++;
	return At;
}

bool isDigit(char Digit)
{
	return (Digit >= '0' && Digit <= '9');
}

int  isNumber(char *Number)
{
	int Result = 0;
	while(*Number && *Number != ' ')
	{
		if(!isDigit(*Number))
		{
			Result = -1;
			return Result;
		}
		Number++;
		Result++;
	}
	
	return Result;
}
//
// ----------------------------------
//


/*
 * Stack-Interface
 * 
 * void push(stack *Stack, float Value);
 *
 * float pop(stack *Stack);
 *
 * node *peak(stack *Stack);
 *
 */

int main(int argc, char **argv)
{
	stack Stack = {};
	
	//
	// Parsing
	//

	// NOTE: the string to parse
	char *Input = argv[1];
	char *At = Input;
	while(*At)
	{
		At = eatAllWhitespaces(At);
		switch(*At)
		{
		case '+':
		{
			// TODO: implement addition
		}break;
		case '-':
		{
		       	// TODO: implement substraction
			// NOTE: substraction is orderdependent
		}break;
		case '*':
		{
			// TODO: implement multiplication
		}break;
		case '/':
		{
			// TODO: implement division
			// NOTE: division is orderdependent
		}break;
		default:
		{
			int Length = isNumber(At);
			if(Length != -1)
			{
				// TODO: implement the handling of new numbers
				At += Length -1;
			}
			else
			{
				printf("ERROR: Only Numbers and Operators + - * and / are allowed");
			}
		}
		}
		At++;
	}

	// NOTE: print out the remaining stack
	// if everything went right, this should only be the result
	while(peak(&Stack))
	{
		printf("%f ", pop(&Stack));
	}
	printf("\n");
}
