perms
[henge/apc.git] / src / lexer_lex.rl
1 /* Ragel State Machine for tokenizing text */
2 #include <stdio.h>
3 #include <string.h>
4 #include <apc/apc.h>
5 #include <apc/parser.tab.h>
6
7
8 int ipow(int, int);
9 int ttov(const uint8_t* , int);
10 uint64_t ttor(const uint8_t* , int);
11 struct name* tton(const uint8_t* , int);
12
13
14 #define MAX_TOK_LEN 64
15 #define MAX_TOKENS 16
16 #define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS)
17
18 int ipow(int base, int exp)
19 {
20 int result = 1;
21 while (exp)
22 {
23 if (exp & 1)
24 result = result * base;
25 exp = exp >> 1;
26 base *= base;
27 }
28
29 return result;
30 }
31
32 /* Token to Value */
33 int ttov(const uint8_t* str, int len)
34 {
35 int i, val = 0;
36
37 for (i = 0; i < len; i++)
38 {
39 val += ((str[len - (i + 1)] - '0') * ipow(10,i));
40 }
41
42 return val;
43 }
44
45 uint64_t ttor(const uint8_t* str, int len)
46 {
47 int i;
48 uint64_t num = 0;
49
50 for (i = 0; i < len; i++)
51 {
52 num += ((str[len - (i + 1)] - '0') * ipow(10,i));
53 }
54
55 return num;
56 }
57
58 struct name* tton(const uint8_t* str, int len)
59 {
60 int i;
61 struct name* namep;
62
63 namep = (name*) malloc(MAX_NAME_LEN);
64 for(i = 0; i < MAX_NAME_LEN - 1; i++)
65 namep[i] = str[i];
66 namep[i] = '\0';
67
68 return namep;
69 }