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…
Reference in New Issue
Block a user