added everything to src
[henge/apc.git] / src / lexer_lex.rl
diff --git a/src/lexer_lex.rl b/src/lexer_lex.rl
new file mode 100755 (executable)
index 0000000..5e395d0
--- /dev/null
@@ -0,0 +1,69 @@
+/* Ragel State Machine for tokenizing text */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <apc/apc.h>\r
+#include <apc/parser.tab.h>\r
+\r
+\r
+int ipow(int, int);\r
+int ttov(const uint8_t* , int);\r
+uint64_t ttor(const uint8_t* , int);\r
+struct name* tton(const uint8_t* , int);\r
+\r
+\r
+#define MAX_TOK_LEN 64\r
+#define MAX_TOKENS 16\r
+#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS)\r
+\r
+int ipow(int base, int exp)\r
+{\r
+  int result = 1;\r
+  while (exp)\r
+    {\r
+      if (exp & 1)\r
+        result = result * base;\r
+      exp = exp >> 1;\r
+      base *= base;\r
+    }\r
+\r
+  return result;\r
+}\r
+\r
+/*  Token to Value */\r
+int ttov(const uint8_t* str, int len)\r
+{\r
+  int i, val = 0;\r
+\r
+  for (i = 0; i < len; i++)\r
+    {\r
+      val += ((str[len - (i + 1)] - '0') * ipow(10,i));\r
+    }\r
+\r
+  return val;\r
+}\r
+\r
+uint64_t ttor(const uint8_t* str, int len)\r
+{\r
+  int i;\r
+  uint64_t num = 0;\r
+\r
+  for (i = 0; i < len; i++)\r
+    {\r
+      num += ((str[len - (i + 1)] - '0') * ipow(10,i));\r
+    }\r
+\r
+  return num;\r
+}\r
+\r
+struct name* tton(const uint8_t* str, int len)\r
+{\r
+  int i;\r
+  struct name* namep;\r
+\r
+  namep = (name*) malloc(MAX_NAME_LEN);\r
+  for(i = 0; i < MAX_NAME_LEN - 1; i++)\r
+    namep[i] = str[i];\r
+  namep[i] = '\0';\r
+\r
+  return namep;\r
+}\r