Subversion Repositories Kolibri OS

Rev

Rev 4050 | Rev 4516 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4050 Rev 4309
1
/// ===========================================================
1
/// ===========================================================
2
 
2
 
3
void command_history_add()
3
void command_history_add()
4
{
4
{
5
 
5
 
6
int i;
6
int i;
7
 
7
 
8
for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
8
for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
9
    if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
9
    if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
10
       return;
10
       return;
11
 
11
 
12
for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
12
for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
13
	strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
13
	strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
14
 
14
 
15
strcpy(CMD_HISTORY[0], CMD);
15
strcpy(CMD_HISTORY[0], CMD);
16
 
16
 
17
if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
17
if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
18
	CMD_HISTORY_NUM_REAL++;
18
	CMD_HISTORY_NUM_REAL++;
19
 
19
 
20
CMD_NUM = 0;
20
CMD_NUM = 0;
21
 
21
 
22
}
22
}
23
 
23
 
24
 
24
 
25
 
25
 
26
/// ===========================================================
26
/// ===========================================================
27
 
27
 
28
void command_get()
28
void command_get()
29
{
29
{
30
unsigned key;
30
unsigned key;
31
 
31
 
32
unsigned i;
32
unsigned i;
33
unsigned cmdLen = 0;
33
unsigned cmdLen = 0;
34
unsigned cmdPos = 0;
34
unsigned cmdPos = 0;
35
CMD[0] = '\0';
35
CMD[0] = '\0';
36
 
36
 
37
for (;;)
37
for (;;)
38
	{
38
	{
39
	key = getch();
39
	key = getch();
40
	if ( 0 != (key & 0xff) )
40
	if ( 0 != (key & 0xff) )
41
		{
41
		{
42
		key &= 0xff;
42
		key &= 0xff;
43
		switch (key)
43
		switch (key)
44
			{
44
			{
45
			case 27: // ESC
45
			case 27: // ESC
46
                                for (i = cmdPos; i < cmdLen; i++)
46
                                for (i = cmdPos; i < cmdLen; i++)
47
                                    printf(" ");
47
                                    printf(" ");
48
                                for (i = cmdLen; i > 0; i--)
48
                                for (i = cmdLen; i > 0; i--)
49
                                    printf("%c %c", 8, 8);
49
                                    printf("%c %c", 8, 8);
50
                                cmdLen = 0;
50
                                cmdLen = 0;
51
                                cmdPos = 0;
51
                                cmdPos = 0;
52
                                CMD[0] = '\0';
52
                                CMD[0] = '\0';
53
				break;
53
				break;
54
 
54
 
55
 
55
 
56
			case 13: // ENTER
56
			case 13: // ENTER
57
				printf("\n\r");
57
				printf("\n\r");
58
				command_history_add();
58
				command_history_add();
59
				return;
59
				return;
60
 
60
 
61
 
61
 
62
			case 8: // BACKSPACE
62
			case 8: // BACKSPACE
63
				if (cmdPos > 0)
63
				if (cmdPos > 0)
64
					{
64
					{
65
                                        for (i = cmdPos-1; i < cmdLen; i++)
65
                                        for (i = cmdPos-1; i < cmdLen; i++)
66
                                            CMD[i] = CMD[i+1];
66
											CMD[i] = CMD[i+1];
67
 
67
 
68
                                        for (i = 0; i < cmdLen-cmdPos; i++)
68
                                        for (i = 0; i < cmdLen-cmdPos; i++)
69
					    printf (" ");
69
					    printf (" ");
70
 
70
 
71
                                        for (i = 0; i < cmdLen; i++)
71
                                        for (i = 0; i < cmdLen; i++)
72
					    printf ("%c %c", 8, 8);
72
					    printf ("%c %c", 8, 8);
73
 
73
 
74
					printf("%s", CMD);
74
					printf("%s", CMD);
75
 
75
 
76
                                        for (i = 0; i < cmdLen-cmdPos; i++)
76
                                        for (i = 0; i < cmdLen-cmdPos; i++)
77
                                            printf("%c", 8);
77
                                            printf("%c", 8);
78
 
78
 
79
                                        cmdPos--;
79
                                        cmdPos--;
80
                                        cmdLen--;
80
                                        cmdLen--;
81
					}
81
					}
82
				break;
82
				break;
83
 
83
 
84
 
84
 
85
			case 9: // TAB
85
			case 9: // TAB
86
				break;
86
				break;
87
 
87
 
88
 
88
 
89
			default:
89
			default:
90
				if (cmdLen < 255)
90
				if (cmdLen < 255)
91
					{
91
					{
92
					if ( kol_key_control() & 0x40 ) // ¥á«¨ ¢ª«îçñ­ CapsLock
92
					if ( kol_key_control() & 0x40 ) // ¥á«¨ ¢ª«îçñ­ CapsLock
93
						if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // ¥á«¨ ­ ¦ âë è¨äâë
93
						if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // ¥á«¨ ­ ¦ âë è¨äâë
94
							key = tolower(key);
94
							key = tolower(key);
95
						else
95
						else
96
							key = toupper(key);
96
							key = toupper(key);
97
 
97
 
98
                                        for (i = cmdLen+1; i > cmdPos; i--)
98
                                        for (i = cmdLen+1; i > cmdPos; i--)
99
                                            CMD[i] = CMD[i-1];
99
                                            CMD[i] = CMD[i-1];
100
 
100
 
101
					CMD[cmdPos] = key;
101
					CMD[cmdPos] = key;
102
 
102
 
103
                                        for (i = cmdPos; i > 0; i--)
103
                                        for (i = cmdPos; i > 0; i--)
104
                                            printf("%c %c", 8, 8);
104
                                            printf("%c %c", 8, 8);
105
 
105
 
106
					printf("%s", CMD);
106
					printf("%s", CMD);
107
 
107
 
108
                                        for (i = 0; i < cmdLen-cmdPos; i++)
108
                                        for (i = 0; i < cmdLen-cmdPos; i++)
109
                                            printf("%c", 8);
109
                                            printf("%c", 8);
110
 
110
 
111
					cmdPos++;
111
					cmdPos++;
112
                                        cmdLen++;
112
                                        cmdLen++;
113
					}
113
					}
114
					break;
114
					break;
115
 
115
 
116
                        }
116
                        }
117
                }
117
                }
118
                else
118
                else
119
                {
119
                {
120
       		key = (key>>8)&0xff;
120
       		key = (key>>8)&0xff;
121
		switch (key)
121
		switch (key)
122
			{
122
			{
123
                        case 83: // Del
123
                        case 83: // Del
124
                             if (cmdPos < cmdLen)
124
                             if (cmdPos < cmdLen)
125
                                {
125
                                {
126
                                for (i = cmdPos; i < cmdLen; i++)
126
                                for (i = cmdPos; i < cmdLen; i++)
127
                                    CMD[i] = CMD[i+1];
127
                                    CMD[i] = CMD[i+1];
128
 
128
 
129
                                for (i = 0; i < cmdLen-cmdPos; i++)
129
                                for (i = 0; i < cmdLen-cmdPos; i++)
130
                                    printf(" ");
130
                                    printf(" ");
131
 
131
 
132
                                for (i = 0; i < cmdLen-cmdPos; i++)
132
                                for (i = 0; i < cmdLen-cmdPos; i++)
133
                                    printf("%c", 8);
133
                                    printf("%c", 8);
134
 
134
 
135
                                for (i = cmdPos; i < cmdLen; i++)
135
                                for (i = cmdPos; i < cmdLen; i++)
136
                                    printf("%c", CMD[i]);
136
                                    printf("%c", CMD[i]);
137
 
137
 
138
                                for (i = 0; i < cmdLen-cmdPos; i++)
138
                                for (i = 0; i < cmdLen-cmdPos; i++)
139
                                    printf("%c", 8);
139
                                    printf("%c", 8);
140
 
140
 
141
                                cmdLen--;
141
                                cmdLen--;
142
                                }
142
                                }
143
 
143
 
144
                             break;
144
                             break;
145
 
145
 
146
                        case 75: // Left
146
                        case 75: // Left
147
                             if (cmdPos > 0)
147
                             if (cmdPos > 0)
148
                                {
148
                                {
149
                                printf("%c", 8);
149
                                printf("%c", 8);
150
                                cmdPos--;
150
                                cmdPos--;
151
                                }
151
                                }
152
                             break;
152
                             break;
153
 
153
 
154
 
154
 
155
                        case 77: // Right
155
                        case 77: // Right
156
                             if (cmdPos < cmdLen)
156
                             if (cmdPos < cmdLen)
157
                                {
157
                                {
158
                                printf("%c", CMD[cmdPos]);
158
                                printf("%c", CMD[cmdPos]);
159
                                cmdPos++;
159
                                cmdPos++;
160
                                }
160
                                }
161
                             break;
161
                             break;
162
 
162
 
163
 
163
 
164
			case 80: // Down
164
			case 80: // Down
165
 
165
 
166
				if (CMD_HISTORY_NUM_REAL > 0)
166
				if (CMD_HISTORY_NUM_REAL > 0)
167
					{
167
					{
168
 
168
 
169
					for (i = cmdPos; i < cmdLen; i++)
169
					for (i = cmdPos; i < cmdLen; i++)
170
						printf(" ");
170
						printf(" ");
171
 
171
 
172
					for (i = cmdLen; i > 0; i--)
172
					for (i = cmdLen; i > 0; i--)
173
						printf("%c %c", 8, 8);
173
						printf("%c %c", 8, 8);
174
 
174
 
175
				    if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
175
				    if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
176
				        CMD_NUM++;
176
				        CMD_NUM++;
177
				    else
177
				    else
178
						CMD_NUM = 0;
178
						CMD_NUM = 0;
179
 
179
 
180
					printf(	CMD_HISTORY[CMD_NUM] );
180
					printf(	"%s", CMD_HISTORY[CMD_NUM] );
181
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
181
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
182
					cmdLen = strlen(CMD);
182
					cmdLen = strlen(CMD);
183
					cmdPos = strlen(CMD);
183
					cmdPos = strlen(CMD);
184
 
184
 
185
					}
185
					}
186
			
186
			
187
				break;
187
				break;
188
 
188
 
189
 
189
 
190
			case 72: // Up
190
			case 72: // Up
191
				if (CMD_HISTORY_NUM_REAL > 0)
191
				if (CMD_HISTORY_NUM_REAL > 0)
192
					{
192
					{
193
 
193
 
194
					for (i = cmdPos; i < cmdLen; i++)
194
					for (i = cmdPos; i < cmdLen; i++)
195
						printf(" ");
195
						printf(" ");
196
 
196
 
197
					for (i = cmdLen; i > 0; i--)
197
					for (i = cmdLen; i > 0; i--)
198
						printf("%c %c", 8, 8);
198
						printf("%c %c", 8, 8);
199
 
199
 
200
				    if (CMD_NUM > 0)
200
				    if (CMD_NUM > 0)
201
				        CMD_NUM--;
201
				        CMD_NUM--;
202
				    else
202
				    else
203
						CMD_NUM = CMD_HISTORY_NUM_REAL-1;
203
						CMD_NUM = CMD_HISTORY_NUM_REAL-1;
204
 
204
 
205
					printf(	CMD_HISTORY[CMD_NUM] );
205
					printf(	"%s", CMD_HISTORY[CMD_NUM] );
206
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
206
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
207
					cmdLen = strlen(CMD);
207
					cmdLen = strlen(CMD);
208
					cmdPos = strlen(CMD);
208
					cmdPos = strlen(CMD);
209
 
209
 
210
					}
210
					}
211
				break;
211
				break;
212
 
212
 
213
 
213
 
214
			case 0: // console window closed
214
			case 0: // console window closed
215
				cmd_exit(NULL);
215
				cmd_exit(NULL);
216
 
216
 
217
                        }
217
                        }
218
 
218
 
219
                }
219
                }
220
        }
220
        }
221
 
221
 
222
}
222
}
223
 
