Subversion Repositories Kolibri OS

Rev

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