Rev 7564 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7564 | Rev 7565 | ||
---|---|---|---|
Line 48... | Line 48... | ||
48 | dword posArgs = 0; |
48 | dword posArgs = 0; |
49 | dword ret = 0; |
49 | dword ret = 0; |
50 | dword p = 0; |
50 | dword p = 0; |
51 | dataArgs = malloc(16*4); |
51 | dataArgs = malloc(16*4); |
52 | posArgs = dataArgs; |
52 | posArgs = dataArgs; |
53 | name = malloc(100); |
- | |
54 | pos = name; |
53 | |
55 | loop() |
54 | loop() |
56 | { |
55 | { |
57 | s = DSBYTE[code]; |
56 | s = DSBYTE[code]; |
Line 58... | Line 57... | ||
58 | 57 | ||
59 | while(s == ' ') |
58 | while(s == ' ') |
60 | { |
59 | { |
61 | code++; |
60 | code++; |
62 | s = DSBYTE[code]; |
61 | s = DSBYTE[code]; |
- | 62 | } |
|
- | 63 | if (!s) return 0; |
|
63 | } |
64 | if (s==')') |
- | 65 | { |
|
- | 66 | code++; |
|
- | 67 | args--; |
|
- | 68 | ret = StdCall(args, name, dataArgs); |
|
- | 69 | free(name); |
|
- | 70 | //free(dataArgs); |
|
- | 71 | return ret; |
|
64 | 72 | } |
|
65 | if (!s) || (s==')') |
73 | if(s == '(') |
66 | { |
74 | { |
- | 75 | code++; |
|
67 | code++; |
76 | DSDWORD[posArgs] = evalLisp(); |
- | 77 | args++; |
|
- | 78 | posArgs += 4; |
|
68 | break; |
79 | continue; |
69 | } |
- | |
70 | 80 | } |
|
71 | if (!args) |
81 | else if (!args) |
72 | { |
82 | { |
73 | if (s != ')') // name function |
83 | if (s != ')') // name function |
- | 84 | { |
|
- | 85 | name = malloc(100); |
|
74 | { |
86 | pos = name; |
75 | while (s != ' ') && (s != ')') |
87 | while (s) && (s != ' ') && (s != ')') |
76 | { |
88 | { |
77 | DSBYTE[pos] = s; |
89 | DSBYTE[pos] = s; |
78 | pos++; |
90 | pos++; |
79 | code++; |
91 | code++; |
80 | s = DSBYTE[code]; |
92 | s = DSBYTE[code]; |
- | 93 | } |
|
- | 94 | DSBYTE[pos] = 0; |
|
81 | } |
95 | args++; |
82 | code--; |
96 | continue; |
83 | } |
97 | } |
84 | } |
98 | } |
85 | else |
99 | else |
86 | { |
- | |
87 | if(s == '(') |
- | |
88 | { |
- | |
89 | code++; |
- | |
90 | tmp = evalLisp(); |
- | |
91 | } |
100 | { |
92 | else if (s >= '0') && (s <= '9') |
101 | if (s >= '0') && (s <= '9') |
93 | { |
102 | { |
94 | tmp = 0; |
103 | tmp = 0; |
95 | while (s >= '0') && (s <= '9') |
104 | while (s >= '0') && (s <= '9') |
96 | { |
105 | { |
97 | tmp *= 10; |
106 | tmp *= 10; |
98 | tmp += s-'0'; |
107 | tmp += s-'0'; |
99 | code++; |
108 | code++; |
100 | s = DSBYTE[code]; |
109 | s = DSBYTE[code]; |
- | 110 | } |
|
- | 111 | args++; |
|
- | 112 | DSDWORD[posArgs] = tmp; |
|
101 | } |
113 | posArgs += 4; |
102 | code--; |
114 | continue; |
103 | } |
115 | } |
104 | else if (s == '"') |
116 | else if (s == '"') |
105 | { |
117 | { |
106 | tmp = malloc(100); |
118 | tmp = malloc(100); |
Line 128... | Line 140... | ||
128 | 140 | ||
129 | code++; |
141 | code++; |
130 | s = DSBYTE[code]; |
142 | s = DSBYTE[code]; |
131 | } |
143 | } |
- | 144 | DSBYTE[p] = 0; |
|
- | 145 | args++; |
|
- | 146 | DSDWORD[posArgs] = tmp; |
|
- | 147 | posArgs += 4; |
|
132 | DSBYTE[p] = 0; |
148 | continue; |
Line 133... | Line 149... | ||
133 | } |
149 | } |
134 | 150 | ||
135 | DSDWORD[posArgs] = tmp; |
151 | DSDWORD[posArgs] = tmp; |
Line 139... | Line 155... | ||
139 | args++; |
155 | args++; |
140 | } |
156 | } |
141 | args--; |
157 | args--; |
142 | ret = StdCall(args, name, dataArgs); |
158 | ret = StdCall(args, name, dataArgs); |
143 | free(name); |
159 | free(name); |
144 | free(dataArgs); |
160 | //free(dataArgs); |
145 | return ret; |
161 | return ret; |
146 | } |
162 | } |
Line 147... | Line 163... | ||
147 | 163 | ||
148 | void main() |
164 | void main() |
149 | { |
165 | { |
150 | dword brainFuckCode = 0; |
166 | dword brainFuckCode = 0; |
151 | word maxLoop = 1000; |
167 | word maxLoop = 1000; |
Line 152... | Line 168... | ||
152 | dword txt = " (print 1)(print 2)"; |
168 | dword txt = "(print (input \"test:\"))"; |
153 | 169 | ||
154 | buffer = malloc(bufferSize); |
170 | buffer = malloc(bufferSize); |
Line 175... | Line 191... | ||
175 | } |
191 | } |
176 | } |
192 | } |
177 | else |
193 | else |
178 | { |
194 | { |
179 | consoleInit(); |
195 | consoleInit(); |
180 | con_printf stdcall ("Lisp interpreter v1.2"); |
196 | con_printf stdcall ("Lisp interpreter v1.3"); |
181 | while(maxLoop) |
197 | while(maxLoop) |
182 | { |
198 | { |
183 | con_printf stdcall ("\r\n\r\nEnter code: "); |
199 | con_printf stdcall ("\r\n\r\nEnter code: "); |
184 | con_gets stdcall(buffer, bufferSize); |
200 | con_gets stdcall(buffer, bufferSize); |
185 | code = EAX; |
201 | code = EAX; |
186 | //code = txt; |
202 | //code = txt; |
187 | con_printf stdcall ("Output: "); |
203 | con_printf stdcall ("Output: "); |
188 | nextLispLine: |
- | |
189 | while(DSBYTE[code] == ' ') code++; |
- | |
190 | if(DSBYTE[code] == '(') code++; |
- | |
191 | else goto endNext; |
- | |
192 | evalLisp(); |
204 | evalLisp(); |
193 | code--; |
- | |
194 | if(DSBYTE[code]==')') code++; |
- | |
195 | else goto endNext; |
- | |
196 | IF(!DSBYTE[code]) goto endNext; |
- | |
197 | goto nextLispLine; |
- | |
198 | endNext: |
- | |
199 | maxLoop--; |
205 | maxLoop--; |
200 | } |
206 | } |
201 | } |
207 | } |
Line 202... | Line 208... | ||
202 | 208 |