223
 
224
/// ===========================================================
224
/// ===========================================================
225
 
225
 
226
int command_get_cmd(char cmd[])
226
int command_get_cmd(char cmd[])
227
{
227
{
228
unsigned i, len;
228
unsigned i, len;
229
int quote = 0;
229
int quote = 0;
230
 
230
 
231
if (CMD[0]=='"')
231
if (CMD[0]=='"')
232
   quote = 1;
232
   quote = 1;
233
 
233
 
234
if (quote == 0)
234
if (quote == 0)
235
   {
235
   {
236
   for (i=0;;i++)
236
   for (i=0;;i++)
237
       	{
237
       	{
238
	cmd[i] = CMD[i];
238
	cmd[i] = CMD[i];
239
	if (0 == cmd[i])
239
	if (0 == cmd[i])
240
		{
240
		{
241
		i = -2;
241
		i = -2;
242
		break;
242
		break;
243
		}
243
		}
244
	if ( iswhite(cmd[i]) )
244
	if ( iswhite(cmd[i]) )
245
		{
245
		{
246
                cmd[i] = '\0';
246
                cmd[i] = '\0';
247
                break;
247
                break;
248
		}
248
		}
249
	}
249
	}
250
   return i+1;
250
   return i+1;
251
   }
251
   }
252
   else
252
   else
253
   {
253
   {
254
   len = 0;
254
   len = 0;
255
   for (i=1;;i++)
255
   for (i=1;;i++)
256
       	{
256
       	{
257
	cmd[len] = CMD[i];
257
	cmd[len] = CMD[i];
258
	if (0 == cmd[len])
258
	if (0 == cmd[len])
259
		{
259
		{
260
		len = -2;
260
		len = -2;
261
		break;
261
		break;
262
		}
262
		}
263
	if ( cmd[len] == '"' )
263
	if ( cmd[len] == '"' )
264
		{
264
		{
265
                cmd[len] = '\0';
265
                cmd[len] = '\0';
266
                break;
266
                break;
267
		}
267
		}
268
        len++;
268
        len++;
269
	}
269
	}
270
   trim(cmd);
270
   trim(cmd);
271
   return len+2;
271
   return len+2;
272
   }
272
   }
273
}
273
}
274
 
