2014-02-11 11:26:28 +01:00
|
|
|
//
|
|
|
|
void sto(void)
|
|
|
|
{
|
2015-05-19 17:51:03 +02:00
|
|
|
MIN_ARGUMENTS(2);
|
|
|
|
ARG_MUST_BE_OF_TYPE(0, cmd_symbol);
|
2014-02-11 11:26:28 +01:00
|
|
|
|
2017-04-21 13:58:44 +02:00
|
|
|
string name(((symbol*)_stack->pop_back())->_value);
|
2017-05-02 10:47:03 +02:00
|
|
|
_global_heap->add(name, _stack->get_obj(0), _stack->get_len(0));
|
2017-04-21 13:58:44 +02:00
|
|
|
(void)_stack->pop_back();
|
2014-02-11 11:26:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void rcl(void)
|
|
|
|
{
|
2015-05-19 17:51:03 +02:00
|
|
|
MIN_ARGUMENTS(1);
|
|
|
|
ARG_MUST_BE_OF_TYPE(0, cmd_symbol);
|
2014-02-11 11:26:28 +01:00
|
|
|
|
2015-05-19 17:51:03 +02:00
|
|
|
// recall a variable
|
2017-05-02 10:47:03 +02:00
|
|
|
object* obj;
|
2015-05-19 17:51:03 +02:00
|
|
|
unsigned int size;
|
|
|
|
int type;
|
2015-02-26 22:33:28 +01:00
|
|
|
string variable(((symbol*)_stack->back())->_value);
|
2015-03-04 17:01:30 +01:00
|
|
|
|
|
|
|
// mind the order of heaps
|
2017-05-02 10:47:03 +02:00
|
|
|
if (_local_heap.get(variable, obj, size)
|
|
|
|
|| ((_parent_local_heap != NULL) && (_parent_local_heap->get(variable, obj, size)))
|
|
|
|
|| _global_heap->get(variable, obj, size))
|
2015-05-19 17:51:03 +02:00
|
|
|
{
|
2017-04-21 13:58:44 +02:00
|
|
|
(void)_stack->pop_back();
|
2017-05-02 10:47:03 +02:00
|
|
|
object* new_obj = _stack->allocate_back(size, obj->_type);
|
|
|
|
stack::copy_and_push_back(obj, *_stack, size);
|
2015-05-19 17:51:03 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
ERR_CONTEXT(ret_unknown_variable);
|
2014-02-11 11:26:28 +01:00
|
|
|
}
|
|
|
|
|
2015-03-04 18:21:11 +01:00
|
|
|
void edit(void)
|
|
|
|
{
|
|
|
|
MIN_ARGUMENTS(1);
|
|
|
|
|
2017-05-24 14:09:52 +02:00
|
|
|
FILE* tmp = tmpfile();
|
|
|
|
if (tmp != NULL)
|
2015-03-04 18:28:54 +01:00
|
|
|
{
|
2017-05-24 14:09:52 +02:00
|
|
|
// re-write stack objet in a stream
|
|
|
|
((object*)_stack->pop_back())->show(tmp);
|
|
|
|
|
|
|
|
// edit: stuff chars using readline facility
|
|
|
|
int len = (int)ftell(tmp);
|
|
|
|
rewind(tmp);
|
|
|
|
for(int i=0;i<len;i++)
|
2015-03-04 18:28:54 +01:00
|
|
|
{
|
2017-05-24 14:09:52 +02:00
|
|
|
char readc;
|
|
|
|
if (fread(&readc, 1, 1, tmp) == 1)
|
|
|
|
rl_stuff_char(readc);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ERR_CONTEXT(ret_runtime_error);
|
|
|
|
break;
|
|
|
|
}
|
2015-03-04 18:28:54 +01:00
|
|
|
}
|
2017-05-24 14:09:52 +02:00
|
|
|
fclose(tmp);
|
2015-03-04 18:28:54 +01:00
|
|
|
}
|
2015-03-04 18:21:11 +01:00
|
|
|
}
|
|
|
|
|
2014-02-11 11:26:28 +01:00
|
|
|
// carefull : this is not a langage command
|
|
|
|
void auto_rcl(symbol* symb)
|
|
|
|
{
|
2017-05-02 11:33:37 +02:00
|
|
|
if (symb->_auto_eval)
|
2015-05-19 17:51:03 +02:00
|
|
|
{
|
2017-05-02 10:47:03 +02:00
|
|
|
object* obj;
|
2015-05-19 17:51:03 +02:00
|
|
|
unsigned int size;
|
|
|
|
int type;
|
2015-03-04 17:01:30 +01:00
|
|
|
string variable(symb->_value);
|
|
|
|
|
|
|
|
// mind the order of heaps
|
2017-05-02 10:47:03 +02:00
|
|
|
if (_local_heap.get(variable, obj, size)
|
|
|
|
|| ((_parent_local_heap != NULL) && (_parent_local_heap->get(variable, obj, size)))
|
|
|
|
|| _global_heap->get(variable, obj, size))
|
2015-03-03 22:07:48 +01:00
|
|
|
{
|
2017-05-02 10:47:03 +02:00
|
|
|
stack::copy_and_push_back(obj, *_stack, size);
|
2015-03-03 22:07:48 +01:00
|
|
|
if (type == cmd_program)
|
|
|
|
eval();
|
|
|
|
}
|
2015-05-19 17:51:03 +02:00
|
|
|
else
|
2017-05-02 10:47:03 +02:00
|
|
|
{
|
|
|
|
stack::copy_and_push_back(symb, *_stack, symb->size());
|
|
|
|
}
|
2015-05-19 17:51:03 +02:00
|
|
|
}
|
|
|
|
else
|
2017-05-02 10:47:03 +02:00
|
|
|
{
|
|
|
|
stack::copy_and_push_back(symb, *_stack, symb->size());
|
|
|
|
}
|
2014-02-11 11:26:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void purge(void)
|
|
|
|
{
|
2015-05-19 17:51:03 +02:00
|
|
|
MIN_ARGUMENTS(1);
|
|
|
|
ARG_MUST_BE_OF_TYPE(0, cmd_symbol);
|
2014-02-11 11:26:28 +01:00
|
|
|
|
2017-04-21 13:58:44 +02:00
|
|
|
string name(((symbol*)_stack->pop_back())->_value);
|
2015-03-04 17:01:30 +01:00
|
|
|
|
|
|
|
// mind the order of heaps
|
|
|
|
bool done = false;
|
|
|
|
if (!_local_heap.erase(name))
|
2015-03-03 18:16:56 +01:00
|
|
|
{
|
2015-03-04 17:01:30 +01:00
|
|
|
if ((_parent_local_heap != NULL) && (_parent_local_heap->erase(name)))
|
|
|
|
done = true;
|
|
|
|
else if (_global_heap->erase(name))
|
|
|
|
done = true;
|
2015-03-03 18:16:56 +01:00
|
|
|
}
|
2015-03-01 16:30:13 +01:00
|
|
|
else
|
2015-03-04 17:01:30 +01:00
|
|
|
done = true;
|
|
|
|
|
|
|
|
if (!done)
|
|
|
|
ERR_CONTEXT(ret_unknown_variable);
|
2014-02-11 11:26:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void vars(void)
|
|
|
|
{
|
2015-05-19 17:51:03 +02:00
|
|
|
object* obj;
|
|
|
|
unsigned int size;
|
|
|
|
int type;
|
|
|
|
string name;
|
2014-02-11 11:26:28 +01:00
|
|
|
|
2015-03-04 17:01:30 +01:00
|
|
|
for (int i=0; i<(int)_global_heap->size(); i++)
|
|
|
|
{
|
2017-05-02 10:47:03 +02:00
|
|
|
(void)_global_heap->get_by_index(i, name, obj, size);
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("var %d: name '%s', type %s, value ", i+1, name.c_str(), cmd_type_string[obj->_type]);
|
2015-03-04 17:01:30 +01:00
|
|
|
obj->show();
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("\n");
|
2015-03-04 17:01:30 +01:00
|
|
|
}
|
|
|
|
if (_parent_local_heap != NULL)
|
|
|
|
{
|
|
|
|
for (int i=0; i<(int)_parent_local_heap->size(); i++)
|
|
|
|
{
|
2017-05-02 10:47:03 +02:00
|
|
|
(void)_parent_local_heap->get_by_index(i, name, obj, size);
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("local var %d: name '%s', type %s, value ", i+1, name.c_str(), cmd_type_string[obj->_type]);
|
2015-03-04 17:01:30 +01:00
|
|
|
obj->show();
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("\n");
|
2015-03-04 17:01:30 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
for (int i=0; i<(int)_local_heap.size(); i++)
|
2015-03-03 18:16:56 +01:00
|
|
|
{
|
2017-05-02 10:47:03 +02:00
|
|
|
(void)_local_heap.get_by_index(i, name, obj, size);
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("local var %d: name '%s', type %s, value ", i+1, name.c_str(), cmd_type_string[obj->_type]);
|
2015-03-03 18:16:56 +01:00
|
|
|
obj->show();
|
2017-05-24 14:09:52 +02:00
|
|
|
printf("\n");
|
2015-03-03 18:16:56 +01:00
|
|
|
}
|
2014-02-11 11:26:28 +01:00
|
|
|
}
|