Subversion Repositories Kolibri OS

Rev

Rev 7787 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7787 Rev 8827
1
/// ===========================================================
-
 
2
 
-
 
3
void command_history_add()
1
void command_history_add() {
4
{
-
 
5
 
-
 
6
int i;
2
    int i;
7
 
3
 
8
if ('\0' == CMD[0]) return;
4
    if ('\0' == CMD[0]) return;
9
 
5
 
10
CMD_NUM = -1;
6
    CMD_NUM = -1;
11
 
7
 
12
for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
8
    for (i = 0; i < CMD_HISTORY_NUM_REAL; i++)
13
	if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
9
        if ( 0 == strcmp( CMD_HISTORY[i], CMD ) )
14
		return;
10
            return;
15
 
11
 
16
for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
12
    for (i = CMD_HISTORY_NUM_REAL; i > 0 ; i--)
17
	strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
13
        strcpy(CMD_HISTORY[i], CMD_HISTORY[i-1]);
18
 
14
 
19
strcpy(CMD_HISTORY[0], CMD);
15
    strcpy(CMD_HISTORY[0], CMD);
20
 
16
 
21
if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
17
    if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1)
22
	CMD_HISTORY_NUM_REAL++;
18
        CMD_HISTORY_NUM_REAL++;
23
 
19
 
24
}
20
}
25
// ============================================================
21
 
26
 
-
 
-
 
22
 
27
char * insert_string( char s1[], unsigned int pos, const char s2[] )
23
char * insert_string( char s1[], unsigned int pos, const char s2[] )
28
{
24
{
29
    unsigned int n1 = strlen( s1 );
25
    unsigned int n1 = strlen( s1 );
30
    unsigned int n2 = strlen( s2 );
26
    unsigned int n2 = strlen( s2 );
31
 
27
 
32
    if ( n1 < pos ) pos = n1;
28
    if ( n1 < pos ) pos = n1;
33
 
29
 
34
    unsigned int i;
30
    unsigned int i;
35
    for (  i = 0; i < n1 - pos; i++ )
31
    for (  i = 0; i < n1 - pos; i++ )
36
    {
32
    {
37
        s1[n1 + n2 - i - 1] = s1[n1 - i - 1];
33
        s1[n1 + n2 - i - 1] = s1[n1 - i - 1];
38
    }
34
    }
39
 
35
 
40
    for ( i = 0; i < n2; i++)
36
    for ( i = 0; i < n2; i++)
41
    {
37
    {
42
        s1[pos+i] = s2[i];
38
        s1[pos+i] = s2[i];
43
    }
39
    }
44
 
40
 
45
    s1[n1 + n2] = '\0';
41
    s1[n1 + n2] = '\0';
46
 
42
 
47
    return s1;
43
    return s1;
48
}
44
}
49
 
45
 
50
/// ===========================================================
-
 
-
 
46
 
51
 
47
 
