right idea, wrong implementation
This commit is contained in:
		
							parent
							
								
									9a95b64618
								
							
						
					
					
						commit
						4221781ee6
					
				
							
								
								
									
										121
									
								
								src/calculate.c
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								src/calculate.c
									
									
									
									
									
								
							@ -1,121 +0,0 @@
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sysexits.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include "libstrnum.h"
 | 
			
		||||
#include "noargvzero.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
typedef long int pile_t;
 | 
			
		||||
 | 
			
		||||
struct Stack{
 | 
			
		||||
	size_t s;
 | 
			
		||||
	size_t dot;
 | 
			
		||||
	pile_t *pile;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* probably could be optimized */
 | 
			
		||||
pile_t
 | 
			
		||||
Stack_pop(struct Stack *s){
 | 
			
		||||
	pile_t n;
 | 
			
		||||
	n = s->pile[(s->dot)-1];
 | 
			
		||||
	if(s->dot >= 0)
 | 
			
		||||
		--(s->dot);
 | 
			
		||||
	return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Stack *
 | 
			
		||||
Stack_push(pile_t n, struct Stack *s){
 | 
			
		||||
	pile_t *new;
 | 
			
		||||
	if(s->s == s->dot && (new = realloc(s->pile, sizeof(*(s->pile)) * ++(s->s))) == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	s->pile[(s->dot)++] = n;
 | 
			
		||||
	return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[]){
 | 
			
		||||
	char *argv0;
 | 
			
		||||
	int i;
 | 
			
		||||
	//int ir, or; /* input radix, output radix */
 | 
			
		||||
	int op;
 | 
			
		||||
	struct Stack s;
 | 
			
		||||
	pile_t x, y;
 | 
			
		||||
	unsigned short int retval;
 | 
			
		||||
 | 
			
		||||
	NOARGVZERO(argv);
 | 
			
		||||
 | 
			
		||||
	retval = EX_OK;
 | 
			
		||||
 | 
			
		||||
	/* stack initialization */
 | 
			
		||||
	if((s.pile = malloc(sizeof(pile_t))) == NULL)
 | 
			
		||||
		return EX_OSERR;
 | 
			
		||||
	*s.pile = 0;
 | 
			
		||||
	s.dot = 0;
 | 
			
		||||
	s.s = 1;
 | 
			
		||||
	Stack_push(0, &s);
 | 
			
		||||
 | 
			
		||||
	argv0 = argv[0];
 | 
			
		||||
	/* Most operations are 1 char, all are two max, so no sense using
 | 
			
		||||
	 * strcmp or a dictionary */
 | 
			
		||||
	while(*++argv != NULL){
 | 
			
		||||
 | 
			
		||||
		/* parse out operation */
 | 
			
		||||
		op = '\0';
 | 
			
		||||
		switch(**argv){
 | 
			
		||||
		case '+': case '-': case '%': case '^': case '<': case '>':
 | 
			
		||||
		case '=': case '!': case '?': case 'q': case 'x':
 | 
			
		||||
			if((*argv)[1] == '\0')
 | 
			
		||||
				op = **argv;
 | 
			
		||||
			break;
 | 
			
		||||
		case '*':
 | 
			
		||||
			if((*argv)[1] == '\0')
 | 
			
		||||
				op = **argv; /* "*" */
 | 
			
		||||
			else if((*argv)[1] == **argv && (*argv)[2] == '\0')
 | 
			
		||||
				op = '^'; /* "**" */
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			op = 'a' + !stris(STRIS_TYPE_UINT, *argv) * ('h' - 'a');
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(op == '\0'){
 | 
			
		||||
			retval = EX_SOFTWARE;
 | 
			
		||||
			goto quit;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* conduct operation */
 | 
			
		||||
		switch(op){
 | 
			
		||||
		case 'a':
 | 
			
		||||
			if(Stack_push(atoi(*argv), &s) == NULL){
 | 
			
		||||
				retval = EX_OSERR;
 | 
			
		||||
				goto quit;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case 'h':
 | 
			
		||||
			goto usage;
 | 
			
		||||
		case 'q': case 'x':
 | 
			
		||||
			goto quit;
 | 
			
		||||
		case '+':
 | 
			
		||||
			Stack_push(Stack_pop(&s) + Stack_pop(&s), &s);
 | 
			
		||||
			write(1,"0",1);
 | 
			
		||||
			break;
 | 
			
		||||
		case '-':
 | 
			
		||||
			y = Stack_pop(&s);
 | 
			
		||||
			x = Stack_pop(&s);
 | 
			
		||||
			Stack_push(x - y, &s);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	printf("%li\n", s.pile[s.dot - 1]);
 | 
			
		||||
 | 
			
		||||
	goto quit;
 | 
			
		||||
usage:
 | 
			
		||||
	write(2, "Usage: ", 7);
 | 
			
		||||
	for(i = 0; argv0[i] != '\0'; ++i);
 | 
			
		||||
	write(2, argv0, i);
 | 
			
		||||
	write(2, "(-C [program])|(program...)\n", 28);
 | 
			
		||||
	retval = EX_USAGE;
 | 
			
		||||
quit:
 | 
			
		||||
	free(s.pile);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user