Subversion Repositories Kolibri OS

Rev

Rev 7563 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7563 Rev 7564
Line 45... Line 45...
45
	dword name = 0;
45
	dword name = 0;
46
	dword tmp = 0;
46
	dword tmp = 0;
47
	dword dataArgs = 0;
47
	dword dataArgs = 0;
48
	dword posArgs = 0;
48
	dword posArgs = 0;
49
	dword ret = 0;
49
	dword ret = 0;
-
 
50
	dword p = 0;
50
	dataArgs = malloc(16*4);
51
	dataArgs = malloc(16*4);
51
	posArgs = dataArgs;
52
	posArgs = dataArgs;
52
	name = malloc(100);
53
	name = malloc(100);
53
	pos = name;
54
	pos = name;
54
	loop()
55
	loop()
55
	{
56
	{
56
		s = DSBYTE[code];
57
		s = DSBYTE[code];
-
 
58
		
57
		while(s == ' ')
59
		while(s == ' ')
58
		{
60
		{
59
			code++;
61
			code++;
60
			s = DSBYTE[code];
62
			s = DSBYTE[code];
61
		}
63
		}
-
 
64
		
62
		if (!s) || (s==')') 
65
		if (!s) || (s==')') 
63
		{
66
		{
64
			code++;
67
			code++;
65
			break;
68
			break;
66
		}
69
		}
-
 
70
		
67
		if (!args) 
71
		if (!args) 
68
		{
72
		{
69
			if(s!=' ') && (s!=')') // name function
73
			if (s != ')') // name function
70
			{
74
			{
71
				while (s!=' ') && (s!=')')
75
				while (s != ' ') && (s != ')')
72
				{
76
				{
73
					DSBYTE[pos] = s;
77
					DSBYTE[pos] = s;
-
 
78
					pos++;
74
					code++;
79
					code++;
75
					s = DSBYTE[code];
80
					s = DSBYTE[code];
76
					pos++;
-
 
77
				}
81
				}
78
				code--;
82
				code--;
79
			}
83
			}
80
		}
84
		}
81
		else
85
		else
82
		{
86
		{
83
			if(s == '(') 
87
			if(s == '(') 
84
			{
88
			{
85
				code++;
89
				code++;
86
				DSDWORD[posArgs] = evalLisp();
90
				tmp = evalLisp();
87
				posArgs += 4;
-
 
88
			}
91
			}
89
			else if (s >= '0') && (s <= '9')
92
			else if (s >= '0') && (s <= '9')
90
			{
93
			{
91
				tmp = 0;
94
				tmp = 0;
92
				while (s >= '0') && (s <= '9')
95
				while (s >= '0') && (s <= '9')
Line 95... Line 98...
95
					tmp += s-'0';
98
					tmp += s-'0';
96
					code++;
99
					code++;
97
					s = DSBYTE[code];
100
					s = DSBYTE[code];
98
				}
101
				}
99
				code--;
102
				code--;
-
 
103
			}
-
 
104
			else if (s == '"')
-
 
105
			{
-
 
106
				tmp = malloc(100);
-
 
107
				p = tmp;
-
 
108
				code++;
-
 
109
				s = DSBYTE[code];
-
 
110
				while (s != '"') && (s)
-
 
111
				{
-
 
112
					DSBYTE[p] = s;
-
 
113
					p++;
-
 
114
					
-
 
115
					code++;
-
 
116
					s = DSBYTE[code];
-
 
117
				}
-
 
118
				DSBYTE[p] = 0;
-
 
119
			}
-
 
120
			else if(s >= 'A') && (s <= 'z')
-
 
121
			{
-
 
122
				tmp = malloc(100);
-
 
123
				p = tmp;
-
 
124
				while (s >= 'A') && (s <= 'z') 
-
 
125
				{
-
 
126
					DSBYTE[p] = s;
-
 
127
					p++;
-
 
128
					
-
 
129
					code++;
-
 
130
					s = DSBYTE[code];
-
 
131
				}
-
 
132
				DSBYTE[p] = 0;
-
 
133
			}
-
 
134
			
100
				DSDWORD[posArgs] = tmp;
135
			DSDWORD[posArgs] = tmp;
101
				posArgs += 4;
136
			posArgs += 4;
102
			}
137
		}
103
		}
-
 
104
		code++;
138
		code++;
105
		args++;
139
		args++;
106
	}
140
	}
107
	args--;
141
	args--;
108
	ret = StdCall(args, name, dataArgs);
142
	ret = StdCall(args, name, dataArgs);
Line 113... Line 147...
113
 
147
 
114
void main()
148
void main()
115
{
149
{
116
	dword brainFuckCode = 0;
150
	dword brainFuckCode = 0;
117
	word maxLoop = 1000;
151
	word maxLoop = 1000;
Line 118... Line 152...
118
	dword txt = "(print (str 1) (str 2))";
152
	dword txt = "  (print 1)(print 2)";
119
	
153
	
120
	buffer = malloc(bufferSize);
154
	buffer = malloc(bufferSize);
Line 128... Line 162...
128
		IF(io.read(I_Param))
162
		IF(io.read(I_Param))
129
		{
163
		{
130
			code = EAX;
164
			code = EAX;
131
			loop()
165
			loop()
132
			{
166
			{
133
				while(DSBYTE[code] == ' ') code++;
167
				WHILE(DSBYTE[code] == ' ') code++;
134
				if(DSBYTE[code]!='(') break;
168
				IF(DSBYTE[code]!='(') BREAK;
135
				else code++;
169
				ELSE code++;
136
				evalLisp();
170
				evalLisp();
-
 
171
				code--;
137
				if(DSBYTE[code]!=')') break;
172
				IF(DSBYTE[code]!=')') BREAK;
138
				code++;
173
				ELSE code++;
139
			}
174
			}
140
		}
175
		}
141
	}
176
	}
142
	else 
177
	else 
143
	{
178
	{
144
		consoleInit();
179
		consoleInit();
145
		con_printf stdcall ("Lisp interpreter v1.2");
180
		con_printf stdcall ("Lisp interpreter v1.2");
146
		WHILE(maxLoop)
181
		while(maxLoop)
147
		{
182
		{
148
			con_printf stdcall ("\r\n\r\nEnter code: ");
183
			con_printf stdcall ("\r\n\r\nEnter code: ");
149
			con_gets stdcall(buffer, bufferSize);
184
			con_gets stdcall(buffer, bufferSize);
150
			code = EAX;
185
			code = EAX;
151
			code = txt;
186
			//code = txt;
152
			con_printf stdcall ("Output: ");
187
			con_printf stdcall ("Output: ");
153
			nextLispLine:
188
			nextLispLine:
154
			while(DSBYTE[code] == ' ') code++;
189
			while(DSBYTE[code] == ' ') code++;
155
			if(DSBYTE[code]!='(') continue;
190
			if(DSBYTE[code] == '(') code++;
156
			else code++;
191
			else goto endNext;
157
			evalLisp();
192
			evalLisp();
-
 
193
			code--;
158
			if(DSBYTE[code]!=')') continue;
194
			if(DSBYTE[code]==')') code++;
159
			code++;
195
			else goto endNext;
-
 
196
			IF(!DSBYTE[code]) goto endNext;
160
			goto nextLispLine;
197
			goto nextLispLine;
-
 
198
			endNext:
161
			maxLoop--;
199
			maxLoop--;
162
		}
200
		}
163
	}
201
	}
Line 164... Line 202...
164
	
202