52
void command_get()
48
void command_get()
53
{
49
{
54
unsigned key;
50
    unsigned key;
55
 
51
 
56
unsigned i;
52
    unsigned i;
57
unsigned cmdLen = 0;
53
    unsigned cmdLen = 0;
58
unsigned cmdPos = 0;
54
    unsigned cmdPos = 0;
59
CMD[0] = '\0';
55
    CMD[0] = '\0';
60
 
56
 
61
int clipNum; // number of clipboard slots
57
    int clipNum; // number of clipboard slots
62
char* clipBuf; // clipboard buffer
58
    char* clipBuf; // clipboard buffer
63
char clipCopy[255+12];
59
    char clipCopy[255+12];
64
 
60
 
65
for (;;)
61
    for (;;) {
66
	{
-
 
67
	key = getch();
62
        key = getch();
68
	if ( 0 != (key & 0xff) )
63
        if ( 0 != (key & 0xff) ) {
69
		{
-
 
70
		key &= 0xff;
64
            key &= 0xff;
71
		switch (key)
65
            switch (key) {
72
			{
-
 
73
			case 27: // ESC
66
                case 27: // ESC
74
				for (i = cmdPos; i < cmdLen; i++)
67
                    for (i = cmdPos; i < cmdLen; i++)
75
					printf(" ");
68
                        printf(" ");
76
				for (i = cmdLen; i > 0; i--)
69
                    for (i = cmdLen; i > 0; i--)
77
					printf("%c %c", 8, 8);
70
                        printf("%c %c", 8, 8);
78
				cmdLen = 0;
71
                    cmdLen = 0;
79
				cmdPos = 0;
72
                    cmdPos = 0;
80
				CMD[0] = '\0';
73
                    CMD[0] = '\0';
81
				break;
74
                    break;
82
 
75
 
83
			case 13: // ENTER
76
                case 13: // ENTER
84
				printf("\n\r");
77
                    printf("\n\r");
85
				command_history_add();
78
                    command_history_add();
86
				return;
79
                    return;
87
 
80
 
88
			case 8: // BACKSPACE
81
                case 8: // BACKSPACE
89
				if (cmdPos > 0)
82
                    if (cmdPos > 0)
90
					{
83
                        {
91
					for (i = cmdPos-1; i < cmdLen; i++)
84
                        for (i = cmdPos-1; i < cmdLen; i++)
92
										CMD[i] = CMD[i+1];
85
                                            CMD[i] = CMD[i+1];
93
					for (i = 0; i < cmdLen-cmdPos; i++)
86
                        for (i = 0; i < cmdLen-cmdPos; i++)
94
						printf (" ");
87
                            printf (" ");
95
 
88
 
96
					for (i = 0; i < cmdLen; i++)
89
                        for (i = 0; i < cmdLen; i++)
97
						printf ("%c %c", 8, 8);
90
                            printf ("%c %c", 8, 8);
98
 
91
 
99
					printf("%s", CMD);
92
                        printf("%s", CMD);
100
 
93
 
101
					for (i = 0; i < cmdLen-cmdPos; i++)
94
                        for (i = 0; i < cmdLen-cmdPos; i++)
102
						printf("%c", 8);
95
                            printf("%c", 8);
103
 
96
 
104
					cmdPos--;
97
                        cmdPos--;
105
					cmdLen--;
98
                        cmdLen--;
106
					}
99
                        }
107
				break;
100
                    break;
108
 
101
 
109
 
102
 
110
			case 9: // TAB
103
                case 9: // TAB
111
				break;
104
                    break;
112
				
105
                    
113
				
106
                    
114
			case 22: // Ctrl+V
107
                case 22: // Ctrl+V
115
				clipNum = kol_clip_num();
108
                    clipNum = _ksys_clip_num();
116
				if (clipNum > 0)
109
                    if (clipNum > 0)
117
					{
110
                        {
118
					clipBuf = kol_clip_get(clipNum-1);
111
                        clipBuf = _ksys_clip_get(clipNum-1);
119
//					printf("Length: %d, Type: %d, Encoding: %d\n", (int) *clipBuf, (int)*(clipBuf+4), (int)*(clipBuf+8));
112
    //					printf("Length: %d, Type: %d, Encoding: %d\n", (int) *clipBuf, (int)*(clipBuf+4), (int)*(clipBuf+8));
120
					if ( (int) *clipBuf > 0 ) // is clipboard empty?
113
                        if ( (int) *clipBuf > 0 ) // is clipboard empty?
121
						{
114
                            {
122
						if ((int)*(clipBuf+4)==0) // text?
115
                            if ((int)*(clipBuf+4)==0) // text?
123
							{
116
                                {
124
							if ((int)*(clipBuf+8)==1) // 866 encoding?
117
                                if ((int)*(clipBuf+8)==1) // 866 encoding?
125
								{
118
                                    {
126
									// clear previous text
119
                                        // clear previous text
127
									for (i = cmdPos; i < cmdLen; i++)
120
                                        for (i = cmdPos; i < cmdLen; i++)
128
										printf(" ");
121
                                            printf(" ");
129
									for (i = cmdLen; i > 0; i--)
122
                                        for (i = cmdLen; i > 0; i--)
130
										printf("%c %c", 8, 8);
123
                                            printf("%c %c", 8, 8);
131
 
124
 
132
									char *pasteText = clipBuf + 12;
125
                                        char *pasteText = clipBuf + 12;
133
									int pasteLen = strlen(pasteText);
126
                                        int pasteLen = strlen(pasteText);
134
									insert_string(CMD, cmdPos, pasteText);
127
                                        insert_string(CMD, cmdPos, pasteText);
135
									cmdLen = strlen(CMD);
128
                                        cmdLen = strlen(CMD);
136
									cmdPos += pasteLen;
129
                                        cmdPos += pasteLen;
137
									printf("%s", CMD);
130
                                        printf("%s", CMD);
138
                                    for (i = 0; i < cmdLen-cmdPos; i++) printf("%c", 8); // rewind the internal console cursor
131
                                        for (i = 0; i < cmdLen-cmdPos; i++) printf("%c", 8); // rewind the internal console cursor
139
								}
132
                                    }
140
							}
133
                                }
141
						}
134
                            }
142
					}
135
                        }
143
				break;
136
                    break;
144
 
137
 
145
				
138
                    
146
			case 3: // Ctrl+C
139
                case 3: // Ctrl+C
147
				if ( cmdLen > 0 )
140
                    if ( cmdLen > 0 )
148
					{
141
                        {
149
					
142
                        
150
					*clipCopy = 12 + cmdLen;
143
                        *clipCopy = 12 + cmdLen;
151
					*(clipCopy+4)=0;
144
                        *(clipCopy+4)=0;
152
					*(clipCopy+8)=1;
145
                        *(clipCopy+8)=1;
153
					
146
                        
154
					for (i = 0; i <= cmdLen; i++)
147
                        for (i = 0; i <= cmdLen; i++)
155
						*(clipCopy+12+i) = CMD[i];
148
                            *(clipCopy+12+i) = CMD[i];
156
						
149
                            
157
					kol_clip_set(12+cmdLen, clipCopy);
150
                        _ksys_clip_set(12+cmdLen, clipCopy);
158
					
151
                        
159
					}
152
                        }
160
				break;
153
                    break;
161
				
154
                    
162
				
155
                    
163
			default:
156
                default:
164
				if (cmdLen < 255)
157
                    if (cmdLen < 255)
165
					{
158
                        {
166
					if ( kol_key_control() & 0x40 ) // ¥á«¨ ¢ª«îçñ­ CapsLock
159
                        if ( kol_key_control() & 0x40 ) // �᫨ ������ CapsLock
167
						if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // ¥á«¨ ­ ¦ âë è¨äâë
160
                            if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // �᫨ ������ ����
168
							key = tolower(key);
161
                                key = tolower(key);
169
						else
162
                            else
170
							key = toupper(key);
163
                                key = toupper(key);
171
 
164
 
172
					for (i = cmdLen+1; i > cmdPos; i--)
165
                        for (i = cmdLen+1; i > cmdPos; i--)
173
						CMD[i] = CMD[i-1];
166
                            CMD[i] = CMD[i-1];
174
 
167
 
175
					CMD[cmdPos] = key;
168
                        CMD[cmdPos] = key;
176
 
169
 
177
					for (i = cmdPos; i > 0; i--)
170
                        for (i = cmdPos; i > 0; i--)
178
						printf("%c %c", 8, 8);
171
                            printf("%c %c", 8, 8);
179
 
172
 
180
					printf("%s", CMD);
173
                        printf("%s", CMD);
181
 
174
 
182
					for (i = 0; i < cmdLen-cmdPos; i++)
175
                        for (i = 0; i < cmdLen-cmdPos; i++)
183
						printf("%c", 8);
176
                            printf("%c", 8);
184
 
177
 
185
					cmdPos++;
178
                        cmdPos++;
186
					cmdLen++;
179
                        cmdLen++;
187
					}
180
                        }
188
				break;
181
                    break;
189
 
182
 
190
			}
183
                }
191
		}
184
            }
192
	else
185
        else
193
		{
186
            {
194
		key = (key>>8)&0xff;
187
            key = (key>>8)&0xff;
195
		switch (key)
188
            switch (key)
196
			{
189
                {
197
			case 83: // Del
190
                case 83: // Del
198
				if (cmdPos < cmdLen)
191
                    if (cmdPos < cmdLen)
199
					{
192
                        {
200
						for (i = cmdPos; i < cmdLen; i++)
193
                            for (i = cmdPos; i < cmdLen; i++)
201
							CMD[i] = CMD[i+1];
194
                                CMD[i] = CMD[i+1];
202
 
195
 
203
						for (i = 0; i < cmdLen-cmdPos; i++)
196
                            for (i = 0; i < cmdLen-cmdPos; i++)
204
							printf(" ");
197
                                printf(" ");
205
 
198
 
206
						for (i = 0; i < cmdLen-cmdPos; i++)
199
                            for (i = 0; i < cmdLen-cmdPos; i++)
207
							printf("%c", 8);
200
                                printf("%c", 8);
208
 
201
 
209
						for (i = cmdPos; i < cmdLen; i++)
202
                            for (i = cmdPos; i < cmdLen; i++)
210
							printf("%c", CMD[i]);
203
                                printf("%c", CMD[i]);
211
 
204
 
212
						for (i = 0; i < cmdLen-cmdPos; i++)
205
                            for (i = 0; i < cmdLen-cmdPos; i++)
213
							printf("%c", 8);
206
                                printf("%c", 8);
214
 
207
 
215
						cmdLen--;
208
                            cmdLen--;
216
					}
209
                        }
217
				break;
210
                    break;
218
 
211
 
219
 
212
 
220
			case 0x47: // Home
213
                case 0x47: // Home
221
				// move internal cursor and cmdPos to the beginning of the line
214
                    // move internal cursor and cmdPos to the beginning of the line
222
				for (;cmdPos > 0; cmdPos--) {printf("%c", 8);}
215
                    for (;cmdPos > 0; cmdPos--) {printf("%c", 8);}
223
				break;
216
                    break;
224
 
217
 
225
			case 0x4F: // End
218
                case 0x4F: // End
226
				// move internal cursor and cmdPos to the end of the line 
219
                    // move internal cursor and cmdPos to the end of the line 
227
				for (;cmdPos < cmdLen; cmdPos++) {printf("%c", CMD[cmdPos]);}
220
                    for (;cmdPos < cmdLen; cmdPos++) {printf("%c", CMD[cmdPos]);}
228
				break;
221
                    break;
229
 
222
 
230
			case 75: // Left
223
                case 75: // Left
231
				if (cmdPos > 0)
224
                    if (cmdPos > 0)
232
					{
225
                        {
233
						printf("%c", 8);
226
                            printf("%c", 8);
234
						cmdPos--;
227
                            cmdPos--;
235
					}
228
                        }
236
				break;
229
                    break;
237
 
230
 
238
 
231
 
239
			case 77: // Right
232
                case 77: // Right
240
				if (cmdPos < cmdLen)
233
                    if (cmdPos < cmdLen)
241
					{
234
                        {
242
						printf("%c", CMD[cmdPos]);
235
                            printf("%c", CMD[cmdPos]);
243
						cmdPos++;
236
                            cmdPos++;
244
					}
237
                        }
245
				break;
238
                    break;
246
 
239
 
247
 
240
 
248
			case 72: // Up
241
                case 72: // Up
249
				if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= -1)
242
                    if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= -1)
250
					{
243
                        {
251
 
244
 
252
					for (i = cmdPos; i < cmdLen; i++)
245
                        for (i = cmdPos; i < cmdLen; i++)
253
						printf(" ");
246
                            printf(" ");
254
 
247
 
255
					for (i = cmdLen; i > 0; i--)
248
                        for (i = cmdLen; i > 0; i--)
256
						printf("%c %c", 8, 8);
249
                            printf("%c %c", 8, 8);
257
 
250
 
258
					if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
251
                        if (CMD_NUM < CMD_HISTORY_NUM_REAL-1)
259
						CMD_NUM++;
252
                            CMD_NUM++;
260
/*					else
253
    /*					else
261
						CMD_NUM = 0;
254
                            CMD_NUM = 0;
262
*/
255
    */
263
					printf("%s", CMD_HISTORY[CMD_NUM]);
256
                        printf("%s", CMD_HISTORY[CMD_NUM]);
264
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
257
                        strcpy(CMD, CMD_HISTORY[CMD_NUM]);
265
					cmdLen = strlen(CMD);
258
                        cmdLen = strlen(CMD);
266
					cmdPos = strlen(CMD);
259
                        cmdPos = strlen(CMD);
267
 
260
 
268
					}
261
                        }
269
			
262
                
270
				break;
263
                    break;
271
 
264
 
272
 
265
 
273
			case 80: // Down
266
                case 80: // Down
274
				if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= 0)
267
                    if (CMD_HISTORY_NUM_REAL > 0 && CMD_NUM >= 0)
275
					{
268
                        {
276
 
269
 
277
					for (i = cmdPos; i < cmdLen; i++)
270
                        for (i = cmdPos; i < cmdLen; i++)
278
						printf(" ");
271
                            printf(" ");
279
 
272
 
280
					for (i = cmdLen; i > 0; i--)
273
                        for (i = cmdLen; i > 0; i--)
281
						printf("%c %c", 8, 8);
274
                            printf("%c %c", 8, 8);
282
 
275
 
283
					if (CMD_NUM > 0)
276
                        if (CMD_NUM > 0)
284
						CMD_NUM--;
277
                            CMD_NUM--;
285
/*					else
278
    /*					else
286
						CMD_NUM = CMD_HISTORY_NUM_REAL-1;
279
                            CMD_NUM = CMD_HISTORY_NUM_REAL-1;
287
*/
280
    */
288
					printf("%s", CMD_HISTORY[CMD_NUM]);
281
                        printf("%s", CMD_HISTORY[CMD_NUM]);
289
					strcpy(CMD, CMD_HISTORY[CMD_NUM]);
282
                        strcpy(CMD, CMD_HISTORY[CMD_NUM]);
290
					cmdLen = strlen(CMD);
283
                        cmdLen = strlen(CMD);
291
					cmdPos = strlen(CMD);
284
                        cmdPos = strlen(CMD);
292
 
285
 
293
					}
286
                        }
294
				break;
287
                    break;
295
 
288
 
296
 
289
 
297
			case 0: // console window closed
290
                case 0: // console window closed
298
				cmd_exit(NULL);
291
                    cmd_exit(NULL);
299
 
292
 
-
 
293
            } // switch end
-
 
294
        } // if end
300
			}
295
    } // for end
301
 
296
 
302
		}
