3122
|
1 #include <stdio.h>
|
|
2 #include <unistd.h>
|
|
3 #define c g->code
|
|
4 #define p g->pointer
|
|
5 #define f g->file
|
|
6 #define b g->bit
|
|
7
|
|
8 struct Data {
|
|
9 const char *code;
|
|
10 char vars[30000];
|
|
11 char *pointer;
|
|
12 char bit;
|
|
13 FILE *file;
|
|
14 };
|
|
15
|
|
16 void lexer(struct Data *g) {
|
|
17 const char *cc = c;
|
|
18 while(*c)
|
|
19 switch (*c++) {
|
|
20 case '>':
|
|
21 ++p;
|
|
22 break;
|
|
23
|
|
24 case '<':
|
|
25 --p;
|
|
26 break;
|
|
27
|
|
28 case '+':
|
|
29 ++*p;
|
|
30 break;
|
|
31
|
|
32 case '-':
|
|
33 --*p;
|
|
34 break;
|
|
35
|
|
36 case '.':
|
|
37 putchar(*p);
|
|
38 break;
|
|
39
|
|
40 case ',':
|
|
41 *p = getchar();
|
|
42 break;
|
|
43
|
|
44 case '[':
|
|
45 cc = c;
|
|
46 if(!*p) while(*c++ != ']');
|
|
47 while(*p) {
|
|
48 c = cc; // restore char position to start of loop
|
|
49 lexer(g);
|
|
50 }
|
|
51 break;
|
|
52
|
|
53 case ']':
|
|
54 return;
|
|
55
|
|
56 case ':':
|
|
57 printf("%hhd", *p);
|
|
58 break;
|
|
59
|
|
60 case ';':
|
|
61 scanf("%hhd", p);
|
|
62 break;
|
|
63
|
|
64 case '#':
|
|
65 // open in read mode unless the cell is 1
|
|
66 if(f) fclose(f);
|
|
67 f = fopen(p + 1, *p == 1 ? "w" : "r");
|
|
68 break;
|
|
69
|
|
70 case '`':
|
|
71 *p = fgetc(f);
|
|
72 break;
|
|
73
|
|
74 case '!':
|
|
75 fputc(*p, f);
|
|
76 break;
|
|
77
|
|
78 case '\'':
|
|
79 *p ^= (1 << b);
|
|
80 b <= 0 ? b = 7 : b--;
|
|
81 break;
|
|
82
|
|
83 case '"':
|
|
84 b <= 0 ? b = 7 : b--;
|
|
85 break;
|
|
86
|
|
87 case '\\':
|
|
88 while(*c++ != '\n');
|
|
89 break;
|
|
90
|
|
91 case '@':
|
|
92 printf("%hhd : %hhd : %hhd : %hhd : %hhd", *(p - 2), *(p - 1), *p, *(p + 1), *(p + 2));
|
|
93 break;
|
|
94
|
|
95 case '$':
|
|
96 sleep(*p);
|
|
97 break;
|
|
98
|
|
99 default:
|
|
100 // everything else is comments
|
|
101 break;
|
|
102 }
|
|
103 }
|
|
104 /*
|
|
105 * Usage:
|
|
106 * struct Data g;
|
|
107 * g.code = "code here";
|
|
108 * g.bit = 7;
|
|
109 * g.pointer = &g.data[15000];
|
|
110 * lexer(&g);
|
|
111 */
|