-/* Ragel State Machine for tokenizing text */
-#include <stdio.h>
-#include <string.h>
-#include <apc/parser.tab.h>
-
-extern void lexer_pushtok(int, YYSTYPE);
-
-int lexer_lex(const char*);
-int ipow(int, int);
-int ttov(const char* str, int);
-uint64_t ttor(const char* str, int);
-char* ttos(const char* str, int);
-
-
-#define MAX_TOK_LEN 64
-#define MAX_TOKENS 16
-#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS)
-#define $($)#$
-#define PUSHTOK(TOK,LFUNC,UTYPE) \
- do { \
- printf("PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \
- tok_t = TOK; \
- yylval.UTYPE = LFUNC(ts, p-ts); \
- lexer_pushtok(tok_t, yylval); \
- ++ntok; \
- } while (0)
-
-%%{
- machine token_matcher;
-
- # set up yylval and tok_t to be pushed to stack
- action set_ref { PUSHTOK(REF, ttor, ref); }
- action set_val { PUSHTOK(NUM, ttov, val); }
- action set_name { PUSHTOK(NAME, ttos, str); }
- action set_ts { ts = p; }
- action lex_error {printf("input error: character %c in filename %s is invalid\n", fc, str);}
-
- # instantiate machines for each possible token
- ref = '0x' xdigit+ %set_ref;
- val = digit+ %set_val;
- name = alpha+ %set_name;
- tok = ref | val | name;
- segment = (tok . '_') %set_ts;
-
- main := segment* . tok $lerr(lex_error);
-}%%
-
-
-%%write data;
-
-/* Scan filename and push the its tokens
- onto the stack */
-int lexer_lex (const char* str)
-{
- const char *p, *pe, *ts, *eof;
- int cs, tok_t, ntok = 0;
- printf ("Lexing: %s\n",str);
- p = ts = str;
- pe = p + strlen(str);
- %%write init;
- %%write exec;
- printf ("Lexed %i tokens\n",ntok);
- return ntok;
-}
-
-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 char* 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 char* 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;
-}
-
-char* ttos(const char* str, int len)
-{
- int i;
- char token_buf[MAX_TOK_LEN];
-
- memmove(token_buf, str, len);
- token_buf[len+1] = '\0';
-
- return strdup(token_buf);
-}
+/* Ragel State Machine for tokenizing text */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <apc/parser.tab.h>\r
+\r
+\r
+extern void lexer_pushtok(int, YYSTYPE);\r
+//extern char* scanner_current_file();\r
+extern int lexer_ismapfile(const char*, int);\r
+extern int lexer_tokfile(const char*, int);\r
+\r
+\r
+int lexer_lex(const char*);\r
+int ipow(int, int);\r
+int ttov(const uint8_t* , int);\r
+uint64_t ttor(const uint8_t* , int);\r
+char* ttos(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
+/* Scan filename and push the its tokens\r
+ onto the stack */\r
+int lexer_lex (const char* str)\r
+{\r
+ int ntok, len;\r
+\r
+\r
+ len = strlen(str);\r
+ printf("Calling lexer_lex on %s\n", str);\r
+ \r
+ \r
+ return ntok;\r
+}\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
+char* ttos(const uint8_t* str, int len)\r
+{\r
+ int i;\r
+ char token_buf[MAX_TOK_LEN];\r
+\r
+ memmove(token_buf, str, len);\r
+ token_buf[len+1] = '\0';\r
+\r
+ return strdup(token_buf);\r
+}\r