-
 
303
	}
-
 
304
 
-
 
305
}
297
}
306
 
298
 
307
/// ===========================================================
299
 
308
 
300
 
309
int command_get_cmd(char cmd[])
301
int command_get_cmd(char cmd[])
310
{
302
{
311
unsigned i, len;
303
    unsigned i, len;
312
int quote = 0;
304
    int quote = 0;
313
 
305
 
314
if (CMD[0]=='"')
306
    if (CMD[0]=='"')
315
   quote = 1;
307
    quote = 1;
316
 
308
 
317
if (quote == 0)
309
    if (quote == 0)
318
	{
310
        {
319
	for (i=0;;i++)
311
        for (i=0;;i++)
320
		{
312
            {
321
		cmd[i] = CMD[i];
313
            cmd[i] = CMD[i];
322
		if (0 == cmd[i])
314
            if (0 == cmd[i])
323
			return i;
315
                return i;
324
		if ( iswhite(cmd[i]) )
316
            if ( iswhite(cmd[i]) )
325
			{
317
                {
326
			cmd[i] = '\0';
318
                cmd[i] = '\0';
327
			break;
319
                break;
328
			}
320
                }
329
		}
321
            }
330
	return i+1;
322
        return i+1;
331
	}
323
        }
332
else
324
    else
333
	{
325
        {
334
	len = 0;
326
        len = 0;
335
	for (i=1;;i++)
327
        for (i=1;;i++)
336
		{
328
            {
337
		cmd[len] = CMD[i];
329
            cmd[len] = CMD[i];
338
		if (0 == cmd[len])
330
            if (0 == cmd[len])
339
			{
331
                {
340
			i--;
332
                i--;
341
			break;
333
                break;
342
			}
334
                }
343
		if ( cmd[len] == '"' )
335
            if ( cmd[len] == '"' )
344
			{
336
                {
345
			cmd[len] = '\0';
337
                cmd[len] = '\0';
346
			break;
338
                break;
347
			}
339
                }
348
		len++;
340
            len++;
349
		}
341
            }
350
	trim(cmd);
342
        trim(cmd);
351
	return i+1;
343
        return i+1;
352
	}
344
        }
353
}
345
}
354
 
