rpn/src/rpn-stack.h

87 lines
1.8 KiB
C
Raw Normal View History

//
void swap(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(2);
_stack->copy_obj_to_local(0, 0);
_stack->copy_obj_to_local(1, 1);
(void)_stack->pop_back();
(void)_stack->pop_back();
2015-05-19 17:51:03 +02:00
_stack->push_obj_from_local(0);
_stack->push_obj_from_local(1);
}
void drop(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(1);
(void)_stack->pop_back();
}
void drop2(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(2);
(void)_stack->pop_back();
(void)_stack->pop_back();
}
void erase(void)
{
2015-05-19 17:51:03 +02:00
while(_stack->size()>0)
(void)_stack->pop_back();
}
void dup(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(1);
_stack->copy_obj_to_local(0, 0);
_stack->push_obj_from_local(0);
}
void dup2(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(2);
_stack->copy_obj_to_local(0, 0);
_stack->copy_obj_to_local(1, 1);
_stack->push_obj_from_local(1);
_stack->push_obj_from_local(0);
}
void pick(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(1);
ARG_MUST_BE_OF_TYPE(0, cmd_number);
unsigned int to_pick = (unsigned int)int(((number*)_stack->pop_back())->_value);
2015-05-19 17:51:03 +02:00
// treat stack depth errors
if ((to_pick == 0) || (to_pick > _stack->size()))
{
ERR_CONTEXT(ret_missing_operand);
return;
}
_stack->copy_obj_to_local(to_pick - 1, 0);
_stack->push_obj_from_local(0);
}
void rot(void)
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(3);
_stack->copy_obj_to_local(0, 0);
_stack->copy_obj_to_local(1, 1);
_stack->copy_obj_to_local(2, 2);
(void)_stack->pop_back();
(void)_stack->pop_back();
(void)_stack->pop_back();
2015-05-19 17:51:03 +02:00
_stack->push_obj_from_local(1);
_stack->push_obj_from_local(0);
_stack->push_obj_from_local(2);
}
void depth(void)
{
2017-04-22 11:39:24 +02:00
unsigned long depth = (unsigned long)_stack->size();
void* significand;
number* num = (number*)_stack->allocate_back(sizeof(number), cmd_number, MPFR_128BITS_STORING_LENGTH, &significand);
num->init(significand);
num->set(depth);
}