274
 
275
/// ===========================================================
275
/// ===========================================================
276
 
276
 
277
typedef int (*handler1_t)(char* arg);
277
typedef int (*handler1_t)(char* arg);
278
 
278
 
279
/// ===========================================================
279
/// ===========================================================
280
 
280
 
281
void command_execute()
281
void command_execute()
282
{
282
{
283
char cmd[256];
283
char cmd[256];
284
char args[256];
284
char args[256];
285
unsigned arg;
285
unsigned arg;
286
int i;
286
int i;
287
int result;
287
int result;
288
 
288
 
289
trim(CMD);
289
trim(CMD);
290
arg = command_get_cmd(cmd);
290
arg = command_get_cmd(cmd);
291
 
291
 
292
if ( !strlen(cmd) )
292
if ( !strlen(cmd) )
293
	return;
293
	return;
294
 
294
 
295
strcpy(args, CMD+arg);
295
strcpy(args, CMD+arg);
296
trim(args);
296
trim(args);
297
 
297
 
298
for (i = 0; i < NUM_OF_CMD; i++)
298
for (i = 0; i < NUM_OF_CMD; i++)
299
	{
299
	{
300
	if (!strcmp(cmd, COMMANDS[i].name))
300
	if (!strcmp(cmd, COMMANDS[i].name))
301
		{
301
		{
302
		result = ((handler1_t)COMMANDS[i].handler)(args);
302
		result = ((handler1_t)COMMANDS[i].handler)(args);
303
                if (result != TRUE)
303
                if (result != TRUE)
304
                   {
304
                   {
305
                   #if LANG_ENG
305
                   #if LANG_ENG
306
                       printf("  Error!\n\r");
306
                       printf("  Error!\n\r");
307
                   #elif LANG_RUS
307
                   #elif LANG_RUS
308
                       printf("  Žè¨¡ª !\n\r");
308
                       printf("  Žè¨¡ª !\n\r");
309
                   #endif
309
                   #endif
310
                    }
310
                    }
311
		return;
311
		return;
312
		}
312
		}
313
	}
313
	}
314
 
314
 
315
 
315
 
316
if ( -1 != alias_search(CMD) )
316
if ( -1 != alias_search(CMD) )
317
	{
317
	{
318
	strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
318
	strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
319
	command_execute();
319
	command_execute();
320
	return;
320
	return;
321
	}
321
	}
322
 
322
 
323
executable_run(cmd, args);
323
executable_run(cmd, args);
324
 
324
 
325
}
325
}
326
 
326
 
327
/// ===========================================================
327
/// ===========================================================