From c74aea420c662039072f606b2d5ef1c73426e481 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Sat, 24 Aug 2024 14:29:55 +0300 Subject: Add more code Add some funcitons to work with variables, add more instructions and add ability to stop the code from `ccl_instruction` --- src/readchar.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/readchar.c (limited to 'src/readchar.c') diff --git a/src/readchar.c b/src/readchar.c new file mode 100644 index 0000000..51e1784 --- /dev/null +++ b/src/readchar.c @@ -0,0 +1,59 @@ +#include "3cl.h" +#include "readchar.h" + +#include +#include + +#include "utils.h" + + +static const char *const space = " \n\t"; +static const char *const brackets = "{[(?;)]}"; +static const char *const instr = "^+-*~%=!$&<>@#:"; +static const char *const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +char ccl_readchar(struct CCL *ccl, struct CCLFrame *frame, enum CCLRCFlags flags) +{ + bool iscomment; + + char chr; + for (;(chr = ccl->code[frame->ep]) != '\0'; ++frame->ep) + { + if (iscomment && chr == '\n') + iscomment = false; + if (iscomment) + continue; + if (chr == '/') + iscomment = true; + + if (strchr(space, chr)) + continue; + + if (strchr(brackets, chr)) + if (!(flags & CCL_RC_BRACK) && flags & CCL_RC_DIE) + goto invalid; + else + goto ok; + else if (strchr(instr, chr)) + if (!(flags & CCL_RC_IS) && flags & CCL_RC_DIE) + goto invalid; + else + goto ok; + else if (strchr(alphabet, chr)) + if (!(flags & CCL_RC_ALP) && flags & CCL_RC_DIE) + goto invalid; + else + goto ok; + else if (chr == '_') + if (!(flags & CCL_RC_US) && flags & CCL_RC_DIE) + goto invalid; + else + goto ok; + else + goto invalid; + } +ok: + return chr; +invalid: + die(1, "Invalid symbol at %d", frame->ep); +} -- cgit 1.4.1