diff options
| author | Nakidai <plaza521@inbox.ru> | 2024-08-24 14:29:55 +0300 |
|---|---|---|
| committer | Nakidai <plaza521@inbox.ru> | 2024-08-24 14:29:55 +0300 |
| commit | c74aea420c662039072f606b2d5ef1c73426e481 (patch) | |
| tree | 4790fa17644df9e11380d6c02b8928c923c20aba /src/instruction/reverse.c | |
| parent | 2b0e05cbc1e4d9beccd3a5867c8730880f6ecc10 (diff) | |
| download | 3cl-c74aea420c662039072f606b2d5ef1c73426e481.tar.gz 3cl-c74aea420c662039072f606b2d5ef1c73426e481.zip | |
Add more code
Add some funcitons to work with variables, add more instructions and add ability to stop the code from `ccl_instruction`
Diffstat (limited to 'src/instruction/reverse.c')
| -rw-r--r-- | src/instruction/reverse.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/instruction/reverse.c b/src/instruction/reverse.c new file mode 100644 index 0000000..bd863ae --- /dev/null +++ b/src/instruction/reverse.c @@ -0,0 +1,51 @@ +#include "3cl.h" + +#include <errno.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "readchar.h" +#include "utils.h" +#include "variable.h" + + +struct CCLFrame *ccl_instruction_reverse(struct CCL *ccl, struct CCLFrame *frame) +{ + char varname; + size_t toreverse; + + varname = ccl_readchar(ccl, frame, CCL_RC_CCL_VARUS); + if (varname == '\0') + { + die(1, "Unexpected EOF"); + } else if (varname == '_') + { + toreverse = ccl->stack.cur; + } else + { + struct CCLVariable *var = ccl_variable_getany(ccl, frame, varname); + if (var == NULL) + die(1, "Unknown variable '%c' at %d", varname, frame->ep); + toreverse = var->value; + } + + if (ccl->stack.cur < toreverse) + die(1, "stack size is %d (%d required)", ccl->stack.cur, toreverse); + + CCLNum *temp = malloc(sizeof(*temp) * toreverse); + if (temp == NULL) + die(1, "malloc(): %s", strerror(errno)); + + size_t start; + for (start = 0; start < toreverse; ++start) + temp[start] = ccl->stack.stack[ccl->stack.cur - start]; + start = ccl->stack.cur - start; + for (int i = 0; i < toreverse; ++i) + ccl->stack.stack[start + i] = temp[i]; + + free(temp); + + return frame; +} |