346
 
355
/// ===========================================================
-
 
-
 
347
 
356
 
348
 
357
typedef int (*handler1_t)(char* arg);
349
typedef int (*handler1_t)(char* arg);
358
 
350
 
359
/// ===========================================================
-
 
-
 
351
 
360
 
352
 
361
void command_execute()
353
void command_execute()
362
{
354
{
363
char cmd[256];
355
    char cmd[256];
364
char args[256];
356
    char args[256];
365
unsigned arg;
357
    unsigned arg;
366
int i;
358
    int i;
367
int result;
359
    int result;
368
 
360
 
369
trim(CMD);
361
    trim(CMD);
370
arg = command_get_cmd(cmd);
362
    arg = command_get_cmd(cmd);
371
 
363
 
372
if ( !strlen(cmd) )
364
    if ( !strlen(cmd) )
373
	return;
365
        return;
374
 
366
 
375
strcpy(args, CMD+arg);
367
    strcpy(args, CMD+arg);
376
trim(args);
368
    trim(args);
377
 
369
 
378
for (i = 0; i < NUM_OF_CMD; i++)
370
    for (i = 0; i < NUM_OF_CMD; i++) {
379
	{
-
 
380
	if (!strcmp(cmd, COMMANDS[i].name))
371
        if (!strcmp(cmd, COMMANDS[i].name)) {
381
		{
-
 
382
		result = ((handler1_t)COMMANDS[i].handler)(args);
372
            result = ((handler1_t)COMMANDS[i].handler)(args);
383
		if (result == FALSE)
373
            if (result == FALSE) {
384
			{
-
 
385
			#if LANG_ENG
-
 
386
				printf("  Error!\n\r");
374
                printf(UNKNOWN_CMD_ERROR);
387
			#elif LANG_RUS
-
 
388
				printf("  Žè¨¡ª !\n\r");
-
 
389
			#endif
-
 
390
			}
375
            }
391
		return;
376
            return;
392
		}
377
        }
393
	}
378
    }
394
 
379
 
395
 
-
 
396
if ( -1 != alias_search(CMD) )
380
    if ( -1 != alias_search(CMD) ) {
397
	{
-
 
398
	strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
381
        strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
399
	command_execute();
382
        command_execute();
400
	return;
383
        return;
401
	}
384
    }
402
 
385
 
403
executable_run(cmd, args);
386
    executable_run(cmd, args);
404
 
387
 
405
}
388
}
406
 
389
407
/// ===========================================================
-
 
408
-
 
409
-