rpn/src/rpn-string.h

43 lines
1.1 KiB
C
Raw Normal View History

2015-02-12 18:23:17 +01:00
void instr()
{
2015-05-19 17:51:03 +02:00
MIN_ARGUMENTS(1);
2015-02-12 18:23:17 +01:00
2015-05-19 17:51:03 +02:00
// stringify only if not already a string
if (_stack->get_type(0) != cmd_string)
{
// write the object in stack(0) in a string and remove this obj
2017-05-24 14:09:52 +02:00
FILE* tmp = tmpfile();
if (tmp != NULL)
{
((object*)_stack->pop_back())->show(tmp);
2015-02-12 18:23:17 +01:00
2017-05-24 14:09:52 +02:00
// reserve the correct size in stack
unsigned int str_size = (unsigned int)ftell(tmp);
ostring* str = (ostring*)_stack->allocate_back(str_size+1+sizeof(ostring), cmd_string);
str->_size = str_size;
2017-05-24 14:09:52 +02:00
// fill the obj
if (fread(str->_value, str_size, 1, tmp) != str_size)
ERR_CONTEXT(ret_runtime_error);
fclose(tmp);
}
else
ERR_CONTEXT(ret_runtime_error);
2015-05-19 17:51:03 +02:00
}
2015-02-12 18:23:17 +01:00
}
void strout()
{
2015-02-26 22:33:28 +01:00
MIN_ARGUMENTS(1);
2015-05-19 17:51:03 +02:00
ARG_MUST_BE_OF_TYPE(0, cmd_string);
2015-02-12 18:23:17 +01:00
string entry(((ostring*)_stack->pop_back())->_value);
2015-02-12 18:23:17 +01:00
2015-05-19 17:51:03 +02:00
program prog;
2015-02-12 18:23:17 +01:00
2015-05-19 17:51:03 +02:00
// make program from string in stack level 1
2015-03-01 23:10:45 +01:00
if (program::parse(entry.c_str(), prog) == ret_ok)
2015-05-19 17:51:03 +02:00
// run it
2015-03-04 17:01:30 +01:00
prog.run(*_stack, *_global_heap, &_local_heap);
2015-02-12 18:23:17 +01:00
}