X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Flexer_lex.rl;fp=src%2Flexer_lex.rl;h=5e395d0161c9be7158e448f400f8d63efe075462;hp=0000000000000000000000000000000000000000;hb=1c75266c959f8168fb6a73b6fef22fc91a5affc7;hpb=a58c4564255146d9a9c7d4ee095558c91eaa874e diff --git a/src/lexer_lex.rl b/src/lexer_lex.rl new file mode 100755 index 0000000..5e395d0 --- /dev/null +++ b/src/lexer_lex.rl @@ -0,0 +1,69 @@ +/* Ragel State Machine for tokenizing text */ +#include +#include +#include +#include + + +int ipow(int, int); +int ttov(const uint8_t* , int); +uint64_t ttor(const uint8_t* , int); +struct name* tton(const uint8_t* , int); + + +#define MAX_TOK_LEN 64 +#define MAX_TOKENS 16 +#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS) + +int ipow(int base, int exp) +{ + int result = 1; + while (exp) + { + if (exp & 1) + result = result * base; + exp = exp >> 1; + base *= base; + } + + return result; +} + +/* Token to Value */ +int ttov(const uint8_t* str, int len) +{ + int i, val = 0; + + for (i = 0; i < len; i++) + { + val += ((str[len - (i + 1)] - '0') * ipow(10,i)); + } + + return val; +} + +uint64_t ttor(const uint8_t* str, int len) +{ + int i; + uint64_t num = 0; + + for (i = 0; i < len; i++) + { + num += ((str[len - (i + 1)] - '0') * ipow(10,i)); + } + + return num; +} + +struct name* tton(const uint8_t* str, int len) +{ + int i; + struct name* namep; + + namep = (name*) malloc(MAX_NAME_LEN); + for(i = 0; i < MAX_NAME_LEN - 1; i++) + namep[i] = str[i]; + namep[i] = '\0'; + + return namep; +}